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