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 2010/02/04 16:01:46 UTC

svn commit: r906512 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/component/ main/java/org/apache/webbeans/container/ test/java/org/apache/webbeans/newtests/contexts/

Author: struberg
Date: Thu Feb  4 15:01:45 2010
New Revision: 906512

URL: http://svn.apache.org/viewvc?rev=906512&view=rev
Log:
OWB-6 create a wrapper which makes all Bean<T> serializable + test

Added:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/SerializableBean.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/contexts/SerializationTest.java
Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/BaseBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/BaseBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/BaseBean.java?rev=906512&r1=906511&r2=906512&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/BaseBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/BaseBean.java Thu Feb  4 15:01:45 2010
@@ -32,7 +32,7 @@
  * @version $Rev$ $Date$
  * <T> bean class
  */
-public abstract class BaseBean<T> implements Bean<T>, PassivationCapable, Serializable
+public abstract class BaseBean<T> implements Bean<T>, PassivationCapable
 {
     /**Bean Manager*/
     private final BeanManager manager;

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java?rev=906512&r1=906511&r2=906512&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java Thu Feb  4 15:01:45 2010
@@ -13,6 +13,8 @@
  */
 package org.apache.webbeans.component;
 
+import java.io.IOException;
+import java.io.Serializable;
 import java.lang.reflect.Constructor;
 
 import javax.enterprise.context.spi.CreationalContext;
@@ -82,5 +84,6 @@
     public void setConstructor(Constructor<T> constructor)
     {
         this.constructor = constructor;
-    }    
+    }
+
 }
\ No newline at end of file

Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/SerializableBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/SerializableBean.java?rev=906512&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/SerializableBean.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/SerializableBean.java Thu Feb  4 15:01:45 2010
@@ -0,0 +1,162 @@
+package org.apache.webbeans.container;
+/*
+* 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.
+*/
+
+import org.apache.webbeans.exception.inject.DeploymentException;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.PassivationCapable;
+import java.io.*;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Set;
+
+
+/**
+ * Wrapper to make all our Beans serializable.
+ * This is basically a delegate to an underlying Bean&lt;T&gt;.
+ *
+ * We use the {@link PassivationCapable#getId()} and
+ * {@link javax.enterprise.inject.spi.BeanManager#getPassivationCapableBean(String)}
+ * for serialisation and deserialisation.
+ *
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public final class SerializableBean<T> implements Bean<T>, PassivationCapable, Serializable {
+
+    /** the delegated bean */
+    private Bean<T> bean;
+
+    /**
+     * @return the deletaged internal Bean. 
+     */
+    public Bean<T> getBean()
+    {
+        return bean;
+    }
+
+    public SerializableBean(Bean<T> bean)
+    {
+        this.bean = bean;
+    }
+
+    @Override
+    public Set<Type> getTypes()
+    {
+        return bean.getTypes();
+    }
+
+    @Override
+    public Set<Annotation> getQualifiers()
+    {
+        return bean.getQualifiers();
+    }
+
+    @Override
+    public Class<? extends Annotation> getScope()
+    {
+        return bean.getScope();
+    }
+
+    @Override
+    public String getName()
+    {
+        return bean.getName();
+    }
+
+    @Override
+    public boolean isNullable()
+    {
+        return bean.isNullable();
+    }
+
+    @Override
+    public Set<InjectionPoint> getInjectionPoints()
+    {
+        return bean.getInjectionPoints();
+    }
+
+    @Override
+    public Class<?> getBeanClass()
+    {
+        return bean.getBeanClass();
+    }
+
+    @Override
+    public Set<Class<? extends Annotation>> getStereotypes()
+    {
+        return bean.getStereotypes();
+    }
+
+    @Override
+    public boolean isAlternative()
+    {
+        return bean.isAlternative();
+    }
+
+    @Override
+    public T create(CreationalContext<T> tCreationalContext)
+    {
+        return bean.create(tCreationalContext);
+    }
+
+    @Override
+    public void destroy(T instance, CreationalContext<T> tCreationalContext)
+    {
+        bean.destroy(instance, tCreationalContext);
+    }
+
+    @Override
+    public String getId()
+    {
+        if (bean instanceof PassivationCapable)
+        {
+            return ((PassivationCapable)bean).getId();
+        }
+        return null;
+    }
+
+    private synchronized void writeObject(ObjectOutputStream s)
+    throws IOException
+    {
+        String id = getId();
+        if (id == null)
+        {
+            throw new NotSerializableException();
+        }
+        
+        s.writeObject(id);
+    }
+
+
+    private synchronized void readObject(ObjectInputStream s)
+    throws IOException, ClassNotFoundException
+    {
+        String id = (String) s.readObject();
+        Bean<T> b = (Bean<T>) BeanManagerImpl.getManager().getPassivationCapableBean(id);
+        if (b == null) {
+            throw new DeploymentException("cannot deserialize Bean with PassivationCapable id=" + id);
+        }
+        bean = b;
+    }
+
+
+}

Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/contexts/SerializationTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/contexts/SerializationTest.java?rev=906512&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/contexts/SerializationTest.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/contexts/SerializationTest.java Thu Feb  4 15:01:45 2010
@@ -0,0 +1,98 @@
+package org.apache.webbeans.newtests.contexts;
+/*
+* 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.
+*/
+
+import org.apache.webbeans.container.SerializableBean;
+import org.apache.webbeans.newtests.AbstractUnitTest;
+import org.apache.webbeans.newtests.contexts.session.common.PersonalDataBean;
+import org.apache.webbeans.newtests.decorators.multiple.Decorator1;
+import org.apache.webbeans.newtests.decorators.multiple.OutputProvider;
+import org.apache.webbeans.newtests.decorators.multiple.RequestStringBuilder;
+import org.apache.webbeans.newtests.injection.circular.beans.CircularApplicationScopedBean;
+import org.apache.webbeans.newtests.injection.circular.beans.CircularConstructorOrProducerMethodParameterBean;
+import org.apache.webbeans.newtests.injection.circular.beans.CircularDependenScopeBean;
+import org.apache.webbeans.newtests.injection.circular.beans.CircularNormalInConstructor;
+import junit.framework.Assert;
+import org.junit.Test;
+
+import javax.enterprise.inject.spi.Bean;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Set;
+
+
+/**
+ *
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class SerializationTest extends AbstractUnitTest
+{
+
+    @Test
+    public void testPersonalDataBean() throws ClassNotFoundException, IOException {
+        Collection<Class<?>> classes = new ArrayList<Class<?>>();
+
+        // add a few random classes
+        classes.add(PersonalDataBean.class);
+        classes.add(OutputProvider.class);
+        classes.add(Decorator1.class);
+        classes.add(CircularApplicationScopedBean.class);
+        classes.add(RequestStringBuilder.class);
+        classes.add(CircularConstructorOrProducerMethodParameterBean.class);
+        classes.add(CircularDependenScopeBean.class);
+        classes.add(CircularNormalInConstructor.class);
+
+        startContainer(classes);
+
+        Set<Bean<?>> beans = getLifecycle().getBeanManager().getBeans(Object.class);
+        Assert.assertNotNull(beans);
+        Assert.assertTrue(beans.size() > 7);
+
+        for (Bean<?> bean : beans)
+        {
+            if (! (bean instanceof SerializableBean))
+            {
+                bean = new SerializableBean(bean);
+            }
+            
+            byte[] serial = serialize(bean);
+            Bean b2 = deSerialize(serial);
+
+            Assert.assertEquals(((SerializableBean)bean).getBean(), ((SerializableBean)b2).getBean());
+        }
+
+    }
+
+    private byte[] serialize(Bean<?> bean) throws IOException
+    {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(bean);
+        return baos.toByteArray();
+    }
+
+    private Bean<?> deSerialize(byte[] serial) throws IOException, ClassNotFoundException {
+        ByteArrayInputStream baos = new ByteArrayInputStream(serial);
+        ObjectInputStream ois = new ObjectInputStream(baos);
+        return (Bean<?>) ois.readObject();
+    }
+
+
+}