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

svn commit: r499623 - in /geronimo/server/trunk: configs/cxf/ modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/server/ modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ modules/geronimo-cxf-builder/src/main/java/org/apache/ger...

Author: djencks
Date: Wed Jan 24 16:04:01 2007
New Revision: 499623

URL: http://svn.apache.org/viewvc?view=rev&rev=499623
Log:
GERONIMO-2777 expose mandatory jaxws MessageContext properties

Modified:
    geronimo/server/trunk/configs/cxf/pom.xml
    geronimo/server/trunk/modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/server/AxisWebServiceContainer.java
    geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java
    geronimo/server/trunk/modules/geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/CXFBuilder.java
    geronimo/server/trunk/modules/geronimo-cxf/pom.xml
    geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/CXFWebServiceContainer.java
    geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/CXFWebServiceContainerFactoryGBean.java
    geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/GeronimoDestination.java
    geronimo/server/trunk/modules/geronimo-jetty6/pom.xml
    geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyEJBWebServiceContext.java
    geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/app/MockWebServiceContainer.java
    geronimo/server/trunk/modules/geronimo-tomcat6/src/main/java/org/apache/geronimo/tomcat/TomcatEJBWebServiceContext.java
    geronimo/server/trunk/modules/geronimo-tomcat6/src/test/java/org/apache/geronimo/tomcat/app/MockWebServiceContainer.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/configs/cxf/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/configs/cxf/pom.xml?view=diff&rev=499623&r1=499622&r2=499623
==============================================================================
--- geronimo/server/trunk/configs/cxf/pom.xml (original)
+++ geronimo/server/trunk/configs/cxf/pom.xml Wed Jan 24 16:04:01 2007
@@ -49,6 +49,13 @@
             <version>${version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.geronimo.configs</groupId>
+            <artifactId>transaction-jta11</artifactId>
+            <version>${version}</version>
+            <type>car</type>
+        </dependency>
+
        <dependency>
             <groupId>org.apache.geronimo.modules</groupId>
             <artifactId>geronimo-cxf</artifactId>

Modified: geronimo/server/trunk/modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/server/AxisWebServiceContainer.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/server/AxisWebServiceContainer.java?view=diff&rev=499623&r1=499622&r2=499623
==============================================================================
--- geronimo/server/trunk/modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/server/AxisWebServiceContainer.java (original)
+++ geronimo/server/trunk/modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/server/AxisWebServiceContainer.java Wed Jan 24 16:04:01 2007
@@ -262,6 +262,9 @@
         response.getOutputStream().flush();
     }
 
+    public void destroy() {
+    }
+
     public URI getLocation() {
         return location;
     }

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=499623&r1=499622&r2=499623
==============================================================================
--- 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 Wed Jan 24 16:04:01 2007
@@ -343,6 +343,9 @@
         }
     }
     
+    public void destroy() {
+    }
+
     public class Axis2TransportInfo implements OutTransportInfo {
         private Response response;
 

Modified: geronimo/server/trunk/modules/geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/CXFBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/CXFBuilder.java?view=diff&rev=499623&r1=499622&r2=499623
==============================================================================
--- geronimo/server/trunk/modules/geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/CXFBuilder.java (original)
+++ geronimo/server/trunk/modules/geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/CXFBuilder.java Wed Jan 24 16:04:01 2007
@@ -49,6 +49,7 @@
 import org.apache.geronimo.j2ee.deployment.WebServiceBuilder;
 import org.apache.geronimo.j2ee.deployment.WebModule;
 import org.apache.geronimo.j2ee.deployment.Module;
+import org.apache.geronimo.j2ee.deployment.EARContext;
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
 import org.apache.geronimo.cxf.PortInfo;
 import org.apache.geronimo.cxf.CXFWebServiceContainerFactoryGBean;
@@ -186,6 +187,12 @@
 
         targetGBean.setReferencePattern("WebServiceContainerFactory", containerFactoryName);
         targetGBean.setAttribute("pojoClassName", seiClassName);
+
+        if (context instanceof EARContext) {
+            containerFactoryData.setReferencePattern("TransactionManager", 
+                                                     ((EARContext)context).getTransactionManagerName());
+        }
+
         return true;
     }
 

Modified: geronimo/server/trunk/modules/geronimo-cxf/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-cxf/pom.xml?view=diff&rev=499623&r1=499622&r2=499623
==============================================================================
--- geronimo/server/trunk/modules/geronimo-cxf/pom.xml (original)
+++ geronimo/server/trunk/modules/geronimo-cxf/pom.xml Wed Jan 24 16:04:01 2007
@@ -47,6 +47,12 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.geronimo.modules</groupId>
+            <artifactId>geronimo-transaction</artifactId>
+            <version>${version}</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.cxf</groupId>
             <artifactId>cxf-rt-frontend-jaxws</artifactId>
         </dependency>

Modified: geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/CXFWebServiceContainer.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/CXFWebServiceContainer.java?view=diff&rev=499623&r1=499622&r2=499623
==============================================================================
--- geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/CXFWebServiceContainer.java (original)
+++ geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/CXFWebServiceContainer.java Wed Jan 24 16:04:01 2007
@@ -99,6 +99,9 @@
         wsdlWriter.writeWSDL(def, response.getOutputStream());
     }
 
+    public void destroy() {
+    }
+
     private  EndpointImpl publishEndpoint(Object target) {
 
         assert target != null : "null target received";

Modified: geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/CXFWebServiceContainerFactoryGBean.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/CXFWebServiceContainerFactoryGBean.java?view=diff&rev=499623&r1=499622&r2=499623
==============================================================================
--- geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/CXFWebServiceContainerFactoryGBean.java (original)
+++ geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/CXFWebServiceContainerFactoryGBean.java Wed Jan 24 16:04:01 2007
@@ -20,8 +20,10 @@
 import java.util.Map;
 import java.util.logging.Logger;
 import java.util.logging.Level;
+
 import javax.naming.Context;
 import javax.naming.NamingException;
+import javax.transaction.TransactionManager;
 
 import org.apache.cxf.Bus;
 import org.apache.cxf.bus.cxf.CXFBusFactory;
@@ -30,6 +32,7 @@
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
 import org.apache.geronimo.kernel.Kernel;
 import org.apache.geronimo.naming.enc.EnterpriseNamingContext;
+import org.apache.geronimo.transaction.GeronimoUserTransaction;
 import org.apache.geronimo.webservices.WebServiceContainer;
 import org.apache.geronimo.webservices.WebServiceContainerFactory;
 
@@ -38,25 +41,29 @@
  */
 public class CXFWebServiceContainerFactoryGBean implements WebServiceContainerFactory {
 
-    private static final Logger LOG = 
-        Logger.getLogger(CXFWebServiceContainerFactoryGBean.class.getName());
+    private static final Logger LOG =
+            Logger.getLogger(CXFWebServiceContainerFactoryGBean.class.getName());
 
     private final PortInfo portInfo;
     private final Bus bus;
     private final Object endpointInstance;
     private Context context;
- 
-    public CXFWebServiceContainerFactoryGBean(PortInfo portInfo, 
-                                              String endpointClassName, 
-                                              ClassLoader classLoader,
-                                              Map componentContext,
-                                              Kernel kernel)
-        throws ClassNotFoundException, IllegalAccessException, InstantiationException {
-        
-        // TODO: get access to the transaction manager
+
+    public CXFWebServiceContainerFactoryGBean(PortInfo portInfo,
+            String endpointClassName,
+            ClassLoader classLoader,
+            Map componentContext,
+            Kernel kernel,
+            TransactionManager transactionManager)
+            throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+
+        GeronimoUserTransaction userTransaction = new GeronimoUserTransaction(transactionManager);
         if (componentContext != null) {
             try {
-                this.context = EnterpriseNamingContext.createEnterpriseNamingContext(componentContext, null, kernel, classLoader);
+                this.context = EnterpriseNamingContext.createEnterpriseNamingContext(componentContext,
+                        userTransaction,
+                        kernel,
+                        classLoader);
             } catch (NamingException e) {
                 LOG.log(Level.WARNING, "Failed to create naming context", e);
             }
@@ -81,9 +88,10 @@
         infoBuilder.addAttribute("classLoader", ClassLoader.class, false);
         infoBuilder.addAttribute("componentContext", Map.class, true, true);
         infoBuilder.addAttribute("kernel", Kernel.class, false);
+        infoBuilder.addReference("TransactionManager", TransactionManager.class, NameFactory.TRANSACTION_MANAGER);
 
-        infoBuilder.setConstructor(new String[] {"portInfo", "endpointClassName", "classLoader", 
-                                                 "componentContext", "kernel"});
+        infoBuilder.setConstructor(new String[]{"portInfo", "endpointClassName", "classLoader",
+                "componentContext", "kernel", "TransactionManager"});
         GBEAN_INFO = infoBuilder.getBeanInfo();
     }
 

Modified: geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/GeronimoDestination.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/GeronimoDestination.java?view=diff&rev=499623&r1=499622&r2=499623
==============================================================================
--- geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/GeronimoDestination.java (original)
+++ geronimo/server/trunk/modules/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/GeronimoDestination.java Wed Jan 24 16:04:01 2007
@@ -19,11 +19,19 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Serializable;
-import java.lang.reflect.Field;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.util.Iterator;
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Enumeration;
 import java.util.StringTokenizer;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.ws.handler.MessageContext;
 
 import org.apache.cxf.Bus;
 import org.apache.cxf.message.Exchange;
@@ -37,6 +45,7 @@
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
 import org.apache.cxf.wsdl.EndpointReferenceUtils;
+import org.apache.geronimo.webservices.WebServiceContainer;
 import org.apache.geronimo.webservices.WebServiceContainer.Request;
 import org.apache.geronimo.webservices.WebServiceContainer.Response;
 
@@ -45,7 +54,9 @@
 
     private MessageObserver messageObserver;
 
-    public GeronimoDestination(Bus bus, ConduitInitiator conduitInitiator, EndpointInfo endpointInfo) throws IOException {
+    public GeronimoDestination(Bus bus, 
+                               ConduitInitiator conduitInitiator, 
+                               EndpointInfo endpointInfo) throws IOException {
         super(bus, conduitInitiator, endpointInfo);
     }
 
@@ -55,75 +66,92 @@
 
     public void invoke(Request request, Response response) throws Exception {
         MessageImpl message = new MessageImpl();
-        message.setContent(java.io.InputStream.class, request.getInputStream());
+        message.setContent(InputStream.class, request.getInputStream());
         message.setDestination(this);
 
         message.put(Request.class, request);
         message.put(Response.class, response);
 
+        HttpServletRequest servletRequest = 
+            (HttpServletRequest)request.getAttribute(WebServiceContainer.SERVLET_REQUEST);
+        message.put(MessageContext.SERVLET_REQUEST, servletRequest);
+        
+        HttpServletResponse servletResponse =
+            (HttpServletResponse)request.getAttribute(WebServiceContainer.SERVLET_RESPONSE);
+        message.put(MessageContext.SERVLET_RESPONSE, servletResponse);
+        
+        ServletContext servletContext = 
+            (ServletContext)request.getAttribute(WebServiceContainer.SERVLET_CONTEXT);
+        message.put(MessageContext.SERVLET_CONTEXT, servletContext);
+        
+        // this calls copyRequestHeaders()
+        setHeaders(message);
+        
+        message.put(Message.HTTP_REQUEST_METHOD, servletRequest.getMethod());
+        message.put(Message.PATH_INFO, servletRequest.getPathInfo());
+        message.put(Message.QUERY_STRING, servletRequest.getQueryString());
+        message.put(Message.CONTENT_TYPE, servletRequest.getContentType());
+        message.put(Message.ENCODING, servletRequest.getCharacterEncoding());
+        
         messageObserver.onMessage(message);
     }
 
-    public Conduit getBackChannel(Message inMessage, Message partialResponse, EndpointReferenceType address) throws IOException {
-        Response response = inMessage.get(Response.class);
-        Conduit backChannel;
-        Exchange ex = inMessage.getExchange();
-        EndpointReferenceType target = address != null
-                ? address
-                : ex.get(EndpointReferenceType.class);
-        if (target == null) {
-            backChannel = new BackChannelConduit(response);
-        } else {
-            throw new IllegalArgumentException("RM not yet implemented");
-        }
-        return backChannel;
-    }
-
-    public void shutdown() {
-    }
-
-    @Override
     protected void copyRequestHeaders(Message message, Map<String, List<String>> headers) {
-        Request req = message.get(Request.class);
-
-        // no map of headers so just find all static field constants that begin with HEADER_, get
-        // its value and get the corresponding header.
-        for (Field field : Request.class.getFields()) {
-            if (field.getName().startsWith("HEADER_")) {
-                try {
-                    assert field.getType().equals(String.class) : "unexpected field type";
-                    String headerName = (String) field.get(null);
-                    String headerValue = req.getHeader(headerName);
-                    if (headerValue != null) {
-                        List<String> values = headers.get(headerName);
-                        if (values == null) {
-                            values = new LinkedList<String>();
-                            headers.put(headerName, values);
-                        }
-                        values.addAll(splitMultipleHeaderValues(headerValue));
-                    }
-                } catch (IllegalAccessException ex) {
-                    // ignore 
+        HttpServletRequest servletRequest = (HttpServletRequest)message.get(MessageContext.SERVLET_REQUEST);
+        if (servletRequest != null) {
+            Enumeration names = servletRequest.getHeaderNames();
+            while(names.hasMoreElements()) {
+                String name = (String)names.nextElement();
+                
+                List<String> headerValues = headers.get(name);
+                if (headerValues == null) {
+                    headerValues = new ArrayList<String>();
+                    headers.put(name, headerValues);
+                }
+                
+                Enumeration values = servletRequest.getHeaders(name);
+                while(values.hasMoreElements()) {
+                    String value = (String)values.nextElement();
+                    headerValues.add(value);
                 }
             }
         }
     }
 
-    private List<String> splitMultipleHeaderValues(String value) {
-
-        List<String> allValues = new LinkedList<String>();
-        if (value.contains(",")) {
-            StringTokenizer st = new StringTokenizer(value, ",");
-            while (st.hasMoreTokens()) {
-                allValues.add(st.nextToken().trim());
-            }
-
+    public Conduit getBackChannel(Message inMessage,
+                                  Message partialResponse,
+                                  EndpointReferenceType address) throws IOException {
+        Conduit backChannel = null;
+        if (address == null) {
+            backChannel = new BackChannelConduit(address, inMessage);
         } else {
-            allValues.add(value);
+            if (partialResponse != null) {
+                // setup the outbound message to for 202 Accepted
+                partialResponse.put(Message.RESPONSE_CODE,
+                                    HttpURLConnection.HTTP_ACCEPTED);
+                backChannel = new BackChannelConduit(address, inMessage);
+            } else {
+                backChannel = conduitInitiator.getConduit(endpointInfo, address);
+                // ensure decoupled back channel input stream is closed
+                backChannel.setMessageObserver(new MessageObserver() {
+                    public void onMessage(Message m) {
+                        if (m.getContentFormats().contains(InputStream.class)) {
+                            InputStream is = m.getContent(InputStream.class);
+                            try {
+                                is.close();
+                            } catch (Exception e) {
+                                // ignore
+                            }
+                        }
+                    }
+                });
+            }
         }
-        return allValues;
+        return backChannel;
     }
 
+    public void shutdown() {
+    }
 
     public void setMessageObserver(MessageObserver messageObserver) {
         this.messageObserver = messageObserver;
@@ -131,15 +159,12 @@
 
     protected class BackChannelConduit implements Conduit {
 
-        //TODO this will soon be publically available from somewhere in CXF
-        private static final String ANONYMOUS_ADDRESS =
-                "http://www.w3.org/2005/08/addressing/anonymous";
-        protected Response response;
+        protected Message request;
         protected EndpointReferenceType target;
 
-        BackChannelConduit(Response resp) {
-            response = resp;
-            target = EndpointReferenceUtils.getEndpointReference(ANONYMOUS_ADDRESS);
+        BackChannelConduit(EndpointReferenceType target, Message request) {
+            this.target = target;
+            this.request = request;
         }
 
         public void close(Message msg) throws IOException {
@@ -162,12 +187,46 @@
          * @param message the message to be sent.
          */
         public void send(Message message) throws IOException {
-            message.put(Response.class, response);
+            Response response = (Response)request.get(Response.class);
+
+            // 1. handle response code
+            Integer i = (Integer)message.get(Message.RESPONSE_CODE);
+            if (i != null) {
+                response.setStatusCode(i.intValue());
+            }
+
+            // 2. handle response headers
+            updateResponseHeaders(message);
+
+            Map<String, List<String>> protocolHeaders =
+                (Map<String, List<String>>)message.get(Message.PROTOCOL_HEADERS);
+
+            // set headers of the HTTP response object
+            Iterator headers = protocolHeaders.entrySet().iterator();
+            while(headers.hasNext()) {
+                Map.Entry entry = (Map.Entry)headers.next();
+                String headerName = (String)entry.getKey();
+                String headerValue = getHeaderValue((List)entry.getValue());
+                response.setHeader(headerName, headerValue);
+            }
+
             //TODO gregw says this should work: current cxf-jetty code wraps output stream.
             //if this doesn't work, we'd see an error from jetty saying you cant write headers to the output stream.
             message.setContent(OutputStream.class, response.getOutputStream());
         }
 
+        private String getHeaderValue(List<String> values) {
+            Iterator iter = values.iterator();
+            StringBuffer buf = new StringBuffer();
+            while(iter.hasNext()) {
+                buf.append(iter.next());
+                if (iter.hasNext()) {
+                    buf.append(", ");
+                }
+            }
+            return buf.toString();
+        }
+        
         /**
          * @return the reference associated with the target Destination
          */

Modified: geronimo/server/trunk/modules/geronimo-jetty6/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/pom.xml?view=diff&rev=499623&r1=499622&r2=499623
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/pom.xml (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/pom.xml Wed Jan 24 16:04:01 2007
@@ -73,7 +73,12 @@
             <groupId>org.mortbay.jetty</groupId>
             <artifactId>jetty</artifactId>
         </dependency>
-        
+
+        <!--<dependency>-->
+            <!--<groupId>org.mortbay.jetty</groupId>-->
+            <!--<artifactId>jetty-plus</artifactId>-->
+        <!--</dependency>-->
+
         <dependency>
             <groupId>org.apache.tomcat</groupId>
             <artifactId>jasper</artifactId>

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=499623&r1=499622&r2=499623
==============================================================================
--- 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 Wed Jan 24 16:04:01 2007
@@ -137,6 +137,11 @@
         RequestAdapter request = new RequestAdapter(jettyRequest);
         ResponseAdapter response = new ResponseAdapter(jettyResponse);
 
+        request.setAttribute(WebServiceContainer.SERVLET_REQUEST, req);
+        request.setAttribute(WebServiceContainer.SERVLET_RESPONSE, res);
+        // TODO: add support for context
+        request.setAttribute(WebServiceContainer.SERVLET_CONTEXT, null);
+
         if (req.getParameter("wsdl") != null) {
             try {
                 webServiceContainer.getWsdl(request, response);
@@ -325,5 +330,5 @@
             response.setStatus(response.getStatus(), responseString);
         }
     }
-
+    
 }

Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/app/MockWebServiceContainer.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/app/MockWebServiceContainer.java?view=diff&rev=499623&r1=499622&r2=499623
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/app/MockWebServiceContainer.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/app/MockWebServiceContainer.java Wed Jan 24 16:04:01 2007
@@ -30,4 +30,7 @@
     
     }
 
+    public void destroy() {
+    }
+
 }

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=499623&r1=499622&r2=499623
==============================================================================
--- 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 Wed Jan 24 16:04:01 2007
@@ -24,7 +24,10 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 import org.apache.catalina.authenticator.BasicAuthenticator;
 import org.apache.catalina.authenticator.DigestAuthenticator;
@@ -130,6 +133,12 @@
             req.setContentType("text/xml");
             RequestAdapter request = new RequestAdapter(req);
             ResponseAdapter response = new ResponseAdapter(res);
+
+            request.setAttribute(WebServiceContainer.SERVLET_REQUEST, (HttpServletRequest)req);
+            request.setAttribute(WebServiceContainer.SERVLET_RESPONSE, (HttpServletResponse)res);
+            // TODO: add support for context
+            request.setAttribute(WebServiceContainer.SERVLET_CONTEXT, null);
+
             req.finishRequest();
             if (req.getParameter("wsdl") != null) {
                 try {

Modified: geronimo/server/trunk/modules/geronimo-tomcat6/src/test/java/org/apache/geronimo/tomcat/app/MockWebServiceContainer.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-tomcat6/src/test/java/org/apache/geronimo/tomcat/app/MockWebServiceContainer.java?view=diff&rev=499623&r1=499622&r2=499623
==============================================================================
--- geronimo/server/trunk/modules/geronimo-tomcat6/src/test/java/org/apache/geronimo/tomcat/app/MockWebServiceContainer.java (original)
+++ geronimo/server/trunk/modules/geronimo-tomcat6/src/test/java/org/apache/geronimo/tomcat/app/MockWebServiceContainer.java Wed Jan 24 16:04:01 2007
@@ -30,4 +30,7 @@
    
    }
 
+    public void destroy() {
+    }
+
 }

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=499623&r1=499622&r2=499623
==============================================================================
--- 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 Wed Jan 24 16:04:01 2007
@@ -43,6 +43,24 @@
     public static final String MESSAGE_CONTEXT = WebServiceContainer.class.getName()+"@MessageContext";
 
     /**
+     * Used for JAX-WS MessageContext. MessageContext must expose HttpServletRequest. 
+     */
+    public static final String SERVLET_REQUEST = 
+        WebServiceContainer.class.getName()+"@ServletRequest";
+    
+    /**
+     * Used for JAX-WS MessageContext. MessageContext must expose HttpServletResponse.
+     */
+    public static final String SERVLET_RESPONSE = 
+        WebServiceContainer.class.getName()+"@ServletResponse";
+    
+    /**
+     * Used for JAX-WS MessageContext. MessageContext must expose ServletContext.
+     */
+    public static final String SERVLET_CONTEXT = 
+        WebServiceContainer.class.getName()+"@ServletContext";
+    
+    /**
      * Token inserted into wsdl where location should be replaced with the real location
      */
     public String LOCATION_REPLACEMENT_TOKEN = "LOCATIONREPLACEMENTTOKEN";
@@ -50,6 +68,8 @@
     void invoke(Request request, Response response) throws Exception;
 
     void getWsdl(Request req, Response res) throws Exception;
+
+    void destroy();
 
     public interface Request {
         /** the HTTP OPTIONS type */

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=499623&r1=499622&r2=499623
==============================================================================
--- 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 Wed Jan 24 16:04:01 2007
@@ -40,19 +40,21 @@
 
     private final Object pojo;
     private WebServiceContainer service;
+    private ServletConfig config;
 
     public WebServiceContainerInvoker(Object pojo) {
         this.pojo = pojo;
     }
 
     public void init(ServletConfig config) throws ServletException {
+        this.config = config;
         ServletContext context = config.getServletContext();
         String webServiceContainerID = config.getInitParameter(WEBSERVICE_CONTAINER);
         service = (WebServiceContainer) context.getAttribute(webServiceContainerID);
     }
 
     public ServletConfig getServletConfig() {
-        return null;
+        return config;
     }
 
     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
@@ -63,6 +65,10 @@
         // This is the guy the WebServiceContainer should invoke
         req.setAttribute(WebServiceContainer.POJO_INSTANCE, pojo);
 
+        req.setAttribute(WebServiceContainer.SERVLET_REQUEST, (HttpServletRequest) req);
+        req.setAttribute(WebServiceContainer.SERVLET_RESPONSE, (HttpServletResponse) res);
+        req.setAttribute(WebServiceContainer.SERVLET_CONTEXT, config.getServletContext());
+
         if (req.getParameter("wsdl") != null || req.getParameter("WSDL") != null) {
             try {
                 service.getWsdl(request, response);
@@ -91,6 +97,7 @@
     }
 
     public void destroy() {
+        service.destroy();
     }
 
     private static class RequestAdapter implements WebServiceContainer.Request {
@@ -141,7 +148,6 @@
             return request.getParameterMap();
         }
 
-
         private static final Map methods = new HashMap();
 
         static {
@@ -175,7 +181,7 @@
         public ResponseAdapter(HttpServletResponse response) {
             this.response = response;
         }
-
+        
         public void setHeader(String name, String value) {
             response.setHeader(name, value);
         }