You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by di...@apache.org on 2006/09/28 20:14:11 UTC

svn commit: r450955 - in /webservices/axis2/trunk/java/modules: integration/test/org/apache/axis2/spring/ kernel/src/org/apache/axis2/ kernel/src/org/apache/axis2/receivers/

Author: dims
Date: Thu Sep 28 11:14:10 2006
New Revision: 450955

URL: http://svn.apache.org/viewvc?view=rev&rev=450955
Log:
Working on fix for AXIS2-969, The problem is that xmlbeans expects the current TCCL to be able to load the xsb files. So we have to set the TCCL to that of the axis service class loader. There is a flakiness even now that i am investigating, namely the service returns a response w/o the xsi:type for the first request ONLY. Responses to subsequent requests are ok. Still looking.

There are now 3 modes for the TCCL when a service method is invoked.

Option #1: default - we don't set the TCCL (AXis2 1.0 behavior)
Option #2: composite - we set a multi class loader as the TCCL with the web app class loader and the axis service class loader.
Option #3: service - we set the TCCL to the axis service classloader.

Notes:
- default is fine for normal use (remember the ejb and jndi lookup problems, this is the default setting for getting them to work)
- composite is for spring folks. there was a forceTCCL i introduced a couple of weeks ago, this is the new way of doing that.
- service is for xmlbeans primarily right now as mentioned before.


Modified:
    webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/spring/SpringServiceTest.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInMessageReceiver.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutAsyncMessageReceiver.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java

Modified: webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/spring/SpringServiceTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/spring/SpringServiceTest.java?view=diff&rev=450955&r1=450954&r2=450955
==============================================================================
--- webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/spring/SpringServiceTest.java (original)
+++ webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/spring/SpringServiceTest.java Thu Sep 28 11:14:10 2006
@@ -130,7 +130,7 @@
 
         service.setClassLoader(Thread.currentThread().getContextClassLoader());
         service.addParameter(new Parameter(Constants.SERVICE_OBJECT_SUPPLIER, supplierName));
-        service.addParameter(new Parameter(Constants.SERVICE_FORCE_TCCL, "true"));
+        service.addParameter(new Parameter(Constants.SERVICE_TCCL, Constants.TCCL_COMPOSITE));
         service.addParameter(new Parameter(SpringAppContextAwareObjectSupplier.SERVICE_SPRING_BEANNAME, beanName));
 
         AxisOperation axisOp = new InOutAxisOperation(opName);
@@ -153,7 +153,7 @@
 
         service.setClassLoader(Thread.currentThread().getContextClassLoader());
         service.addParameter(new Parameter(Constants.SERVICE_OBJECT_SUPPLIER, supplierName));
-        service.addParameter(new Parameter(Constants.SERVICE_FORCE_TCCL, "true"));
+        service.addParameter(new Parameter(Constants.SERVICE_TCCL, Constants.TCCL_COMPOSITE));
         service.addParameter(new Parameter(SpringAppContextAwareObjectSupplier.SERVICE_SPRING_BEANNAME, beanName));
 
         AxisOperation axisOp = new OutInAxisOperation(opName);

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java?view=diff&rev=450955&r1=450954&r2=450955
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java Thu Sep 28 11:14:10 2006
@@ -107,7 +107,11 @@
     //Parameter name of Service impl class
     public static final String SERVICE_CLASS = "ServiceClass";
     public static final String SERVICE_OBJECT_SUPPLIER = "ServiceObjectSupplier";
-    public static final String SERVICE_FORCE_TCCL = "forceTCCL";
+    public static final String SERVICE_TCCL = "ServiceTCCL";
+
+    public static final String TCCL_DEFAULT = "default";
+    public static final String TCCL_COMPOSITE = "composite";
+    public static final String TCCL_SERVICE = "service";
 
     /**
      * Field REQUEST_URL_PREFIX

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInMessageReceiver.java?view=diff&rev=450955&r1=450954&r2=450955
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInMessageReceiver.java Thu Sep 28 11:14:10 2006
@@ -35,7 +35,7 @@
             saveTCCL(messageCtx);
             invokeBusinessLogic(messageCtx);
         } finally {
-            restoreTCCL();
+            restoreTCCL(messageCtx);
         }
     }
 }

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutAsyncMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutAsyncMessageReceiver.java?view=diff&rev=450955&r1=450954&r2=450955
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutAsyncMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutAsyncMessageReceiver.java Thu Sep 28 11:14:10 2006
@@ -60,7 +60,7 @@
                         saveTCCL(messageCtx);
                         invokeBusinessLogic(messageCtx, newmsgCtx);
                     } finally {
-                        restoreTCCL();
+                        restoreTCCL(messageCtx);
                     }
                     callback.handleResult(newmsgCtx);
                 } catch (AxisFault e) {

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java?view=diff&rev=450955&r1=450954&r2=450955
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java Thu Sep 28 11:14:10 2006
@@ -38,7 +38,7 @@
             saveTCCL(msgContext);
             invokeBusinessLogic(msgContext, outMsgContext);
         } finally {
-            restoreTCCL();
+            restoreTCCL(msgContext);
         }
 
         AxisEngine engine =

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java?view=diff&rev=450955&r1=450954&r2=450955
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java Thu Sep 28 11:14:10 2006
@@ -38,26 +38,38 @@
 import java.net.URL;
 
 public abstract class AbstractMessageReceiver implements MessageReceiver {
-//    public static final String SERVICE_CLASS = "ServiceClass";
-//    public static final String SERVICE_OBJECT_SUPPLIER = "ServiceObjectSupplier";
     public static final String SCOPE = "scope";
-    protected boolean forceTCCL = false;
+    protected String serviceTCCL = null;
+    public static final String SAVED_TCCL = "_SAVED_TCCL_";
 
     protected void saveTCCL(MessageContext msgContext) {
-        if (forceTCCL && msgContext.getAxisService() != null &&
+        if (serviceTCCL != null && msgContext.getAxisService() != null &&
                 msgContext.getAxisService().getClassLoader() != null) {
-            Thread.currentThread().setContextClassLoader(new MultiParentClassLoader(new URL[]{}, new ClassLoader[]{
-                    msgContext.getAxisService().getClassLoader(),
-                    Thread.currentThread().getContextClassLoader(),
-            }));
+            ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+            if (serviceTCCL.equals(Constants.TCCL_COMPOSITE)) {
+                msgContext.setProperty(SAVED_TCCL, contextClassLoader);
+                Thread.currentThread().setContextClassLoader(new MultiParentClassLoader(new URL[]{}, new ClassLoader[]{
+                        msgContext.getAxisService().getClassLoader(),
+                        contextClassLoader,
+                }));
+            } else if (serviceTCCL.equals(Constants.TCCL_SERVICE)) {
+                msgContext.setProperty(SAVED_TCCL, contextClassLoader);
+                Thread.currentThread().setContextClassLoader(
+                        msgContext.getAxisService().getClassLoader()
+                );
+            }
         }
     }
 
-    protected void restoreTCCL() {
-        if(forceTCCL) {
-            ClassLoader tccl = Thread.currentThread().getContextClassLoader();
-            if (tccl != null && tccl instanceof MultiParentClassLoader) {
-                Thread.currentThread().setContextClassLoader(((MultiParentClassLoader) tccl).getParents()[1]);
+    protected void restoreTCCL(MessageContext msgContext) {
+        if(serviceTCCL != null) {
+            ClassLoader oldTCCL = (ClassLoader) msgContext.getProperty(SAVED_TCCL);
+            if(oldTCCL != null) {
+                if(serviceTCCL.equals(Constants.TCCL_COMPOSITE)) {
+                    Thread.currentThread().setContextClassLoader(oldTCCL);
+                } else if (serviceTCCL.equals(Constants.TCCL_SERVICE)) {
+                    Thread.currentThread().setContextClassLoader(oldTCCL);
+                }
             }
         }
     }
@@ -70,18 +82,16 @@
      * @throws AxisFault
      */
     protected Object makeNewServiceObject(MessageContext msgContext) throws AxisFault {
-        saveTCCL(msgContext);
         try {
             AxisService service =
                     msgContext.getOperationContext().getServiceContext().getAxisService();
             ClassLoader classLoader = service.getClassLoader();
 
-            if(service.getParameter(Constants.SERVICE_FORCE_TCCL) != null) {
+            if(service.getParameter(Constants.SERVICE_TCCL) != null) {
                 Parameter serviceObjectParam =
-                        service.getParameter(Constants.SERVICE_FORCE_TCCL);
-                String value = ((String)
-                        serviceObjectParam.getValue()).trim();
-                forceTCCL = JavaUtils.isTrue(value);
+                        service.getParameter(Constants.SERVICE_TCCL);
+                serviceTCCL = ((String)
+                        serviceObjectParam.getValue()).trim().toLowerCase();
             }
             // allow alternative definition of makeNewServiceObject
             if (service.getParameter(Constants.SERVICE_OBJECT_SUPPLIER) != null) {
@@ -110,8 +120,6 @@
             }
         } catch (Exception e) {
             throw AxisFault.makeFault(e);
-        } finally {
-            restoreTCCL();
         }
     }
 

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java?view=diff&rev=450955&r1=450954&r2=450955
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java Thu Sep 28 11:14:10 2006
@@ -35,7 +35,7 @@
             saveTCCL(messageCtx);
             invokeBusinessLogic(messageCtx);
         } finally {
-            restoreTCCL();
+            restoreTCCL(messageCtx);
         }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org