You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by st...@apache.org on 2013/08/16 23:07:37 UTC
git commit: DELTASPIKE-402 make DependentProvider Serializable (if
possible)
Updated Branches:
refs/heads/master ff62a1830 -> 258afc8c8
DELTASPIKE-402 make DependentProvider Serializable (if possible)
Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/258afc8c
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/258afc8c
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/258afc8c
Branch: refs/heads/master
Commit: 258afc8c809f68bd1b530e115725e0bf511e02ca
Parents: ff62a18
Author: Mark Struberg <st...@apache.org>
Authored: Fri Aug 16 23:06:16 2013 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Fri Aug 16 23:06:16 2013 +0200
----------------------------------------------------------------------
.../core/api/provider/DependentProvider.java | 47 +++++++++++-
.../core/api/message/MessageContextTest.java | 2 +-
.../core/api/message/SimpleMessageTest.java | 2 +-
.../core/api/provider/BeanProviderTest.java | 19 +++++
.../core/api/provider/DependentTestBean.java | 3 +-
.../deltaspike/test/category/Serializer.java | 81 --------------------
.../deltaspike/test/utils/Serializer.java | 81 ++++++++++++++++++++
7 files changed, 149 insertions(+), 86 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/258afc8c/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/DependentProvider.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/DependentProvider.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/DependentProvider.java
index a63fe83..ae76a04 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/DependentProvider.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/DependentProvider.java
@@ -20,7 +20,13 @@ package org.apache.deltaspike.core.api.provider;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.PassivationCapable;
import javax.inject.Provider;
+import java.io.IOException;
+import java.io.NotSerializableException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
/**
* A {@link Provider} for @Dependent scoped contextual instances.
@@ -28,12 +34,17 @@ import javax.inject.Provider;
* needed anymore via the {@link #destroy()} method.
*
* Instances of this class can be retrieved using the {@link BeanProvider}.
+ *
+ * Instances of this class are Serializable if the wrapped contextual instance
+ * is Serializable.
*/
-public class DependentProvider<T> implements Provider<T>
+public class DependentProvider<T> implements Provider<T>, Serializable
{
+ private static final long serialVersionUID = 23423413412001L;
+
private T instance;
private CreationalContext<T> creationalContext;
- private Bean<T> bean;
+ private transient Bean<T> bean;
DependentProvider(Bean<T> bean, CreationalContext<T> creationalContext, T instance)
{
@@ -52,4 +63,36 @@ public class DependentProvider<T> implements Provider<T>
{
bean.destroy(instance, creationalContext);
}
+
+ private void writeObject(ObjectOutputStream out) throws IOException
+ {
+ if (!(bean instanceof PassivationCapable))
+ {
+ throw new NotSerializableException("Bean is not PassivationCapable: " + bean.toString());
+ }
+ String passivationId = ((PassivationCapable) bean).getId();
+ if (passivationId == null)
+ {
+ throw new NotSerializableException(bean.toString());
+ }
+
+ out.writeLong(serialVersionUID);
+ out.writeObject(passivationId);
+ out.writeObject(instance);
+ out.writeObject(creationalContext);
+ }
+
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
+ {
+ long oldSerialId = in.readLong();
+ if (oldSerialId != serialVersionUID)
+ {
+ throw new NotSerializableException(getClass().getName() + " serialVersion does not match");
+ }
+ String passivationId = (String) in.readObject();
+ bean = (Bean<T>) BeanManagerProvider.getInstance().getBeanManager().getPassivationCapableBean(passivationId);
+ instance = (T) in.readObject();
+ creationalContext = (CreationalContext<T>) in.readObject();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/258afc8c/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java
index c4bde2f..a0893d0 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java
@@ -28,7 +28,7 @@ import org.apache.deltaspike.core.api.message.Message;
import org.apache.deltaspike.core.api.message.MessageContext;
import org.apache.deltaspike.core.impl.message.MessageBundleExtension;
import org.apache.deltaspike.test.category.SeCategory;
-import org.apache.deltaspike.test.category.Serializer;
+import org.apache.deltaspike.test.utils.Serializer;
import org.apache.deltaspike.test.util.ArchiveUtils;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/258afc8c/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/SimpleMessageTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/SimpleMessageTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/SimpleMessageTest.java
index e5dadd8..8acc095 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/SimpleMessageTest.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/SimpleMessageTest.java
@@ -21,7 +21,7 @@ package org.apache.deltaspike.test.core.api.message;
import org.apache.deltaspike.core.api.message.LocaleResolver;
import org.apache.deltaspike.core.impl.message.MessageBundleExtension;
import org.apache.deltaspike.test.category.SeCategory;
-import org.apache.deltaspike.test.category.Serializer;
+import org.apache.deltaspike.test.utils.Serializer;
import org.apache.deltaspike.test.util.ArchiveUtils;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/258afc8c/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/BeanProviderTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/BeanProviderTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/BeanProviderTest.java
index abbeb98..d9c9feb 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/BeanProviderTest.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/BeanProviderTest.java
@@ -22,6 +22,8 @@ package org.apache.deltaspike.test.core.api.provider;
import org.apache.deltaspike.core.api.provider.BeanProvider;
import org.apache.deltaspike.core.api.provider.DependentProvider;
import org.apache.deltaspike.test.util.ArchiveUtils;
+import org.apache.deltaspike.test.utils.CdiContainerUnderTest;
+import org.apache.deltaspike.test.utils.Serializer;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
@@ -29,6 +31,7 @@ import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
+import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -38,6 +41,9 @@ import java.util.concurrent.ConcurrentHashMap;
@RunWith(Arquillian.class)
public class BeanProviderTest
{
+ private static final String CONTAINER_OWB_1_1_x = "owb-1\\.1\\..*";
+
+
/**
*X TODO creating a WebArchive is only a workaround because JavaArchive cannot contain other archives.
*/
@@ -210,6 +216,19 @@ public class BeanProviderTest
checkDependentProvider(dependentTestBeanProvider);
}
+ @Test
+ public void testDependentBeanSerialization() throws Exception
+ {
+ // this test is known to not work under owb-1.1.x as ManagedBean for Dependent scoped classes did not implement PassivationCapable.
+ Assume.assumeTrue(!CdiContainerUnderTest.is(CONTAINER_OWB_1_1_x));
+
+ DependentProvider<DependentTestBean> dependentTestBeanProvider = BeanProvider.getDependent(DependentTestBean.class);
+
+ Serializer<DependentProvider<DependentTestBean>> serializer = new Serializer<DependentProvider<DependentTestBean>>();
+ DependentProvider<DependentTestBean> provider2 = serializer.roundTrip(dependentTestBeanProvider);
+ Assert.assertNotNull(provider2);
+ }
+
private void checkDependentProvider(DependentProvider<DependentTestBean> dependentTestBeanProvider)
{
Assert.assertNotNull(dependentTestBeanProvider);
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/258afc8c/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/DependentTestBean.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/DependentTestBean.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/DependentTestBean.java
index 1bda0b4..b5862e8 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/DependentTestBean.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/DependentTestBean.java
@@ -21,10 +21,11 @@ package org.apache.deltaspike.test.core.api.provider;
import javax.annotation.PreDestroy;
import javax.enterprise.context.Dependent;
import javax.inject.Named;
+import java.io.Serializable;
@Dependent
@Named
-public class DependentTestBean
+public class DependentTestBean implements Serializable
{
private int i = 42;
private boolean destroyed = false;
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/258afc8c/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/category/Serializer.java
----------------------------------------------------------------------
diff --git a/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/category/Serializer.java b/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/category/Serializer.java
deleted file mode 100644
index bd03e94..0000000
--- a/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/category/Serializer.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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.deltaspike.test.category;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-/**
- * A few helper methods for testing serialisation.
- * They help serializing to a byte[] and back to the object
- */
-public class Serializer<T>
-{
-
- /**
- * Serializes the given instance to a byte[] and immediately
- * de-serialize it back.
- * @param original instance
- * @return the deserialized new instance
- */
- public T roundTrip(T original)
- {
- return deserialize(serialize(original));
- }
-
- /**
- * Serializes the given instance to a byte[].
- */
- public byte[] serialize(T o)
- {
- try
- {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos = null;
- oos = new ObjectOutputStream(baos);
- oos.writeObject(o);
- return baos.toByteArray();
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * De-serializes the given byte[] to an instance of T.
- */
- public T deserialize(byte[] serial)
- {
- try
- {
- ByteArrayInputStream bais = new ByteArrayInputStream(serial);
- ObjectInputStream ois = new ObjectInputStream(bais);
- return (T) ois.readObject();
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/258afc8c/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/utils/Serializer.java
----------------------------------------------------------------------
diff --git a/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/utils/Serializer.java b/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/utils/Serializer.java
new file mode 100644
index 0000000..ff0d645
--- /dev/null
+++ b/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/utils/Serializer.java
@@ -0,0 +1,81 @@
+/*
+ * 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.deltaspike.test.utils;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+/**
+ * A few helper methods for testing serialisation.
+ * They help serializing to a byte[] and back to the object
+ */
+public class Serializer<T>
+{
+
+ /**
+ * Serializes the given instance to a byte[] and immediately
+ * de-serialize it back.
+ * @param original instance
+ * @return the deserialized new instance
+ */
+ public T roundTrip(T original)
+ {
+ return deserialize(serialize(original));
+ }
+
+ /**
+ * Serializes the given instance to a byte[].
+ */
+ public byte[] serialize(T o)
+ {
+ try
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = null;
+ oos = new ObjectOutputStream(baos);
+ oos.writeObject(o);
+ return baos.toByteArray();
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * De-serializes the given byte[] to an instance of T.
+ */
+ public T deserialize(byte[] serial)
+ {
+ try
+ {
+ ByteArrayInputStream bais = new ByteArrayInputStream(serial);
+ ObjectInputStream ois = new ObjectInputStream(bais);
+ return (T) ois.readObject();
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+}