diff options
author | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2011-12-09 13:34:11 +0000 |
---|---|---|
committer | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2011-12-09 13:34:11 +0000 |
commit | 0fb1fd45f479254df6b527908d61720c8d08e083 (patch) | |
tree | ec564d5c462ec884a0ccce626a3cea37bdff9d00 | |
parent | 342f347a90282bcb3c86c3029203049859a970bc (diff) |
TUSCANY-3946 - Had a bit of a change of heart about this one. I'm concerned that putting extra doPrivileged checks in the main message flow is going to have a negative impact on performance so I've swapped out that code so a check on the presence of a message header.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1212406 13f79535-47bb-0310-9956-ffa450edef68
2 files changed, 20 insertions, 18 deletions
diff --git a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/Constants.java b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/Constants.java index d6f872d00a..d84ef752ac 100644 --- a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/Constants.java +++ b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/Constants.java @@ -24,8 +24,14 @@ package org.apache.tuscany.sca.core.invocation; *
*/
public interface Constants {
- String MESSAGE_ID = "MESSAGE_ID";
- String RELATES_TO = "RELATES_TO";
- String ASYNC_RESPONSE_INVOKER = "ASYNC_RESPONSE_INVOKER";
- String ASYNC_CALLBACK = "ASYNC_CALLBACK";
+ public static final String MESSAGE_ID = "MESSAGE_ID";
+ public static final String RELATES_TO = "RELATES_TO";
+ public static final String ASYNC_RESPONSE_INVOKER = "ASYNC_RESPONSE_INVOKER";
+ public static final String ASYNC_CALLBACK = "ASYNC_CALLBACK";
+
+ /**
+ * If you've set the TCCL in your binding impl according to OASIS rules you can prevent
+ * the implementation provider from repeating the process by including this header
+ */
+ public static final String SUPPRESS_TCCL_SWAP = "SUPPRESS_TCCL_SWAP";
}
diff --git a/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java b/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java index 4ce1fdcf4b..de15651227 100644 --- a/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java +++ b/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java @@ -31,6 +31,7 @@ import javax.xml.ws.Holder; import org.apache.tuscany.sca.assembly.EndpointReference; import org.apache.tuscany.sca.core.factory.ObjectCreationException; +import org.apache.tuscany.sca.core.invocation.Constants; import org.apache.tuscany.sca.core.scope.Scope; import org.apache.tuscany.sca.core.scope.ScopeContainer; import org.apache.tuscany.sca.core.scope.ScopedRuntimeComponent; @@ -104,7 +105,13 @@ public class JavaImplementationInvoker implements Invoker, DataExchangeSemantics return tccl; } }); - ClassLoader contributionClassloader = null; + + // TUSCANY-3946 - If the TCCL has not already been set to the contribution classloader earlier + // in the wire processing then + // set it so that the thread context classloader of the thread used to invoke an operation + // of a Java POJO component implementation is the class loader of the contribution + // used to load the POJO implementation class. + boolean swapTCCL = (msg.getHeaders().get(Constants.SUPPRESS_TCCL_SWAP) == null); try { // The following call might create a new conversation, as a result, the msg.getConversationID() might @@ -132,18 +139,7 @@ public class JavaImplementationInvoker implements Invoker, DataExchangeSemantics } } - // TUSCANY-3946 - If the TCCL has not already been set to the contribution classloader then - // set it so that the thread context classloader of the thread used to invoke an operation - // of a Java POJO component implementation is the class loader of the contribution - // used to load the POJO implementation class. - contributionClassloader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() { - public ClassLoader run() { - ClassLoader contributionClassloader = instance.getClass().getClassLoader(); - return contributionClassloader; - } - }); - - if (tccl != contributionClassloader){ + if (swapTCCL){ AccessController.doPrivileged(new PrivilegedAction() { public Object run() { Thread.currentThread().setContextClassLoader(instance.getClass().getClassLoader()); @@ -271,7 +267,7 @@ public class JavaImplementationInvoker implements Invoker, DataExchangeSemantics } finally { // reset the tccl if it was replaced above // with the contribution classloader - if (tccl != contributionClassloader){ + if (swapTCCL){ AccessController.doPrivileged(new PrivilegedAction() { public Object run() { Thread.currentThread().setContextClassLoader(tccl); |