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