You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/03/12 11:15:49 UTC

svn commit: r1299611 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb: BeanContext.java core/ivm/EjbHomeProxyHandler.java util/proxy/DynamicProxyImplFactory.java

Author: rmannibucau
Date: Mon Mar 12 10:15:49 2012
New Revision: 1299611

URL: http://svn.apache.org/viewvc?rev=1299611&view=rev
Log:
managing dynamic more complex injections for dynamic beans

Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1299611&r1=1299610&r2=1299611&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java Mon Mar 12 10:15:49 2012
@@ -1299,7 +1299,9 @@ public class BeanContext extends Deploym
                 injections.addAll(newInjections);
 
                 injectionProcessor = new InjectionProcessor(beanConstructor.create(creationalContext), injections, InjectionProcessor.unwrap(ctx));
-                injectionProcessor.setProperty("implementingInterfaceClass", beanClass);
+                if (hasField(proxyClass, "implementingInterfaceClass")) {
+                    injectionProcessor.setProperty("implementingInterfaceClass", beanClass);
+                }
                 InvocationHandler handler = (InvocationHandler) injectionProcessor.createInstance();
                 beanInstance = DynamicProxyImplFactory.newProxy(this, handler);
                 inject(handler, creationalContext);
@@ -1382,6 +1384,19 @@ public class BeanContext extends Deploym
         }                        
     }
 
+    private boolean hasField(final Class<?> clazz, final String name) {
+        Class<?> current = clazz;
+        while (current != null && !Object.class.equals(current)) {
+            try {
+                current.getDeclaredField(name);
+                return true;
+            } catch (NoSuchFieldException e) {
+                // ignored
+            }
+        }
+        return false;
+    }
+
     protected <X> X getBean(Class<X> clazz, Bean<?> bean) {
         return clazz.cast(bean);
     }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java?rev=1299611&r1=1299610&r2=1299611&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java Mon Mar 12 10:15:49 2012
@@ -133,7 +133,7 @@ public abstract class EjbHomeProxyHandle
 
             // TODO Is it correct for ManagedBean injection via managed bean class?
             if ((InterfaceType.LOCALBEAN.equals(objectInterfaceType) || getBeanContext().getComponentType().equals(BeanType.MANAGED))
-                    &&! getBeanContext().isDynamicallyImplemented()) {
+                    && !getBeanContext().isDynamicallyImplemented()) {
                 return LocalBeanProxyFactory.newProxyInstance(handler.getBeanContext().getClassLoader(), handler.getBeanContext().getBeanClass(), handler);
             } else {
                 List<Class> proxyInterfaces = new ArrayList<Class>(handler.getInterfaces().size() + 1);

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java?rev=1299611&r1=1299610&r2=1299611&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java Mon Mar 12 10:15:49 2012
@@ -18,10 +18,9 @@
 package org.apache.openejb.util.proxy;
 
 import org.apache.openejb.BeanContext;
+import org.apache.openejb.Injection;
 import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.api.Proxy;
-import org.apache.openejb.util.LogCategory;
-import org.apache.openejb.util.Logger;
 import org.apache.xbean.finder.Annotated;
 import org.apache.xbean.finder.MetaAnnotatedClass;
 
@@ -31,8 +30,6 @@ import javax.persistence.PersistenceCont
 import java.lang.reflect.Method;
 
 public class DynamicProxyImplFactory {
-    private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB, BeanContext.class);
-
     public static boolean isKnownDynamicallyImplemented(Class<?> clazz) {
         final Annotated<Class<?>> metaClass = new MetaAnnotatedClass(clazz);
         return clazz.isInterface()
@@ -42,14 +39,19 @@ public class DynamicProxyImplFactory {
 
     public static Object newProxy(BeanContext context, java.lang.reflect.InvocationHandler invocationHandler) {
         if (invocationHandler instanceof QueryProxy) {
-            String emLookupName = context.getInjections().get(context.getInjections().size() - 1).getJndiName();
-            EntityManager em;
-            try {
-                em = (EntityManager) context.getJndiEnc().lookup(emLookupName);
-            } catch (NamingException e) {
-                throw new OpenEJBRuntimeException("a dynamic bean should reference at least one correct PersistenceContext", e);
+            EntityManager em = null;
+            for (Injection injection : context.getInjections()) {
+                if (QueryProxy.class.equals(injection.getTarget())) {
+                    try {
+                        em = (EntityManager) context.getJndiEnc().lookup(injection.getJndiName());
+                    } catch (NamingException e) {
+                        throw new OpenEJBRuntimeException("a dynamic bean should reference at least one correct PersistenceContext", e);
+                    }
+                }
+            }
+            if (em == null) {
+                throw new OpenEJBRuntimeException("can't find the entity manager to use for the dynamic bean " + context.getEjbName());
             }
-
             ((QueryProxy) invocationHandler).setEntityManager(em);
         }
 



Re: svn commit: r1299611 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb: BeanContext.java core/ivm/EjbHomeProxyHandler.java util/proxy/DynamicProxyImplFactory.java

Posted by Romain Manni-Bucau <rm...@gmail.com>.
ok, i take it
- Romain


2012/3/12 David Blevins <da...@gmail.com>

>
> On Mar 12, 2012, at 5:15 AM, rmannibucau@apache.org wrote:
>
> > +++
> openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
> Mon Mar 12 10:15:49 2012
> >
> > +    private boolean hasField(final Class<?> clazz, final String name) {
> > +        Class<?> current = clazz;
> > +        while (current != null && !Object.class.equals(current)) {
> > +            try {
> > +                current.getDeclaredField(name);
> > +                return true;
> > +            } catch (NoSuchFieldException e) {
> > +                // ignored
> > +            }
> > +        }
> > +        return false;
> > +    }
>
> FYI, infinite loop.  "current" is never updated. :)
>
> In general we can move all this special processing to the
> ConfigurationFactory side of things.  With one DynamicDeployer impl you
> could check if the bean is an @Proxy bean then check the handler for the
> specified field and add an env-entry of type java.lang.Class with the
> correct injection-target.
>
>
> -David
>
>

Re: svn commit: r1299611 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb: BeanContext.java core/ivm/EjbHomeProxyHandler.java util/proxy/DynamicProxyImplFactory.java

Posted by David Blevins <da...@gmail.com>.
On Mar 12, 2012, at 5:15 AM, rmannibucau@apache.org wrote:

> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java Mon Mar 12 10:15:49 2012
> 
> +    private boolean hasField(final Class<?> clazz, final String name) {
> +        Class<?> current = clazz;
> +        while (current != null && !Object.class.equals(current)) {
> +            try {
> +                current.getDeclaredField(name);
> +                return true;
> +            } catch (NoSuchFieldException e) {
> +                // ignored
> +            }
> +        }
> +        return false;
> +    }

FYI, infinite loop.  "current" is never updated. :)

In general we can move all this special processing to the ConfigurationFactory side of things.  With one DynamicDeployer impl you could check if the bean is an @Proxy bean then check the handler for the specified field and add an env-entry of type java.lang.Class with the correct injection-target.


-David