Author: rmannibucau
Date: Thu Aug  4 08:27:22 2011
New Revision: 1153780

URL: http://svn.apache.org/viewvc?rev=1153780&view=rev
Log:
managing  inheritance for stateless interfaces

Added:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/AnnotationUtil.java
Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/QueryProxy.java
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/util/DynamicEJBImplTest.java

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1153780&r1=1153779&r2=1153780&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 Thu Aug  4 08:27:22 2011
@@ -108,6 +108,7 @@ import org.apache.openejb.jee.WebApp;
 import org.apache.openejb.jee.WebserviceDescription;
 import org.apache.openejb.jee.oejb3.OpenejbJar;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.AnnotationUtil;
 import org.apache.openejb.util.Join;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
@@ -2609,7 +2610,7 @@ public class AnnotationDeployer implemen
                         && all.remote.isEmpty()
                         ) {
 
-                    if (interfaces.size() == 0) {
+                    if (interfaces.size() == 0 || 
AnnotationUtil.getAnnotation(PersistenceContext.class, clazz) != null) {
                         // No interfaces?  Then @LocalBean
 
                         sessionBean.setLocalBean(new Empty());
@@ -3313,6 +3314,7 @@ public class AnnotationDeployer implemen
             }
 
             boolean localbean = isKnownLocalBean(interfce);
+            boolean dynamicallyImplemented = 
isKnownDynamicallyImplemented(interfce);
 
             if ((!localbean) && interfce != null && !isValidEjbInterface(name, 
interfce, ejbRef.getName())) {
                 return;
@@ -3342,6 +3344,9 @@ public class AnnotationDeployer implemen
                 } else if (localbean) {
                     ejbRef.setRefType(EjbReference.Type.LOCAL);
                     ejbRef.setRemote(interfce.getName());
+                } else if (dynamicallyImplemented) {
+                    ejbRef.setRefType(EjbReference.Type.LOCAL);
+                    ejbRef.setRemote(interfce.getName());
                 } else {
                     ejbRef.setRemote(interfce.getName());
                     if (interfce.getAnnotation(Local.class) != null) {
@@ -3414,6 +3419,10 @@ public class AnnotationDeployer implemen
             return "java:comp/env/" + refName;
         }
 
+        private boolean isKnownDynamicallyImplemented(Class<?> clazz) {
+            return clazz.isInterface() && 
AnnotationUtil.getAnnotation(PersistenceContext.class, clazz) != null;
+        }
+
         private boolean isKnownLocalBean(Class clazz) {
             if (clazz.isAnnotation()) return false;
             if (clazz.isArray()) return false;

Added: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/AnnotationUtil.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/AnnotationUtil.java?rev=1153780&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/AnnotationUtil.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/AnnotationUtil.java
 Thu Aug  4 08:27:22 2011
@@ -0,0 +1,24 @@
+package org.apache.openejb.util;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * @author rmannibucau
+ */
+public final class AnnotationUtil {
+    private AnnotationUtil() {
+        // no-op
+    }
+
+    public static Annotation getAnnotation(Class<? extends Annotation> a, 
Class<?> clazz) {
+        Class<?> current = clazz;
+        do {
+            Annotation annotation = current.getAnnotation(a);
+            if (annotation != null) {
+                return annotation;
+            }
+            current = current.getSuperclass();
+        } while (current != null);
+        return null;
+    }
+}

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java?rev=1153780&r1=1153779&r2=1153780&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java
 Thu Aug  4 08:27:22 2011
@@ -13,11 +13,11 @@ import java.util.List;
 public class DynamicProxyImplFactory {
     public static Object newProxy(BeanContext context) {
         List<Injection> injection = context.getInjections(); // the entity 
manager
-        if (injection.size() != 1) {
+        if (injection.size() < 1) {
             throw new RuntimeException("a dynamic bean should have at least 
one PersistenceContext annotation");
         }
 
-        String emLookupName = injection.iterator().next().getJndiName();
+        String emLookupName = injection.get(injection.size() - 
1).getJndiName();
         EntityManager em;
         try {
             em = (EntityManager) context.getJndiEnc().lookup(emLookupName);

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/QueryProxy.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/QueryProxy.java?rev=1153780&r1=1153779&r2=1153780&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/QueryProxy.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/QueryProxy.java
 Thu Aug  4 08:27:22 2011
@@ -37,6 +37,8 @@ public class QueryProxy implements Invoc
     public static final String MERGE_NAME = "update";
     public static final String REMOVE_NAME = "delete";
     public static final String NAMED_QUERY_NAME = "namedQuery";
+    public static final String NATIVE_QUERY_NAME = "nativeQuery";
+    public static final String QUERY_NAME = "query";
 
     public static final String FIND_PREFIX = "find";
     public static final String BY = "By";
@@ -48,6 +50,10 @@ public class QueryProxy implements Invoc
 
     private EntityManager em;
 
+    private static enum QueryType {
+        NAMED, NATIVE, OTHER
+    }
+
     public QueryProxy(EntityManager entityManager) {
         em = entityManager;
     }
@@ -75,11 +81,20 @@ public class QueryProxy implements Invoc
             return null; // void
         }
 
+        // queries
         if (NAMED_QUERY_NAME.equals(methodName)) {
-            return query(method, args);
+            return query(method, args, QueryType.NAMED);
+        }
+
+        if (NATIVE_QUERY_NAME.equals(methodName)) {
+            return query(method, args, QueryType.NATIVE);
+        }
+
+        if (QUERY_NAME.equals(methodName)) {
+            return query(method, args, QueryType.OTHER);
         }
 
-        // other cases (finders)
+        // finders
         if (methodName.startsWith(FIND_PREFIX)) {
             return find(method, args);
         }
@@ -88,11 +103,13 @@ public class QueryProxy implements Invoc
     }
 
     /**
-     * @param args queryName (String) -> first parameter, parameters 
(Map<String, ?>) or (Object[]), first and max (int) -> max follows first
+     *
      * @param method the method
+     * @param args queryName (String) -> first parameter, parameters 
(Map<String, ?>) or (Object[]), first and max (int) -> max follows first
+     * @param type the query type
      * @return the expected result
      */
-    private Object query(Method method, Object[] args) {
+    private Object query(Method method, Object[] args, QueryType type) {
         if (args.length < 1) {
             throw new IllegalArgumentException("query() needs at least the 
query name");
         }
@@ -100,8 +117,21 @@ public class QueryProxy implements Invoc
         int matched = 0;
         Query query;
         if (String.class.isAssignableFrom(args[0].getClass())) {
-            query = em.createNamedQuery((String) args[0]);
+            switch (type) {
+                case NAMED:
+                    query = em.createNamedQuery((String) args[0]);
+                break;
+
+                case NATIVE:
+                    query = em.createNativeQuery((String) args[0]);
+                break;
+
+                default:
+                    query = em.createQuery((String) args[0]);
+            }
+
             matched++;
+
             for (int i = 1; i < args.length; i++) {
                 if (args[i] == null) {
                     continue;

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/util/DynamicEJBImplTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/util/DynamicEJBImplTest.java?rev=1153780&r1=1153779&r2=1153780&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/util/DynamicEJBImplTest.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/util/DynamicEJBImplTest.java
 Thu Aug  4 08:27:22 2011
@@ -49,7 +49,6 @@ import java.util.Properties;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
 import static junit.framework.Assert.assertTrue;
 import static junit.framework.Assert.fail;
 
@@ -60,8 +59,9 @@ import static junit.framework.Assert.fai
 public class DynamicEJBImplTest {
     private static boolean initDone = false;
 
-    @EJB private UtilBean util;
-    @EJB private UserDAO dao;
+    @EJB private UserDAO dao = null;
+    @EJB private UtilBean util = null;
+    @EJB private UserDAOChild child = null;
 
     @Before public void initDatabaseIfNotDone() {
         if (!initDone) {
@@ -167,6 +167,39 @@ public class DynamicEJBImplTest {
 
         users = dao.namedQuery("dynamic-ejb-impl-test.query", 0, 2, params);
         assertEquals(2, users.size());
+
+        users = dao.namedQuery("dynamic-ejb-impl-test.all");
+        assertEquals(10, users.size());
+
+        params.remove("name");
+        params.put("info", "0");
+        users = dao.query("SELECT u FROM DynamicEJBImplTest$User AS u WHERE 
u.info LIKE :info", params);
+        assertEquals(4, users.size());
+    }
+
+    @Test public void inheritance() {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("name", "foo");
+
+        Collection<User> users = 
child.namedQuery("dynamic-ejb-impl-test.query", params, 0, 100);
+        assertEquals(4, users.size());
+
+        users = child.namedQuery("dynamic-ejb-impl-test.query", params);
+        assertEquals(4, users.size());
+
+        users = child.namedQuery("dynamic-ejb-impl-test.query", params, 0, 2);
+        assertEquals(2, users.size());
+
+        users = child.namedQuery("dynamic-ejb-impl-test.query", 0, 2, params);
+        assertEquals(2, users.size());
+
+        users = child.namedQuery("dynamic-ejb-impl-test.all");
+        assertEquals(10, users.size());
+
+        params.remove("name");
+        params.put("info", "0");
+        users = child.query("SELECT u FROM DynamicEJBImplTest$User AS u WHERE 
u.info LIKE :info", params);
+        assertEquals(4, users.size());
     }
 
     @Stateless @PersistenceContext(name = "pu") public static interface 
UserDAO {
@@ -182,6 +215,9 @@ public class DynamicEJBImplTest {
         Collection<User> namedQuery(String name, Map<String, ?> params, int 
first, int max);
         Collection<User> namedQuery(String name, int first, int max, 
Map<String, ?> params);
         Collection<User> namedQuery(String name, Map<String, ?> params);
+        Collection<User> namedQuery(String name);
+
+        Collection<User> query(String value, Map<String, ?> params);
 
         void save(User u);
 
@@ -190,12 +226,18 @@ public class DynamicEJBImplTest {
         User update(User u);
     }
 
-    @NamedQuery(name = "dynamic-ejb-impl-test.query", query = "SELECT u FROM 
DynamicEJBImplTest$User AS u WHERE u.name LIKE :name")
+    @Stateless @PersistenceContext(name = "pu") public static interface 
UserDAOChild extends UserDAO {
+        // just inherited methods
+    }
+
+    @NamedQueries({
+        @NamedQuery(name = "dynamic-ejb-impl-test.query", query = "SELECT u 
FROM DynamicEJBImplTest$User AS u WHERE u.name LIKE :name"),
+        @NamedQuery(name = "dynamic-ejb-impl-test.all", query = "SELECT u FROM 
DynamicEJBImplTest$User AS u")
+    })
     @Entity public static class User {
         @Id @GeneratedValue private long id;
         private String name;
         private String info;
-        private int age;
 
         public long getId() {
             return id;
@@ -213,14 +255,6 @@ public class DynamicEJBImplTest {
             this.name = name;
         }
 
-        public int getAge() {
-            return age;
-        }
-
-        public void setAge(int age) {
-            this.age = age;
-        }
-
         public String getInfo() {
             return info;
         }
@@ -230,18 +264,17 @@ public class DynamicEJBImplTest {
         }
 
         @Override public String toString() {
-            return "User{age=" + age + ", info='" + info + '\'' + ", name='" + 
name + '\'' + ", id=" + id + '}';
+            return "User{info='" + info + '\'' + ", name='" + name + '\'' + ", 
id=" + id + '}';
         }
     }
 
     @Singleton public static class UtilBean {
         @PersistenceContext private EntityManager em;
-        @EJB private UserDAO dao;
+        @EJB private UserDAO dao = null;
 
         public void init() {
             for (int i = 0; i < 10; i++) {
                 User u = new User();
-                u.setAge(i * 8);
                 if (i % 3 == 0) {
                     u.setName("foo");
                 } else {
@@ -273,6 +306,7 @@ public class DynamicEJBImplTest {
         EjbJar ejbJar = new EjbJar("dynamic");
         ejbJar.addEnterpriseBean(new SingletonBean(UtilBean.class));
         ejbJar.addEnterpriseBean(new StatelessBean(UserDAO.class));
+        ejbJar.addEnterpriseBean(new StatelessBean(UserDAOChild.class));
         return ejbJar;
     }
 


Reply via email to