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);
         }
     }
 


Reply via email to