1 package org.codehaus.xfire.plexus; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.InputStream; 5 import java.io.StringReader; 6 import java.util.HashMap; 7 import java.util.List; 8 import java.util.Map; 9 10 import javax.xml.stream.XMLStreamException; 11 12 import org.codehaus.plexus.PlexusTestCase; 13 import org.codehaus.xfire.MessageContext; 14 import org.codehaus.xfire.XFire; 15 import org.codehaus.xfire.exchange.InMessage; 16 import org.codehaus.xfire.service.Service; 17 import org.codehaus.xfire.service.ServiceRegistry; 18 import org.codehaus.xfire.soap.Soap11; 19 import org.codehaus.xfire.soap.Soap12; 20 import org.codehaus.xfire.test.XPathAssert; 21 import org.codehaus.xfire.transport.Channel; 22 import org.codehaus.xfire.transport.Transport; 23 import org.codehaus.xfire.transport.local.LocalTransport; 24 import org.codehaus.xfire.util.STAXUtils; 25 import org.codehaus.xfire.wsdl.WSDLWriter; 26 import org.codehaus.yom.Document; 27 import org.codehaus.yom.Node; 28 import org.codehaus.yom.Serializer; 29 import org.codehaus.yom.stax.StaxBuilder; 30 31 /*** 32 * Contains helpful methods to test SOAP services. 33 * 34 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a> 35 */ 36 public class PlexusXFireTest 37 extends PlexusTestCase 38 { 39 /*** 40 * Namespaces for the XPath expressions. 41 */ 42 private Map namespaces = new HashMap(); 43 44 protected void printNode(Node node) 45 throws Exception 46 { 47 Serializer writer = new Serializer(System.out); 48 writer.setOutputStream(System.out); 49 50 if (node instanceof Document) 51 writer.write((Document) node); 52 else 53 { 54 writer.flush(); 55 writer.writeChild(node); 56 } 57 } 58 59 /*** 60 * Invoke a service with the specified document. 61 * 62 * @param service The name of the service. 63 * @param document The request as an xml document in the classpath. 64 */ 65 protected Document invokeService(String service, String document) 66 throws Exception 67 { 68 ByteArrayOutputStream out = new ByteArrayOutputStream(); 69 MessageContext context = new MessageContext(); 70 context.setXFire(getXFire()); 71 context.setProperty(Channel.BACKCHANNEL_URI, out); 72 73 if (service != null) 74 context.setService(getServiceRegistry().getService(service)); 75 76 InputStream stream = getResourceAsStream(document); 77 InMessage msg = new InMessage(STAXUtils.createXMLStreamReader(stream, "UTF-8")); 78 79 Transport t = getXFire().getTransportManager().getTransport(LocalTransport.NAME); 80 Channel c = t.createChannel(); 81 82 c.receive(context, msg); 83 84 String response = out.toString(); 85 if (response == null || response.length() == 0) 86 return null; 87 88 return readDocument(response); 89 } 90 91 protected Document readDocument(String text) 92 throws XMLStreamException 93 { 94 try 95 { 96 StaxBuilder builder = new StaxBuilder(); 97 return builder.build(new StringReader(text)); 98 } 99 catch (XMLStreamException e) 100 { 101 System.err.println("Could not read the document!"); 102 System.out.println(text); 103 throw e; 104 } 105 } 106 107 protected Document getWSDLDocument(String service) 108 throws Exception 109 { 110 ByteArrayOutputStream out = new ByteArrayOutputStream(); 111 112 getXFire().generateWSDL(service, out); 113 114 return readDocument(out.toString()); 115 } 116 117 /*** 118 * @see junit.framework.TestCase#setUp() 119 */ 120 protected void setUp() 121 throws Exception 122 { 123 super.setUp(); 124 125 addNamespace("s", Soap11.getInstance().getNamespace()); 126 addNamespace("soap12", Soap12.getInstance().getNamespace()); 127 } 128 129 /*** 130 * Assert that the following XPath query selects one or more nodes. 131 * 132 * @param xpath 133 * @return 134 */ 135 public List assertValid(String xpath, Node node) 136 throws Exception 137 { 138 return XPathAssert.assertValid(xpath, node, namespaces); 139 } 140 141 /*** 142 * Assert that the following XPath query selects no nodes. 143 * 144 * @param xpath 145 * @return 146 */ 147 public List assertInvalid(String xpath, Node node) 148 throws Exception 149 { 150 return XPathAssert.assertInvalid(xpath, node, namespaces); 151 } 152 153 /*** 154 * Asser that the text of the xpath node retrieved is equal to the value specified. 155 * 156 * @param xpath 157 * @param value 158 * @param node 159 */ 160 public void assertXPathEquals(String xpath, String value, Node node) 161 throws Exception 162 { 163 XPathAssert.assertXPathEquals(xpath, value, node, namespaces); 164 } 165 166 public void assertNoFault(Node node) 167 throws Exception 168 { 169 XPathAssert.assertNoFault(node); 170 } 171 172 /*** 173 * Add a namespace that will be used for XPath expressions. 174 * 175 * @param ns Namespace name. 176 * @param uri The namespace uri. 177 */ 178 public void addNamespace(String ns, String uri) 179 { 180 namespaces.put(ns, uri); 181 } 182 183 /*** 184 * Get the WSDL for a service. 185 * 186 * @param string The name of the service. 187 * @return 188 * @throws Exception 189 */ 190 protected WSDLWriter getWSDL(String service) 191 throws Exception 192 { 193 ServiceRegistry reg = getServiceRegistry(); 194 Service hello = reg.getService(service); 195 196 return hello.getWSDLWriter(); 197 } 198 199 protected XFire getXFire() 200 throws Exception 201 { 202 return (XFire) lookup(XFire.ROLE); 203 } 204 205 protected ServiceRegistry getServiceRegistry() 206 throws Exception 207 { 208 return getXFire().getServiceRegistry(); 209 } 210 }