You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by is...@apache.org on 2011/01/22 17:51:25 UTC

svn commit: r1062194 - /axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java

Author: isurues
Date: Sat Jan 22 16:51:25 2011
New Revision: 1062194

URL: http://svn.apache.org/viewvc?rev=1062194&view=rev
Log:
Fixing https://issues.apache.org/jira/browse/AXIS2-4930. Committing a modified version of the patch which was given by Kasun. Basically this fix adds the URLs of the deployment class loader into the current TCCL.

Modified:
    axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java

Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java?rev=1062194&r1=1062193&r2=1062194&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java (original)
+++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java Sat Jan 22 16:51:25 2011
@@ -28,13 +28,12 @@ import org.apache.axis2.description.Para
 import org.apache.axis2.description.WSDL2Constants;
 import org.apache.axis2.engine.AxisEngine;
 import org.apache.axis2.engine.MessageReceiver;
+import org.apache.axis2.java.security.AccessController;
 import org.apache.axis2.jaxws.ExceptionFactory;
 import org.apache.axis2.jaxws.core.InvocationContextFactory;
 import org.apache.axis2.jaxws.core.MessageContext;
 import org.apache.axis2.jaxws.core.util.MessageContextUtils;
-
 import org.apache.axis2.jaxws.description.EndpointDescription;
-import org.apache.axis2.jaxws.description.ServiceDescription;
 import org.apache.axis2.jaxws.handler.AttachmentsAdapter;
 import org.apache.axis2.jaxws.handler.MEPContext;
 import org.apache.axis2.jaxws.handler.SOAPHeadersAdapter;
@@ -53,6 +52,9 @@ import org.apache.commons.logging.LogFac
 
 import javax.xml.ws.Binding;
 import javax.xml.ws.WebServiceException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.PrivilegedAction;
 
 /**
  * The JAXWSMessageReceiver is the entry point, from the server's perspective, to the JAX-WS code.
@@ -82,7 +84,13 @@ public class JAXWSMessageReceiver implem
         //Get the name of the service impl that was stored as a parameter
         // inside of the services.xml.
         AxisService service = axisRequestMsgCtx.getAxisService();
-        
+
+        // we need to merge the deployment class loader to the TCCL. This is because, in JAX-WS
+        // services, there can be situations where we have to load classes from the deployment
+        // artifact (JAX-WS jar file) in the message flow. Ex: Handler classes in the service
+        // artifact. Adding this as a fix for AXIS2-4930.
+        mergeDeploymentCL(service);
+
         org.apache.axis2.description.Parameter svcClassParam =
                 service.getParameter(PARAM_SERVICE_CLASS);
 
@@ -251,7 +259,52 @@ public class JAXWSMessageReceiver implem
             throw faultToReturn;
         }
     }
-    
+
+    /**
+     * Merges the deployment class loader to the TCCL. Deployment class loader is accessed through
+     * the AxisService and a new class loader is created by using URLs from deployment class loder
+     * and setting the current TCCL as the parent. Finally the new class loader is set as the TCCL.
+     *
+     * @param service - Current AxisService instance
+     */
+    private void mergeDeploymentCL(AxisService service) {
+        ClassLoader deploymentClassLoader = service.getClassLoader();
+        // get URLs from deployment class loader
+        URL[] deploymentClassLoaderUrls = ((URLClassLoader) deploymentClassLoader).getURLs();
+        // create a new class loader by setting the current TCCL as the parent
+        setContextClassLoader(new URLClassLoader(deploymentClassLoaderUrls,
+                getContextClassLoader()));
+    }
+
+    /**
+     * Get context class loader of the current thread.
+     *
+     * @return ClassLoader
+     */
+    private ClassLoader getContextClassLoader() {
+        return (ClassLoader) AccessController.doPrivileged(
+                new PrivilegedAction() {
+                    public Object run() {
+                        return Thread.currentThread().getContextClassLoader();
+                    }
+                }
+        );
+    }
+
+    /**
+     * Set context class loader of the current thread.
+     *
+     * @param cl the context ClassLoader for the Thread
+     */
+    private void setContextClassLoader(final ClassLoader cl) {
+        AccessController.doPrivileged(new PrivilegedAction() {
+            public Object run() {
+                Thread.currentThread().setContextClassLoader(cl);
+                return null;
+            }
+        });
+    }
+
     private void sendAckBack(org.apache.axis2.context.MessageContext axisMsgCtx){
         if (log.isDebugEnabled()) {
             log.debug("sendAckBack entry");