Author: dblevins
Date: Sat Mar  1 22:12:29 2014
New Revision: 1573233

URL: http://svn.apache.org/r1573233
Log:
OPENEJB-2080: EJB @LocalBean reference serialization issue

Added:
    
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalReferenceSerializationTest.java
      - copied, changed from r1573209, 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxySerializationTest.java
Removed:
    
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxySerializationTest.java
Modified:
    
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
    
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java

Modified: 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java?rev=1573233&r1=1573232&r2=1573233&view=diff
==============================================================================
--- 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
 (original)
+++ 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
 Sat Mar  1 22:12:29 2014
@@ -364,6 +364,9 @@ public abstract class EjbHomeProxyHandle
             * If the proxy is serialized outside the core container system,
             * we allow the application server to handle it.
             */
+        } else if (!interfaceType.isRemote()) {
+            return proxy;
+
         } else {
             final ApplicationServer applicationServer = 
ServerFederation.getApplicationServer();
             return applicationServer.getEJBHome(this.getProxyInfo());

Modified: 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java?rev=1573233&r1=1573232&r2=1573233&view=diff
==============================================================================
--- 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java
 (original)
+++ 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java
 Sat Mar  1 22:12:29 2014
@@ -210,6 +210,10 @@ public abstract class EjbObjectProxyHand
             * If the proxy is serialized outside the core container system,
             * we allow the application server to handle it.
             */
+        } else if (!interfaceType.isRemote()) {
+
+            return proxy;
+
         } else {
             final ApplicationServer applicationServer = 
ServerFederation.getApplicationServer();
             if (interfaceType.isBusiness()) {

Copied: 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalReferenceSerializationTest.java
 (from r1573209, 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxySerializationTest.java)
URL: 
http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalReferenceSerializationTest.java?p2=tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalReferenceSerializationTest.java&p1=tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxySerializationTest.java&r1=1573209&r2=1573233&rev=1573233&view=diff
==============================================================================
--- 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxySerializationTest.java
 (original)
+++ 
tomee/tomee/branches/tomee-1.5.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalReferenceSerializationTest.java
 Sat Mar  1 22:12:29 2014
@@ -17,44 +17,161 @@
 
 package org.apache.openejb.util.proxy;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import javax.ejb.EJB;
-import org.apache.openejb.jee.Empty;
+import org.apache.openejb.ProxyInfo;
+import org.apache.openejb.core.ServerFederation;
+import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.StatelessBean;
 import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.spi.ApplicationServer;
 import org.apache.openejb.testing.Module;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import javax.ejb.CreateException;
+import javax.ejb.EJB;
+import javax.ejb.EJBHome;
+import javax.ejb.EJBLocalHome;
+import javax.ejb.EJBLocalObject;
+import javax.ejb.EJBMetaData;
+import javax.ejb.EJBObject;
+import javax.ejb.Handle;
+import javax.ejb.HomeHandle;
+import javax.ejb.Local;
+import javax.ejb.LocalBean;
+import javax.ejb.LocalHome;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
 @RunWith(ApplicationComposer.class)
-public class LocalBeanProxySerializationTest {
+public class LocalReferenceSerializationTest {
+
+
+    @EJB
+    private RedLocal red;
+
     @EJB
-    private SampleLocalBean bean;
+    private OrangeLocalBean orange;
+
+    @EJB
+    private GreenLocalHome greenHome;
 
     @Module
-    public StatelessBean app() {
-        final StatelessBean bean = new StatelessBean(SampleLocalBean.class);
-        bean.setLocalBean(new Empty());
-        return bean;
+    public EjbJar app() {
+        final EjbJar ejbJar = new EjbJar();
+
+        ejbJar.addEnterpriseBean(new StatelessBean(OrangeLocalBean.class));
+        ejbJar.addEnterpriseBean(new StatelessBean(RedBean.class));
+        ejbJar.addEnterpriseBean(new StatelessBean(GreenBean.class));
+
+        return ejbJar;
+    }
+
+    @Test
+    public void testLocalBean() throws Exception {
+        assertEquals(5, copy(orange).add(2, 3));
+    }
+
+    @Test
+    public void testLocal() throws Exception {
+        assertEquals(5, copy(red).add(2, 3));
+    }
+
+    @Test
+    public void testLocalObject() throws Exception {
+        assertEquals(5, greenHome.create().add(2, 3));
+
+
+        final GreenLocal greenLocal = copy(greenHome).create();
+
+        assertEquals(5, copy(greenLocal).add(2, 3));
     }
 
-       @Test
-       public void testSerialization() throws Exception {
+    private static <T> T copy(T bean) throws IOException, 
ClassNotFoundException {
         assertNotNull(bean);
 
+        ServerFederation.setApplicationServer(new TestApplicationServer());
+
         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-           final ObjectOutputStream oos = new ObjectOutputStream(baos);
+        final ObjectOutputStream oos = new ObjectOutputStream(baos);
         oos.writeObject(bean);
 
         final ByteArrayInputStream bis = new 
ByteArrayInputStream(baos.toByteArray());
         final ObjectInputStream ois = new ObjectInputStream(bis);
-        final SampleLocalBean deserialized = (SampleLocalBean) 
ois.readObject();
-        assertEquals(5, deserialized.add(2, 3));
-       }
+        return (T) ois.readObject();
+    }
+
+    @LocalBean
+    public static class OrangeLocalBean {
+
+        public int add(int a, int b) {
+            return a + b;
+        }
+    }
+
+    @Local
+    public static class RedBean implements RedLocal {
+
+        public int add(int a, int b) {
+            return a + b;
+        }
+    }
+
+    public static interface RedLocal {
+        public int add(int a, int b);
+    }
+
+    @LocalHome(GreenLocalHome.class)
+    public static class GreenBean {
+
+        public int add(int a, int b) {
+            return a + b;
+        }
+    }
+
+    public static interface GreenLocal extends EJBLocalObject {
+        public int add(int a, int b);
+    }
+
+    public static interface GreenLocalHome extends EJBLocalHome {
+        public GreenLocal create() throws CreateException;
+    }
+
+
+    private static class TestApplicationServer implements ApplicationServer {
+        @Override
+        public EJBMetaData getEJBMetaData(ProxyInfo proxyInfo) {
+            throw new AssertionError("Should never be called");
+        }
+
+        @Override
+        public Handle getHandle(ProxyInfo proxyInfo) {
+            throw new AssertionError("Should never be called");
+        }
+
+        @Override
+        public HomeHandle getHomeHandle(ProxyInfo proxyInfo) {
+            throw new AssertionError("Should never be called");
+        }
+
+        @Override
+        public EJBObject getEJBObject(ProxyInfo proxyInfo) {
+            throw new AssertionError("Should never be called");
+        }
+
+        @Override
+        public Object getBusinessObject(ProxyInfo proxyInfo) {
+            throw new AssertionError("Should never be called");
+        }
+
+        @Override
+        public EJBHome getEJBHome(ProxyInfo proxyInfo) {
+            throw new AssertionError("Should never be called");
+        }
+    }
 }


Reply via email to