package org.servicemix.components.xfire;
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 org.xml.sax.SAXException;
import javax.jbi.JBIException;
import javax.xml.namespace.QName;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import junit.framework.TestCase;
public class XFireComponentTest extends TestCase {
protected JBIContainer container;
protected SourceTransformer transformer = new SourceTransformer();
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();
XFireComponent component = new XFireComponent();
component.init(null);
container.activateComponent(new ActivationSpec("xfire", component));
component.getServiceUnitManager().deploy("addNumbers", path.getAbsolutePath());
component.start("addNumbers");
QName serviceName = new QName("http://foo.bar.com", "AddNumbers");
String file = "request.xml";
Object answer = requestServiceWithFileRequest(serviceName, file);
assertTrue("Should return a DOM Node: " + answer, answer instanceof Node);
Node node = (Node) answer;
System.out.println(transformer.toString(node));
assertTrue(transformer.toString(node).indexOf("30") > 0);
component.stop("addNumbers");
}
protected Object requestServiceWithFileRequest(QName serviceName, String fileOnClassPath) throws JBIException, TransformerException, ParserConfigurationException, IOException, SAXException {
Source content = getSourceFromClassPath(fileOnClassPath);
ServiceNameEndpointResolver resolver = new ServiceNameEndpointResolver(serviceName);
ServiceMixClient client = new DefaultServiceMixClient(container);
Object answer = client.request(resolver, null, null, content);
if (answer instanceof Source) {
answer = transformer.toDOMNode((Source) answer);
}
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();
}
}
}