You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by di...@apache.org on 2007/01/14 03:59:41 UTC

svn commit: r496024 - in /geronimo/server/trunk/modules: geronimo-axis/src/test/java/org/apache/geronimo/axis/ geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/ geronimo-tomcat6/src/main/j...

Author: dims
Date: Sat Jan 13 18:59:40 2007
New Revision: 496024

URL: http://svn.apache.org/viewvc?view=rev&rev=496024
Log:
borrow some code from Axis2's transport package and get it to compile (needs a lot of work!)

Modified:
    geronimo/server/trunk/modules/geronimo-axis/src/test/java/org/apache/geronimo/axis/AxisRequest.java
    geronimo/server/trunk/modules/geronimo-axis/src/test/java/org/apache/geronimo/axis/AxisWebServiceContainerTest.java
    geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java
    geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyEJBWebServiceContext.java
    geronimo/server/trunk/modules/geronimo-tomcat6/src/main/java/org/apache/geronimo/tomcat/TomcatEJBWebServiceContext.java
    geronimo/server/trunk/modules/geronimo-webservices/src/main/java/org/apache/geronimo/webservices/WebServiceContainer.java
    geronimo/server/trunk/modules/geronimo-webservices/src/main/java/org/apache/geronimo/webservices/WebServiceContainerInvoker.java

Modified: geronimo/server/trunk/modules/geronimo-axis/src/test/java/org/apache/geronimo/axis/AxisRequest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-axis/src/test/java/org/apache/geronimo/axis/AxisRequest.java?view=diff&rev=496024&r1=496023&r2=496024
==============================================================================
--- geronimo/server/trunk/modules/geronimo-axis/src/test/java/org/apache/geronimo/axis/AxisRequest.java (original)
+++ geronimo/server/trunk/modules/geronimo-axis/src/test/java/org/apache/geronimo/axis/AxisRequest.java Sat Jan 13 18:59:40 2007
@@ -32,6 +32,7 @@
     private URI uri;
     private Map headers;
     private Map attributes;
+    private String remoteAddress;
 
     /**
      * 
@@ -43,7 +44,8 @@
         int method,
         Map parameters,
         URI uri,
-        Map headers) {
+        Map headers,
+        String remoteAddress) {
         this.contentType = contentType;
         this.in = in;
         this.method = method;
@@ -51,6 +53,7 @@
         this.uri = uri;
         this.headers = headers;
         this.attributes = new HashMap();
+        this.remoteAddress = remoteAddress;
     }
 
     public int getContentLength() {
@@ -91,5 +94,9 @@
 
     public void setAttribute(String name, Object value){
         attributes.put(name, value);
+    }
+
+    public String getRemoteAddr() {
+
     }
 }

Modified: geronimo/server/trunk/modules/geronimo-axis/src/test/java/org/apache/geronimo/axis/AxisWebServiceContainerTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-axis/src/test/java/org/apache/geronimo/axis/AxisWebServiceContainerTest.java?view=diff&rev=496024&r1=496023&r2=496024
==============================================================================
--- geronimo/server/trunk/modules/geronimo-axis/src/test/java/org/apache/geronimo/axis/AxisWebServiceContainerTest.java (original)
+++ geronimo/server/trunk/modules/geronimo-axis/src/test/java/org/apache/geronimo/axis/AxisWebServiceContainerTest.java Sat Jan 13 18:59:40 2007
@@ -113,7 +113,8 @@
                     0,
                     new HashMap(),
                     location,
-                    new HashMap());
+                    new HashMap(),
+                    "127.0.0.1");
             
             ByteArrayOutputStream out = new ByteArrayOutputStream();
             AxisResponse res = new AxisResponse("text/xml; charset=utf-8", "127.0.0.1", null, null, 8080, out);

Modified: geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java?view=diff&rev=496024&r1=496023&r2=496024
==============================================================================
--- geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java (original)
+++ geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java Sat Jan 13 18:59:40 2007
@@ -17,41 +17,316 @@
 
 package org.apache.geronimo.axis2;
 
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
+import org.apache.axis2.addressing.AddressingHelper;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.context.ConfigurationContextFactory;
 import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.OperationContext;
 import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.TransportInDescription;
+import org.apache.axis2.description.TransportOutDescription;
+import org.apache.axis2.engine.AxisEngine;
 import org.apache.axis2.rpc.receivers.RPCMessageReceiver;
-import org.apache.axis2.transport.http.SimpleHTTPServer;
+import org.apache.axis2.transport.http.HTTPConstants;
+import org.apache.axis2.transport.http.HTTPTransportReceiver;
+import org.apache.axis2.transport.http.HTTPTransportUtils;
+import org.apache.axis2.transport.http.server.HttpUtils;
+import org.apache.axis2.transport.OutTransportInfo;
+import org.apache.axis2.util.UUIDGenerator;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.geronimo.webservices.WebServiceContainer;
+import org.apache.ws.commons.schema.XmlSchema;
+
+import javax.xml.namespace.QName;
+import java.io.PrintWriter;
+import java.net.SocketException;
+import java.util.HashMap;
+import java.util.Map;
 
 
 public class Axis2WebServiceContainer implements WebServiceContainer {
 
+    private static final Log LOG = LogFactory.getLog(Axis2WebServiceContainer.class);
+
     public static final String REQUEST = Axis2WebServiceContainer.class.getName() + "@Request";
     public static final String RESPONSE = Axis2WebServiceContainer.class.getName() + "@Response";
 
     private transient final ClassLoader classLoader;
     private final String endpointClassName;
     private final PortInfo portInfo;
+    ConfigurationContext configurationContext = ConfigurationContextFactory.createEmptyConfigurationContext();
 
     public Axis2WebServiceContainer(PortInfo portInfo, String endpointClassName, ClassLoader classLoader) {
         this.classLoader = classLoader;
         this.endpointClassName = endpointClassName;
         this.portInfo = portInfo;
+        try {
+            AxisService service = AxisService.createService(endpointClassName, configurationContext.getAxisConfiguration(), RPCMessageReceiver.class);
+            configurationContext.getAxisConfiguration().addService(service);
+        } catch (AxisFault af) {
+            throw new RuntimeException(af);
+        }
     }
 
     public void getWsdl(Request request, Response response) throws Exception {
-        //TODO: Implement the logic
+        doService(request, response);
     }
 
-    public void invoke(Request req, Response res) throws Exception {
-        ConfigurationContext configContext = ConfigurationContextFactory.createEmptyConfigurationContext();
+    public void invoke(Request request, Response response) throws Exception {
+        doService(request, response);
+    }
+
+    protected void doService(final Request request, final Response response)
+            throws Exception {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Target URI: " + request.getURI());
+        }
+
+        MessageContext msgContext = new MessageContext();
+        msgContext.setIncomingTransportName(Constants.TRANSPORT_HTTP);
+        msgContext.setProperty(MessageContext.REMOTE_ADDR, request.getRemoteAddr());
+
+        try {
+            TransportOutDescription transportOut = this.configurationContext.getAxisConfiguration()
+                    .getTransportOut(new QName(Constants.TRANSPORT_HTTP));
+            TransportInDescription transportIn = this.configurationContext.getAxisConfiguration()
+                    .getTransportIn(new QName(Constants.TRANSPORT_HTTP));
+
+            msgContext.setConfigurationContext(this.configurationContext);
+
+            //TODO: Port this segment for session support.
+//            String sessionKey = (String) this.httpcontext.getAttribute(HTTPConstants.COOKIE_STRING);
+//            if (this.configurationContext.getAxisConfiguration().isManageTransportSession()) {
+//                SessionContext sessionContext = this.sessionManager.getSessionContext(sessionKey);
+//                msgContext.setSessionContext(sessionContext);
+//            }
+            msgContext.setTransportIn(transportIn);
+            msgContext.setTransportOut(transportOut);
+            msgContext.setServiceGroupContextId(UUIDGenerator.getUUID());
+            msgContext.setServerSide(true);
+
+//            // set the transport Headers
+//            HashMap headerMap = new HashMap();
+//            for (Iterator it = request.headerIterator(); it.hasNext();) {
+//                Header header = (Header) it.next();
+//                headerMap.put(header.getName(), header.getValue());
+//            }
+//            msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, headerMap);
+//
+//            this.httpcontext.setAttribute(AxisParams.MESSAGE_CONTEXT, msgContext);
 
-        //TODO: Change the Message Reciever to JAXWSMessageReciever
-        AxisService service = AxisService.createService(endpointClassName, configContext.getAxisConfiguration(), RPCMessageReceiver.class);
-        configContext.getAxisConfiguration().addService(service);
+            doService2(request, response, msgContext);
+        } catch (Throwable e) {
+            try {
+                AxisEngine engine = new AxisEngine(this.configurationContext);
+
+                msgContext.setProperty(MessageContext.TRANSPORT_OUT, response.getOutputStream());
+                msgContext.setProperty(Constants.OUT_TRANSPORT_INFO, new Axis2TransportInfo(response));
+
+                MessageContext faultContext = engine.createFaultMessageContext(msgContext, e);
+                // If the fault is not going along the back channel we should be 202ing
+                if (AddressingHelper.isFaultRedirected(msgContext)) {
+                    response.setStatusCode(202);
+                } else {
+                    response.setStatusCode(500);
+                }
+                engine.sendFault(faultContext);
+            } catch (Exception ex) {
+                if (AddressingHelper.isFaultRedirected(msgContext)) {
+                    response.setStatusCode(202);
+                } else {
+                    response.setStatusCode(500);
+                    String msg = ex.getMessage();
+                    if (msg == null || msg.trim().length() == 0) {
+                        msg = "Exception message unknown";
+                    }
+                    response.setHeader(HTTPConstants.HEADER_CONTENT_TYPE, "text/plain");
+                    PrintWriter pw = new PrintWriter(response.getOutputStream());
+                    pw.write(msg);
+                    pw.flush();
+                }
+            }
+        }
 
-        // TODO: Lot's more to be done here.
     }
+
+    public void doService2(
+            final Request request,
+            final Response response,
+            final MessageContext msgContext) throws Exception {
+
+        ConfigurationContext configurationContext = msgContext.getConfigurationContext();
+        final String servicePath = configurationContext.getServiceContextPath();
+        final String contextPath = (servicePath.startsWith("/") ? servicePath : "/" + servicePath) + "/";
+
+        String uri = request.getURI().toString();
+        String soapAction = request.getHeader(HTTPConstants.HEADER_SOAP_ACTION);
+
+        // TODO: Port this section
+//        // Adjust version and content chunking based on the config
+//        boolean chunked = false;
+//        TransportOutDescription transportOut = msgContext.getTransportOut();
+//        if (transportOut != null) {
+//            Parameter p = transportOut.getParameter(HTTPConstants.PROTOCOL_VERSION);
+//            if (p != null) {
+//                if (HTTPConstants.HEADER_PROTOCOL_10.equals(p.getValue())) {
+//                    ver = HttpVersion.HTTP_1_0;
+//                }
+//            }
+//            if (ver.greaterEquals(HttpVersion.HTTP_1_1)) {
+//                p = transportOut.getParameter(HTTPConstants.HEADER_TRANSFER_ENCODING);
+//                if (p != null) {
+//                    if (HTTPConstants.HEADER_TRANSFER_ENCODING_CHUNKED.equals(p.getValue())) {
+//                        chunked = true;
+//                    }
+//                }
+//            }
+//        }
+
+        if (request.getMethod() == Request.GET) {
+            if (!uri.startsWith(contextPath)) {
+                response.setStatusCode(301);
+                response.setHeader("Location", contextPath);
+                return;
+            }
+            if (uri.indexOf("?") < 0) {
+                if (!uri.endsWith(contextPath)) {
+                    String serviceName = uri.replaceAll(contextPath, "");
+                    if (serviceName.indexOf("/") < 0) {
+                        String res = HTTPTransportReceiver.printServiceHTML(serviceName, configurationContext);
+                        PrintWriter pw = new PrintWriter(response.getOutputStream());
+                        pw.write(res);
+                        return;
+                    }
+                }
+            }
+            if (uri.endsWith("?wsdl2")) {
+                String serviceName = uri.substring(uri.lastIndexOf("/") + 1, uri.length() - 6);
+                HashMap services = configurationContext.getAxisConfiguration().getServices();
+                final AxisService service = (AxisService) services.get(serviceName);
+                if (service != null) {
+                    final String ip = HttpUtils.getIpAddress();
+                    service.printWSDL2(response.getOutputStream(), ip, servicePath);
+                    return;
+                }
+            }
+            if (uri.endsWith("?wsdl")) {
+                String serviceName = uri.substring(uri.lastIndexOf("/") + 1, uri.length() - 5);
+                HashMap services = configurationContext.getAxisConfiguration().getServices();
+                final AxisService service = (AxisService) services.get(serviceName);
+                if (service != null) {
+                    final String ip = HttpUtils.getIpAddress();
+                    service.printWSDL(response.getOutputStream(), ip, servicePath);
+                    return;
+                }
+            }
+            if (uri.endsWith("?xsd")) {
+                String serviceName = uri.substring(uri.lastIndexOf("/") + 1, uri.length() - 4);
+                HashMap services = configurationContext.getAxisConfiguration().getServices();
+                final AxisService service = (AxisService) services.get(serviceName);
+                if (service != null) {
+                    service.printSchema(response.getOutputStream());
+                    return;
+                }
+            }
+            //cater for named xsds - check for the xsd name
+            if (uri.indexOf("?xsd=") > 0) {
+                String serviceName = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("?xsd="));
+                String schemaName = uri.substring(uri.lastIndexOf("=") + 1);
+
+                HashMap services = configurationContext.getAxisConfiguration().getServices();
+                AxisService service = (AxisService) services.get(serviceName);
+                if (service != null) {
+                    //run the population logic just to be sure
+                    service.populateSchemaMappings();
+                    //write out the correct schema
+                    Map schemaTable = service.getSchemaMappingTable();
+                    final XmlSchema schema = (XmlSchema) schemaTable.get(schemaName);
+                    //schema found - write it to the stream
+                    if (schema != null) {
+                        schema.write(response.getOutputStream());
+                        return;
+                    } else {
+                        // no schema available by that name  - send 404
+                        response.setStatusCode(404);
+                        return;
+                    }
+                }
+            }
+
+            msgContext.setProperty(MessageContext.TRANSPORT_OUT, response.getOutputStream());
+            msgContext.setProperty(Constants.OUT_TRANSPORT_INFO, new Axis2TransportInfo(response));
+
+            // deal with GET request
+            boolean processed = HTTPTransportUtils.processHTTPGetRequest(
+                    msgContext,
+                    response.getOutputStream(),
+                    soapAction,
+                    uri,
+                    configurationContext,
+                    HTTPTransportReceiver.getGetRequestParameters(uri));
+
+            if (!processed) {
+                response.setStatusCode(200);
+                String s = HTTPTransportReceiver.getServicesHTML(configurationContext);
+                PrintWriter pw = new PrintWriter(response.getOutputStream());
+                pw.write(s);
+                pw.flush();
+            }
+
+        } else if (request.getMethod() == Request.POST) {
+            // deal with POST request
+
+            msgContext.setProperty(MessageContext.TRANSPORT_OUT, response.getOutputStream());
+            msgContext.setProperty(Constants.OUT_TRANSPORT_INFO, response.getOutputStream());
+
+            String contenttype = request.getHeader(HTTPConstants.HEADER_CONTENT_TYPE);
+            HTTPTransportUtils.processHTTPPostRequest(
+                    msgContext,
+                    request.getInputStream(),
+                    response.getOutputStream(),
+                    contenttype,
+                    soapAction,
+                    uri);
+
+        } else {
+            throw new UnsupportedOperationException("[" + request.getMethod() + " ] method not supported");
+        }
+
+        // Finalize response
+        OperationContext operationContext = msgContext.getOperationContext();
+        Object contextWritten = null;
+        Object isTwoChannel = null;
+        if (operationContext != null) {
+            contextWritten = operationContext.getProperty(Constants.RESPONSE_WRITTEN);
+            isTwoChannel = operationContext.getProperty(Constants.DIFFERENT_EPR);
+        }
+
+
+        if ((contextWritten != null) && Constants.VALUE_TRUE.equals(contextWritten)) {
+            if ((isTwoChannel != null) && Constants.VALUE_TRUE.equals(isTwoChannel)) {
+                response.setStatusCode(202);
+                return;
+            }
+            response.setStatusCode(202);
+        } else {
+            response.setStatusCode(202);
+        }
+    }
+
+    public class Axis2TransportInfo implements OutTransportInfo {
+        private Response response;
+
+        public Axis2TransportInfo(Response response) {
+            this.response = response;
+        }
+
+        public void setContentType(String contentType) {
+            response.setHeader(HTTPConstants.HEADER_CONTENT_TYPE, contentType);
+        }
+    }
+
 }

Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyEJBWebServiceContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyEJBWebServiceContext.java?view=diff&rev=496024&r1=496023&r2=496024
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyEJBWebServiceContext.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyEJBWebServiceContext.java Sat Jan 13 18:59:40 2007
@@ -259,6 +259,9 @@
             request.setAttribute(name, value);
         }
 
+        public String getRemoteAddr() {
+            return request.getRemoteAddr();
+        }
 
         private static final Map methods = new HashMap();
 

Modified: geronimo/server/trunk/modules/geronimo-tomcat6/src/main/java/org/apache/geronimo/tomcat/TomcatEJBWebServiceContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-tomcat6/src/main/java/org/apache/geronimo/tomcat/TomcatEJBWebServiceContext.java?view=diff&rev=496024&r1=496023&r2=496024
==============================================================================
--- geronimo/server/trunk/modules/geronimo-tomcat6/src/main/java/org/apache/geronimo/tomcat/TomcatEJBWebServiceContext.java (original)
+++ geronimo/server/trunk/modules/geronimo-tomcat6/src/main/java/org/apache/geronimo/tomcat/TomcatEJBWebServiceContext.java Sat Jan 13 18:59:40 2007
@@ -227,6 +227,9 @@
             request.setAttribute(name, value);
         }
 
+        public String getRemoteAddr() {
+            return request.getRemoteAddr();
+        }
 
         private static final Map methods = new HashMap();
 

Modified: geronimo/server/trunk/modules/geronimo-webservices/src/main/java/org/apache/geronimo/webservices/WebServiceContainer.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-webservices/src/main/java/org/apache/geronimo/webservices/WebServiceContainer.java?view=diff&rev=496024&r1=496023&r2=496024
==============================================================================
--- geronimo/server/trunk/modules/geronimo-webservices/src/main/java/org/apache/geronimo/webservices/WebServiceContainer.java (original)
+++ geronimo/server/trunk/modules/geronimo-webservices/src/main/java/org/apache/geronimo/webservices/WebServiceContainer.java Sat Jan 13 18:59:40 2007
@@ -112,6 +112,8 @@
         Object getAttribute(String name);
 
         void setAttribute(String name, Object value);
+
+        java.lang.String getRemoteAddr();
     }
 
     public interface Response {

Modified: geronimo/server/trunk/modules/geronimo-webservices/src/main/java/org/apache/geronimo/webservices/WebServiceContainerInvoker.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-webservices/src/main/java/org/apache/geronimo/webservices/WebServiceContainerInvoker.java?view=diff&rev=496024&r1=496023&r2=496024
==============================================================================
--- geronimo/server/trunk/modules/geronimo-webservices/src/main/java/org/apache/geronimo/webservices/WebServiceContainerInvoker.java (original)
+++ geronimo/server/trunk/modules/geronimo-webservices/src/main/java/org/apache/geronimo/webservices/WebServiceContainerInvoker.java Sat Jan 13 18:59:40 2007
@@ -159,6 +159,10 @@
             request.setAttribute(s, o);
         }
 
+        public String getRemoteAddr() {
+            return request.getRemoteAddr();
+        }
+
     }
 
     private static class ResponseAdapter implements WebServiceContainer.Response {