You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by an...@apache.org on 2006/05/03 16:07:41 UTC

svn commit: r399310 - in /incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2: handler/ util/

Author: antelder
Date: Wed May  3 07:07:39 2006
New Revision: 399310

URL: http://svn.apache.org/viewcvs?rev=399310&view=rev
Log:
First cut at a fix for TUSCANY-258

Added:
    incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/ClassLoaderHelper.java
Modified:
    incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/Axis2OperationInvoker.java
    incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/WebServiceEntryPointInOutSyncMessageReceiver.java
    incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/WebServiceEntryPointServlet.java
    incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/SDODataBinding.java

Modified: incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/Axis2OperationInvoker.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/Axis2OperationInvoker.java?rev=399310&r1=399309&r2=399310&view=diff
==============================================================================
--- incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/Axis2OperationInvoker.java (original)
+++ incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/Axis2OperationInvoker.java Wed May  3 07:07:39 2006
@@ -21,6 +21,7 @@
 import org.apache.axis2.client.OperationClient;
 import org.apache.axis2.client.Options;
 import org.apache.axis2.context.MessageContext;
+import org.apache.tuscany.binding.axis2.util.ClassLoaderHelper;
 import org.apache.tuscany.binding.axis2.util.DataBinding;
 import org.apache.ws.commons.om.OMElement;
 import org.apache.ws.commons.soap.SOAPEnvelope;
@@ -68,14 +69,15 @@
 
         operationClient.addMessageContext(requestMC);
 
-        ClassLoader ccl = Thread.currentThread().getContextClassLoader();
+        ClassLoader oldCL = ClassLoaderHelper.setSystemClassLoader();
         try {
-            Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 
             operationClient.execute(true);
 
         } finally {
-            Thread.currentThread().setContextClassLoader(ccl);
+            if (oldCL != null) {
+                Thread.currentThread().setContextClassLoader(oldCL);
+            }
         }
 
         MessageContext responseMC = operationClient.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);

Modified: incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/WebServiceEntryPointInOutSyncMessageReceiver.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/WebServiceEntryPointInOutSyncMessageReceiver.java?rev=399310&r1=399309&r2=399310&view=diff
==============================================================================
--- incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/WebServiceEntryPointInOutSyncMessageReceiver.java (original)
+++ incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/WebServiceEntryPointInOutSyncMessageReceiver.java Wed May  3 07:07:39 2006
@@ -16,18 +16,17 @@
  */
 package org.apache.tuscany.binding.axis2.handler;
 
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
+import org.apache.tuscany.binding.axis2.util.ClassLoaderHelper;
 import org.apache.tuscany.binding.axis2.util.DataBinding;
 import org.apache.tuscany.core.wire.InvocationRuntimeException;
 import org.apache.ws.commons.om.OMElement;
 import org.apache.ws.commons.soap.SOAPEnvelope;
-import org.apache.ws.commons.soap.SOAPProcessingException;
 
 public class WebServiceEntryPointInOutSyncMessageReceiver extends AbstractInOutSyncMessageReceiver {
 
@@ -45,38 +44,32 @@
 
     @Override
     public void invokeBusinessLogic(MessageContext inMC, MessageContext outMC) throws AxisFault {
-        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
-        ClassLoader mycl = getClass().getClassLoader();
         try {
-            if (tccl != mycl) {
-                Thread.currentThread().setContextClassLoader(mycl);
-            }
-            try {
 
-                invokeEntryPoint(inMC, outMC);
+            OMElement requestOM = inMC.getEnvelope().getBody().getFirstElement();
+            Object[] request = dataBinding.fromOMElement(requestOM);
+            
+            Object response;
+            ClassLoader oldCL = ClassLoaderHelper.setApplicationClassLoader();
+            try {
+                
+                response = operationMethod.invoke(entryPointProxy, request);
 
-            } catch (Exception e) {
-                throw new InvocationRuntimeException(e);
+            } finally {
+                if (oldCL != null) {
+                    Thread.currentThread().setContextClassLoader(oldCL);
+                }
             }
-        } finally {
-            if (tccl != mycl) {
-                Thread.currentThread().setContextClassLoader(tccl);
-            }
-        }
-    }
 
-    protected void invokeEntryPoint(MessageContext inMC, MessageContext outMC) throws IllegalArgumentException, IllegalAccessException,
-            InvocationTargetException, SOAPProcessingException, AxisFault {
+            OMElement responseOM = dataBinding.toOMElement(new Object[] { response });
 
-        OMElement requestOM = inMC.getEnvelope().getBody().getFirstElement();
-        Object[] request = dataBinding.fromOMElement(requestOM);
-        Object response = operationMethod.invoke(entryPointProxy, request);
-        OMElement responseOM = dataBinding.toOMElement(new Object[] { response });
-
-        SOAPEnvelope soapEnvelope = getSOAPFactory(inMC).getDefaultEnvelope();
-        soapEnvelope.getBody().addChild(responseOM);
-        outMC.setEnvelope(soapEnvelope);
-        outMC.getOperationContext().setProperty(Constants.RESPONSE_WRITTEN, Constants.VALUE_TRUE);
-    }
+            SOAPEnvelope soapEnvelope = getSOAPFactory(inMC).getDefaultEnvelope();
+            soapEnvelope.getBody().addChild(responseOM);
+            outMC.setEnvelope(soapEnvelope);
+            outMC.getOperationContext().setProperty(Constants.RESPONSE_WRITTEN, Constants.VALUE_TRUE);
 
+        } catch (Exception e) {
+            throw new InvocationRuntimeException(e);
+        }
+    }
 }

Modified: incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/WebServiceEntryPointServlet.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/WebServiceEntryPointServlet.java?rev=399310&r1=399309&r2=399310&view=diff
==============================================================================
--- incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/WebServiceEntryPointServlet.java (original)
+++ incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/handler/WebServiceEntryPointServlet.java Wed May  3 07:07:39 2006
@@ -43,6 +43,7 @@
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.transport.http.AxisServlet;
 import org.apache.tuscany.binding.axis2.assembly.WebServiceBinding;
+import org.apache.tuscany.binding.axis2.util.ClassLoaderHelper;
 import org.apache.tuscany.binding.axis2.util.DataBinding;
 import org.apache.tuscany.binding.axis2.util.SDODataBinding;
 import org.apache.tuscany.core.context.CompositeContext;
@@ -64,13 +65,10 @@
 
     private boolean tuscanyGetDefaultAxis2xmlChecked;
 
-    public void init(ServletConfig config) throws ServletException {
-        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
-        ClassLoader mycl = getClass().getClassLoader();
+    public void init(final ServletConfig config) throws ServletException {
+        ClassLoaderHelper.initApplicationClassLoader();
         try {
-            if (tccl != mycl) {
-                Thread.currentThread().setContextClassLoader(mycl);
-            }
+            ClassLoaderHelper.setSystemClassLoader();
             try {
 
                 super.init(config);
@@ -80,9 +78,7 @@
                 throw new ServletException(e);
             }
         } finally {
-            if (tccl != mycl) {
-                Thread.currentThread().setContextClassLoader(tccl);
-            }
+            ClassLoaderHelper.setApplicationClassLoader();
         }
     }
 
@@ -211,41 +207,30 @@
     }
 
     @Override
-    protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
-
-        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
-        ClassLoader mycl = getClass().getClassLoader();
+    protected void doGet(final HttpServletRequest arg0, final HttpServletResponse arg1) throws ServletException, IOException {
+        ClassLoaderHelper.initApplicationClassLoader();
         try {
-            if (tccl != mycl) {
-                Thread.currentThread().setContextClassLoader(mycl);
-            }
+            ClassLoaderHelper.setSystemClassLoader();
             super.doGet(arg0, arg1);
         } catch (Exception e) {
             e.printStackTrace();
             throw new ServletException(e);
         } finally {
-            if (tccl != mycl) {
-                Thread.currentThread().setContextClassLoader(tccl);
-            }
+            ClassLoaderHelper.setApplicationClassLoader();
         }
     }
 
     @Override
-    protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
-        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
-        ClassLoader mycl = getClass().getClassLoader();
+    protected void doPost(final HttpServletRequest arg0, final HttpServletResponse arg1) throws ServletException, IOException {
+        ClassLoaderHelper.initApplicationClassLoader();
         try {
-            if (tccl != mycl) {
-                Thread.currentThread().setContextClassLoader(mycl);
-            }
+            ClassLoaderHelper.setSystemClassLoader();
             super.doPost(arg0, arg1);
         } catch (Exception e) {
             e.printStackTrace();
             throw new ServletException(e);
         } finally {
-            if (tccl != mycl) {
-                Thread.currentThread().setContextClassLoader(tccl);
-            }
+            ClassLoaderHelper.setApplicationClassLoader();
         }
     }
 }

Added: incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/ClassLoaderHelper.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/ClassLoaderHelper.java?rev=399310&view=auto
==============================================================================
--- incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/ClassLoaderHelper.java (added)
+++ incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/ClassLoaderHelper.java Wed May  3 07:07:39 2006
@@ -0,0 +1,76 @@
+/**
+ *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed 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.tuscany.binding.axis2.util;
+
+public class ClassLoaderHelper {
+
+    private static ThreadLocal<ClassLoader> applicationClassLoader = new ThreadLocal<ClassLoader>() {
+        protected synchronized ClassLoader initialValue() {
+            return Thread.currentThread().getContextClassLoader();
+        }
+    };
+
+    public static void initApplicationClassLoader() {
+        applicationClassLoader.set(Thread.currentThread().getContextClassLoader());
+    }
+
+    public static ClassLoader setApplicationClassLoader() {
+        ClassLoader oldCL = null;
+        ClassLoader cl = applicationClassLoader.get();
+        if (cl != Thread.currentThread().getContextClassLoader()) {
+            oldCL = Thread.currentThread().getContextClassLoader();
+            Thread.currentThread().setContextClassLoader(cl);
+        }
+        return oldCL;
+    }
+
+    public static ClassLoader setSystemClassLoader() {
+        ClassLoader oldCL = null;
+        ClassLoader cl = ClassLoaderHelper.class.getClassLoader();
+        if (cl != Thread.currentThread().getContextClassLoader()) {
+            oldCL = Thread.currentThread().getContextClassLoader();
+            Thread.currentThread().setContextClassLoader(cl);
+        }
+        return oldCL;
+    }
+    
+    public static void applicationInvoke(Runnable runnable) {
+        ClassLoader currentCL = Thread.currentThread().getContextClassLoader();
+        ClassLoader appCL = applicationClassLoader.get();
+        invoke(runnable, currentCL, appCL);
+    }
+
+    public static void systemInvoke(Runnable runnable) {
+        ClassLoader currentCL = Thread.currentThread().getContextClassLoader();
+        ClassLoader sysCL = ClassLoaderHelper.class.getClassLoader();
+        invoke(runnable, currentCL, sysCL);
+    }
+
+    private static void invoke(Runnable runnable, ClassLoader old, ClassLoader newCL) {
+        try {
+            if (newCL != old) {
+                Thread.currentThread().setContextClassLoader(newCL);
+            }
+
+            runnable.run();
+
+        }finally {
+            if (newCL != old) {
+                Thread.currentThread().setContextClassLoader(old);
+            }
+        }
+    }
+}

Modified: incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/SDODataBinding.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/SDODataBinding.java?rev=399310&r1=399309&r2=399310&view=diff
==============================================================================
--- incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/SDODataBinding.java (original)
+++ incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/SDODataBinding.java Wed May  3 07:07:39 2006
@@ -33,13 +33,27 @@
     }
 
     public Object[] fromOMElement(OMElement omElement) {
-        Object[] args = AxiomHelper.toObjects(typeHelper, omElement);
-        return args;
+        ClassLoader oldCL = ClassLoaderHelper.setApplicationClassLoader();
+        try {
+            Object[] args = AxiomHelper.toObjects(typeHelper, omElement);
+            return args;
+        } finally {
+            if (oldCL != null) {
+                Thread.currentThread().setContextClassLoader(oldCL);
+            }
+        }
     }
 
     public OMElement toOMElement(Object[] args) {
-        OMElement omElement = AxiomHelper.toOMElement(typeHelper, args, typeQN);
-        return omElement;
+        ClassLoader oldCL = ClassLoaderHelper.setApplicationClassLoader();
+        try {
+            OMElement omElement = AxiomHelper.toOMElement(typeHelper, args, typeQN);
+            return omElement;
+        } finally {
+            if (oldCL != null) {
+                Thread.currentThread().setContextClassLoader(oldCL);
+            }
+        }
     }
 
 }