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 &#064;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
 {
 }


Reply via email to