/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.camel.component.spring.ws.addressing;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.camel.component.spring.ws.utils.OutputChannelReceiver;
import org.apache.camel.component.spring.ws.utils.TestUtil;
import org.apache.camel.test.spring.CamelSpringTestSupport;
import org.junit.After;
import org.junit.Before;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.soap.SoapMessage;
import org.springframework.ws.soap.addressing.client.ActionCallback;
import org.springframework.ws.soap.addressing.core.EndpointReference;
import org.springframework.ws.soap.addressing.core.MessageAddressingProperties;
import org.springframework.ws.soap.addressing.version.Addressing10;
/**
* Provides abstract test for WS-Addressing
*/
public abstract class AbstractWSATests extends CamelSpringTestSupport {
protected WebServiceTemplate webServiceTemplate;
protected OutputChannelReceiver response;
protected OutputChannelReceiver newReply;
protected StreamSource source;
protected StreamResult result;
private final String xmlBody = "<GetQuote xmlns=\"http://www.webserviceX.NET/\"><symbol>GOOG</symbol></GetQuote>";
private String requestInputAction;
@Before
public void setUp() throws Exception {
super.setUp();
// initialize beans for catching results
webServiceTemplate = applicationContext.getBean("webServiceTemplate", WebServiceTemplate.class);
newReply = getMandatoryBean(OutputChannelReceiver.class, "replyReceiver");
response = getMandatoryBean(OutputChannelReceiver.class, "responseReceiver");
// sample data
source = new StreamSource(new StringReader(xmlBody));
result = new StreamResult(new StringWriter());
// reset from previous test
response.clear();
newReply.clear();
requestInputAction = null;
}
@After
public void after() throws Exception {
assertNotNull(result);
}
/**
* Creates WS-Addressing Action and ReplyTo param for request
*
* @param action
* @param replyTo
* @return
* @throws URISyntaxException
*/
protected final ActionCallback actionAndReplyTo(String action, String replyTo) throws URISyntaxException {
requestInputAction = action;
ActionCallback requestCallback = new ActionCallback(action);
if (replyTo != null) {
requestCallback.setReplyTo(new EndpointReference(new URI(replyTo)));
}
return requestCallback;
}
/**
* Creates WS-Addressing Action param for request
*
* @param action
* @param replyTo
* @return
* @throws URISyntaxException
*/
protected final ActionCallback action(String action) throws URISyntaxException {
return actionAndReplyTo(action, null);
}
/**
* Creates WS-Addressing To and ReplyTo param for request
*
* @param action
* @param replyTo
* @return
* @throws URISyntaxException
*/
protected final ActionCallback toAndReplyTo(String to, String replyTo) throws URISyntaxException {
requestInputAction = "http://doesn-not-matter.com";
ActionCallback requestCallback = new ActionCallback(new URI(requestInputAction), new Addressing10(), new URI(to));
if (replyTo != null) {
requestCallback.setReplyTo(new EndpointReference(new URI(replyTo)));
}
return requestCallback;
}
/**
* Creates WS-Addressing To param for request
*
* @param action
* @param replyTo
* @return
* @throws URISyntaxException
*/
protected final ActionCallback to(String to) throws URISyntaxException {
return toAndReplyTo(to, null);
}
/**
* Construct a default action for the response message from the input
* message using the default response action suffix.
*
* @return
* @throws URISyntaxException
*/
protected URI getDefaultResponseAction() throws URISyntaxException {
return new URI(requestInputAction + "Response");
}
/**
* Only response is allow using a brand new channel
*
* @return
*/
protected final MessageAddressingProperties newChannelParams() {
assertNotNull(newReply);
assertNotNull(newReply.getMessageContext());
SoapMessage request = (SoapMessage)newReply.getMessageContext().getRequest();
assertNotNull(request);
MessageAddressingProperties wsaProperties = TestUtil.getWSAProperties(request);
assertNotNull(wsaProperties);
assertNotNull(wsaProperties.getTo());
return wsaProperties;
}
/**
* Only response is allow using same channel
*
* @return
*/
protected final MessageAddressingProperties sameChannelParams() {
// we expect the same channel reply
assertNull(newReply.getMessageContext());
assertNotNull(response);
assertNotNull(response.getMessageContext());
SoapMessage soapResponse = (SoapMessage)response.getMessageContext().getResponse();
assertNotNull(soapResponse);
MessageAddressingProperties wsaProperties = TestUtil.getWSAProperties(soapResponse);
assertNotNull(wsaProperties);
return wsaProperties;
}
/**
* Provides such an ActionCallback that sets the WS-Addressing param replyTo
* or doesn't set WS-Addressing param replyTo. In other words it cause
* response to be return using new or same channel as the request.
*
* @param action
* @return
* @throws URISyntaxException
*/
abstract ActionCallback channelIn(String action) throws URISyntaxException;
/**
* Provide corresponding results based on channel input. These two abstract
* methods (channelIn and channelOut)are bind together tighly.
*
* @return
*/
abstract MessageAddressingProperties channelOut();
}