dblevins 2005/02/02 19:07:59
Modified: modules/core/src/test/org/openejb/server/soap
WSContainerTest.java
Log:
Revising the WSContainer to better support rpc/encoded strictly against a
lightweight WSDL->Java mapping.
Added validation for lightweigth mappings.
Added ability to download the WSDL via http://foobar.com/someservice?wsdl
Revision Changes Path
1.3 +233 -53
openejb/modules/core/src/test/org/openejb/server/soap/WSContainerTest.java
Index: WSContainerTest.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/test/org/openejb/server/soap/WSContainerTest.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- WSContainerTest.java 12 Jan 2005 04:58:39 -0000 1.2
+++ WSContainerTest.java 3 Feb 2005 00:07:59 -0000 1.3
@@ -44,12 +44,21 @@
*/
package org.openejb.server.soap;
-import java.io.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URI;
import java.net.URL;
import javax.management.ObjectName;
+import javax.wsdl.Definition;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
import junit.framework.TestCase;
import org.apache.geronimo.gbean.GBeanData;
@@ -61,64 +70,177 @@
import org.apache.geronimo.kernel.jmx.JMXUtil;
import org.apache.geronimo.kernel.management.State;
import org.codehaus.xfire.MessageContext;
-import org.openejb.EJBContainer;
import org.openejb.server.StandardServiceStackGBean;
import org.openejb.server.httpd.HttpListener;
import org.openejb.server.httpd.HttpRequest;
import org.openejb.server.httpd.HttpResponse;
import org.openejb.server.httpd.HttpServerGBean;
import org.openejb.slsb.MockEJBContainer;
+import org.openejb.slsb.MockEJBContainerGBean;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
public class WSContainerTest extends TestCase {
WSContainer wsContainer;
// static {
-// BasicConfigurator.configure();
+// org.apache.log4j.BasicConfigurator.configure();
// }
- public void testWSContainer() throws Exception {
- EJBContainer ejbContainer = new MockEJBContainer();
- WSContainer container = new WSContainer(ejbContainer, null, null,
"urn:testing", "encoded", "rpc");
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- PrintStream out = new PrintStream(baos);
- out.print("<soap:Envelope\n" +
- "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"\n"
+
- "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
- "xmlns:ns=\"urn:testing\"\n" +
-
"soap:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" >\n" +
- "<Body>\n" +
- "<ns:intMethodRequest>\n" +
- "<ns:in0 xsi:type=\"int\">126</ns:in0>\n" +
- "</ns:intMethodRequest>\n" +
- "</Body>\n" +
- "</soap:Envelope>");
- out.flush();
- out.close();
-
- ByteArrayInputStream in = new
ByteArrayInputStream(baos.toByteArray());
- baos.reset();
-
- baos = new ByteArrayOutputStream();
- MessageContext context = new MessageContext("not-used", null, baos,
null, "/test/web/service");
- context.setRequestStream(in);
- container.invoke(context);
- String response = new String(baos.toByteArray());
- assertTrue(response.indexOf(("<out>127</out>")) > 0);
+// public void testWSContainer() throws Exception {
+// EJBContainer ejbContainer = new MockEJBContainer();
+// WSContainer container = new WSContainer(ejbContainer, null, null,
"urn:testing", "encoded", "rpc");
+//
+// ByteArrayOutputStream baos = new ByteArrayOutputStream();
+// PrintStream out = new PrintStream(baos);
+// out.print("<soap:Envelope\n" +
+//
"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"\n" +
+//
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+// "xmlns:ns=\"urn:testing\"\n" +
+//
"soap:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" >\n" +
+// "<Body>\n" +
+// "<ns:intMethodRequest>\n" +
+// "<ns:in0 xsi:type=\"int\">126</ns:in0>\n" +
+// "</ns:intMethodRequest>\n" +
+// "</Body>\n" +
+// "</soap:Envelope>");
+// out.flush();
+// out.close();
+//
+// ByteArrayInputStream in = new
ByteArrayInputStream(baos.toByteArray());
+// baos.reset();
+//
+// baos = new ByteArrayOutputStream();
+// MessageContext context = new MessageContext("not-used", null,
baos, null, "/test/web/service");
+// context.setRequestStream(in);
+// container.invoke(context);
+//
+// String result = getResult(new
ByteArrayInputStream(baos.toByteArray()));
+//
+// assertEquals("127", result);
+// }
+//
+// public void testGBeanWSContainerStack() throws Exception {
+// Kernel kernel = new Kernel("wstest");
+// kernel.boot();
+//
+// WSDLReader wsdlReader = WSDLFactory.newInstance().newWSDLReader();
+// wsdlReader.readWSDL(wsdlURL.toExternalForm());
+//
+// ObjectName ejbContainer = MockEJBContainer.addGBean(kernel,
"MockEJB");
+// ObjectName wsContainer = WSContainerGBean.addGBean(kernel,
"HTTPSOAP", ejbContainer, new URI("/test/service"), null, "urn:testing",
"encoded", "rpc");
+// ObjectName listener = TestSoapHttpListener.addGBean(kernel,
"HTTPSOAP", wsContainer);
+// ObjectName server = HttpServerGBean.addGBean(kernel, "HTTPSOAP",
listener);
+// ObjectName stack = StandardServiceStackGBean.addGBean(kernel,
"HTTPSOAP", 0, InetAddress.getByName("localhost"), null, 1, 5, null, null,
server);
+//
+// assertRunning(kernel, ejbContainer);
+// assertRunning(kernel, wsContainer);
+// assertRunning(kernel, listener);
+// assertRunning(kernel, server);
+// assertRunning(kernel, stack);
+//
+// HttpURLConnection connection = null;
+//
+// try {
+// kernel.setAttribute(stack, "soTimeout", new Integer(1000));
+// int port = ((Integer) kernel.getAttribute(stack,
"port")).intValue();
+// URL url = new URL("http://localhost:" + port +
"/this/should/hit/something");
+//
+// connection = (HttpURLConnection) url.openConnection();
+// connection.setDoOutput(true);
+// connection.setRequestProperty("Content-Type", "text/xml");
+// PrintStream out = new
PrintStream(connection.getOutputStream());
+// out.print("<soap:Envelope\n" +
+//
"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"\n" +
+//
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+// "xmlns:ns=\"urn:testing\"\n" +
+//
"soap:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" >\n" +
+// "<Body>\n" +
+// "<ns:intMethodRequest>\n" +
+// "<ns:in0 xsi:type=\"int\">126</ns:in0>\n" +
+// "</ns:intMethodRequest>\n" +
+// "</Body>\n" +
+// "</soap:Envelope>");
+// out.flush();
+// out.close();
+//
+// String result = getResult(connection.getInputStream());
+//
+// assertEquals("127", result);
+//
+// } catch (Exception e) {
+// fail(e.getMessage());
+// } finally {
+// connection.disconnect();
+// kernel.stopGBean(stack);
+// kernel.shutdown();
+// }
+// }
+
+ private Definition getDefinition(URL wsdlURL) throws Exception {
+ WSDLReader wsdlReader = WSDLFactory.newInstance().newWSDLReader();
+ return wsdlReader.readWSDL(wsdlURL.toExternalForm());
}
- public void testGBeanWSContainerStack() throws Exception {
+ public void testGetWSDL() throws Exception {
Kernel kernel = new Kernel("wstest");
kernel.boot();
+ URL wsdlURL = new
File("target/test-ejb-jar/META-INF/wsdl/test-ejb.wsdl").toURL();
+
+
ObjectName ejbContainer = MockEJBContainer.addGBean(kernel,
"MockEJB");
- ObjectName wsContainer = WSContainerGBean.addGBean(kernel,
"HTTPSOAP", ejbContainer, new URI("/test/service"), null, "urn:testing",
"encoded", "rpc");
- ObjectName listener = TestSoapHttpListener.addGBean(kernel,
"HTTPSOAP", wsContainer);
+ ObjectName wsContainer = WSContainerGBean.addGBean(kernel,
"HTTPSOAP", ejbContainer, getDefinition(wsdlURL), new URI("/test/service"),
wsdlURL, "urn:testing", "encoded", "rpc");
+ ObjectName index = WSContainerIndexGBean.addGBean(kernel,
"HTTPSOAP", wsContainer);
+ ObjectName listener = SoapHttpListenerGBean.addGBean(kernel,
"HTTPSOAP", index);
ObjectName server = HttpServerGBean.addGBean(kernel, "HTTPSOAP",
listener);
ObjectName stack = StandardServiceStackGBean.addGBean(kernel,
"HTTPSOAP", 0, InetAddress.getByName("localhost"), null, 1, 5, null, null,
server);
assertRunning(kernel, ejbContainer);
assertRunning(kernel, wsContainer);
+ assertRunning(kernel, index);
+ assertRunning(kernel, listener);
+ assertRunning(kernel, server);
+ assertRunning(kernel, stack);
+
+ InputStream in = null;
+ try {
+ kernel.setAttribute(stack, "soTimeout", new Integer(1000));
+ int port = ((Integer) kernel.getAttribute(stack,
"port")).intValue();
+ URL url = new URL("http://localhost:" + port +
"/test/service?wsdl");
+ in = url.openStream();
+
+ WSDLReader wsdlReader =
WSDLFactory.newInstance().newWSDLReader();
+ Definition definition = wsdlReader.readWSDL(null, new
InputSource(in));
+
+ assertNotNull(definition);
+
+ } catch (Exception e) {
+ fail(e.getMessage());
+ } finally {
+ in.close();
+ kernel.stopGBean(stack);
+ kernel.shutdown();
+ }
+ }
+
+ public void testAxisStyleMessage() throws Exception {
+ Kernel kernel = new Kernel("wstest");
+ kernel.boot();
+
+ URL wsdlURL = new
File("target/test-ejb-jar/META-INF/wsdl/test-ejb.wsdl").toURL();
+
+ ObjectName ejbContainer = MockEJBContainerGBean.addGBean(kernel, new
File("target/test-ejb-jar").toURL(), "SimpleEJB",
"org.openejb.test.simple.slsb.SimpleStatelessSessionEJB",
"org.openejb.test.simple.slsb.SimpleStatelessSessionHome",
"org.openejb.test.simple.slsb.SimpleStatelessSession",
"org.openejb.test.simple.slsb.SimpleStatelessSessionLocalHome",
"org.openejb.test.simple.slsb.SimpleStatelessSessionLocal",
"org.openejb.test.simple.slsb.SimpleStatelessSessionEndpoint");
+ ObjectName wsContainer = WSContainerGBean.addGBean(kernel,
"HTTPSOAP", ejbContainer, getDefinition(wsdlURL), new URI("/services/Simple"),
wsdlURL, "urn:testing", "encoded", "rpc");
+ ObjectName index = WSContainerIndexGBean.addGBean(kernel,
"HTTPSOAP", wsContainer);
+ ObjectName listener = SoapHttpListenerGBean.addGBean(kernel,
"HTTPSOAP", index);
+ ObjectName server = HttpServerGBean.addGBean(kernel, "HTTPSOAP",
listener);
+ ObjectName stack = StandardServiceStackGBean.addGBean(kernel,
"HTTPSOAP", 0, InetAddress.getByName("localhost"), null, 1, 5, null, null,
server);
+
+ assertRunning(kernel, ejbContainer);
+ assertRunning(kernel, wsContainer);
+ assertRunning(kernel, index);
assertRunning(kernel, listener);
assertRunning(kernel, server);
assertRunning(kernel, stack);
@@ -128,31 +250,30 @@
try {
kernel.setAttribute(stack, "soTimeout", new Integer(1000));
int port = ((Integer) kernel.getAttribute(stack,
"port")).intValue();
- URL url = new URL("http://localhost:" + port +
"/this/should/hit/something");
+ URL url = new URL("http://localhost:" + port +
"/services/Simple");
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "text/xml");
PrintStream out = new PrintStream(connection.getOutputStream());
- out.print("<soap:Envelope\n" +
-
"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"\n" +
-
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
- "xmlns:ns=\"urn:testing\"\n" +
-
"soap:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" >\n" +
- "<Body>\n" +
- "<ns:intMethodRequest>\n" +
- "<ns:in0 xsi:type=\"int\">126</ns:in0>\n" +
- "</ns:intMethodRequest>\n" +
- "</Body>\n" +
- "</soap:Envelope>");
+ out.print("<soapenv:Envelope\n" +
+ "
xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"\n" +
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" +
+ "
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
+ "<soapenv:Body>\n" +
+ "<ns1:echo
soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"\n" +
+ "
xmlns:ns1=\"http://openejb.org/test-ejb-jar\">\n" +
+ "<String_1 xsi:type=\"xsd:string\">hello</String_1>\n" +
+ "</ns1:echo>\n" +
+ "</soapenv:Body>\n" +
+ "</soapenv:Envelope>");
out.flush();
out.close();
- byte[] bytes = new byte[connection.getContentLength()];
- DataInputStream in = new
DataInputStream(connection.getInputStream());
- in.readFully(bytes);
- String response = new String(bytes);
- assertTrue(response.indexOf(("<out>127</out>")) > 0);
+ String result = getResult(connection.getInputStream());
+
+ assertEquals("hello", result);
+
} catch (Exception e) {
fail(e.getMessage());
} finally {
@@ -162,6 +283,50 @@
}
}
+// public void testAxisClient() throws Exception {
+// Kernel kernel = new Kernel("wstest");
+// kernel.boot();
+//
+// URL wsdlURL = new
File("target/test-ejb-jar/META-INF/wsdl/test-ejb.wsdl").toURL();
+//
+// ObjectName ejbContainer = MockEJBContainerGBean.addGBean(kernel,
new File("target/test-ejb-jar").toURL(), "SimpleEJB",
"org.openejb.test.simple.slsb.SimpleStatelessSessionEJB",
"org.openejb.test.simple.slsb.SimpleStatelessSessionHome",
"org.openejb.test.simple.slsb.SimpleStatelessSession",
"org.openejb.test.simple.slsb.SimpleStatelessSessionLocalHome",
"org.openejb.test.simple.slsb.SimpleStatelessSessionLocal",
"org.openejb.test.simple.slsb.SimpleStatelessSessionEndpoint" );
+// ObjectName wsContainer = WSContainerGBean.addGBean(kernel,
"HTTPSOAP", ejbContainer, getDefinition(wsdlURL), new URI("/services/Simple"),
wsdlURL, "urn:testing", "encoded", "rpc");
+// ObjectName index = WSContainerIndexGBean.addGBean(kernel,
"HTTPSOAP", wsContainer);
+// ObjectName listener = SoapHttpListenerGBean.addGBean(kernel,
"HTTPSOAP", index);
+// ObjectName server = HttpServerGBean.addGBean(kernel, "HTTPSOAP",
listener);
+// int port = 8000;
+// ObjectName stack = StandardServiceStackGBean.addGBean(kernel,
"HTTPSOAP", port, InetAddress.getByName("localhost"), null, 1, 5, null, null,
server);
+//
+// assertRunning(kernel, ejbContainer);
+// assertRunning(kernel, wsContainer);
+// assertRunning(kernel, index);
+// assertRunning(kernel, listener);
+// assertRunning(kernel, server);
+// assertRunning(kernel, stack);
+//
+// try {
+// kernel.setAttribute(stack, "soTimeout", new Integer(1000));
+// URL wsdl = new URL("http://localhost:" + port +
"/services/Simple?wsdl");
+//
+// String namespaceURI = "http://openejb.org/test-ejb-jar";
+// Service service = new org.apache.axis.client.Service(wsdl, new
QName(namespaceURI,"SimpleService"));
+//
+// QName portName = new QName(namespaceURI, "SimplePort");
+// QName operationName = new QName(namespaceURI, "echo");
+//
+// Call call = service.createCall(portName, operationName);
+// Object[] inputParams = new Object[]{"hello"};
+// String result = (String) call.invoke(inputParams);
+// System.out.println("result = " + result);
+// } catch (Exception e) {
+// e.printStackTrace();
+// fail(e.getMessage());
+// } finally {
+// kernel.stopGBean(stack);
+// kernel.shutdown();
+// }
+// }
+
private void assertRunning(Kernel kernel, ObjectName objectName) throws
Exception {
int state = ((Integer) kernel.getAttribute(objectName,
"state")).intValue();
assertEquals("should be running: " + objectName,
State.RUNNING_INDEX, state);
@@ -218,4 +383,19 @@
}
}
+ private String getResult(InputStream responseStream) throws
ParserConfigurationException, SAXException, IOException {
+ SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
+ SAXParser saxParser = saxParserFactory.newSAXParser();
+ TestHandler handler = new TestHandler();
+ saxParser.parse(responseStream, handler);
+ return handler.result;
+ }
+
+ private static class TestHandler extends DefaultHandler {
+ String result;
+
+ public void characters(char ch[], int start, int length) throws
SAXException {
+ result = new String(ch, start, length);
+ }
+ }
}