package org.servicemix.components.jaxws;
import com.sun.org.apache.xpath.internal.CachedXPathAPI;
import org.servicemix.client.DefaultServiceMixClient;
import org.servicemix.client.ServiceMixClient;
import org.servicemix.jbi.container.ActivationSpec;
import org.servicemix.jbi.container.JBIContainer;
import org.servicemix.jbi.jaxp.SourceTransformer;
import org.servicemix.jbi.resolver.ServiceNameEndpointResolver;
import org.servicemix.jbi.util.DOMUtil;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.NodeIterator;
import javax.jbi.JBIException;
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import junit.framework.TestCase;
public class JXAWSComponentTest extends TestCase {
protected JBIContainer container;
protected void setUp() throws Exception {
container = new JBIContainer();
container.init();
container.start();
}
protected void tearDown() throws Exception {
container.shutDown();
}
public void testXBeanJbi() throws Exception {
URL url = Thread.currentThread().getContextClassLoader().getResource("addNumbers/xbean.xml");
File path = new File(url.toURI());
path = path.getParentFile();
JAXWSComponent component = new JAXWSComponent();
container.activateComponent(new ActivationSpec("jaxws", component));
component.getServiceUnitManager().deploy("addNumbers", path.getAbsolutePath());
component.start("addNumbers");
SourceTransformer transformer = new SourceTransformer();
QName serviceName = new QName("http://jaxws.components.servicemix.org/", "AddNumbersImplService");
String file = "requestWithEnvelope.xml";
Object answer = requestServiceWithFileRequest(serviceName, file);
if (answer instanceof Source) {
answer = transformer.toDOMNode((Source) answer);
}
assertTrue("Should return a DOM Node: " + answer, answer instanceof Node);
Node node = (Node) answer;
System.out.println(transformer.toString(node));
String text = textValueOfXPath(node, "//return").trim();
System.out.println("Result: " + text);
assertTrue("Result text should not be empty", text.length() > 0);
component.stop("addNumbers");
}
protected Object requestServiceWithFileRequest(QName serviceName, String fileOnClassPath) throws JBIException {
Source content = getSourceFromClassPath(fileOnClassPath);
ServiceNameEndpointResolver resolver = new ServiceNameEndpointResolver(serviceName);
ServiceMixClient client = new DefaultServiceMixClient(container);
Object answer = client.request(resolver, null, null, content);
return answer;
}
protected Source getSourceFromClassPath(String fileOnClassPath) {
InputStream stream = getClass().getResourceAsStream(fileOnClassPath);
assertNotNull("Could not find file: " + fileOnClassPath + " on the classpath", stream);
Source content = new StreamSource(stream);
return content;
}
protected String textValueOfXPath(Node node, String xpath) throws TransformerException {
CachedXPathAPI cachedXPathAPI = new CachedXPathAPI();
NodeIterator iterator = cachedXPathAPI.selectNodeIterator(node, xpath);
Node root = iterator.nextNode();
if (root instanceof Element) {
Element element = (Element) root;
if (element == null) {
return "";
}
String text = DOMUtil.getElementText(element);
return text;
}
else {
return root.getNodeValue();
}
}
}