You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ge...@apache.org on 2010/09/30 08:18:10 UTC

svn commit: r1002951 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/component/ main/java/org/apache/webbeans/corespi/ main/java/org/apache/webbeans/inject/impl/ test/java/org/apache/webbeans/newtests/injection/injectionpoint/...

Author: gerdogdu
Date: Thu Sep 30 06:18:10 2010
New Revision: 1002951

URL: http://svn.apache.org/viewvc?rev=1002951&view=rev
Log:
[OWB-464]  InjectionPointImpl using wrong class loader during serialize/deserialize, dropping qualifiers, and omiting qualifier values.Thanks to Paul J. Reder

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractProducerBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/impl/InjectionPointImpl.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/injectionpoint/tests/DependentProducerMethodInjectionPointTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractProducerBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractProducerBean.java?rev=1002951&r1=1002950&r2=1002951&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractProducerBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractProducerBean.java Thu Sep 30 06:18:10 2010
@@ -19,7 +19,6 @@
 package org.apache.webbeans.component;
 
 import java.io.Serializable;
-import java.lang.annotation.Annotation;
 import java.util.Set;
 
 import javax.enterprise.context.spi.CreationalContext;

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java?rev=1002951&r1=1002950&r2=1002951&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java Thu Sep 30 06:18:10 2010
@@ -18,10 +18,12 @@
  */
 package org.apache.webbeans.corespi;
 
+import java.lang.ref.WeakReference;
 import java.util.HashMap;
 import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.WeakHashMap;
 
 import org.apache.webbeans.exception.WebBeansException;
 import org.apache.webbeans.spi.SingletonService;
@@ -35,9 +37,9 @@ public class DefaultSingletonService imp
      * Keys --> ClassLoaders
      * Values --> Maps of singleton class name with object
      */
-    private final Map<ClassLoader, Map<String, Object>> singletonMap = new HashMap<ClassLoader, Map<String,Object>>();
+    private final Map<ClassLoader, Map<String, Object>> singletonMap = new WeakHashMap<ClassLoader, Map<String,Object>>();
     
-    private final Map<Object, ClassLoader> objectToClassLoaderMap = new IdentityHashMap<Object, ClassLoader>();
+    private final Map<Object, WeakReference<ClassLoader>> objectToClassLoaderMap = new IdentityHashMap<Object, WeakReference<ClassLoader>>();
 
  
     /**
@@ -90,7 +92,7 @@ public class DefaultSingletonService imp
                     managerMap.put(singletonName, object);
                     
                     //Save it object --> classloader
-                    objectToClassLoaderMap.put(object, classLoader);
+                    objectToClassLoaderMap.put(object, new WeakReference<ClassLoader>(classLoader));
 
                 }
                 catch (InstantiationException e)
@@ -167,7 +169,11 @@ public class DefaultSingletonService imp
         {
             if(objectToClassLoaderMap.containsKey(object))
             {
-                return objectToClassLoaderMap.get(object);
+                WeakReference<ClassLoader> current = objectToClassLoaderMap.get(object);
+                if(current != null)
+                {
+                    return current.get();
+                }                
             }              
         }
         

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/impl/InjectionPointImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/impl/InjectionPointImpl.java?rev=1002951&r1=1002950&r2=1002951&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/impl/InjectionPointImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/impl/InjectionPointImpl.java Thu Sep 30 06:18:10 2010
@@ -19,6 +19,10 @@
 package org.apache.webbeans.inject.impl;
 
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamClass;
 import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
@@ -40,8 +44,8 @@ import javax.enterprise.inject.spi.Injec
 
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.portable.AnnotatedElementFactory;
-import org.apache.webbeans.proxy.JavassistProxyFactory;
 import org.apache.webbeans.util.ClassUtil;
+import org.apache.webbeans.util.WebBeansUtil;
 
 class InjectionPointImpl implements InjectionPoint, Serializable
 {
@@ -126,14 +130,19 @@ class InjectionPointImpl implements Inje
         this.transientt = transientt;
     }
     
-    private void writeObject(java.io.ObjectOutputStream out) throws IOException
+    private void writeObject(java.io.ObjectOutputStream op) throws IOException
     {
+        ObjectOutputStream out = new ObjectOutputStream(op);
+
+        //Write the owning bean class
         out.writeObject(this.ownerBean.getBeanClass());
-                
-        Set<Annotation> annotations = this.ownerBean.getQualifiers();
-        for(Annotation ann : annotations)
+
+        Set<Annotation> qualifiers = this.ownerBean.getQualifiers();
+        for(Annotation qualifier : qualifiers)
         {
-            out.writeObject(ann.annotationType());
+            out.writeObject(new Character('-')); // throw-away delimiter so alternating annotations don't get swallowed in the read.
+            out.writeObject(qualifier);
+            
         }
         
         out.writeObject(new Character('~'));
@@ -171,25 +180,47 @@ class InjectionPointImpl implements Inje
         
         out.writeBoolean(this.delegate);
         out.writeBoolean(this.transientt);
+        out.flush();
         
     }
     
+    public class CustomObjectInputStream extends ObjectInputStream
+    {
+        private ClassLoader classLoader;
+
+        public CustomObjectInputStream(InputStream in, ClassLoader classLoader) throws IOException
+        {
+            super(in);
+            this.classLoader = classLoader;
+        }
+        
+        protected Class<?> resolveClass(ObjectStreamClass desc) throws ClassNotFoundException
+        {
+            return Class.forName(desc.getName(), false, this.classLoader);
+        }
+    }
+
     @SuppressWarnings("unchecked")
-    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
+    private void readObject(java.io.ObjectInputStream inp) throws IOException, ClassNotFoundException
     {
+
+        ObjectInputStream in = new CustomObjectInputStream(inp, WebBeansUtil.getCurrentClassLoader());
+
         Class<?> beanClass = (Class<?>)in.readObject();
         Set<Annotation> anns = new HashSet<Annotation>();
         AnnotatedElementFactory annotatedElementFactory = AnnotatedElementFactory.getInstance();
 
-        while(!in.readObject().equals(new Character('~')))
+        while(!in.readObject().equals(new Character('~')))   // read throw-away '-' or '~' terminal delimiter.
         {
-            Class<? extends Annotation> ann = (Class<Annotation>) in.readObject();
-            anns.add(JavassistProxyFactory.createNewAnnotationProxy(ann));
+            Annotation ann = (Annotation) in.readObject();  // now read the annotation.
+            anns.add(ann);
         }
         
-        this.ownerBean = BeanManagerImpl.getManager().getBeans(beanClass, anns.toArray(new Annotation[0])).iterator().next();
+        //process annotations
+        this.ownerBean = BeanManagerImpl.getManager().getBeans(beanClass, anns.toArray(new Annotation[anns.size()])).iterator().next();
         this.qualifierAnnotations = anns;
         
+        // determine type of injection point member (0=field, 1=method, 2=constructor) and read...
         int c = in.readByte();
         if(c == 0)
         {

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/injectionpoint/tests/DependentProducerMethodInjectionPointTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/injectionpoint/tests/DependentProducerMethodInjectionPointTest.java?rev=1002951&r1=1002950&r2=1002951&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/injectionpoint/tests/DependentProducerMethodInjectionPointTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/injectionpoint/tests/DependentProducerMethodInjectionPointTest.java Thu Sep 30 06:18:10 2010
@@ -18,6 +18,7 @@
  */
 package org.apache.webbeans.newtests.injection.injectionpoint.tests;
 
+import java.io.*;
 import java.lang.reflect.Field;
 import java.net.URL;
 import java.util.ArrayList;
@@ -38,7 +39,7 @@ public class DependentProducerMethodInje
 {
     @SuppressWarnings("unchecked")
     @Test
-    public void testDependentProducerMethodInjectionPoint()
+    public void testDependentProducerMethodInjectionPoint() throws Exception
     {
         Collection<URL> beanXmls = new ArrayList<URL>();
         
@@ -63,8 +64,30 @@ public class DependentProducerMethodInje
         InjectionPoint point = model2.getInjectionPoint();
         Assert.assertTrue(point.getBean().equals(bean));
         Assert.assertTrue(point.getMember() instanceof Field);
+
+        point = (InjectionPoint) deserialize(serialize(point));
+
+        Assert.assertTrue(point.getBean().equals(bean));
+        Assert.assertTrue(point.getMember() instanceof Field);
         
         shutDownContainer();
 
     }
+
+    private byte[] serialize(Object o) throws IOException
+    {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(o);
+        return baos.toByteArray();
+    }
+
+    private Object deserialize(byte[] serial) throws IOException, ClassNotFoundException
+    {
+        ByteArrayInputStream bais = new ByteArrayInputStream(serial);
+        ObjectInputStream ois = new ObjectInputStream(bais);
+        return ois.readObject();
+    }
+
+
 }