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 sa...@apache.org on 2012/08/25 09:24:04 UTC
svn commit: r1377228 - in
/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2:
classloader/ThreadContextDescriptor.java engine/DependencyManager.java
receivers/AbstractMessageReceiver.java
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 {