View Javadoc

1   package org.codehaus.xfire.plexus;
2   
3   import java.io.ByteArrayOutputStream;
4   import java.util.HashMap;
5   import java.util.List;
6   import java.util.Map;
7   
8   import org.codehaus.plexus.PlexusTestCase;
9   import org.codehaus.plexus.util.StringInputStream;
10  import org.codehaus.xfire.MessageContext;
11  import org.codehaus.xfire.XFire;
12  import org.codehaus.xfire.service.Service;
13  import org.codehaus.xfire.service.ServiceRegistry;
14  import org.codehaus.xfire.soap.Soap11;
15  import org.codehaus.xfire.soap.Soap12;
16  import org.codehaus.xfire.wsdl.WSDLWriter;
17  import org.dom4j.Document;
18  import org.dom4j.DocumentHelper;
19  import org.dom4j.Node;
20  import org.dom4j.XPath;
21  import org.dom4j.io.OutputFormat;
22  import org.dom4j.io.SAXReader;
23  import org.dom4j.io.XMLWriter;
24  
25  /***
26   * Contains helpful methods to test SOAP services.
27   * 
28   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
29   */
30  public class PlexusXFireTest
31      extends PlexusTestCase
32  {
33      /*** Namespaces for the XPath expressions. */
34      private Map namespaces = new HashMap();
35      
36      protected void printNode( Node node ) 
37          throws Exception
38      {
39          XMLWriter writer = new XMLWriter( OutputFormat.createPrettyPrint() );
40          writer.setOutputStream( System.out );
41          writer.write( node );
42      }
43      
44      /***
45       * Invoke a service with the specified document.
46       * 
47       * @param service The name of the service.
48       * @param document The request as an xml document in the classpath.
49       * @return
50       * @throws Exception
51       */
52      protected Document invokeService( String service, String document ) 
53          throws Exception
54      {
55          ByteArrayOutputStream out = new ByteArrayOutputStream();
56          MessageContext context = 
57              new MessageContext( service,
58                                  null,
59                                  out,
60                                  null,
61                                  null );
62          
63          getXFire().invoke( getResourceAsStream( document ), context );
64          
65          SAXReader reader = new SAXReader();
66          return reader.read( new StringInputStream(out.toString()) );
67      }
68  
69      protected Document getWSDLDocument( String service ) 
70          throws Exception
71      {
72          ByteArrayOutputStream out = new ByteArrayOutputStream();
73  
74          getXFire().generateWSDL( service, out );
75          
76          SAXReader reader = new SAXReader();
77          return reader.read( new StringInputStream(out.toString()) );
78      }
79      
80      /***
81       * @see junit.framework.TestCase#setUp()
82       */
83      protected void setUp() throws Exception
84      {
85          super.setUp();
86          
87          addNamespace("s", Soap11.getInstance().getNamespace());
88          addNamespace("soap12", Soap12.getInstance().getNamespace());
89      }
90      
91      /***
92       * Assert that the following XPath query selects one or more nodes.
93       * 
94       * @param xpath
95       * @throws Exception
96       */
97      public void assertValid( String xpath, Node node )
98          throws Exception
99      {
100         List nodes = createXPath( xpath ).selectNodes( node );
101         
102         if ( nodes.size() == 0 )
103         {
104             throw new Exception( "Failed to select any nodes for expression:.\n" +
105                                  xpath + "\n" +
106                                  node.asXML() );
107         }
108     }
109     
110     /***
111      * Assert that the following XPath query selects no nodes.
112      * 
113      * @param xpath
114      * @throws Exception
115      */
116     public void assertInvalid( String xpath, Node node )
117         throws Exception
118     {
119         List nodes = createXPath( xpath ).selectNodes( node );
120         
121         if ( nodes.size() > 0 )
122         {
123             throw new Exception( "Found multiple nodes for expression:\n" +
124                                  xpath + "\n" +
125                                  node.asXML() );
126         }
127     }
128 
129     /***
130      * Asser that the text of the xpath node retrieved is equal to the
131      * value specified.
132      * 
133      * @param xpath
134      * @param value
135      * @param node
136      * @throws Exception
137      */
138     public void assertXPathEquals( String xpath, String value, Node node )
139         throws Exception
140     {
141         String value2 = createXPath( xpath ).selectSingleNode( node ).getText().trim();
142         
143         assertEquals( value, value2 );
144     }
145     
146     public void assertNoFault( Node node )
147         throws Exception
148     {
149         assertInvalid("/s:Envelope/s:Body/s:Fault", node);
150     }
151     
152     /***
153      * Create the specified XPath expression with the namespaces added
154      * via addNamespace().
155      */
156     protected XPath createXPath( String xpathString )
157     {
158         XPath xpath = DocumentHelper.createXPath( xpathString );
159         xpath.setNamespaceURIs(namespaces);
160         
161         return xpath;
162     }
163     
164     /***
165      * Add a namespace that will be used for XPath expressions.
166      * @param ns Namespace name.
167      * @param uri The namespace uri.
168      */
169     public void addNamespace( String ns, String uri )
170     {
171         namespaces.put(ns, uri);
172     }
173 
174     /***
175      * Get the WSDL for a service.
176      * 
177      * @param string The name of the service.
178      * @return
179      * @throws Exception
180      */
181     protected WSDLWriter getWSDL(String service) 
182         throws Exception
183     {
184         ServiceRegistry reg = getServiceRegistry();
185         Service hello = reg.getService(service);
186         
187         return hello.getWSDLWriter();
188     }
189     
190     protected XFire getXFire() throws Exception
191     {
192         return (XFire) lookup( XFire.ROLE );
193     }
194     
195     protected ServiceRegistry getServiceRegistry() throws Exception
196     {
197         return getXFire().getServiceRegistry();
198     }
199 }