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();
+ }
+
+
}