Title: [2568] trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config: Added checks for dependent classes.

Diff

Modified: trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/ConfigurationFactory.java (2567 => 2568)

--- trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/ConfigurationFactory.java	2006-03-22 01:56:22 UTC (rev 2567)
+++ trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/ConfigurationFactory.java	2006-03-22 02:00:32 UTC (rev 2568)
@@ -56,8 +56,8 @@
 public class ConfigurationFactory implements OpenEjbConfigurationFactory, ProviderDefaults {
 
     public static final String DEFAULT_SECURITY_ROLE = "openejb.default.security.role";
-    protected static final Logger logger = Logger.getInstance("OpenEJB.startup", "org.openejb.util.resources");
-    protected static final Messages messages = new Messages("org.openejb.util.resources");
+    protected static final Logger logger = Logger.getInstance("OpenEJB.startup", "org.openejb.alt.config.rules");
+    protected static final Messages messages = new Messages("org.openejb.alt.config.rules");
 
     private AutoDeployer deployer;
     private Openejb openejb;
@@ -1086,7 +1086,8 @@
                     ValidationError[] errors = set.getErrors();
                     for (int j = 0; j < errors.length; j++) {
                         ValidationError e = errors[j];
-                        logger.error(e.getPrefix() + " ... " + e.getBean().getEjbName() + ":\t" + e.getMessage(2));
+                        String ejbName = (e.getBean() != null)? e.getBean().getEjbName(): "null";
+                        logger.error(e.getPrefix() + " ... " + ejbName + ":\t" + e.getMessage(2));
                     }
                     ValidationFailure[] failures = set.getFailures();
                     for (int j = 0; j < failures.length; j++) {

Modified: trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/EjbValidator.java (2567 => 2568)

--- trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/EjbValidator.java	2006-03-22 01:56:22 UTC (rev 2567)
+++ trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/EjbValidator.java	2006-03-22 02:00:32 UTC (rev 2568)
@@ -11,6 +11,11 @@
 import org.openejb.OpenEJBException;
 import org.openejb.loader.SystemInstance;
 import org.openejb.alt.config.ejb11.EjbJar;
+import org.openejb.alt.config.ejb11.EjbRef;
+import org.openejb.alt.config.ejb11.EjbLocalRef;
+import org.openejb.alt.config.ejb11.EnvEntry;
+import org.openejb.alt.config.ejb11.ResourceRef;
+import org.openejb.alt.config.ejb11.SecurityRoleRef;
 import org.openejb.alt.config.rules.CheckClasses;
 import org.openejb.alt.config.rules.CheckMethods;
 import org.openejb.util.JarUtils;
@@ -20,7 +25,7 @@
 public class EjbValidator {
     private static final String helpBase = "META-INF/org.openejb.cli/";
 
-    protected static final Messages _messages = new Messages("org.openejb.util.resources");
+    protected static final Messages _messages = new Messages("org.openejb.alt.config.rules");
 
     int LEVEL = 2;
     boolean PRINT_DETAILS = false;
@@ -47,7 +52,7 @@
         return ejbSets;
     }
 
-    public EjbSet validateJar(EjbJarUtils ejbJarUtils, ClassLoader classLoader) {
+    public EjbSet validateJar(final EjbJarUtils ejbJarUtils, ClassLoader classLoader) {
         EjbSet set = null;
 
         try {
@@ -59,6 +64,70 @@
         } catch (Throwable e) {
             e.printStackTrace(System.out);
             ValidationError err = new ValidationError("cannot.validate");
+            err.setCause(e);
+            err.setBean(new Bean(){
+
+                public String getType() {
+                    return "Ejb-jar";
+                }
+
+                public Object getBean() {
+                    return null;
+                }
+
+                public String getEjbName() {
+                    String name = ejbJarUtils.getEjbJar().getDisplayName();
+                    if (name == null){
+                        File jar = new File(ejbJarUtils.getJarLocation());
+                        jar = jar.getAbsoluteFile();
+                        name = jar.getName();
+                        if (name.equals(".")){
+                            name = jar.getParentFile().getName();
+                        }
+                    }
+                    return name;
+                }
+
+                public String getEjbClass() {
+                    return null;
+                }
+
+                public String getHome() {
+                    return null;
+                }
+
+                public String getRemote() {
+                    return null;
+                }
+
+                public String getLocalHome() {
+                    return null;
+                }
+
+                public String getLocal() {
+                    return null;
+                }
+
+                public EjbRef[] getEjbRef() {
+                    return new EjbRef[0];
+                }
+
+                public EjbLocalRef[] getEjbLocalRef() {
+                    return new EjbLocalRef[0];
+                }
+
+                public EnvEntry[] getEnvEntry() {
+                    return new EnvEntry[0];
+                }
+
+                public ResourceRef[] getResourceRef() {
+                    return new ResourceRef[0];
+                }
+
+                public SecurityRoleRef[] getSecurityRoleRef() {
+                    return new SecurityRoleRef[0];
+                }
+            });
             err.setDetails(e.getMessage());
             set.addError(err);
         }

Modified: trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/ValidationError.java (2567 => 2568)

--- trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/ValidationError.java	2006-03-22 01:56:22 UTC (rev 2567)
+++ trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/ValidationError.java	2006-03-22 02:00:32 UTC (rev 2568)
@@ -2,6 +2,8 @@
 
 public class ValidationError extends ValidationException {
 
+    private Throwable cause;
+
     public ValidationError(String message) {
         super(message);
     }
@@ -14,4 +16,12 @@
         return "errors";
     }
 
+    public Throwable getCause() {
+        return cause;
+    }
+
+    public void setCause(Throwable cause) {
+        this.cause = cause;
+    }
+
 }

Modified: trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/rules/CheckClasses.java (2567 => 2568)

--- trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/rules/CheckClasses.java	2006-03-22 01:56:22 UTC (rev 2567)
+++ trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/rules/CheckClasses.java	2006-03-22 02:00:32 UTC (rev 2568)
@@ -9,6 +9,7 @@
 
 import javax.ejb.EJBLocalHome;
 import javax.ejb.EJBLocalObject;
+import java.lang.reflect.Method;
 
 public class CheckClasses implements ValidationRule {
 
@@ -25,17 +26,22 @@
                 b = beans[i];
                 check_hasEjbClass(b);
                 check_isEjbClass(b);
+                check_hasDependentClasses(b, b.getEjbClass(), "<ejb-class>");
                 if (b.getHome() != null) {
                     check_hasHomeClass(b);
                     check_hasRemoteClass(b);
                     check_isHomeInterface(b);
                     check_isRemoteInterface(b);
+                    check_hasDependentClasses(b, b.getHome(), "<home>");
+                    check_hasDependentClasses(b, b.getRemote(), "<remote>");
                 }
                 if (b.getLocalHome() != null) {
                     check_hasLocalHomeClass(b);
                     check_hasLocalClass(b);
                     check_isLocalHomeInterface(b);
                     check_isLocalInterface(b);
+                    check_hasDependentClasses(b, b.getLocalHome(), "<local-home>");
+                    check_hasDependentClasses(b, b.getLocal(), "<local>");
                 }
             }
         } catch (RuntimeException e) {
@@ -43,6 +49,45 @@
         }
     }
 
+    private void check_hasDependentClasses(Bean b, String className, String type) {
+        try {
+            ClassLoader cl = set.getClassLoader();
+            Class clazz = cl.loadClass(className);
+            for (Object item : clazz.getFields()) { item.toString(); }
+            for (Object item : clazz.getMethods()) { item.toString(); }
+            for (Object item : clazz.getConstructors()) { item.toString(); }
+            for (Object item : clazz.getAnnotations()) { item.toString(); }
+            for (Object item : clazz.getEnumConstants()) { item.toString(); }
+        } catch (NullPointerException e) {
+            // Don't know why I get these from clazz.getEnumConstants() 
+        } catch (ClassNotFoundException e) {
+            /*
+            # 0 - Referring Class name
+            # 1 - Dependent Class name
+            # 2 - Element (home, ejb-class, remote)
+            # 3 - Bean name
+            */
+            ValidationFailure failure = new ValidationFailure("missing.dependent.class");
+            failure.setDetails(className, e.getMessage(), type, b.getEjbName());
+            failure.setBean(b);
+
+            set.addFailure(failure);
+        } catch (NoClassDefFoundError e) {
+            /*
+            # 0 - Referring Class name
+            # 1 - Dependent Class name
+            # 2 - Element (home, ejb-class, remote)
+            # 3 - Bean name
+            */
+
+            ValidationFailure failure = new ValidationFailure("missing.dependent.class");
+            failure.setDetails(className, e.getMessage(), type, b.getEjbName());
+            failure.setBean(b);
+
+            set.addFailure(failure);
+        }
+    }
+
     private void check_hasLocalClass(Bean b) {
         lookForClass(b, b.getLocal(), "<local>");
     }
@@ -162,6 +207,5 @@
             throw new OpenEJBException(SafeToolkit.messages.format("cl0007", clazz, set.getJarPath()));
         }
     }
-
 }
 

Modified: trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/rules/Messages.properties (2567 => 2568)

--- trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/rules/Messages.properties	2006-03-22 01:56:22 UTC (rev 2567)
+++ trunk/openejb3/container/openejb-core/src/main/java/org/openejb/alt/config/rules/Messages.properties	2006-03-22 02:00:32 UTC (rev 2568)
@@ -46,12 +46,11 @@
 # Validation Rule messages
 #--------------------------------------------------------------------
 
-# 0 - Class name
-# 1 - Element (home, ejb-class, remote)
-# 2 - Bean name
+# 0 - Error Message
+# 1 - Stack Trace
 1.cannot.validate         Cannot validate jar
-2.cannot.validate         Cannot validate jar
-3.cannot.validate         {0}
+2.cannot.validate         Cannot validate jar: {0}
+3.cannot.validate         Cannot validate jar: {0}
 
 # 0 - Class name
 # 1 - Element (home, ejb-class, remote)
@@ -116,3 +115,10 @@
 2.misslocated.class           Misslocated class {0} 
 3.misslocated.class           The class {0} was found in a parent classloader and was loaded from there rather than this jar.  However, a dependent class {3} was not found in the parent classloader.  \n\nThere are two ways to fix this:\n\nOne, remove the class {0} from the jar in the parent classloader to ensure the class is only loaded from this jar.\n\nTwo, move the dependent class {3} and any other dependent classes into the jar in the parent classloader.  \n\nMore information can be found at http://www.openejb.org/faq_validation.html#misslocated.class
 
+# 0 - Referring Class name
+# 1 - Dependent Class name
+# 2 - Element (home, ejb-class, remote)
+# 3 - Bean name
+1.missing.dependent.class           Missing dependent class or library
+2.missing.dependent.class           Missing dependent class or library: {1} needed by {2}
+3.missing.dependent.class           The class {1} not found and is referenced by the {2} class {0}.  The Check that the class or related library is available in the classpath

Reply via email to