You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2017/03/14 17:10:12 UTC

svn commit: r1786929 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/container/ main/java/org/apache/webbeans/inject/impl/ test/java/org/apache/webbeans/test/injection/injectionpoint/beans/ test/java/org/apache/webbeans/test/t...

Author: struberg
Date: Tue Mar 14 17:10:12 2017
New Revision: 1786929

URL: http://svn.apache.org/viewvc?rev=1786929&view=rev
Log:
OWB-1173 InjectionPoint with no ownerBean fails on serialisation

txs to Alexander Falb for debugging and reporting the issue!

Added:
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/injectionpoint/beans/UnmanagedClassWithInjectionPoints.java   (with props)
Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionTargetFactoryImpl.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/test/injection/injectionpoint/beans/FieldInjectionPointOwner.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/InjectionPointInjectionTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionTargetFactoryImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionTargetFactoryImpl.java?rev=1786929&r1=1786928&r2=1786929&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionTargetFactoryImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionTargetFactoryImpl.java Tue Mar 14 17:10:12 2017
@@ -33,7 +33,6 @@ import javax.enterprise.inject.spi.Annot
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.InjectionTarget;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -73,12 +72,7 @@ public class InjectionTargetFactoryImpl<
 
     public Set<InjectionPoint> createInjectionPoints(Bean<T> bean)
     {
-        Set<InjectionPoint> injectionPoints = new HashSet<InjectionPoint>();
-        for (InjectionPoint injectionPoint: webBeansContext.getInjectionPointFactory().buildInjectionPoints(bean, annotatedType))
-        {
-            injectionPoints.add(injectionPoint);
-        }
-        return injectionPoints;
+        return webBeansContext.getInjectionPointFactory().buildInjectionPoints(bean, annotatedType);
     }
 
     public AnnotatedType<T> getAnnotatedType()

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=1786929&r1=1786928&r2=1786929&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 Tue Mar 14 17:10:12 2017
@@ -19,6 +19,7 @@
 package org.apache.webbeans.inject.impl;
 
 import java.io.IOException;
+import java.io.NotSerializableException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
@@ -39,6 +40,7 @@ import javax.decorator.Delegate;
 import javax.enterprise.inject.spi.Annotated;
 import javax.enterprise.inject.spi.AnnotatedConstructor;
 import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMember;
 import javax.enterprise.inject.spi.AnnotatedMethod;
 import javax.enterprise.inject.spi.AnnotatedParameter;
 import javax.enterprise.inject.spi.AnnotatedType;
@@ -46,6 +48,7 @@ import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.InjectionPoint;
 
 import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.event.EventUtil;
 import org.apache.webbeans.portable.AnnotatedElementFactory;
 import org.apache.webbeans.util.Asserts;
@@ -173,17 +176,33 @@ class InjectionPointImpl implements Inje
     {
         ObjectOutputStream out = new ObjectOutputStream(op);
 
-        //Write the owning bean class
-        out.writeObject(ownerBean.getBeanClass());
 
-        Set<Annotation> qualifiers = ownerBean.getQualifiers();
-        for(Annotation qualifier : qualifiers)
+        if (ownerBean != null)
         {
-            out.writeObject(Character.valueOf('-')); // throw-away delimiter so alternating annotations don't get swallowed in the read.
-            out.writeObject(qualifier);
-            
+            //Write the owning bean class
+            out.writeObject(ownerBean.getBeanClass());
+
+            // and it's Qualifiers
+            Set<Annotation> qualifiers = ownerBean.getQualifiers();
+            for (Annotation qualifier : qualifiers)
+            {
+                out.writeObject(Character.valueOf('-')); // throw-away delimiter so alternating annotations don't get swallowed in the read.
+                out.writeObject(qualifier);
+            }
         }
-        
+        else
+        {
+            if (annotated instanceof AnnotatedMember)
+            {
+                Class<?> beanClass = ((AnnotatedMember) annotated).getDeclaringType().getJavaClass();
+                out.writeObject(beanClass);
+            }
+            else
+            {
+                throw new NotSerializableException("Cannot detect bean class of InjetionPoint");
+            }
+        }
+
         out.writeObject(Character.valueOf('~'));
         
         if(injectionMember instanceof Field)
@@ -202,7 +221,6 @@ class InjectionPointImpl implements Inje
             
             AnnotatedParameter<?> ap = (AnnotatedParameter<?>) annotated;
             out.writeByte(ap.getPosition());
-            
         }
         
         if(injectionMember instanceof Constructor)
@@ -214,7 +232,6 @@ class InjectionPointImpl implements Inje
             
             AnnotatedParameter<?> ap = (AnnotatedParameter<?>) annotated;
             out.writeByte(ap.getPosition());
-            
         }
         
         out.writeBoolean(delegate);
@@ -230,7 +247,7 @@ class InjectionPointImpl implements Inje
         ObjectInputStream in = new OwbCustomObjectInputStream(inp, WebBeansUtil.getCurrentClassLoader());
 
         Class<?> beanClass = (Class<?>)in.readObject();
-        Set<Annotation> anns = new HashSet<Annotation>();
+        Set<Annotation> anns = new HashSet<>();
         WebBeansContext webBeansContext = WebBeansContext.currentInstance();
         AnnotatedElementFactory annotatedElementFactory = webBeansContext.getAnnotatedElementFactory();
 
@@ -241,9 +258,14 @@ class InjectionPointImpl implements Inje
         }
         
         //process annotations
-        ownerBean = webBeansContext.getBeanManagerImpl().getBeans(beanClass, anns.toArray(new Annotation[anns.size()])).iterator().next();
-        qualifierAnnotations = anns;
-        
+        BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
+        Set<Bean<?>> beans = beanManager.getBeans(beanClass, anns.toArray(new Annotation[anns.size()]));
+        ownerBean = beanManager.resolve(beans);
+        if (ownerBean != null)
+        {
+            qualifierAnnotations = anns;
+        }
+
         // determine type of injection point member (0=field, 1=method, 2=constructor) and read...
         int c = in.readByte();
         if(c == 0)
@@ -256,7 +278,6 @@ class InjectionPointImpl implements Inje
             AnnotatedType<?> annotatedType = annotatedElementFactory.newAnnotatedType(beanClass);
             annotated = annotatedElementFactory.newAnnotatedField(field, annotatedType);
             injectionType = field.getGenericType();
-            
         }
         else if(c == 1)
         {
@@ -273,7 +294,6 @@ class InjectionPointImpl implements Inje
 
             annotated = annParameters.get(in.readByte());
             injectionType = annotated.getBaseType();
-            
         }
         else if(c == 2)
         {
@@ -299,7 +319,6 @@ class InjectionPointImpl implements Inje
 
         delegate = in.readBoolean();
         transientt = in.readBoolean();
-         
     }
 
 
@@ -315,7 +334,6 @@ class InjectionPointImpl implements Inje
         {
             Method method = (Method) injectionMember;
             buffer.append("Method Injection Point, method name :  ").append(method.getName()).append(", Bean Owner : [").append(ownerBean).append("]");
-            
         }
         else if(injectionMember instanceof Field)
         {

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/injectionpoint/beans/FieldInjectionPointOwner.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/injectionpoint/beans/FieldInjectionPointOwner.java?rev=1786929&r1=1786928&r2=1786929&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/injectionpoint/beans/FieldInjectionPointOwner.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/injectionpoint/beans/FieldInjectionPointOwner.java Tue Mar 14 17:10:12 2017
@@ -18,8 +18,10 @@ package org.apache.webbeans.test.injecti
 import javax.annotation.PostConstruct;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.inject.Inject;
+import java.io.Serializable;
 
-public class FieldInjectionPointOwner extends AbstractInjectionPointOwner {
+public class FieldInjectionPointOwner extends AbstractInjectionPointOwner implements Serializable
+{
 
     @Inject
     private InjectionPoint ip;

Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/injectionpoint/beans/UnmanagedClassWithInjectionPoints.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/injectionpoint/beans/UnmanagedClassWithInjectionPoints.java?rev=1786929&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/injectionpoint/beans/UnmanagedClassWithInjectionPoints.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/injectionpoint/beans/UnmanagedClassWithInjectionPoints.java Tue Mar 14 17:10:12 2017
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.webbeans.test.injection.injectionpoint.beans;
+
+import javax.inject.Inject;
+import java.io.Serializable;
+
+/**
+ * An unmanaged class with some InjectionPoints
+ */
+public class UnmanagedClassWithInjectionPoints implements Serializable
+{
+    private @Inject FieldInjectionPointOwner someField;
+
+
+    public FieldInjectionPointOwner getSomeField()
+    {
+        return someField;
+    }
+}

Propchange: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/injectionpoint/beans/UnmanagedClassWithInjectionPoints.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/InjectionPointInjectionTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/InjectionPointInjectionTest.java?rev=1786929&r1=1786928&r2=1786929&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/InjectionPointInjectionTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/InjectionPointInjectionTest.java Tue Mar 14 17:10:12 2017
@@ -29,11 +29,12 @@ import javax.enterprise.context.Dependen
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.InjectionTarget;
 import javax.inject.Inject;
 
-import junit.framework.Assert;
 import org.apache.webbeans.annotation.DefaultLiteral;
 import org.apache.webbeans.test.AbstractUnitTest;
 import org.apache.webbeans.test.injection.injectionpoint.beans.AbstractInjectionPointOwner;
@@ -46,6 +47,9 @@ import org.apache.webbeans.test.injectio
 import org.apache.webbeans.test.injection.injectionpoint.beans.MethodInjectionPointOwner;
 import org.apache.webbeans.test.injection.injectionpoint.beans.ProducerInjectionPointInstanceOwner;
 import org.apache.webbeans.test.injection.injectionpoint.beans.ProducerMethodInjectionPointOwner;
+import org.apache.webbeans.test.injection.injectionpoint.beans.UnmanagedClassWithInjectionPoints;
+import org.apache.webbeans.test.util.Serializations;
+import org.junit.Assert;
 import org.junit.Test;
 
 public class InjectionPointInjectionTest extends AbstractUnitTest {
@@ -156,6 +160,28 @@ public class InjectionPointInjectionTest
         Assert.assertNotNull(owner.getConstructorInjectionPointOwner().getName());
     }
 
+    @Test
+    public void testManualCreateInjectionTargetWithInjectionPointsSerialisation() throws Exception
+    {
+        startContainer(FieldInjectionPointOwner.class);
+        AnnotatedType<UnmanagedClassWithInjectionPoints> at = getBeanManager().createAnnotatedType(UnmanagedClassWithInjectionPoints.class);
+        InjectionTarget<UnmanagedClassWithInjectionPoints> injectionTarget = getBeanManager().createInjectionTarget(at);
+
+        UnmanagedClassWithInjectionPoints instance = new UnmanagedClassWithInjectionPoints();
+        Assert.assertNull(instance.getSomeField());
+
+        CreationalContext cc = getBeanManager().createCreationalContext(null);
+        injectionTarget.inject(instance, cc);
+
+        Assert.assertNotNull(instance.getSomeField());
+        Assert.assertNotNull(instance.getSomeField().getInjectionPoint());
+
+        byte[] bytes = Serializations.serialize(instance);
+        Assert.assertNotNull(bytes);
+        UnmanagedClassWithInjectionPoints instance2 = (UnmanagedClassWithInjectionPoints) Serializations.deserialize(bytes);
+        Assert.assertNotNull(instance2);
+    }
+
     @Dependent
     public static class ConstructorInjectionOwner
     {