Author: struberg
Date: Fri Jan 18 23:54:34 2013
New Revision: 1435418
URL: http://svn.apache.org/viewvc?rev=1435418&view=rev
Log:
OWB-344 Abstract Decorators work in progress
Added:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/DecoratorProxyFactory.java
- copied, changed from r1435371,
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/OwbDecoratorProxy.java
- copied, changed from r1435371,
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/OwbNormalScopeProxy.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/DecoratorBean.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedConstructorImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/DecoratorBean.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/DecoratorBean.java?rev=1435418&r1=1435417&r2=1435418&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/DecoratorBean.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/DecoratorBean.java
Fri Jan 18 23:54:34 2013
@@ -18,14 +18,19 @@
*/
package org.apache.webbeans.component;
+import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Decorator;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.InjectionTarget;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Type;
+import java.util.List;
import java.util.Set;
import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.portable.InjectionTargetImpl;
/**
* Decorator Bean implementation.
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java?rev=1435418&r1=1435417&r2=1435418&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
Fri Jan 18 23:54:34 2013
@@ -26,10 +26,12 @@ import javax.enterprise.inject.spi.Annot
import javax.enterprise.inject.spi.AnnotatedParameter;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.InjectionTarget;
import javax.inject.Inject;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Constructor;
+import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.HashSet;
@@ -47,6 +49,8 @@ import org.apache.webbeans.config.WebBea
import org.apache.webbeans.exception.WebBeansConfigurationException;
import org.apache.webbeans.inject.impl.InjectionPointFactory;
import org.apache.webbeans.logger.WebBeansLoggerFacade;
+import org.apache.webbeans.portable.AnnotatedConstructorImpl;
+import org.apache.webbeans.portable.InjectionTargetImpl;
import org.apache.webbeans.util.ClassUtil;
@@ -76,7 +80,6 @@ public class DecoratorBeanBuilder<T> ext
private final Set<String> ignoredDecoratorInterfaces;
-
public DecoratorBeanBuilder(WebBeansContext webBeansContext,
AnnotatedType<T> annotatedType)
{
super(webBeansContext, annotatedType);
@@ -298,7 +301,18 @@ public class DecoratorBeanBuilder<T> ext
}
}
+ @Override
+ protected InjectionTarget<T> buildInjectionTarget(Set<Type> types,
Set<Annotation> qualifiers, AnnotatedType<T> annotatedType, Set<InjectionPoint>
points,
+ WebBeansContext
webBeansContext, List<AnnotatedMethod<?>> postConstructMethods,
List<AnnotatedMethod<?>> preDestroyMethods)
+ {
+ InjectionTarget<T> injectionTarget = super.buildInjectionTarget(types,
qualifiers, annotatedType, points, webBeansContext, postConstructMethods,
preDestroyMethods);
+ if (Modifier.isAbstract(annotatedType.getJavaClass().getModifiers()))
+ {
+
+ }
+ return injectionTarget;
+ }
@Override
protected DecoratorBean<T> createBean(Set<Type> types,
@@ -330,4 +344,40 @@ public class DecoratorBeanBuilder<T> ext
return decorator;
}
+
+ /**
+ * Helper class to swap out the constructor for the proxied subclass.
+ */
+ private static class AbstractDecoratorInjectionTarget<T> extends
InjectionTargetImpl<T>
+ {
+ private Class<? extends T> proxySubClass = null;
+
+ private AbstractDecoratorInjectionTarget(AnnotatedType<T>
annotatedType, Set<InjectionPoint> points, WebBeansContext webBeansContext,
+ List<AnnotatedMethod<?>>
postConstructMethods, List<AnnotatedMethod<?>> preDestroyMethods)
+ {
+ super(annotatedType, points, webBeansContext,
postConstructMethods, preDestroyMethods);
+ }
+
+ @Override
+ protected AnnotatedConstructor<T> getConstructor()
+ {
+ if (constructor != null)
+ {
+ return constructor;
+ }
+ else
+ {
+ //X TODO create proxy subclass
+
+ Constructor<T> ct =
webBeansContext.getWebBeansUtil().getNoArgConstructor(proxySubClass);
+ this.constructor = new
AnnotatedConstructorImpl<T>(webBeansContext, ct, annotatedType);
+
+ //X TODO what about @Inject constructors?
+
+ }
+
+ return constructor;
+ }
+
+ }
}
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedConstructorImpl.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedConstructorImpl.java?rev=1435418&r1=1435417&r2=1435418&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedConstructorImpl.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedConstructorImpl.java
Fri Jan 18 23:54:34 2013
@@ -32,14 +32,14 @@ import javax.enterprise.inject.spi.Annot
*
* @param <X> class info
*/
-class AnnotatedConstructorImpl<X> extends AbstractAnnotatedCallable<X>
implements AnnotatedConstructor<X>
+public class AnnotatedConstructorImpl<X> extends AbstractAnnotatedCallable<X>
implements AnnotatedConstructor<X>
{
/**
* Create a ew instance.
*
* @param javaMember constructor
*/
- AnnotatedConstructorImpl(WebBeansContext webBeansContext, Constructor<X>
javaMember, AnnotatedType<X> declaringType)
+ public AnnotatedConstructorImpl(WebBeansContext webBeansContext,
Constructor<X> javaMember, AnnotatedType<X> declaringType)
{
super(webBeansContext, javaMember.getDeclaringClass(), javaMember,
declaringType);
setAnnotations(javaMember.getDeclaredAnnotations());
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java?rev=1435418&r1=1435417&r2=1435418&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
Fri Jan 18 23:54:34 2013
@@ -51,7 +51,6 @@ import javax.interceptor.InvocationConte
import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.context.creational.CreationalContextImpl;
-import org.apache.webbeans.decorator.DelegateHandler;
import org.apache.webbeans.exception.WebBeansException;
import org.apache.webbeans.inject.InjectableConstructor;
import org.apache.webbeans.inject.InjectableField;
@@ -71,10 +70,11 @@ import org.apache.webbeans.util.Exceptio
public class InjectionTargetImpl<T> extends AbstractProducer<T> implements
InjectionTarget<T>
{
- private AnnotatedType<T> type;
- private AnnotatedConstructor<T> constructor;
protected final WebBeansContext webBeansContext;
+ protected final AnnotatedType<T> annotatedType;
+ protected AnnotatedConstructor<T> constructor;
+
/**
* If the InjectionTarget has a @PostConstruct method,
<code>null</code> if not.
* This methods only gets used if the produced instance is not intercepted.
@@ -131,7 +131,7 @@ public class InjectionTargetImpl<T> exte
super(points);
Asserts.assertNotNull(annotatedType);
Asserts.assertNotNull(webBeansContext);
- type = annotatedType;
+ this.annotatedType = annotatedType;
this.webBeansContext = webBeansContext;
this.postConstructMethods = postConstructMethods;
this.preDestroyMethods = preDestroyMethods;
@@ -281,7 +281,7 @@ public class InjectionTargetImpl<T> exte
*/
private void injectInitializerMethods(Class<?> declaringType, T instance,
CreationalContextImpl<T> context)
{
- for (AnnotatedMethod<? super T> method : type.getMethods())
+ for (AnnotatedMethod<? super T> method : annotatedType.getMethods())
{
if (method.getDeclaringType().getJavaClass().equals(declaringType)
&& method.isAnnotationPresent(Inject.class) && method.getParameters().isEmpty())
{
@@ -385,7 +385,7 @@ public class InjectionTargetImpl<T> exte
}
}
- private AnnotatedConstructor<T> getConstructor()
+ protected AnnotatedConstructor<T> getConstructor()
{
if (constructor != null)
{
@@ -413,14 +413,14 @@ public class InjectionTargetImpl<T> exte
}
else
{
- this.constructor = new
AnnotatedConstructorImpl<T>(webBeansContext, getDefaultConstructor(), type);
+ this.constructor = new
AnnotatedConstructorImpl<T>(webBeansContext, getDefaultConstructor(),
annotatedType);
}
return this.constructor;
}
private Constructor<T> getDefaultConstructor()
{
- return
webBeansContext.getWebBeansUtil().getNoArgConstructor(type.getJavaClass());
+ return
webBeansContext.getWebBeansUtil().getNoArgConstructor(annotatedType.getJavaClass());
}
private boolean isProducerMethod(InjectionPoint injectionPoint)
Copied:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/DecoratorProxyFactory.java
(from r1435371,
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java)
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/DecoratorProxyFactory.java?p2=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/DecoratorProxyFactory.java&p1=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java&r1=1435371&r2=1435418&rev=1435418&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/DecoratorProxyFactory.java
Fri Jan 18 23:54:34 2013
@@ -41,17 +41,12 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
/**
- * This factory creates proxies which delegate the
- * method invocations 1:1 to an instance which gets
- * resolved via a {@link javax.inject.Provider}.
+ * This factory creates subclasses for abstract classes.
*/
-public class NormalScopeProxyFactory extends AbstractProxyFactory
+public class DecoratorProxyFactory extends AbstractProxyFactory
{
- /** the name of the field which stores the {@link Provider} for the
Contextual Instance */
- public static final String FIELD_INSTANCE_PROVIDER =
"owbContextualInstanceProvider";
-
- public NormalScopeProxyFactory(WebBeansContext webBeansContext)
+ public DecoratorProxyFactory(WebBeansContext webBeansContext)
{
super(webBeansContext);
}
@@ -59,28 +54,11 @@ public class NormalScopeProxyFactory ext
@Override
protected Class getMarkerInterface()
{
- return OwbNormalScopeProxy.class;
+ return OwbDecoratorProxy.class;
}
- /**
- * @return the internal instance which gets proxied.
- */
- public Provider getInstanceProvider(OwbNormalScopeProxy proxyInstance)
- {
- try
- {
- Field internalInstanceField =
proxyInstance.getClass().getDeclaredField(FIELD_INSTANCE_PROVIDER);
- internalInstanceField.setAccessible(true);
- return (Provider) internalInstanceField.get(proxyInstance);
- }
- catch (Exception e)
- {
- ExceptionUtil.throwAsRuntimeException(e);
- }
- return null;
- }
- public <T> T createNormalScopeProxy(Bean<T> bean)
+ public <T> T createDecoratorSubclass(Bean<T> bean)
{
ClassLoader classLoader = bean.getClass().getClassLoader();
@@ -88,6 +66,7 @@ public class NormalScopeProxyFactory ext
if (bean instanceof OwbBean)
{
classToProxy = ((OwbBean<T>) bean).getReturnType();
+
}
else
{
@@ -95,7 +74,12 @@ public class NormalScopeProxyFactory ext
classToProxy = (Class<T>) bean.getBeanClass();
}
- Class<? extends T> proxyClass = createProxyClass(classLoader,
classToProxy);
+ if (!Modifier.isAbstract(classToProxy.getModifiers()))
+ {
+ throw new WebBeansConfigurationException("Only abstract classes
should get subclassed, not " + classToProxy);
+ }
+
+ Class<? extends T> proxyClass = createSubClass(classLoader,
classToProxy);
return createProxyInstance(proxyClass,
getInstanceProvider(classLoader, bean));
}
@@ -149,10 +133,10 @@ public class NormalScopeProxyFactory ext
* @return the proxy class
* //X TODO for serialisation reasons this probably needs the Bean it
serves.
*/
- public synchronized <T> Class<T> createProxyClass(ClassLoader classLoader,
Class<T> classToProxy)
+ public synchronized <T> Class<T> createSubClass(ClassLoader classLoader,
Class<T> classToProxy)
throws ProxyGenerationException
{
- String proxyClassName = getUnusedProxyClassName(classLoader,
classToProxy.getName() + "$OwbNormalScopeProxy");
+ String proxyClassName = getUnusedProxyClassName(classLoader,
classToProxy.getName() + "$OwbSubClass");
Method[] nonInterceptedMethods;
if (classToProxy.isInterface())
Copied:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/OwbDecoratorProxy.java
(from r1435371,
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/OwbNormalScopeProxy.java)
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/OwbDecoratorProxy.java?p2=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/OwbDecoratorProxy.java&p1=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/OwbNormalScopeProxy.java&r1=1435371&r2=1435418&rev=1435418&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/OwbNormalScopeProxy.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/OwbDecoratorProxy.java
Fri Jan 18 23:54:34 2013
@@ -22,16 +22,8 @@ package org.apache.webbeans.proxy;
import java.io.Serializable;
/**
- * <p>Interface for all OpenWebBeans {@link
javax.enterprise.context.NormalScope} Proxies.
- * A normalscoping proxy just resolves the underlying Contextual Instance
- * and directly invokes the target method onto it.</p>
- *
- * <p>Each <code>OwbNormalScopeProxy</code> contains a {@link
javax.inject.Provider}
- * which returns the current Contextual Instance.</p>
- *
- * <p>This interface extends Serializable because every NormalScoped bean
proxy must
- * be Serializable!</p>
+ * <p>Interface for all OpenWebBeans abstract Decorator subclasses.
*/
-public interface OwbNormalScopeProxy extends Serializable
+public interface OwbDecoratorProxy extends Serializable
{
}