You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by db...@apache.org on 2005/04/05 09:58:47 UTC

svn commit: r160139 - in geronimo/trunk/modules: axis/src/java/org/apache/geronimo/axis/server/ axis/src/test/org/apache/geronimo/axis/ jetty/src/java/org/apache/geronimo/jetty/ webservices/src/java/org/apache/geronimo/webservices/

Author: dblevins
Date: Tue Apr  5 00:58:42 2005
New Revision: 160139

URL: http://svn.apache.org/viewcvs?view=rev&rev=160139
Log:
Rewritten POJO WebService implementation including ServiceLifecycle support.

Added:
    geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/POJOWebServiceServlet.java
    geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/ServiceLifecycleManager.java
    geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/WebServiceContainerInvoker.java
Modified:
    geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/server/AxisWebServiceContainer.java
    geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/server/POJOProvider.java
    geronimo/trunk/modules/axis/src/test/org/apache/geronimo/axis/AxisRequest.java
    geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyEJBWebServiceContext.java
    geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyPOJOWebServiceHolder.java

Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/server/AxisWebServiceContainer.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/server/AxisWebServiceContainer.java?view=diff&r1=160138&r2=160139
==============================================================================
--- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/server/AxisWebServiceContainer.java (original)
+++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/server/AxisWebServiceContainer.java Tue Apr  5 00:58:42 2005
@@ -54,12 +54,16 @@
  * @version $Rev$ $Date$
  */
 public class AxisWebServiceContainer implements WebServiceContainer {
+    public static final String REQUEST = AxisWebServiceContainer.class.getName()+"@Request";
+    public static final String RESPONSE = AxisWebServiceContainer.class.getName()+"@Response";
+
     private static Log log = LogFactory.getLog(AxisWebServiceContainer.class);
 
     public static final String XSD_NS = "http://www.w3.org/2001/XMLSchema";
-    protected final URI location;
-    protected final URL wsdlURL;
-    protected final SOAPService service;  //TODO why did i make these protected?
+
+    private final URI location;
+    private final URL wsdlURL;
+    private final SOAPService service;
     
     private final ClassLoader classLoader;
     private final Byte wsdlMutext = new Byte((byte)0);
@@ -75,6 +79,8 @@
 
     public void invoke(Request req, Response res) throws Exception {
         org.apache.axis.MessageContext context = new org.apache.axis.MessageContext(null);
+        req.setAttribute(MESSAGE_CONTEXT, context);
+
         context.setClassLoader(classLoader);
         
         Message responseMessage = null;
@@ -88,6 +94,8 @@
         context.setProperty(HTTPConstants.MC_HTTP_SERVLETPATHINFO, req.getURI().getPath());
         context.setProperty(org.apache.axis.MessageContext.TRANS_URL, req.getURI().toString());
         context.setService(service);
+        context.setProperty(REQUEST, req);
+        context.setProperty(RESPONSE, res);
 
         try {
             String characterEncoding = (String) requestMessage.getProperty(SOAPMessage.CHARACTER_SET_ENCODING);

Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/server/POJOProvider.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/server/POJOProvider.java?view=diff&r1=160138&r2=160139
==============================================================================
--- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/server/POJOProvider.java (original)
+++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/server/POJOProvider.java Tue Apr  5 00:58:42 2005
@@ -21,18 +21,17 @@
 import org.apache.axis.providers.java.RPCProvider;
 import org.apache.axis.MessageContext;
 import org.apache.axis.Handler;
+import org.apache.geronimo.webservices.WebServiceContainer;
 
 /**
  * @version $Rev$ $Date$
  */
 public class POJOProvider extends RPCProvider {
-    private final Class pojoClass;
-
-    public POJOProvider(Class pojoClass) {
-        this.pojoClass = pojoClass;
+    public POJOProvider() {
     }
 
     public Object getServiceObject(MessageContext msgContext, Handler service, String clsName, IntHolder scopeHolder) throws Exception {
-        return pojoClass.newInstance();
+        WebServiceContainer.Request request = (WebServiceContainer.Request) msgContext.getProperty(AxisWebServiceContainer.REQUEST);
+        return request.getAttribute(WebServiceContainer.POJO_INSTANCE);
     }
 }

Modified: geronimo/trunk/modules/axis/src/test/org/apache/geronimo/axis/AxisRequest.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/test/org/apache/geronimo/axis/AxisRequest.java?view=diff&r1=160138&r2=160139
==============================================================================
--- geronimo/trunk/modules/axis/src/test/org/apache/geronimo/axis/AxisRequest.java (original)
+++ geronimo/trunk/modules/axis/src/test/org/apache/geronimo/axis/AxisRequest.java Tue Apr  5 00:58:42 2005
@@ -3,6 +3,7 @@
 import java.io.InputStream;
 import java.net.URI;
 import java.util.Map;
+import java.util.HashMap;
 
 import org.apache.geronimo.webservices.WebServiceContainer;
 
@@ -14,6 +15,7 @@
     private Map parameters;
     private URI uri;
     private Map headers;
+    private Map attributes;
 
     /**
      * 
@@ -32,6 +34,7 @@
         this.parameters = parameters;
         this.uri = uri;
         this.headers = headers;
+        this.attributes = new HashMap();
     }
 
     public int getContentLength() {
@@ -66,4 +69,11 @@
         return uri;
     }
 
+    public Object getAttribute(String name) {
+        return attributes.get(name);
+    }
+
+    public void setAttribute(String name, Object value){
+        attributes.put(name, value);
+    }
 }

Modified: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyEJBWebServiceContext.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyEJBWebServiceContext.java?view=diff&r1=160138&r2=160139
==============================================================================
--- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyEJBWebServiceContext.java (original)
+++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyEJBWebServiceContext.java Tue Apr  5 00:58:42 2005
@@ -162,6 +162,14 @@
             return request.getParameters();
         }
 
+        public Object getAttribute(String name) {
+            return request.getAttribute(name);
+        }
+
+        public void setAttribute(String name, Object value){
+            request.setAttribute(name, value);
+        }
+
 
         private static final Map methods = new HashMap();
 

Modified: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyPOJOWebServiceHolder.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyPOJOWebServiceHolder.java?view=diff&r1=160138&r2=160139
==============================================================================
--- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyPOJOWebServiceHolder.java (original)
+++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyPOJOWebServiceHolder.java Tue Apr  5 00:58:42 2005
@@ -16,32 +16,25 @@
  */
 package org.apache.geronimo.jetty;
 
-import java.io.*;
+import java.io.IOException;
+import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
-import java.util.Collections;
-import java.security.SignedObject;
-import java.security.PrivateKey;
-import java.security.Signature;
-import java.security.InvalidKeyException;
-import java.security.SignatureException;
-import java.security.PublicKey;
 import javax.security.jacc.PolicyContext;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.UnavailableException;
-import javax.servlet.Servlet;
-import javax.servlet.ServletConfig;
-import javax.crypto.SealedObject;
+import javax.servlet.ServletContext;
 
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
 import org.apache.geronimo.gbean.GBeanLifecycle;
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
-import org.apache.geronimo.webservices.WebServiceContainer;
-import org.apache.geronimo.kernel.ObjectInputStreamExt;
 import org.apache.geronimo.kernel.StoredObject;
+import org.apache.geronimo.webservices.WebServiceContainer;
+import org.apache.geronimo.webservices.POJOWebServiceServlet;
+import org.apache.geronimo.webservices.WebServiceContainerInvoker;
 import org.mortbay.jetty.servlet.ServletHolder;
 import org.mortbay.jetty.servlet.ServletHttpRequest;
 
@@ -53,35 +46,38 @@
  * @version $Rev: 154436 $ $Date: 2005-02-19 10:22:02 -0800 (Sat, 19 Feb 2005) $
  */
 public class JettyPOJOWebServiceHolder extends ServletHolder implements GBeanLifecycle {
-    private WebServiceContainer webServiceContainer;
     private StoredObject storedWebServiceContainer;
-    private ClassLoader webClassLoader;
+    private Set servletMappings;
+    private Map webRoleRefPermissions;
+    private JettyServletRegistration context;
+    private String pojoClassName;
 
     //todo consider interface instead of this constructor for endpoint use.
     public JettyPOJOWebServiceHolder() {
 
     }
 
-    public JettyPOJOWebServiceHolder(String servletName,
-                              Map initParams,
-                              Integer loadOnStartup,
-                              Set servletMappings,
-                              Map webRoleRefPermissions,
-                              StoredObject storedWebServiceContainer,
-                              JettyServletRegistration context) throws Exception {
-        super(context == null? null: context.getServletHandler(), servletName, POJOWebServiceServlet.class.getName(), null);
+    public JettyPOJOWebServiceHolder(String pojoClassName,
+                                     String servletName,
+                                     Map initParams,
+                                     Integer loadOnStartup,
+                                     Set servletMappings,
+                                     Map webRoleRefPermissions,
+                                     StoredObject storedWebServiceContainer,
+                                     JettyServletRegistration context) throws Exception {
+        super(context == null ? null : context.getServletHandler(), servletName, POJOWebServiceServlet.class.getName(), null);
         //context will be null only for use as "default servlet info holder" in deployer.
 
+        this.pojoClassName = pojoClassName;
+        this.context = context;
         this.storedWebServiceContainer = storedWebServiceContainer;
         if (context != null) {
-            this.webClassLoader = context.getWebClassLoader();
             putAll(initParams);
             if (loadOnStartup != null) {
                 setInitOrder(loadOnStartup.intValue());
             }
-            //this now starts the servlet in the appropriate context
-            context.registerServletHolder(this, servletName, servletMappings, webRoleRefPermissions == null? Collections.EMPTY_MAP: webRoleRefPermissions);
-//            start();
+            this.servletMappings = servletMappings;
+            this.webRoleRefPermissions = webRoleRefPermissions == null ? Collections.EMPTY_MAP : webRoleRefPermissions;
         }
     }
 
@@ -100,7 +96,7 @@
             throws ServletException, UnavailableException, IOException {
 
         //  TODO There has to be some way to get this in on the Servlet's init method.
-        request.setAttribute(POJOWebServiceServlet.WEBSERVICE_CONTAINER, webServiceContainer);
+//        request.setAttribute(POJOWebServiceServlet.WEBSERVICE_CONTAINER, webServiceContainer);
 
         JettyServletHolder.currentServletHolder.set(this);
         PolicyContext.setHandlerData(ServletHttpRequest.unwrap(request));
@@ -114,7 +110,8 @@
         GBeanInfoBuilder infoBuilder = new GBeanInfoBuilder(JettyPOJOWebServiceHolder.class, NameFactory.SERVLET_WEB_SERVICE_TEMPLATE);
         //todo replace with interface
         infoBuilder.addInterface(ServletHolder.class);
-        
+
+        infoBuilder.addAttribute("pojoClassName", String.class, true);
         infoBuilder.addAttribute("servletName", String.class, true);
         infoBuilder.addAttribute("initParams", Map.class, true);
         infoBuilder.addAttribute("loadOnStartup", Integer.class, true);
@@ -123,13 +120,14 @@
         infoBuilder.addAttribute("webServiceContainer", StoredObject.class, true);
         infoBuilder.addReference("JettyServletRegistration", JettyServletRegistration.class);
 
-        infoBuilder.setConstructor(new String[] {"servletName",
-                                                 "initParams",
-                                                 "loadOnStartup", 
-                                                 "servletMappings",
-                                                 "webRoleRefPermissions",
-                                                 "webServiceContainer",
-                                                 "JettyServletRegistration"});
+        infoBuilder.setConstructor(new String[]{"pojoClassName",
+                                                "servletName",
+                                                "initParams",
+                                                "loadOnStartup",
+                                                "servletMappings",
+                                                "webRoleRefPermissions",
+                                                "webServiceContainer",
+                                                "JettyServletRegistration"});
 
         GBEAN_INFO = infoBuilder.getBeanInfo();
     }
@@ -139,8 +137,31 @@
     }
 
     public void doStart() throws Exception {
-        if (webClassLoader != null){
-            webServiceContainer = (WebServiceContainer) storedWebServiceContainer.getObject(webClassLoader);
+        if (context != null) {
+
+            Class pojoClass = context.getWebClassLoader().loadClass(pojoClassName);
+            WebServiceContainer webServiceContainer = (WebServiceContainer) storedWebServiceContainer.getObject(context.getWebClassLoader());
+
+            /* DMB: Hack! I really just want to override initServlet and give a reference of the WebServiceContainer to the servlet before we call init on it.
+             * But this will have to do instead....
+             */
+            ServletContext servletContext = this.context.getServletHandler().getServletContext();
+
+            // Make up an ID for the WebServiceContainer
+            // put a reference the ID in the init-params
+            // put the WebServiceContainer in the webapp context keyed by its ID
+            String webServicecontainerID = getServletName() + WebServiceContainerInvoker.WEBSERVICE_CONTAINER + webServiceContainer.hashCode();
+            put(WebServiceContainerInvoker.WEBSERVICE_CONTAINER, webServicecontainerID);
+            servletContext.setAttribute(webServicecontainerID, webServiceContainer);
+
+            // Same for the POJO Class
+            String pojoClassID = getServletName() + POJOWebServiceServlet.POJO_CLASS + pojoClass.hashCode();
+            put(POJOWebServiceServlet.POJO_CLASS, pojoClassID);
+            servletContext.setAttribute(pojoClassID, pojoClass);
+
+            //this now starts the servlet in the appropriate context
+            context.registerServletHolder(this, getServletName(), this.servletMappings, this.webRoleRefPermissions);
+//            start();
         }
     }
 
@@ -149,7 +170,6 @@
 
     public void doFail() {
     }
-
 
 
 }

Added: geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/POJOWebServiceServlet.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/POJOWebServiceServlet.java?view=auto&rev=160139
==============================================================================
--- geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/POJOWebServiceServlet.java (added)
+++ geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/POJOWebServiceServlet.java Tue Apr  5 00:58:42 2005
@@ -0,0 +1,95 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.webservices;
+
+import java.io.IOException;
+import java.security.Principal;
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.xml.rpc.ServiceException;
+import javax.xml.rpc.handler.MessageContext;
+import javax.xml.rpc.server.ServiceLifecycle;
+import javax.xml.rpc.server.ServletEndpointContext;
+
+/**
+ * Delegates requests to a WebServiceContainer which is presumably for a POJO WebService
+ * Nothing stopping us from using this for EJBs or other types of webservices other than
+ * it is more than we need.  EJB webservices use the JettyEJBWebServiceContext.
+ * <p/>
+ * From a 10,000 foot view the Jetty architecture has:
+ * Container -> Context -> Holder -> Servlet
+ * <p/>
+ * A Container has multiple Contexts, typically webapps
+ * A Context provides the JNDI, TX, and Security for the webapp and has many Holders
+ * A Holder simply wraps each Servlet
+ * <p/>
+ * The POJO Web Service architecture on Jetty looks like this:
+ * Container -> WebApp Context -> JettyPOJOWebServiceHolder -> POJOWebServiceServlet
+ * <p/>
+ * The EJB Web Service architecure, on the other hand, creates one Context for each EJB:
+ * Container -> JettyEJBWebServiceContext
+ *
+ * @version $Rev$ $Date$
+ */
+public class POJOWebServiceServlet implements Servlet {
+    public static final String POJO_CLASS = POJOWebServiceServlet.class.getName()+"@pojoClassName";
+    private Servlet stack;
+
+    public void init(ServletConfig config) throws ServletException {
+        ServletContext context = config.getServletContext();
+
+        String pojoClassID = config.getInitParameter(POJO_CLASS);
+        Class pojoClass = (Class) context.getAttribute(pojoClassID);
+
+        Object pojo;
+        try {
+            pojo = pojoClass.newInstance();
+        } catch (Exception e) {
+            throw new ServletException("Unable to instantiate POJO WebService class: " + pojoClass.getName(), e);
+        }
+
+        stack = new WebServiceContainerInvoker(pojo);
+        if (pojo instanceof ServiceLifecycle) {
+            stack = new ServiceLifecycleManager(stack,(ServiceLifecycle)pojo);
+        }
+
+
+        stack.init(config);
+    }
+
+    public ServletConfig getServletConfig() {
+        return stack.getServletConfig();
+    }
+
+    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
+        stack.service(servletRequest, servletResponse);
+    }
+
+    public String getServletInfo() {
+        return stack.getServletInfo();
+    }
+
+    public void destroy() {
+        stack.destroy();
+    }
+}

Added: geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/ServiceLifecycleManager.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/ServiceLifecycleManager.java?view=auto&rev=160139
==============================================================================
--- geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/ServiceLifecycleManager.java (added)
+++ geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/ServiceLifecycleManager.java Tue Apr  5 00:58:42 2005
@@ -0,0 +1,168 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.webservices;
+
+import java.io.IOException;
+import java.security.Principal;
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.xml.rpc.server.ServiceLifecycle;
+import javax.xml.rpc.server.ServletEndpointContext;
+import javax.xml.rpc.ServiceException;
+import javax.xml.rpc.handler.MessageContext;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ServiceLifecycleManager implements Servlet {
+
+    private final ServiceLifecycle managedService;
+    private final Servlet next;
+
+    public ServiceLifecycleManager(Servlet next, ServiceLifecycle managedService) {
+        this.next = next;
+        this.managedService = managedService;
+    }
+
+    public void init(ServletConfig config) throws ServletException {
+        next.init(config);
+        try {
+            managedService.init(new InstanceContext(config.getServletContext()));
+        } catch (ServiceException e) {
+            throw new ServletException("Unable to initialize ServiceEndpoint", e);
+        }
+    }
+
+    public ServletConfig getServletConfig() {
+        return next.getServletConfig();
+    }
+
+    public String getServletInfo() {
+        return next.getServletInfo();
+    }
+
+    public void destroy() {
+        managedService.destroy();
+        next.destroy();
+    }
+
+    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
+        ServletEndpointContext context = getContext();
+        try {
+            endpointContext.set(new InvocationContext((HttpServletRequest) req));
+            next.service(req, res);
+        } finally {
+            endpointContext.set(context);
+        }
+    }
+
+    private static final DefaultContext DEFAULT_CONTEXT = new DefaultContext();
+
+    private static final ThreadLocal endpointContext = new ThreadLocal();
+
+
+    private static ServletEndpointContext getContext() {
+        ServletEndpointContext context = (ServletEndpointContext) endpointContext.get();
+        return context != null ? context : DEFAULT_CONTEXT;
+    }
+
+    static class InstanceContext implements ServletEndpointContext {
+        private final ServletContext servletContext;
+
+        public InstanceContext(ServletContext servletContext) {
+            this.servletContext = servletContext;
+        }
+
+        public MessageContext getMessageContext() {
+            return getContext().getMessageContext();
+        }
+
+        public Principal getUserPrincipal() {
+            return getContext().getUserPrincipal();
+        }
+
+        public HttpSession getHttpSession() {
+            return getContext().getHttpSession();
+        }
+
+        public ServletContext getServletContext() {
+            return servletContext;
+        }
+
+        public boolean isUserInRole(String s) {
+            return getContext().isUserInRole(s);
+        }
+    }
+
+    static class InvocationContext implements ServletEndpointContext {
+
+        private final HttpServletRequest request;
+
+        public InvocationContext(HttpServletRequest request) {
+            this.request = request;
+        }
+
+        public MessageContext getMessageContext() {
+            return (MessageContext) request.getAttribute(WebServiceContainer.MESSAGE_CONTEXT);
+        }
+
+        public Principal getUserPrincipal() {
+            return request.getUserPrincipal();
+        }
+
+        public HttpSession getHttpSession() {
+            return request.getSession();
+        }
+
+        public ServletContext getServletContext() {
+            throw new IllegalAccessError("InstanceContext should never delegate this method.");
+        }
+
+        public boolean isUserInRole(String s) {
+            return request.isUserInRole(s);
+        }
+    }
+
+    static class DefaultContext implements ServletEndpointContext {
+
+        public MessageContext getMessageContext() {
+            throw new IllegalStateException("Method cannot be called outside a request context");
+        }
+
+        public Principal getUserPrincipal() {
+            throw new IllegalStateException("Method cannot be called outside a request context");
+        }
+
+        public HttpSession getHttpSession() {
+            throw new javax.xml.rpc.JAXRPCException("Method cannot be called outside an http request context");
+        }
+
+        public ServletContext getServletContext() {
+            throw new IllegalAccessError("InstanceContext should never delegate this method.");
+        }
+
+        public boolean isUserInRole(String s) {
+            throw new IllegalStateException("Method cannot be called outside a request context");
+        }
+    }
+}

Added: geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/WebServiceContainerInvoker.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/WebServiceContainerInvoker.java?view=auto&rev=160139
==============================================================================
--- geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/WebServiceContainerInvoker.java (added)
+++ geronimo/trunk/modules/webservices/src/java/org/apache/geronimo/webservices/WebServiceContainerInvoker.java Tue Apr  5 00:58:42 2005
@@ -0,0 +1,208 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.webservices;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URISyntaxException;
+import java.util.Map;
+import java.util.HashMap;
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class WebServiceContainerInvoker implements Servlet {
+
+    public static final String WEBSERVICE_CONTAINER = WebServiceContainerInvoker.class.getName()+"@WebServiceContainer";
+
+    private final Object pojo;
+    private WebServiceContainer service;
+
+    public WebServiceContainerInvoker(Object pojo) {
+        this.pojo = pojo;
+    }
+
+    public void init(ServletConfig config) throws ServletException {
+        ServletContext context = config.getServletContext();
+        String webServiceContainerID = config.getInitParameter(WEBSERVICE_CONTAINER);
+        service = (WebServiceContainer) context.getAttribute(webServiceContainerID);
+    }
+
+    public ServletConfig getServletConfig() {
+        return null;
+    }
+
+    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
+        res.setContentType("text/xml");
+        RequestAdapter request = new RequestAdapter((HttpServletRequest) req);
+        ResponseAdapter response = new ResponseAdapter((HttpServletResponse) res);
+
+        // This is the guy the WebServiceContainer should invoke
+        req.setAttribute(WebServiceContainer.POJO_INSTANCE, pojo);
+
+        if (request.getParameter("wsdl") != null) {
+            try {
+                service.getWsdl(request, response);
+            } catch (IOException e) {
+                throw e;
+            } catch (ServletException e) {
+                throw e;
+            } catch (Exception e) {
+                throw new ServletException("Could not fetch wsdl!", e);
+            }
+        } else {
+            try {
+                service.invoke(request, response);
+            } catch (IOException e) {
+                throw e;
+            } catch (ServletException e) {
+                throw e;
+            } catch (Exception e) {
+                throw new ServletException("Could not process message!", e);
+            }
+        }
+    }
+
+    public String getServletInfo() {
+        return null;
+    }
+
+    public void destroy() {
+    }
+
+    private static class RequestAdapter implements WebServiceContainer.Request {
+        private final HttpServletRequest request;
+
+        public RequestAdapter(HttpServletRequest request) {
+            this.request = request;
+        }
+
+        public String getHeader(String name) {
+            return request.getHeader(name);
+        }
+
+        public java.net.URI getURI() {
+            try {
+                String uriString = request.getRequestURI();
+                return new java.net.URI(uriString);
+            } catch (URISyntaxException e) {
+                throw new IllegalStateException(e.getMessage());
+            }
+        }
+
+        public int getContentLength() {
+            return request.getContentLength();
+        }
+
+        public String getContentType() {
+            return request.getContentType();
+        }
+
+        public InputStream getInputStream() throws IOException {
+            return request.getInputStream();
+        }
+
+        public int getMethod() {
+            Integer method = (Integer) methods.get(request.getMethod());
+            return method == null ? UNSUPPORTED : method.intValue();
+        }
+
+        public String getParameter(String name) {
+            return request.getParameter(name);
+        }
+
+        public Map getParameters() {
+            return request.getParameterMap();
+        }
+
+
+        private static final Map methods = new HashMap();
+
+        static {
+            methods.put("OPTIONS", new Integer(OPTIONS));
+            methods.put("GET", new Integer(GET));
+            methods.put("HEAD", new Integer(HEAD));
+            methods.put("POST", new Integer(POST));
+            methods.put("PUT", new Integer(PUT));
+            methods.put("DELETE", new Integer(DELETE));
+            methods.put("TRACE", new Integer(TRACE));
+            methods.put("CONNECT", new Integer(CONNECT));
+        }
+
+        public Object getAttribute(String s) {
+            return request.getAttribute(s);
+        }
+
+        public void setAttribute(String s, Object o) {
+            request.setAttribute(s, o);
+        }
+
+    }
+
+    private static class ResponseAdapter implements WebServiceContainer.Response {
+        private final HttpServletResponse response;
+
+        public ResponseAdapter(HttpServletResponse response) {
+            this.response = response;
+        }
+
+        public void setHeader(String name, String value) {
+            response.setHeader(name, value);
+        }
+
+        public String getHeader(String name) {
+            throw new UnsupportedOperationException("Not possible to implement");
+        }
+
+        public OutputStream getOutputStream() {
+            try {
+                return response.getOutputStream();
+            } catch (IOException e) {
+                throw (IllegalStateException) new IllegalStateException().initCause(e);
+            }
+        }
+
+        public void setStatusCode(int code) {
+            response.setStatus(code);
+        }
+
+        public int getStatusCode() {
+            throw new UnsupportedOperationException("Not possible to implement");
+        }
+
+        public void setContentType(String type) {
+            response.setContentType(type);
+        }
+
+        public String getContentType() {
+            return response.getContentType();
+        }
+
+        public void setStatusMessage(String responseString) {
+            response.setStatus(getStatusCode(), responseString);
+        }
+    }
+}