David,

I'm now getting tons of test case errors trying to build...is there additional test case cleanup required, or is the validation acting too aggresively?

Rick

[EMAIL PROTECTED] wrote:
Author: dblevins
Date: Wed Jul 16 22:32:23 2008
New Revision: 677503

URL: http://svn.apache.org/viewvc?rev=677503&view=rev
Log:
OPENEJB-859: Improved validation for <home>, <remote>, <local-home>, <local>, 
<business-local> and <business-remote> elements
Rewrote this validation completely to be more aggressive in figuring out what 
the user might have intended to do.

Added:
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/InvalidInterfacesTest.java
Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationException.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Strings.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java?rev=677503&r1=677502&r2=677503&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java
 Wed Jul 16 22:32:23 2008
@@ -29,6 +29,7 @@
 import org.apache.openejb.spi.ContainerSystem;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
+import org.apache.openejb.util.Strings;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.ivm.naming.BusinessLocalReference;
@@ -126,21 +127,10 @@
                 this.type = type;
                 this.annotatedName = annotatedName;
                 this.xmlName = xmlName;
-                this.xmlNameCc = camelCase(xmlName);
+                this.xmlNameCc = Strings.camelCase(xmlName);
                 this.openejbLegacy = openejbLegacy;
             }
- private String camelCase(String string){
-                StringBuilder sb = new StringBuilder();
-                String[] strings = string.split("-");
-                for (String s : strings) {
-                    int l = sb.length();
-                    sb.append(s);
-                    sb.setCharAt(l, Character.toUpperCase(sb.charAt(l)));
-                }
-                return sb.toString();
-            }
-
public InterfaceType getType() {
                 return type;

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationException.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationException.java?rev=677503&r1=677502&r2=677503&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationException.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationException.java
 Wed Jul 16 22:32:23 2008
@@ -36,6 +36,10 @@
         }
     }
+ public String getMessageKey(){
+        return message;
+    }
+ public Object[] getDetails() {
         return details;
     }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java?rev=677503&r1=677502&r2=677503&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
 Wed Jul 16 22:32:23 2008
@@ -24,12 +24,15 @@
 import org.apache.openejb.jee.Interceptor;
 import org.apache.openejb.config.EjbModule;
 import org.apache.openejb.util.SafeToolkit;
+import org.apache.openejb.util.Strings;
 import org.apache.xbean.finder.ClassFinder;
import javax.ejb.EJBLocalHome;
 import javax.ejb.EJBLocalObject;
 import javax.ejb.EJBHome;
 import javax.ejb.EJBObject;
+import javax.ejb.Local;
+import javax.ejb.Remote;
 import javax.jws.WebService;
 import static java.lang.reflect.Modifier.isAbstract;
 import java.lang.reflect.Method;
@@ -69,38 +72,40 @@
     public void validate(EjbModule ejbModule) {
         for (EnterpriseBean bean : ejbModule.getEjbJar().getEnterpriseBeans()) 
{
             try {
-                check_hasEjbClass(bean);
+                Class<?> beanClass = check_hasEjbClass(bean);
if (!(bean instanceof RemoteBean)) continue;
                 RemoteBean b = (RemoteBean) bean;
check_isEjbClass(b);
-                check_hasDependentClasses(b, b.getEjbClass(), "<ejb-class>");
+                check_hasDependentClasses(b, b.getEjbClass(), "ejb-class");
                 check_hasInterface(b);
+
+                if (b.getRemote() != null){
+                    checkInterface(b, beanClass, "remote", b.getRemote());
+                }
+
                 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>");
+                    checkInterface(b, beanClass, "home", b.getHome());
+                }
+
+                if (b.getLocal() != null) {
+                    checkInterface(b, beanClass, "local", b.getLocal());
                 }
+
                 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>");
+                    checkInterface(b, beanClass, "local-home", 
b.getLocalHome());
                 }
if (b instanceof SessionBean) {
                     SessionBean sessionBean = (SessionBean) b;
+
                     for (String interfce : sessionBean.getBusinessLocal()) {
-                        check_businessInterface(sessionBean, interfce, 
"<business-local>");
+                        checkInterface(b, beanClass, "business-local", 
interfce);
                     }
+
                     for (String interfce : sessionBean.getBusinessRemote()) {
-                        check_businessInterface(sessionBean, interfce, 
"<business-remote>");
+                        checkInterface(b, beanClass, "business-local", 
interfce);
                     }
                 }
             } catch (RuntimeException e) {
@@ -113,35 +118,30 @@
         }
     }
- private void check_businessInterface(SessionBean b, String interfaceName, String tagName) {
-        String ejbName = b.getEjbName();
-        Class<?> interfce = lookForClass(interfaceName, tagName, 
b.getEjbName());
+    private void checkInterface(RemoteBean b, Class<?> beanClass, String tag, 
String className) {
+        Class<?> interfce = lookForClass(className, tag, b.getEjbName());
- if (!interfce.isInterface()){
-            fail(b, "notAnInterface", interfce.getName(), tagName);
-        }
+        if (interfce == null) return;
+
+        check_hasDependentClasses(b, className, tag);
+
+        tag = Strings.lcfirst(Strings.camelCase(tag));
+
+        if (isValidInterface(b, interfce, beanClass, tag));
ClassFinder finder = new ClassFinder(interfce); for (Class<? extends Annotation> annotation : beanOnlyAnnotations) {
+
             if (interfce.isAnnotationPresent(annotation)){
                 warn(b, "interface.beanOnlyAnnotation", 
annotation.getSimpleName(), interfce.getName(), b.getEjbClass());
             }
+
             for (Method method : finder.findAnnotatedMethods(annotation)) {
                 warn(b, "interfaceMethod.beanOnlyAnnotation", 
annotation.getSimpleName(), interfce.getName(), method.getName(), b.getEjbClass());
             }
         }
- if (EJBHome.class.isAssignableFrom(interfce)){
-            fail(ejbName, "xml.businessRemoteOrLocal.ejbHome", tagName, 
interfce.getName());
-        } else if (EJBObject.class.isAssignableFrom(interfce)){
-            fail(ejbName, "xml.businessRemoteOrLocal.ejbObject", tagName, 
interfce.getName());
-        } else if (EJBLocalHome.class.isAssignableFrom(interfce)) {
-            fail(ejbName, "xml.businessRemoteOrLocal.ejbLocalHome", tagName, 
interfce.getName());
-        } else if (EJBLocalObject.class.isAssignableFrom(interfce)){
-            fail(ejbName, "xml.businessRemoteOrLocal.ejbLocalObject", tagName, 
interfce.getName());
-        }
-
     }
private void check_hasInterface(RemoteBean b) {
@@ -187,7 +187,8 @@
             # 2 - Element (home, ejb-class, remote)
             # 3 - Bean name
             */
-            fail(b, "missing.dependent.class", className, e.getMessage(), 
type, b.getEjbName());
+            String missingClass = e.getMessage();
+            fail(b, "missing.dependent.class", className, missingClass, type, 
b.getEjbName());
         } catch (NoClassDefFoundError e) {
             /*
             # 0 - Referring Class name
@@ -195,19 +196,12 @@
             # 2 - Element (home, ejb-class, remote)
             # 3 - Bean name
             */
-            fail(b, "missing.dependent.class", className, e.getMessage(), 
type, b.getEjbName());
+            String missingClass = e.getMessage();
+            fail(b, "missing.dependent.class", className, missingClass, type, 
b.getEjbName());
         }
     }
- private void check_hasLocalClass(RemoteBean b) {
-        lookForClass(b.getLocal(), "<local>", b.getEjbName());
-    }
-
-    private void check_hasLocalHomeClass(RemoteBean b) {
-        lookForClass(b.getLocalHome(), "<local-home>", b.getEjbName());
-    }
-
-    public void check_hasEjbClass(EnterpriseBean b) {
+    public Class<?> check_hasEjbClass(EnterpriseBean b) {
String ejbName = b.getEjbName(); @@ -217,32 +211,22 @@
             fail(ejbName, "interfaceDeclaredAsBean", beanClass.getName());
         }
- if (isCmp(b)) return;
+        if (isCmp(b)) return beanClass;
if (isAbstract(beanClass.getModifiers())){
             fail(ejbName, "abstractDeclaredAsBean", beanClass.getName());
         }
-    }
-
-    public void check_hasInterceptorClass(Interceptor i) {
-
-        lookForClass(i.getInterceptorClass(), "<interceptor-class>", 
"Interceptor");
+ return beanClass;
     }
- public void check_hasHomeClass(RemoteBean b) {
+    private void check_hasInterceptorClass(Interceptor i) {
- lookForClass(b.getHome(), "<home>", b.getEjbName());
+        lookForClass(i.getInterceptorClass(), "interceptor-class", 
"Interceptor");
} - public void check_hasRemoteClass(RemoteBean b) {
-
-        lookForClass(b.getRemote(), "<remote>", b.getEjbName());
-
-    }
-
-    public void check_isEjbClass(RemoteBean b) {
+    private void check_isEjbClass(RemoteBean b) {
if (b instanceof SessionBean) { @@ -258,26 +242,6 @@ } - private void check_isLocalInterface(RemoteBean b) {
-        compareTypes(b, b.getLocal(), EJBLocalObject.class);
-    }
-
-    private void check_isLocalHomeInterface(RemoteBean b) {
-        compareTypes(b, b.getLocalHome(), EJBLocalHome.class);
-    }
-
-    public void check_isHomeInterface(RemoteBean b) {
-
-        compareTypes(b, b.getHome(), javax.ejb.EJBHome.class);
-
-    }
-
-    public void check_isRemoteInterface(RemoteBean b) {
-
-        compareTypes(b, b.getRemote(), javax.ejb.EJBObject.class);
-
-    }
-
     private Class<?> lookForClass(String clazz, String type, String ejbName) {
         try {
             return loadClass(clazz);
@@ -305,6 +269,63 @@
         return null;
     }
+ private boolean isValidInterface(RemoteBean b, Class clazz, Class beanClass, String tag) {
+
+        if (clazz.equals(beanClass)) {
+
+            fail(b, "xml." + tag + ".beanClass", clazz.getName());
+
+        } else if (!clazz.isInterface()) {
+
+            fail(b, "xml." + tag + ".notInterface", clazz.getName());
+
+        } else if (EJBHome.class.isAssignableFrom(clazz)) {
+
+            if (tag.equals("home")) return true;
+
+            fail(b, "xml." + tag + ".ejbHome", clazz.getName());
+
+        } else if (EJBLocalHome.class.isAssignableFrom(clazz)) {
+
+            if (tag.equals("local-home")) return true;
+
+            fail(b, "xml." + tag + ".ejbLocalHome", clazz.getName());
+
+        } else if (EJBObject.class.isAssignableFrom(clazz)) {
+
+            if (tag.equals("remote")) return true;
+
+            fail(b, "xml." + tag + ".ejbObject", clazz.getName());
+
+        } else if (EJBLocalObject.class.isAssignableFrom(clazz)) {
+
+            if (tag.equals("local")) return true;
+
+            fail(b, "xml." + tag + ".ejbLocalObject", clazz.getName());
+
+        } else if (tag.equals("businessLocal") && 
tag.equals("businessRemote")) {
+
+            return true;
+        }
+
+        // must be tagged as <home>, <local-home>, <remote>, or <local>
+        if (clazz.isAnnotationPresent(Local.class)) {
+
+            fail(b, "xml." + tag + ".businessLocal", clazz.getName());
+
+        } else if (clazz.isAnnotationPresent(Remote.class)) {
+
+            fail(b, "xml." + tag + ".businessRemote", clazz.getName());
+
+        } else {
+
+            fail(b, "xml." + tag + ".unknown", clazz.getName());
+
+        }
+
+        return false;
+    }
+
     private void compareTypes(RemoteBean b, String clazz1, Class<?> class2) {
         Class<?> class1 = null;
         try {

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Strings.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Strings.java?rev=677503&r1=677502&r2=677503&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Strings.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Strings.java
 Wed Jul 16 22:32:23 2008
@@ -70,4 +70,15 @@
         return sb.toString();
     }
+ public static String camelCase(String string){
+        StringBuilder sb = new StringBuilder();
+        String[] strings = string.split("-");
+        for (String s : strings) {
+            int l = sb.length();
+            sb.append(s);
+            sb.setCharAt(l, Character.toUpperCase(sb.charAt(l)));
+        }
+        return sb.toString();
+    }
+
 }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties?rev=677503&r1=677502&r2=677503&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
 Wed Jul 16 22:32:23 2008
@@ -47,7 +47,7 @@
 # 2 - Bean name
 1.missing.class           Missing class
 2.missing.class           Missing class {0}
-3.missing.class           The class {0} not found. Check that the class 
specified in the {1} element for bean {2} is spelled correctly and the class is 
present in the jar
+3.missing.class           The class {0} not found. Check that the class specified in 
the <{1}> element for bean {2} is spelled correctly and the class is present in 
the jar
# 0 - Class name
 # 1 - EJB Class name
@@ -125,9 +125,10 @@
 # 1 - Dependent Class name
 # 2 - Element (home, ejb-class, remote)
 # 3 - Bean name
+# fail(b, "missing.dependent.class", className, missingClass, type, 
b.getEjbName());
 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
+2.missing.dependent.class           Missing dependent class or library: {1} 
needed by {0}
+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
# CheckAssemblyBindings.java
@@ -304,26 +305,6 @@
 2.ann.remoteOrLocal.ejbLocalObject = @{0} used in bean class lists a 
javax.ejb.EJBLocalObject interface. Use @LocalHome with home interface of "{1}".
 3.ann.remoteOrLocal.ejbLocalObject = When applied to a bean class, the @{0} annotation 
must only list business interfaces and cannot list legacy EJBLocalObject interfaces.  The 
EJBLocalHome of interface for "{1}" can be annotated on the bean class with 
@LocalHome
-# fail(ejbName, "xml.businessRemoteOrLocal.ejbHome", tagName, interfce.getName());
-1.xml.businessRemoteOrLocal.ejbHome = javax.ejb.EJBHome interface declared as 
{0}.
-2.xml.businessRemoteOrLocal.ejbHome = javax.ejb.EJBHome interface declared as {0}. Use 
<home>{1}</home>
-3.xml.businessRemoteOrLocal.ejbHome = Interfaces extending javax.ejb.EJBHome pre-date the 
concept of EJB 3.0 simplified business interfaces and must not use the {0} tag when 
declared in the ejb-jar.xml.  Declare this interface as <home>{1}</home>.
-
-# fail(ejbName, "xml.businessRemoteOrLocal.ejbLocalHome", tagName, 
interfce.getName());
-1.xml.businessRemoteOrLocal.ejbLocalHome = javax.ejb.EJBLocalHome interface 
declared as {0}.
-2.xml.businessRemoteOrLocal.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as 
{0}. Use <local-home>{1}</local-home>
-3.xml.businessRemoteOrLocal.ejbLocalHome = Interfaces extending javax.ejb.EJBLocalHome 
pre-date the concept of EJB 3.0 simplified business interfaces and must not use the {0} tag 
when declared in the ejb-jar.xml.  Declare this interface as 
<local-home>{1}</local-home>.
-
-# fail(ejbName, "xml.businessRemoteOrLocal.ejbObject", tagName, 
interfce.getName());
-1.xml.businessRemoteOrLocal.ejbObject = javax.ejb.EJBObject interface declared 
as {0}.
-2.xml.businessRemoteOrLocal.ejbObject = javax.ejb.EJBObject interface declared as {0}. Use 
<remote>{1}</remote>
-3.xml.businessRemoteOrLocal.ejbObject = Interfaces extending javax.ejb.EJBObject pre-date 
the concept of EJB 3.0 simplified business interfaces and must not use the {0} tag when 
declared in the ejb-jar.xml.  Declare this interface as <remote>{1}</remote>.
-
-# fail(ejbName, "xml.businessRemoteOrLocal.ejbLocalObject", tagName, 
interfce.getName());
-1.xml.businessRemoteOrLocal.ejbLocalObject = javax.ejb.EJBLocalObject 
interface declared as {0}.
-2.xml.businessRemoteOrLocal.ejbLocalObject = javax.ejb.EJBLocalObject interface declared 
as {0}. Use <local>{1}</local>
-3.xml.businessRemoteOrLocal.ejbLocalObject = Interfaces extending javax.ejb.EJBLocalObject 
pre-date the concept of EJB 3.0 simplified business interfaces and must not use the {0} tag 
when declared in the ejb-jar.xml.  Declare this interface as <local>{1}</local>.
-
 # warn(bean, "ignoredStatefulAnnotation", annotationType, beanType, 
methodName);
 1.ignoredStatefulAnnotation = @{0} is ignored for beans of type {1}
 2.ignoredStatefulAnnotation = @{0} is ignored for beans of type {1}.  Method: 
{2}
@@ -524,11 +505,6 @@
 Which can then be implemented by the {0} class.\
-# fail(b, "notAnInterface", interfce.getName(), tagName);
-1.notAnInterface = Business remotes and locals must be interfaces.
-2.notAnInterface = Class tagged as {1} is not an interface: {0}
-3.notAnInterface = All business remote and business local views must be java 
interfaces.  Classes, abstract classes or enums are not allowed.  Either 
convert {0} to an interface or remove the related {1} xml tag from your 
ejb-jar.xml.
-
 # fail(ejbName, "ann.notAnInterface", annotationName, interfce.getName());
 1.ann.notAnInterface = @{0} lists a non-interface.
 2.ann.notAnInterface = @{0} lists a non-interface: {1}
@@ -574,3 +550,195 @@
 2.ann.invalidConcurrencyAttribute = Ignoring {0} invalid @Lock annotations.  
Bean not using Container-Managed Concurrencys.
 3.ann.invalidConcurrencyAttribute = The @Lock annotation applies only to beans 
using Container-Managed Concurrencys.  Beans marked as 
@ConcurrencyManagement(BEAN) are responsible for thier own concurrency and may 
not use the @Lock annotation.  There are {0} such invalid annotations in the 
bean class that will be ignored and should be removed.
+
+1.xml.home.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as <home>. Use 
<local-home>{0}</local-home>
+2.xml.home.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as <home>. Use 
<local-home>{0}</local-home>
+3.xml.home.ejbLocalHome = The <home> element is for interfaces extending javax.ejb.EJBHome.  The 
interface supplied is a javax.ejb.EJBLocalHome and should be declared with the <local-home> 
element as in: <local-home>{0}</local-home>
+
+1.xml.home.ejbObject = javax.ejb.EJBObject interface declared as <home>. Use 
<remote>{0}</remote>
+2.xml.home.ejbObject = javax.ejb.EJBObject interface declared as <home>. Use 
<remote>{0}</remote>
+3.xml.home.ejbObject = The <home> element is for interfaces extending javax.ejb.EJBHome.  The 
interface supplied is a javax.ejb.EJBObject and should be declared with the <remote> element as 
in: <remote>{0}</remote>
+
+1.xml.home.ejbLocalObject = javax.ejb.EJBLocalObject interface declared as <home>. Use 
<local>{0}</local>
+2.xml.home.ejbLocalObject = javax.ejb.EJBLocalObject interface declared as <home>. Use 
<local>{0}</local>
+3.xml.home.ejbLocalObject = The <home> element is for interfaces extending javax.ejb.EJBHome.  
The interface supplied is a javax.ejb.EJBLocalObject and should be declared with the <local> 
element as in: <local>{0}</local>
+
+1.xml.home.businessLocal = EJB 3.0 business interface declared as <home>. Use 
<business-local>{0}</business-local>
+2.xml.home.businessLocal = EJB 3.0 business interface declared as <home>. Use 
<business-local>{0}</business-local>
+3.xml.home.businessLocal = The <home> element of the ejb-jar.xml is for interfaces 
extending javax.ejb.EJBHome.  EJB 3.0 simplified business interfaces can be decalred via 
<business-local>{0}</business-local> or via the @Remote annotation on the bean class 
or interface class.
+
+1.xml.home.businessRemote = EJB 3.0 business interface declared as <home>. Use 
<business-remote>{0}</business-remote>
+2.xml.home.businessRemote = EJB 3.0 business interface declared as <home>. Use 
<business-remote>{0}</business-remote>
+3.xml.home.businessRemote = The <home> element of the ejb-jar.xml is for interfaces 
extending javax.ejb.EJBHome.  EJB 3.0 simplified business interfaces can be decalred via 
<business-remote>{0}</business-remote> or via the @Remote annotation on the bean 
class or interface class.
+
+1.xml.home.beanClass = Bean class mistakenly declared as <home>
+2.xml.home.beanClass = Bean class mistakenly declared as <home>
+3.xml.home.beanClass = The <home> element of the ejb-jar.xml is for interfaces 
extending javax.ejb.EJBHome.  The bean class cannot be used as a home interface.
+
+1.xml.home.notInterface = The value of <home> is not an interface
+2.xml.home.notInterface = The value of <home> is not an interface: {0}
+3.xml.home.notInterface = The <home> element of the ejb-jar.xml is for interfaces 
extending javax.ejb.EJBHome.  Classes, abstract classes or enums are not allowed.  Either 
convert {0} to an interface or remove the related <home> xml tag from your ejb-jar.xml
+
+1.xml.home.unknown = The value of <home> must be an interface extending 
javax.ejb.EJBHome
+2.xml.home.unknown = The value of <home> must be an interface extending 
javax.ejb.EJBHome
+3.xml.home.unknown = The <home> element of the ejb-jar.xml is for interfaces extending 
javax.ejb.EJBHome.  If this interface is intended to be an EJB 3.0 business remote view, declare 
this interface as <business-remote>{0}</business-remote> or via the @Remote 
annotation on the bean class or interface class.
+
+
+
+1.xml.remote.ejbHome = javax.ejb.EJBHome interface declared as <remote>. Use 
<home>{0}</home>
+2.xml.remote.ejbHome = javax.ejb.EJBHome interface declared as <remote>. Use 
<home>{0}</home>
+3.xml.remote.ejbHome = The <remote> element is for interfaces extending javax.ejb.EJBObject.  
The interface supplied is a javax.ejb.EJBHome and should be declared with the <home> element as 
in: <home>{0}</home>
+
+1.xml.remote.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as <remote>. Use 
<local-home>{0}</local-home>
+2.xml.remote.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as <remote>. Use 
<local-home>{0}</local-home>
+3.xml.remote.ejbLocalHome = The <remote> element is for interfaces extending javax.ejb.EJBHome.  
The interface supplied is a javax.ejb.EJBLocalHome and should be declared with the <local-home> 
element as in: <local-home>{0}</local-home>
+
+1.xml.remote.ejbLocalObject = javax.ejb.EJBLocalObject interface declared as <remote>. Use 
<local>{0}</local>
+2.xml.remote.ejbLocalObject = javax.ejb.EJBLocalObject interface declared as <remote>. Use 
<local>{0}</local>
+3.xml.remote.ejbLocalObject = The <remote> element is for interfaces extending 
javax.ejb.EJBObject.  The interface supplied is a javax.ejb.EJBLocalObject and should be declared with 
the <local> element as in: <local>{0}</local>
+
+# must be attempting an override
+1.xml.remote.businessLocal = EJB 3.0 business interface declared as <remote>. Use 
<business-remote>{0}</business-remote>
+2.xml.remote.businessLocal = EJB 3.0 business interface declared as <remote>. Use 
<business-remote>{0}</business-remote>
+3.xml.remote.businessLocal = The <remote> element of the ejb-jar.xml is for interfaces 
extending javax.ejb.EJBObject.  EJB 3.0 simplified business interfaces can be decalred via 
<business-local>{0}</business-local> or via the @Remote annotation on the bean class 
or interface class.
+
+1.xml.remote.businessRemote = EJB 3.0 business interface declared as <remote>. Use 
<business-remote>{0}</business-remote>
+2.xml.remote.businessRemote = EJB 3.0 business interface declared as <remote>. Use 
<business-remote>{0}</business-remote>
+3.xml.remote.businessRemote = The <remote> element of the ejb-jar.xml is for interfaces 
extending javax.ejb.EJBObject.  EJB 3.0 simplified business interfaces can be decalred via 
<business-remote>{0}</business-remote> or via the @Remote annotation on the bean 
class or interface class.
+
+1.xml.remote.beanClass = Bean class mistakenly declared as <remote>
+2.xml.remote.beanClass = Bean class mistakenly declared as <remote>
+3.xml.remote.beanClass = The <remote> element of the ejb-jar.xml is for 
interfaces extending javax.ejb.EJBObject.  The bean class cannot be used as a home 
interface.
+
+1.xml.remote.notInterface = The value of <remote> is not an interface
+2.xml.remote.notInterface = The value of <remote> is not an interface: {0}
+3.xml.remote.notInterface = The <remote> element of the ejb-jar.xml is for 
interfaces extending javax.ejb.EJBObject.  Classes, abstract classes or enums are not 
allowed.  Either convert {0} to an interface or remove the related <remote> xml tag 
from your ejb-jar.xml
+
+1.xml.remote.unknown = The value of <remote> must be an interface extending 
javax.ejb.EJBObject
+2.xml.remote.unknown = The value of <remote> must be an interface extending 
javax.ejb.EJBObject
+3.xml.remote.unknown = The <remote> element of the ejb-jar.xml is for interfaces extending 
javax.ejb.EJBObject.  If this interface is intended to be an EJB 3.0 business remote view, 
declare this interface as <business-remote>{0}</business-remote> or via the @Remote 
annotation on the bean class or interface class.
+
+
+
+
+1.xml.localHome.ejbHome = javax.ejb.EJBHome interface declared as <local-home>. Use 
<home>{0}</home>
+2.xml.localHome.ejbHome = javax.ejb.EJBHome interface declared as <local-home>. Use 
<home>{0}</home>
+3.xml.localHome.ejbHome = The <local-home> element is for interfaces extending 
javax.ejb.EJBLocalHome.  The interface supplied is a javax.ejb.EJBHome and should be declared with the 
<home> element as in: <home>{0}</home>
+
+1.xml.localHome.ejbObject = javax.ejb.EJBObject interface declared as <local-home>. Use 
<remote>{0}</remote>
+2.xml.localHome.ejbObject = javax.ejb.EJBObject interface declared as <local-home>. Use 
<remote>{0}</remote>
+3.xml.localHome.ejbObject = The <local-home> element is for interfaces extending 
javax.ejb.EJBLocalHome.  The interface supplied is a javax.ejb.EJBObject and should be declared with 
the <remote> element as in: <remote>{0}</remote>
+
+1.xml.localHome.ejbLocalObject = javax.ejb.EJBLocalObject interface declared as 
<local-home>. Use <local>{0}</local>
+2.xml.localHome.ejbLocalObject = javax.ejb.EJBLocalObject interface declared as 
<local-home>. Use <local>{0}</local>
+3.xml.localHome.ejbLocalObject = The <local-home> element is for interfaces extending 
javax.ejb.EJBLocalHome.  The interface supplied is a javax.ejb.EJBLocalObject and should be declared 
with the <local> element as in: <local>{0}</local>
+
+1.xml.localHome.businessLocal = EJB 3.0 business interface declared as <local-home>. Use 
<business-local>{0}</business-local>
+2.xml.localHome.businessLocal = EJB 3.0 business interface declared as <local-home>. Use 
<business-local>{0}</business-local>
+3.xml.localHome.businessLocal = The <local-home> element of the ejb-jar.xml is for 
interfaces extending javax.ejb.EJBLocalHome.  EJB 3.0 simplified business interfaces can be 
decalred via <business-local>{0}</business-local> or via the @Remote annotation on 
the bean class or interface class.
+
+1.xml.localHome.businessRemote = EJB 3.0 business interface declared as <local-home>. Use 
<business-remote>{0}</business-remote>
+2.xml.localHome.businessRemote = EJB 3.0 business interface declared as <local-home>. Use 
<business-remote>{0}</business-remote>
+3.xml.localHome.businessRemote = The <local-home> element of the ejb-jar.xml is for 
interfaces extending javax.ejb.EJBLocalHome.  EJB 3.0 simplified business interfaces can be 
decalred via <business-remote>{0}</business-remote> or via the @Remote annotation on 
the bean class or interface class.
+
+1.xml.localHome.beanClass = Bean class mistakenly declared as <local-home>
+2.xml.localHome.beanClass = Bean class mistakenly declared as <local-home>
+3.xml.localHome.beanClass = The <local-home> element of the ejb-jar.xml is for 
interfaces extending javax.ejb.EJBLocalHome.  The bean class cannot be used as a home 
interface.
+
+1.xml.localHome.notInterface = The value of <local-home> is not an interface
+2.xml.localHome.notInterface = The value of <local-home> is not an interface: 
{0}
+3.xml.localHome.notInterface = The <local-home> element of the ejb-jar.xml is for 
interfaces extending javax.ejb.EJBLocalHome.  Classes, abstract classes or enums are not 
allowed.  Either convert {0} to an interface or remove the related <local-home> xml 
tag from your ejb-jar.xml
+
+1.xml.localHome.unknown = The value of <local-home> must be an interface 
extending javax.ejb.EJBLocalHome
+2.xml.localHome.unknown = The value of <local-home> must be an interface 
extending javax.ejb.EJBLocalHome
+3.xml.localHome.unknown =  The <local-home> element of the ejb-jar.xml is for interfaces 
extending javax.ejb.EJBLocalHome.  If this interface is intended to be an EJB 3.0 business local 
view, declare this interface as <business-local>{0}</business-local> or via the 
@Local annotation on the bean class or interface class.
+
+
+
+
+1.xml.local.ejbHome = javax.ejb.EJBHome interface declared as <local>. Use 
<home>{0}</home>
+2.xml.local.ejbHome = javax.ejb.EJBHome interface declared as <local>. Use 
<home>{0}</home>
+3.xml.local.ejbHome = The <local> element is for interfaces extending javax.ejb.EJBLocalObject.  
The interface supplied is a javax.ejb.EJBHome and should be declared with the <home> element as 
in: <home>{0}</home>
+
+1.xml.local.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as <local>. Use 
<local-home>{0}</local-home>
+2.xml.local.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as <local>. Use 
<local-home>{0}</local-home>
+3.xml.local.ejbLocalHome = The <local> element is for interfaces extending 
javax.ejb.EJBLocalObject.  The interface supplied is a javax.ejb.EJBLocalHome and should be declared 
with the <local-home> element as in: <local-home>{0}</local-home>
+
+1.xml.local.ejbObject = javax.ejb.EJBObject interface declared as <local>. Use 
<remote>{0}</remote>
+2.xml.local.ejbObject = javax.ejb.EJBObject interface declared as <local>. Use 
<remote>{0}</remote>
+3.xml.local.ejbObject = The <local> element is for interfaces extending 
javax.ejb.EJBLocalObject.  The interface supplied is a javax.ejb.EJBObject and should be declared with 
the <remote> element as in: <remote>{0}</remote>
+
+1.xml.local.businessLocal = EJB 3.0 business interface declared as <local>. Use 
<business-local>{0}</business-local>
+2.xml.local.businessLocal = EJB 3.0 business interface declared as <local>. Use 
<business-local>{0}</business-local>
+3.xml.local.businessLocal = The <local> element of the ejb-jar.xml is for interfaces 
extending javax.ejb.EJBLocalObject.  EJB 3.0 simplified business interfaces can be decalred via 
<business-local>{0}</business-local> or via the @Remote annotation on the bean class 
or interface class.
+
+# must be attempting an override
+1.xml.local.businessRemote = EJB 3.0 business interface declared as <local>. Use 
<business-local>{0}</business-local>
+2.xml.local.businessRemote = EJB 3.0 business interface declared as <local>. Use 
<business-local>{0}</business-local>
+3.xml.local.businessRemote = The <local> element of the ejb-jar.xml is for interfaces 
extending javax.ejb.EJBLocalObject.  EJB 3.0 simplified business interfaces can be decalred via 
<business-remote>{0}</business-remote> or via the @Remote annotation on the bean 
class or interface class.
+
+1.xml.local.beanClass = Bean class mistakenly declared as <local>
+2.xml.local.beanClass = Bean class mistakenly declared as <local>
+3.xml.local.beanClass = The <local> element of the ejb-jar.xml is for 
interfaces extending javax.ejb.EJBLocalObject.  The bean class cannot be used as a 
home interface.
+
+1.xml.local.notInterface = The value of <local> is not an interface
+2.xml.local.notInterface = The value of <local> is not an interface: {0}
+3.xml.local.notInterface = The <local> element of the ejb-jar.xml is for interfaces 
extending javax.ejb.EJBLocalObject.  Classes, abstract classes or enums are not allowed.  
Either convert {0} to an interface or remove the related <local> xml tag from your 
ejb-jar.xml
+
+1.xml.local.unknown = The value of <local> must be an interface extending 
javax.ejb.EJBLocalObject
+2.xml.local.unknown = The value of <local> must be an interface extending 
javax.ejb.EJBLocalObject.  Perhaps you meant to use 
<business-local>{0}</business-local>
+3.xml.local.unknown = The <local> element of the ejb-jar.xml is for interfaces extending 
javax.ejb.EJBLocalObject.  If this interface is intended to be an EJB 3.0 business local view, 
declare this interface as <business-local>{0}</business-local> or via the @Local 
annotation on the bean class or interface class.
+
+
+
+
+1.xml.businessRemote.ejbHome = javax.ejb.EJBHome interface declared as <business-remote>. 
Use <home>{0}</home>
+2.xml.businessRemote.ejbHome = javax.ejb.EJBHome interface declared as <business-remote>. 
Use <home>{0}</home>
+3.xml.businessRemote.ejbHome = Interfaces extending javax.ejb.EJBHome must use the <home> tag, 
not the <business-remote> tag, when declared in the ejb-jar.xml.  Declare this interface as 
<home>{0}</home> or alternatively add @RemoteHome({0}.class) to the top of your bean class.
+
+1.xml.businessRemote.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as 
<business-remote>. Use <local-home>{0}</local-home>
+2.xml.businessRemote.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as 
<business-remote>. Use <local-home>{0}</local-home>
+3.xml.businessRemote.ejbLocalHome = Interfaces extending javax.ejb.EJBLocalHome must use the 
<local-home> tag, not the <business-remote> tag, when declared in the ejb-jar.xml.  Declare 
this interface as <local-home>{0}</local-home> or alternatively add @LocalHome({0}.class) 
to the top of your bean class.
+
+1.xml.businessRemote.ejbObject = javax.ejb.EJBObject interface declared as 
<business-remote>. Use <remote>{0}</remote>
+2.xml.businessRemote.ejbObject = javax.ejb.EJBObject interface declared as 
<business-remote>. Use <remote>{0}</remote>
+3.xml.businessRemote.ejbObject = Interfaces extending javax.ejb.EJBObject must use the <remote> 
tag, not the <business-remote> tag, when declared in the ejb-jar.xml.  Declare this interface as 
<remote>{0}</remote>.
+
+1.xml.businessRemote.ejbLocalObject = javax.ejb.EJBLocalObject interface declared as 
<business-remote>. Use <local>{0}</local>
+2.xml.businessRemote.ejbLocalObject = javax.ejb.EJBLocalObject interface declared as 
<business-remote>. Use <local>{0}</local>
+3.xml.businessRemote.ejbLocalObject = Interfaces extending javax.ejb.EJBLocalObject must use the 
<local> tag, not the <business-remote> tag, when declared in the ejb-jar.xml.  Declare this 
interface as <local>{0}</local>.
+
+1.xml.businessRemote.beanClass = Bean class mistakenly declared as 
<business-remote>
+2.xml.businessRemote.beanClass = Bean class mistakenly declared as 
<business-remote>
+3.xml.businessRemote.beanClass = The bean class cannot itself cannot be used as the 
value of the <business-remote> element of the ejb-jar.xml.  Either list a valid 
java interface or delete this element and annotate the intended interface with the 
@Remote annotation.
+
+1.xml.businessRemote.notInterface = The value of <business-remote> is not an 
interface
+2.xml.businessRemote.notInterface = The value of <business-remote> is not an 
interface: {0}
+3.xml.businessRemote.notInterface = The <business-remote> element of the ejb-jar.xml 
must be an interface.  Classes, abstract classes or enums are not allowed.  Either convert 
{0} to an interface or remove the related <business-remote> xml tag from your 
ejb-jar.xml
+
+
+
+
+1.xml.businessLocal.ejbHome = javax.ejb.EJBHome interface declared as <business-local>. 
Use <home>{0}</home>
+2.xml.businessLocal.ejbHome = javax.ejb.EJBHome interface declared as <business-local>. 
Use <home>{0}</home>
+3.xml.businessLocal.ejbHome = Interfaces extending javax.ejb.EJBHome must use the <home> tag, 
not the <business-local> tag, when declared in the ejb-jar.xml.  Declare this interface as 
<home>{0}</home> or alternatively add @RemoteHome({0}.class) to the top of your bean class.
+
+1.xml.businessLocal.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as 
<business-local>. Use <local-home>{0}</local-home>
+2.xml.businessLocal.ejbLocalHome = javax.ejb.EJBLocalHome interface declared as 
<business-local>. Use <local-home>{0}</local-home>
+3.xml.businessLocal.ejbLocalHome = Interfaces extending javax.ejb.EJBLocalHome must use the 
<local-home> tag, not the <business-local> tag, when declared in the ejb-jar.xml.  Declare 
this interface as <local-home>{0}</local-home> or alternatively add @LocalHome({0}.class) 
to the top of your bean class.
+
+1.xml.businessLocal.ejbObject = javax.ejb.EJBObject interface declared as 
<business-local>. Use <remote>{0}</remote>
+2.xml.businessLocal.ejbObject = javax.ejb.EJBObject interface declared as 
<business-local>. Use <remote>{0}</remote>
+3.xml.businessLocal.ejbObject = Interfaces extending javax.ejb.EJBObject must use the <remote> 
tag, not the <business-local> tag, when declared in the ejb-jar.xml.  Declare this interface as 
<remote>{0}</remote>.
+
+1.xml.businessLocal.ejbLocalObject = javax.ejb.EJBLocalObject interface declared as 
<business-local>. Use <local>{0}</local>
+2.xml.businessLocal.ejbLocalObject = javax.ejb.EJBLocalObject interface declared as 
<business-local>. Use <local>{0}</local>
+3.xml.businessLocal.ejbLocalObject = Interfaces extending javax.ejb.EJBLocalObject must use the 
<local> tag, not the <business-local> tag, when declared in the ejb-jar.xml.  Declare this 
interface as <local>{0}</local>.
+
+1.xml.businessLocal.beanClass = Bean class mistakenly declared as 
<business-local>
+2.xml.businessLocal.beanClass = Bean class mistakenly declared as 
<business-local>
+3.xml.businessLocal.beanClass = The bean class cannot itself cannot be used as the 
value of the <business-local> element of the ejb-jar.xml.  Either 1) list a 
valid java interface or 2) delete this element and annotate the intended interface 
with the @Local annotation.
+
+1.xml.businessLocal.notInterface = The value of <business-local> is not an 
interface
+2.xml.businessLocal.notInterface = The value of <business-local> is not an 
interface: {0}
+3.xml.businessLocal.notInterface = The <business-local> element of the ejb-jar.xml 
must be an interface.  Classes, abstract classes or enums are not allowed.  Either convert 
{0} to an interface or remove the related <business-local> xml tag from your 
ejb-jar.xml

Added: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/InvalidInterfacesTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/InvalidInterfacesTest.java?rev=677503&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/InvalidInterfacesTest.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/InvalidInterfacesTest.java
 Wed Jul 16 22:32:23 2008
@@ -0,0 +1,88 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.openejb.config.rules;
+
+import junit.framework.TestCase;
+import org.apache.openejb.assembler.classic.ContainerSystemInfo;
+import org.apache.openejb.assembler.classic.StatelessSessionContainerInfo;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.ValidationFailedException;
+import org.apache.openejb.config.ValidationFailure;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.StatelessBean;
+
+import javax.ejb.EJBHome;
+import javax.ejb.EJBLocalHome;
+import javax.ejb.EJBLocalObject;
+import javax.ejb.EJBObject;
+import javax.ejb.Local;
+import javax.ejb.Remote;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class InvalidInterfacesTest extends TestCase {
+    private ConfigurationFactory config;
+
+    public void testBadHomeAndLocal() throws Exception {
+
+        EjbJar ejbJar = new EjbJar();
+        StatelessBean bean = ejbJar.addEnterpriseBean(new 
StatelessBean(FooBean.class));
+        bean.setHomeAndLocal(FooLocal.class, FooLocal.class);
+        bean.setHomeAndRemote(FooLocal.class, FooLocal.class);
+
+        try {
+            config.configureApplication(ejbJar);
+        } catch (ValidationFailedException e) {
+            for (ValidationFailure failure : e.getFailures()) {
+                System.out.println("failure = " + failure.getMessageKey());
+            }
+        }
+
+    }
+
+    public void setUp() throws Exception {
+        config = new ConfigurationFactory(true);
+        ContainerSystemInfo containerSystem = 
config.getOpenEjbConfiguration().containerSystem;
+        
containerSystem.containers.add(config.configureService(StatelessSessionContainerInfo.class));
+    }
+
+    public static class FooBean {
+
+    }
+
+    public static interface FooEJBHome extends EJBHome {
+    }
+
+    public static interface FooEJBObject extends EJBObject {
+    }
+
+    public static interface FooEJBLocalHome extends EJBLocalHome {
+    }
+
+    public static interface FooEJBLocalObject extends EJBLocalObject {
+    }
+
+    @Remote
+    public static interface FooRemote {
+    }
+
+    @Local
+    public static interface FooLocal {
+    }
+
+}




Reply via email to