SWS-298 (SWS-84)

This commit is contained in:
Arjen Poutsma
2008-02-26 01:22:04 +00:00
parent 072aab6aa9
commit edabca8a5b
4 changed files with 375 additions and 0 deletions

View File

@@ -0,0 +1,193 @@
/*
* Copyright 2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ws.soap.addressing.client;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.xml.transform.TransformerException;
import org.springframework.core.JdkVersion;
import org.springframework.util.Assert;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.client.core.WebServiceMessageCallback;
import org.springframework.ws.soap.SoapMessage;
import org.springframework.ws.soap.addressing.core.EndpointReference;
import org.springframework.ws.soap.addressing.core.MessageAddressingProperties;
import org.springframework.ws.soap.addressing.messageid.MessageIdStrategy;
import org.springframework.ws.soap.addressing.messageid.RandomGuidMessageIdStrategy;
import org.springframework.ws.soap.addressing.messageid.UuidMessageIdStrategy;
import org.springframework.ws.soap.addressing.version.Addressing10;
import org.springframework.ws.soap.addressing.version.AddressingVersion;
import org.springframework.ws.transport.context.TransportContext;
import org.springframework.ws.transport.context.TransportContextHolder;
/**
* {@link WebServiceMessageCallback} implementation that sets the WS-Addressing <code>Action</code> header on the
* message.
* <p/>
* A usage example with {@link org.springframework.ws.client.core.WebServiceTemplate}:
* <pre>
* WebServiceTemplate template = new WebServiceTemplate(messageFactory);
* Result result = new DOMResult();
* template.sendSourceAndReceiveToResult(
* new StringSource("&lt;content xmlns=\"http://tempuri.org\"/&gt;"),
* new ActionCallback(new URI("http://tempuri.org/Action")),
* result);
* </pre>
*
* @author Arjen Poutsma
* @since 1.0.0
*/
public class ActionCallback implements WebServiceMessageCallback {
private final AddressingVersion version;
private final URI action;
private final URI to;
private MessageIdStrategy messageIdStrategy;
private EndpointReference from;
private EndpointReference replyTo;
private EndpointReference faultTo;
/**
* Create a new <code>ActionCallback</code> with the given <code>Action</code>.
* <p/>
* The <code>To</code> header of the outgoing message will reflect the {@link org.springframework.ws.transport.WebServiceConnection#getUri()
* connection URI}.
* <p/>
* The {@link AddressingVersion} is set to {@link Addressing10}.
*
* @param action the value of the action property to set
*/
public ActionCallback(String action) throws URISyntaxException {
this(new URI(action), new Addressing10(), null);
}
/**
* Create a new <code>ActionCallback</code> with the given <code>Action</code>.
* <p/>
* The <code>To</code> header of the outgoing message will reflect the {@link org.springframework.ws.transport.WebServiceConnection#getUri()
* connection URI}.
* <p/>
* The {@link AddressingVersion} is set to {@link Addressing10}.
*
* @param action the value of the action property to set
*/
public ActionCallback(URI action) {
this(action, new Addressing10(), null);
}
/**
* Create a new <code>ActionCallback</code> with the given version and <code>Action</code>.
* <p/>
* The <code>To</code> header of the outgoing message will reflect the {@link org.springframework.ws.transport.WebServiceConnection#getUri()
* connection URI}.
*
* @param action the value of the action property to set
* @param version the WS-Addressing version to use
*/
public ActionCallback(URI action, AddressingVersion version) {
this(action, version, null);
}
/**
* Create a new <code>ActionCallback</code> with the given version, <code>Action</code>, and optional
* <code>To</code>.
*
* @param action the value of the action property
* @param version the WS-Addressing version to use
* @param action the value of the destination property
*/
public ActionCallback(URI action, AddressingVersion version, URI to) {
Assert.notNull(action, "'action' must not be null");
Assert.notNull(version, "'version' must not be null");
this.action = action;
this.version = version;
this.to = to;
if (JdkVersion.isAtLeastJava15()) {
messageIdStrategy = new UuidMessageIdStrategy();
}
else {
messageIdStrategy = new RandomGuidMessageIdStrategy();
}
}
/**
* Sets the message id strategy used for creating WS-Addressing MessageIds.
* <p/>
* By default, the {@link UuidMessageIdStrategy} is used on Java 5 and higher, and the {@link
* RandomGuidMessageIdStrategy} on Java 1.4.
*/
public void setMessageIdStrategy(MessageIdStrategy messageIdStrategy) {
Assert.notNull(messageIdStrategy, "'messageIdStrategy' must not be null");
this.messageIdStrategy = messageIdStrategy;
}
public void setFrom(EndpointReference from) {
this.from = from;
}
public void setReplyTo(EndpointReference replyTo) {
this.replyTo = replyTo;
}
public void setFaultTo(EndpointReference faultTo) {
this.faultTo = faultTo;
}
/**
* Returns the <code>Destination</code> for outgoing messages.
* <p/>
* Defaults to the {@link org.springframework.ws.transport.WebServiceConnection#getUri() connection URI} if no
* destination was set.
*/
protected URI getTo() {
if (to == null) {
TransportContext transportContext = TransportContextHolder.getTransportContext();
if (transportContext != null && transportContext.getConnection() != null) {
try {
return transportContext.getConnection().getUri();
}
catch (URISyntaxException ex) {
// ignore
}
}
throw new IllegalStateException("Could not obtain connection URI from Transport Context");
}
else {
return to;
}
}
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
Assert.isInstanceOf(SoapMessage.class, message);
SoapMessage soapMessage = (SoapMessage) message;
URI to = getTo();
URI messageId = messageIdStrategy.newMessageId(soapMessage);
MessageAddressingProperties map =
new MessageAddressingProperties(to, from, replyTo, faultTo, action, messageId);
version.addAddressingHeaders(soapMessage, map);
}
}

View File

@@ -0,0 +1,120 @@
/*
* Copyright ${YEAR} the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ws.soap.addressing.client;
import java.net.URI;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import org.easymock.MockControl;
import org.springframework.ws.soap.addressing.AbstractWsAddressingTestCase;
import org.springframework.ws.soap.addressing.core.EndpointReference;
import org.springframework.ws.soap.addressing.messageid.MessageIdStrategy;
import org.springframework.ws.soap.addressing.version.AddressingVersion;
import org.springframework.ws.soap.saaj.SaajSoapMessage;
import org.springframework.ws.transport.WebServiceConnection;
import org.springframework.ws.transport.context.DefaultTransportContext;
import org.springframework.ws.transport.context.TransportContext;
import org.springframework.ws.transport.context.TransportContextHolder;
public abstract class AbstractActionCallbackTestCase extends AbstractWsAddressingTestCase {
private ActionCallback callback;
private MockControl strategyControl;
private MessageIdStrategy strategyMock;
private MockControl connectionControl;
private WebServiceConnection connectionMock;
protected final void onSetUp() throws Exception {
strategyControl = MockControl.createControl(MessageIdStrategy.class);
strategyMock = (MessageIdStrategy) strategyControl.getMock();
connectionControl = MockControl.createControl(WebServiceConnection.class);
connectionMock = (WebServiceConnection) connectionControl.getMock();
TransportContext transportContext = new DefaultTransportContext(connectionMock);
TransportContextHolder.setTransportContext(transportContext);
}
protected void tearDown() throws Exception {
TransportContextHolder.setTransportContext(null);
}
public void testValid() throws Exception {
URI action = new URI("http://example.com/fabrikam/mail/Delete");
URI to = new URI("mailto:fabrikam@example.com");
callback = new ActionCallback(action, getVersion(), to);
callback.setMessageIdStrategy(strategyMock);
SaajSoapMessage message = createDeleteMessage();
strategyControl
.expectAndReturn(strategyMock.newMessageId(message), new URI("http://example.com/someuniquestring"));
callback.setReplyTo(new EndpointReference(new URI("http://example.com/business/client1")));
strategyControl.replay();
connectionControl.replay();
callback.doWithMessage(message);
SaajSoapMessage expected = loadSaajMessage(getTestPath() + "/valid.xml");
assertXMLEqual("Invalid message", expected, message);
strategyControl.verify();
connectionControl.verify();
}
public void testDefaults() throws Exception {
URI action = new URI("http://example.com/fabrikam/mail/Delete");
URI connectionUri = new URI("mailto:fabrikam@example.com");
callback = new ActionCallback(action, getVersion());
callback.setMessageIdStrategy(strategyMock);
connectionControl.expectAndReturn(connectionMock.getUri(), connectionUri);
connectionControl.replay();
SaajSoapMessage message = createDeleteMessage();
strategyControl
.expectAndReturn(strategyMock.newMessageId(message), new URI("http://example.com/someuniquestring"));
callback.setReplyTo(new EndpointReference(new URI("http://example.com/business/client1")));
strategyControl.replay();
callback.doWithMessage(message);
SaajSoapMessage expected = loadSaajMessage(getTestPath() + "/valid.xml");
assertXMLEqual("Invalid message", expected, message);
strategyControl.verify();
connectionControl.verify();
}
private SaajSoapMessage createDeleteMessage() throws SOAPException {
SOAPMessage saajMessage = messageFactory.createMessage();
SOAPBody saajBody = saajMessage.getSOAPBody();
SOAPBodyElement delete = saajBody.addBodyElement(new QName("http://example.com/fabrikam", "Delete"));
SOAPElement maxCount = delete.addChildElement(new QName("maxCount"));
maxCount.setTextContent("42");
return new SaajSoapMessage(saajMessage);
}
protected abstract AddressingVersion getVersion();
protected abstract String getTestPath();
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright 2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ws.soap.addressing.client;
import org.springframework.ws.soap.addressing.version.Addressing10;
import org.springframework.ws.soap.addressing.version.AddressingVersion;
public class ActionCallback10Test extends AbstractActionCallbackTestCase {
protected AddressingVersion getVersion() {
return new Addressing10();
}
protected String getTestPath() {
return "10";
}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright 2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ws.soap.addressing.client;
import org.springframework.ws.soap.addressing.version.Addressing200408;
import org.springframework.ws.soap.addressing.version.AddressingVersion;
public class ActionCallback200408Test extends AbstractActionCallbackTestCase {
protected AddressingVersion getVersion() {
return new Addressing200408();
}
protected String getTestPath() {
return "200408";
}
}