You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/12/03 08:57:09 UTC

svn commit: r1416371 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config: AppValidator.java rules/CheckRestMethodArePublic.java rules/ValidationBase.java

Author: rmannibucau
Date: Mon Dec  3 07:57:08 2012
New Revision: 1416371

URL: http://svn.apache.org/viewvc?rev=1416371&view=rev
Log:
TOMEE-617 trying to ensure validations are done with tempclassloader - note: AppValidator update should be useless but try to avoid side effect if a validator is added and not well coded

Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppValidator.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckRestMethodArePublic.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/ValidationBase.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppValidator.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppValidator.java?rev=1416371&r1=1416370&r2=1416371&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppValidator.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppValidator.java Mon Dec  3 07:57:08 2012
@@ -91,6 +91,8 @@ public class AppValidator {
 
     // START SNIPPET : code2
     public AppModule validate(final AppModule appModule) {
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(appModule.getClassLoader()); // be sure to not mix classloaders
         try {
             ValidationRule[] rules = getValidationRules();
             for (int i = 0; i < rules.length; i++) {
@@ -102,6 +104,8 @@ public class AppValidator {
             err.setCause(e);
             err.setDetails(e.getMessage());
             appModule.getValidation().addError(err);
+        } finally {
+            Thread.currentThread().setContextClassLoader(loader);
         }
         return appModule;
     }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckRestMethodArePublic.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckRestMethodArePublic.java?rev=1416371&r1=1416370&r2=1416371&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckRestMethodArePublic.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckRestMethodArePublic.java Mon Dec  3 07:57:08 2012
@@ -37,59 +37,69 @@ public class CheckRestMethodArePublic im
     public void validate(final AppModule appModule) {
         // valid standalone classes
         final Collection<String> standAloneClasses = new ArrayList<String>();
-        for (EjbModule ejb : appModule.getEjbModules()) {
-            for (EnterpriseBean bean : ejb.getEjbJar().getEnterpriseBeans()) {
-                if (bean instanceof SessionBean && ((SessionBean) bean).isRestService()) {
-                    standAloneClasses.add(bean.getEjbClass());
-                    valid(ejb.getValidation(), ejb.getClassLoader(), bean.getEjbClass());
-                }
-            }
-        }
 
-        for (WebModule web : appModule.getWebModules()) {
-            // build the list of classes to validate
-            final Collection<String> classes = new ArrayList<String>();
-            classes.addAll(web.getRestClasses());
-            classes.addAll(web.getEjbRestServices());
-
-            for (String app : web.getRestApplications()) {
-                Class<?> clazz;
-                try {
-                    clazz = web.getClassLoader().loadClass(app);
-                } catch (ClassNotFoundException e) {
-                    continue; // managed elsewhere, here we just check methods
-                }
-
-                final Application appInstance;
-                try {
-                    appInstance = (Application) clazz.newInstance();
-                } catch (Exception e) {
-                    continue; // managed elsewhere
-                }
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        try {
+            for (EjbModule ejb : appModule.getEjbModules()) {
+                Thread.currentThread().setContextClassLoader(ejb.getClassLoader());
 
-                for (Class<?> rsClass : appInstance.getClasses()) {
-                    classes.add(rsClass.getName());
-                }
-                for (Object rsSingleton : appInstance.getSingletons()) {
-                    classes.add(rsSingleton.getClass().getName());
+                for (EnterpriseBean bean : ejb.getEjbJar().getEnterpriseBeans()) {
+                    if (bean instanceof SessionBean && ((SessionBean) bean).isRestService()) {
+                        standAloneClasses.add(bean.getEjbClass());
+                        valid(ejb.getValidation(), ejb.getClassLoader(), bean.getEjbClass());
+                    }
                 }
             }
 
-            // try to avoid to valid twice the same classes
-            final Iterator<String> it = classes.iterator();
-            while (it.hasNext()) {
-                final String current = it.next();
-                if (standAloneClasses.contains(current)) {
-                    it.remove();
+            for (WebModule web : appModule.getWebModules()) {
+                Thread.currentThread().setContextClassLoader(web.getClassLoader());
+
+                // build the list of classes to validate
+                final Collection<String> classes = new ArrayList<String>();
+                classes.addAll(web.getRestClasses());
+                classes.addAll(web.getEjbRestServices());
+
+                for (String app : web.getRestApplications()) {
+                    Class<?> clazz;
+                    try {
+                        clazz = web.getClassLoader().loadClass(app);
+                    } catch (ClassNotFoundException e) {
+                        continue; // managed elsewhere, here we just check methods
+                    }
+
+                    final Application appInstance;
+                    try {
+                        appInstance = (Application) clazz.newInstance();
+                    } catch (Exception e) {
+                        continue; // managed elsewhere
+                    }
+
+                    for (Class<?> rsClass : appInstance.getClasses()) {
+                        classes.add(rsClass.getName());
+                    }
+                    for (Object rsSingleton : appInstance.getSingletons()) {
+                        classes.add(rsSingleton.getClass().getName());
+                    }
+                }
+
+                // try to avoid to valid twice the same classes
+                final Iterator<String> it = classes.iterator();
+                while (it.hasNext()) {
+                    final String current = it.next();
+                    if (standAloneClasses.contains(current)) {
+                        it.remove();
+                    }
+                }
+
+                // valid
+                for (String classname : classes) {
+                    valid(web.getValidation(), web.getClassLoader(), classname);
                 }
-            }
 
-            // valid
-            for (String classname : classes) {
-                valid(web.getValidation(), web.getClassLoader(), classname);
+                classes.clear();
             }
-
-            classes.clear();
+        } finally {
+            Thread.currentThread().setContextClassLoader(loader);
         }
 
         standAloneClasses.clear();

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/ValidationBase.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/ValidationBase.java?rev=1416371&r1=1416370&r2=1416371&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/ValidationBase.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/ValidationBase.java Mon Dec  3 07:57:08 2012
@@ -40,13 +40,22 @@ public abstract class ValidationBase imp
     DeploymentModule module;
 
     public void validate(AppModule appModule) {
-        for (EjbModule ejbModule : appModule.getEjbModules()) {
-            module = ejbModule;
-            validate(ejbModule);
-        }
-        for (ClientModule clientModule : appModule.getClientModules()) {
-            module = clientModule;
-            validate(clientModule);
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        try {
+            for (EjbModule ejbModule : appModule.getEjbModules()) {
+                Thread.currentThread().setContextClassLoader(ejbModule.getClassLoader());
+
+                module = ejbModule;
+                validate(ejbModule);
+            }
+            for (ClientModule clientModule : appModule.getClientModules()) {
+                Thread.currentThread().setContextClassLoader(clientModule.getClassLoader());
+
+                module = clientModule;
+                validate(clientModule);
+            }
+        } finally {
+            Thread.currentThread().setContextClassLoader(loader);
         }
     }