Author: sagara
Date: Sat Aug 25 07:24:03 2012
New Revision: 1377228

URL: http://svn.apache.org/viewvc?rev=1377228&view=rev
Log:
Fixed AXIS2-5399. 

Added:
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/classloader/ThreadContextDescriptor.java
   (with props)
Modified:
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/engine/DependencyManager.java
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java

Added: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/classloader/ThreadContextDescriptor.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/classloader/ThreadContextDescriptor.java?rev=1377228&view=auto
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/classloader/ThreadContextDescriptor.java
 (added)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/classloader/ThreadContextDescriptor.java
 Sat Aug 25 07:24:03 2012
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.axis2.classloader;
+
+import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import org.apache.axis2.Constants;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.AxisService;
+
+public class ThreadContextDescriptor {
+
+    private ClassLoader oldClassLoader;
+    private MessageContext oldMessageContext;
+
+    public ClassLoader getOldClassLoader() {
+        return oldClassLoader;
+    }
+
+    public void setOldClassLoader(ClassLoader oldClassLoader) {
+        this.oldClassLoader = oldClassLoader;
+    }
+
+    public MessageContext getOldMessageContext() {
+        return oldMessageContext;
+    }
+
+    public void setOldMessageContext(MessageContext oldMessageContext) {
+        this.oldMessageContext = oldMessageContext;
+    }
+
+    public static ThreadContextDescriptor setThreadContext(final AxisService 
service) {
+        ThreadContextDescriptor tc = new ThreadContextDescriptor();
+        tc.oldMessageContext = (MessageContext) 
MessageContext.currentMessageContext.get();
+        final ClassLoader contextClassLoader = getContextClassLoader_doPriv();
+        tc.oldClassLoader = contextClassLoader;
+        String serviceTCCL = (String) 
service.getParameterValue(Constants.SERVICE_TCCL);
+        if (serviceTCCL != null) {
+            serviceTCCL = serviceTCCL.trim().toLowerCase();
+
+            if (serviceTCCL.equals(Constants.TCCL_COMPOSITE)) {
+                final ClassLoader loader = (ClassLoader) AccessController
+                        .doPrivileged(new PrivilegedAction() {
+                            public Object run() {
+                                return new MultiParentClassLoader(new URL[] 
{}, new ClassLoader[] {
+                                        service.getClassLoader(), 
contextClassLoader });
+                            }
+                        });
+                org.apache.axis2.java.security.AccessController
+                        .doPrivileged(new PrivilegedAction() {
+                            public Object run() {
+                                
Thread.currentThread().setContextClassLoader(loader);
+                                return null;
+                            }
+                        });
+            } else if (serviceTCCL.equals(Constants.TCCL_SERVICE)) {
+                org.apache.axis2.java.security.AccessController
+                        .doPrivileged(new PrivilegedAction() {
+                            public Object run() {
+                                Thread.currentThread().setContextClassLoader(
+                                        service.getClassLoader());
+                                return null;
+                            }
+                        });
+            }
+        }
+        return tc;
+    }
+
+    /**
+     * Several pieces of information need to be available to the service
+     * implementation class. For one, the ThreadContextClassLoader needs to be
+     * correct, and for another we need to give the service code access to the
+     * MessageContext (getCurrentContext()). So we toss these things in TLS.
+     * 
+     * @param msgContext
+     *            the current MessageContext
+     * @return a ThreadContextDescriptor containing the old values
+     */
+    public static ThreadContextDescriptor setThreadContext(final 
MessageContext msgContext) {
+        AxisService service = msgContext.getAxisService();
+        ThreadContextDescriptor tc = setThreadContext(service);
+        MessageContext.setCurrentMessageContext(msgContext);
+        return tc;
+    }
+
+    private static ClassLoader getContextClassLoader_doPriv() {
+        return (ClassLoader) org.apache.axis2.java.security.AccessController
+                .doPrivileged(new PrivilegedAction() {
+                    public Object run() {
+                        return Thread.currentThread().getContextClassLoader();
+                    }
+                });
+    }
+
+}

Propchange: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/classloader/ThreadContextDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/engine/DependencyManager.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/engine/DependencyManager.java?rev=1377228&r1=1377227&r2=1377228&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/engine/DependencyManager.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/engine/DependencyManager.java
 Sat Aug 25 07:24:03 2012
@@ -22,6 +22,8 @@ package org.apache.axis2.engine;
 
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
+import org.apache.axis2.classloader.ThreadContextDescriptor;
+import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.context.ServiceContext;
 import org.apache.axis2.context.ServiceGroupContext;
 import org.apache.axis2.description.AxisService;
@@ -34,6 +36,7 @@ import org.apache.commons.logging.LogFac
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.security.PrivilegedAction;
 import java.util.Iterator;
 
 /**
@@ -64,7 +67,7 @@ public class DependencyManager {
         // ...however, we also still support the old way for now.  Note that 
introspecting for
         // a method like this is something like 10 times slower than the above 
instanceof check.
 
-        Class classToLoad = obj.getClass();
+        Class<?> classToLoad = obj.getClass();
         // We can not call classToLoad.getDeclaredMethed() , since there
         //  can be insatnce where mutiple services extends using one class
         // just for init and other reflection methods
@@ -109,12 +112,14 @@ public class DependencyManager {
             Parameter implInfoParam = 
service.getParameter(Constants.SERVICE_CLASS);
             if (implInfoParam != null) {
                 try {
-                    Class implClass = Loader.loadClass(
+                    ThreadContextDescriptor tc = 
ThreadContextDescriptor.setThreadContext(axisService);
+                    Class<?> implClass = Loader.loadClass(
                             classLoader,
                             ((String) implInfoParam.getValue()).trim());
                     Object serviceImpl = implClass.newInstance();
                     serviceContext.setProperty(ServiceContext.SERVICE_OBJECT, 
serviceImpl);
                     initServiceObject(serviceImpl, serviceContext);
+                    restoreThreadContext(tc);
                 } catch (Exception e) {
                     throw AxisFault.makeFault(e);
                 }
@@ -137,7 +142,7 @@ public class DependencyManager {
 
             // For now, we also use "raw" introspection to try and find the 
destroy method.
 
-            Class classToLoad = obj.getClass();
+            Class<?> classToLoad = obj.getClass();
             Method method =
                     null;
             try {
@@ -160,4 +165,14 @@ public class DependencyManager {
 
         }
     }
+
+    protected static void restoreThreadContext(final ThreadContextDescriptor 
tc) {
+        org.apache.axis2.java.security.AccessController.doPrivileged(new 
PrivilegedAction() {
+            public Object run() {
+                
Thread.currentThread().setContextClassLoader(tc.getOldClassLoader());
+                return null;
+            }
+        });
+        MessageContext.currentMessageContext.set(tc.getOldMessageContext());
+    }
 }

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java?rev=1377228&r1=1377227&r2=1377228&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java
 Sat Aug 25 07:24:03 2012
@@ -27,12 +27,11 @@ import org.apache.axiom.soap.SOAPFactory
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
 import org.apache.axis2.addressing.EndpointReference;
-import org.apache.axis2.classloader.MultiParentClassLoader;
+import org.apache.axis2.classloader.ThreadContextDescriptor;
 import org.apache.axis2.clustering.ClusteringFault;
 import org.apache.axis2.clustering.state.Replicator;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.context.ServiceContext;
-import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.InOnlyAxisOperation;
 import org.apache.axis2.description.WSDL2Constants;
 import org.apache.axis2.engine.AxisEngine;
@@ -46,8 +45,6 @@ import org.apache.axis2.wsdl.WSDLUtil;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import java.net.URL;
-import java.security.AccessController;
 import java.security.PrivilegedAction;
 
 public abstract class AbstractMessageReceiver implements MessageReceiver {
@@ -58,12 +55,7 @@ public abstract class AbstractMessageRec
     public static final String SAVED_TCCL = "_SAVED_TCCL_";
     public static final String SAVED_MC = "_SAVED_MC_";
     public static final String DO_ASYNC = 
"messageReceiver.invokeOnSeparateThread";
-
-    // Place to store previous values
-    public static class ThreadContextDescriptor {
-        public ClassLoader oldClassLoader;
-        public MessageContext oldMessageContext;
-    }
+    
 
     protected void replicateState(MessageContext messageContext) throws 
ClusteringFault {
         Replicator.replicate(messageContext);
@@ -109,7 +101,7 @@ public abstract class AbstractMessageRec
 
         }
 
-        ThreadContextDescriptor tc = setThreadContext(messageCtx);
+        ThreadContextDescriptor tc = 
ThreadContextDescriptor.setThreadContext(messageCtx);
         try {
             invokeBusinessLogic(messageCtx);
         } catch (AxisFault fault) {
@@ -154,83 +146,19 @@ public abstract class AbstractMessageRec
                 worker);
     }
 
-    /**
-     * Several pieces of information need to be available to the service
-     * implementation class.  For one, the ThreadContextClassLoader needs
-     * to be correct, and for another we need to give the service code
-     * access to the MessageContext (getCurrentContext()).  So we toss these
-     * things in TLS.
-     *
-     * @param msgContext the current MessageContext
-     * @return a ThreadContextDescriptor containing the old values
-     */
-    protected ThreadContextDescriptor setThreadContext(final MessageContext 
msgContext) {
-        ThreadContextDescriptor tc = new ThreadContextDescriptor();
-        tc.oldMessageContext = (MessageContext) 
MessageContext.currentMessageContext.get();
-        final ClassLoader contextClassLoader = getContextClassLoader_doPriv();
-        tc.oldClassLoader = contextClassLoader;
-
-        AxisService service = msgContext.getAxisService();
-        String serviceTCCL = (String) 
service.getParameterValue(Constants.SERVICE_TCCL);
-        if (serviceTCCL != null) {
-            serviceTCCL = serviceTCCL.trim().toLowerCase();
-
-            if (serviceTCCL.equals(Constants.TCCL_COMPOSITE)) {
-                final ClassLoader loader = (ClassLoader) 
AccessController.doPrivileged(new PrivilegedAction() {
-                    public Object run() {
-                        return new MultiParentClassLoader(new URL[]{},
-                                new ClassLoader[]{
-                                        
msgContext.getAxisService().getClassLoader(),
-                                        contextClassLoader
-                                });
-                    }
-                });
-                org.apache.axis2.java.security.AccessController.doPrivileged(
-                        new PrivilegedAction() {
-                            public Object run() {
-                                Thread.currentThread().setContextClassLoader(
-                                        loader);
-                                return null;
-                            }
-                        }
-                );
-            } else if (serviceTCCL.equals(Constants.TCCL_SERVICE)) {
-                org.apache.axis2.java.security.AccessController.doPrivileged(
-                        new PrivilegedAction() {
-                            public Object run() {
-                                Thread.currentThread().setContextClassLoader(
-                                        
msgContext.getAxisService().getClassLoader()
-                                );
-                                return null;
-                            }
-                        }
-                );
-            }
-        }
-        MessageContext.setCurrentMessageContext(msgContext);
-        return tc;
-    }
-
-    private ClassLoader getContextClassLoader_doPriv() {
-        return (ClassLoader) 
org.apache.axis2.java.security.AccessController.doPrivileged(
-                new PrivilegedAction() {
-                    public Object run() {
-                        return Thread.currentThread().getContextClassLoader();
-                    }
-                }
-        );
-    }
+    
 
+   
     protected void restoreThreadContext(final ThreadContextDescriptor tc) {
         org.apache.axis2.java.security.AccessController.doPrivileged(
                 new PrivilegedAction() {
                     public Object run() {
-                        
Thread.currentThread().setContextClassLoader(tc.oldClassLoader);
+                        
Thread.currentThread().setContextClassLoader(tc.getOldClassLoader());
                         return null;
                     }
                 }
         );
-        MessageContext.currentMessageContext.set(tc.oldMessageContext);
+        MessageContext.currentMessageContext.set(tc.getOldMessageContext());
     }
 
     /**
@@ -296,7 +224,7 @@ public abstract class AbstractMessageRec
 
         public void run() {
             try {
-                ThreadContextDescriptor tc = setThreadContext(messageCtx);
+                ThreadContextDescriptor tc = 
ThreadContextDescriptor.setThreadContext(messageCtx);
                 try {
                     invokeBusinessLogic(messageCtx);
                 } finally {


Reply via email to