Permalink
Comparing changes
Open a pull request
- 3 commits
- 11 files changed
- 0 commit comments
- 3 contributors
Commits on Mar 19, 2019
https://issues.jboss.org/browse/WFLY-11866 is a regression of WFLY-2949. Exceptions are not passed-by-reference if enabled, this cause issues if the Exception is not marked as Serializable.
Commits on Apr 04, 2019
WFLY-11866 Exception can not be passed-by-reference
Unified
Split
Showing
with
447 additions
and 9 deletions.
- +7 −5 ejb3/src/main/java/org/jboss/as/ejb3/remote/LocalEjbReceiver.java
- +88 −0 ...tegration/basic/src/test/java/org/jboss/as/test/integration/ejb/remote/byreference/HelloBean.java
- +39 −0 ...gration/basic/src/test/java/org/jboss/as/test/integration/ejb/remote/byreference/HelloRemote.java
- +47 −0 ...sic/src/test/java/org/jboss/as/test/integration/ejb/remote/byreference/NonSerializableObject.java
- +39 −0 ...rc/test/java/org/jboss/as/test/integration/ejb/remote/byreference/RemoteByReferenceException.java
- +1 −1 ...ion/basic/src/test/java/org/jboss/as/test/integration/ejb/remote/byreference/RemoteInterface.java
- +77 −2 ...ava/org/jboss/as/test/integration/ejb/remote/byreference/RemoteInvocationByReferenceTestCase.java
- +49 −0 .../basic/src/test/java/org/jboss/as/test/integration/ejb/remote/byreference/SerializableObject.java
- +1 −1 ...basic/src/test/java/org/jboss/as/test/integration/ejb/remote/byreference/StatelessRemoteBean.java
- +50 −0 ...n/basic/src/test/java/org/jboss/as/test/integration/ejb/remote/byreference/TransferParameter.java
- +49 −0 ...basic/src/test/java/org/jboss/as/test/integration/ejb/remote/byreference/TransferReturnValue.java
| @@ -204,7 +204,7 @@ protected void processInvocation(final EJBReceiverInvocationContext receiverCont | ||
| result = view.invoke(interceptorContext); | ||
| } catch (Exception e) { | ||
| // WFLY-4331 - clone the exception of an async task | ||
| receiverContext.resultReady(new CloningExceptionProducer(resultCloner, e)); | ||
| receiverContext.resultReady(new CloningExceptionProducer(resultCloner, e, allowPassByReference)); | ||
| return; | ||
| } | ||
| // if the result is null, there is no cloning needed | ||
| @@ -225,7 +225,7 @@ protected void processInvocation(final EJBReceiverInvocationContext receiverCont | ||
| intr = true; | ||
| } catch (ExecutionException e) { | ||
| // WFLY-4331 - clone the exception of an async task | ||
| receiverContext.resultReady(new CloningExceptionProducer(resultCloner, e)); | ||
| receiverContext.resultReady(new CloningExceptionProducer(resultCloner, e, allowPassByReference)); | ||
| return; | ||
| } | ||
| } finally { | ||
| @@ -267,7 +267,7 @@ protected void processInvocation(final EJBReceiverInvocationContext receiverCont | ||
| } catch (Exception e) { | ||
| //we even have to clone the exception type | ||
| //to make sure it matches | ||
| receiverContext.resultReady(new CloningExceptionProducer(resultCloner, e)); | ||
| receiverContext.resultReady(new CloningExceptionProducer(resultCloner, e, allowPassByReference)); | ||
| return; | ||
| } | ||
| receiverContext.resultReady(new CloningResultProducer(invocation, resultCloner, result, allowPassByReference)); | ||
| @@ -309,14 +309,16 @@ public void discardResult() { | ||
| static final class CloningExceptionProducer implements EJBReceiverInvocationContext.ResultProducer { | ||
| private final ObjectCloner resultCloner; | ||
| private final Exception exception; | ||
| private final boolean allowPassByReference; | ||
|
|
||
| CloningExceptionProducer(final ObjectCloner resultCloner, final Exception exception) { | ||
| CloningExceptionProducer(final ObjectCloner resultCloner, final Exception exception, final boolean allowPassByReference) { | ||
| this.resultCloner = resultCloner; | ||
| this.exception = exception; | ||
| this.allowPassByReference = allowPassByReference; | ||
| } | ||
|
|
||
| public Object getResult() throws Exception { | ||
| throw (Exception) LocalEjbReceiver.clone(resultCloner, exception); | ||
| throw (Exception) LocalEjbReceiver.clone(Exception.class, resultCloner, exception, allowPassByReference); | ||
| } | ||
|
|
||
| public void discardResult() { | ||
| @@ -0,0 +1,88 @@ | ||
| /* | ||
| * JBoss, Home of Professional Open Source. | ||
| * Copyright 2019, Red Hat, Inc., and individual contributors | ||
| * as indicated by the @author tags. See the copyright.txt file in the | ||
| * distribution for a full listing of individual contributors. | ||
| * | ||
| * This is free software; you can redistribute it and/or modify it | ||
| * under the terms of the GNU Lesser General Public License as | ||
| * published by the Free Software Foundation; either version 2.1 of | ||
| * the License, or (at your option) any later version. | ||
| * | ||
| * This software is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| * Lesser General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU Lesser General Public | ||
| * License along with this software; if not, write to the Free | ||
| * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| * 02110-1301 USA, or see the FSF site: http://www.fsf.org. | ||
| */ | ||
| package org.jboss.as.test.integration.ejb.remote.byreference; | ||
|
|
||
|
|
||
| import java.util.logging.Logger; | ||
|
|
||
| import javax.ejb.Stateless; | ||
|
|
||
| @Stateless | ||
| public class HelloBean implements HelloRemote { | ||
|
|
||
| private Logger log = Logger.getLogger(this.getClass().getSimpleName().toString()); | ||
|
|
||
| public TransferReturnValue hello ( TransferParameter param ) throws RemoteByReferenceException { | ||
| log.info("hello("+ param +") = Hello " + param ); | ||
|
|
||
| if(param == null) | ||
| throw new RemoteByReferenceException("Param was null"); | ||
|
|
||
| return new TransferReturnValue ( "Hello " + param ); | ||
| } | ||
|
|
||
| @Override | ||
| public SerializableObject helloSerializable(SerializableObject param) throws RemoteByReferenceException { | ||
| log.info("helloserializable("+ param +") = Hello " + param ); | ||
|
|
||
| if(param == null) | ||
| throw new RemoteByReferenceException("Param was null"); | ||
| param.setValue("Bye"); | ||
|
|
||
| return param; | ||
| } | ||
|
|
||
| @Override | ||
| public NonSerializableObject helloNonSerializable(NonSerializableObject param) throws RemoteByReferenceException { | ||
| log.info("helloserializable("+ param +") = Hello " + param ); | ||
|
|
||
| if(param == null) | ||
| throw new RemoteByReferenceException("Param was null"); | ||
| param.setValue("Bye"); | ||
|
|
||
| return param; | ||
| } | ||
|
|
||
| @Override | ||
| public SerializableObject helloNonSerializableToSerializable(NonSerializableObject param) | ||
| throws RemoteByReferenceException { | ||
| log.info("helloserializable("+ param +") = Hello " + param ); | ||
|
|
||
| if(param == null) | ||
| throw new RemoteByReferenceException("Param was null"); | ||
| param.setValue("Bye"); | ||
|
|
||
| return new SerializableObject(param.getValue()); | ||
| } | ||
|
|
||
| @Override | ||
| public NonSerializableObject helloSerializableToNonSerializable(SerializableObject param) | ||
| throws RemoteByReferenceException { | ||
| log.info("helloserializable("+ param +") = Hello " + param ); | ||
|
|
||
| if(param == null) | ||
| throw new RemoteByReferenceException("Param was null"); | ||
| param.setValue("Bye"); | ||
|
|
||
| return new NonSerializableObject(param.getValue()); | ||
| } | ||
| } |
| @@ -0,0 +1,39 @@ | ||
| /* | ||
| * JBoss, Home of Professional Open Source. | ||
| * Copyright 2019, Red Hat, Inc., and individual contributors | ||
| * as indicated by the @author tags. See the copyright.txt file in the | ||
| * distribution for a full listing of individual contributors. | ||
| * | ||
| * This is free software; you can redistribute it and/or modify it | ||
| * under the terms of the GNU Lesser General Public License as | ||
| * published by the Free Software Foundation; either version 2.1 of | ||
| * the License, or (at your option) any later version. | ||
| * | ||
| * This software is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| * Lesser General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU Lesser General Public | ||
| * License along with this software; if not, write to the Free | ||
| * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| * 02110-1301 USA, or see the FSF site: http://www.fsf.org. | ||
| */ | ||
|
|
||
| package org.jboss.as.test.integration.ejb.remote.byreference; | ||
|
|
||
| import javax.ejb.Remote; | ||
|
|
||
| @Remote | ||
| public interface HelloRemote { | ||
| public TransferReturnValue hello ( TransferParameter param ) throws RemoteByReferenceException; | ||
|
|
||
| public SerializableObject helloSerializable ( SerializableObject param ) throws RemoteByReferenceException; | ||
|
|
||
| public NonSerializableObject helloNonSerializable(NonSerializableObject param) throws RemoteByReferenceException; | ||
|
|
||
| public SerializableObject helloNonSerializableToSerializable(NonSerializableObject param) throws RemoteByReferenceException; | ||
|
|
||
| public NonSerializableObject helloSerializableToNonSerializable(SerializableObject param) throws RemoteByReferenceException; | ||
| } | ||
|
|
| @@ -0,0 +1,47 @@ | ||
| /* | ||
| * JBoss, Home of Professional Open Source. | ||
| * Copyright 2019, Red Hat, Inc., and individual contributors | ||
| * as indicated by the @author tags. See the copyright.txt file in the | ||
| * distribution for a full listing of individual contributors. | ||
| * | ||
| * This is free software; you can redistribute it and/or modify it | ||
| * under the terms of the GNU Lesser General Public License as | ||
| * published by the Free Software Foundation; either version 2.1 of | ||
| * the License, or (at your option) any later version. | ||
| * | ||
| * This software is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| * Lesser General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU Lesser General Public | ||
| * License along with this software; if not, write to the Free | ||
| * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| * 02110-1301 USA, or see the FSF site: http://www.fsf.org. | ||
| */ | ||
|
|
||
| package org.jboss.as.test.integration.ejb.remote.byreference; | ||
|
|
||
| public class NonSerializableObject { | ||
|
|
||
| private String value; | ||
|
|
||
| public NonSerializableObject() { | ||
| } | ||
|
|
||
| public NonSerializableObject(String value) { | ||
| this.value = value; | ||
| } | ||
|
|
||
| public String getValue() { | ||
| return value; | ||
| } | ||
|
|
||
| public void setValue(String value) { | ||
| this.value = value; | ||
| } | ||
|
|
||
| public String toString() { | ||
| return value; | ||
| } | ||
| } |
| @@ -0,0 +1,39 @@ | ||
| /* | ||
| * JBoss, Home of Professional Open Source. | ||
| * Copyright 2019, Red Hat, Inc., and individual contributors | ||
| * as indicated by the @author tags. See the copyright.txt file in the | ||
| * distribution for a full listing of individual contributors. | ||
| * | ||
| * This is free software; you can redistribute it and/or modify it | ||
| * under the terms of the GNU Lesser General Public License as | ||
| * published by the Free Software Foundation; either version 2.1 of | ||
| * the License, or (at your option) any later version. | ||
| * | ||
| * This software is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| * Lesser General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU Lesser General Public | ||
| * License along with this software; if not, write to the Free | ||
| * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| * 02110-1301 USA, or see the FSF site: http://www.fsf.org. | ||
| */ | ||
|
|
||
| package org.jboss.as.test.integration.ejb.remote.byreference; | ||
|
|
||
| public class RemoteByReferenceException extends Exception { | ||
|
|
||
| private NonSerializableObject nonSerializableObject; | ||
|
|
||
| public RemoteByReferenceException() { | ||
| super(); | ||
| nonSerializableObject = new NonSerializableObject("null"); | ||
| } | ||
|
|
||
| public RemoteByReferenceException(String msg) { | ||
| super(msg); | ||
| nonSerializableObject = new NonSerializableObject(msg); | ||
| } | ||
| } | ||
|
|
| @@ -1,6 +1,6 @@ | ||
| /* | ||
| * JBoss, Home of Professional Open Source. | ||
| * Copyright 2012, Red Hat, Inc., and individual contributors | ||
| * Copyright 2019, Red Hat, Inc., and individual contributors | ||
| * as indicated by the @author tags. See the copyright.txt file in the | ||
| * distribution for a full listing of individual contributors. | ||
| * | ||
| @@ -1,6 +1,6 @@ | ||
| /* | ||
| * JBoss, Home of Professional Open Source. | ||
| * Copyright 2012, Red Hat, Inc., and individual contributors | ||
| * Copyright 2019, Red Hat, Inc., and individual contributors | ||
| * as indicated by the @author tags. See the copyright.txt file in the | ||
| * distribution for a full listing of individual contributors. | ||
| * | ||
| @@ -74,7 +74,8 @@ public void tearDown(final ManagementClient managementClient, final String conta | ||
| @Deployment | ||
| public static Archive<?> createDeployment() { | ||
| JavaArchive jar = ShrinkWrap.create(JavaArchive.class, ARCHIVE_NAME + ".jar"); | ||
| jar.addClasses(StatelessRemoteBean.class, RemoteInterface.class, RemoteInvocationByReferenceTestCaseSetup.class); | ||
| jar.addClasses(StatelessRemoteBean.class, RemoteInterface.class, RemoteInvocationByReferenceTestCaseSetup.class, RemoteByReferenceException.class, NonSerializableObject.class, | ||
| HelloBean.class, HelloRemote.class, TransferParameter.class, TransferReturnValue.class, SerializableObject.class); | ||
| return jar; | ||
| } | ||
|
|
||
| @@ -96,4 +97,78 @@ public void testPassByReferenceSemanticsOnRemoteInterface() throws Exception { | ||
| remote.modifyFirstElementOfArray(array, newValue); | ||
| Assert.assertEquals("Invocation on remote interface of an EJB did *not* use pass-by-reference semantics", newValue, array[0]); | ||
| } | ||
|
|
||
| /** | ||
| * Test that invocation on a remote interface of an EJB uses pass-by-reference semantics and the Exception also is pass-by-reference | ||
| * @throws Exception | ||
| */ | ||
| @Test | ||
| public void testPassByReferenceObjectAndException() throws Exception { | ||
| final HelloRemote remote = lookup(HelloBean.class.getSimpleName(), HelloRemote.class); | ||
| // invoke on the remote interface | ||
| TransferReturnValue ret = remote.hello(new TransferParameter(this.getClass().getSimpleName())); | ||
| Assert.assertEquals("Invocation on remote interface of Hello did *not* use pass-by-reference semantics", ret.getValue(), "Hello " + this.getClass().getSimpleName()); | ||
|
|
||
| try { | ||
| remote.hello(null); | ||
| } catch(RemoteByReferenceException he) { | ||
| Assert.assertEquals("Invocation on remote interface of an EJB did *not* use pass-by-reference in exception", he.getMessage(), "Param was null"); | ||
| } | ||
| } | ||
|
|
||
| @Test | ||
| public void testPassByReferenceNonSerializableAndException() throws Exception { | ||
| final HelloRemote remote = lookup(HelloBean.class.getSimpleName(), HelloRemote.class); | ||
| // invoke on the remote interface | ||
| NonSerializableObject ret = remote.helloNonSerializable(new NonSerializableObject("Hello")); | ||
| Assert.assertEquals("Invocation on remote interface of Hello did *not* use pass-by-reference semantics", ret.getValue(), "Bye"); | ||
|
|
||
| try { | ||
| remote.helloNonSerializable(null); | ||
| } catch(RemoteByReferenceException he) { | ||
| Assert.assertEquals("Invocation on remote interface of an EJB did *not* use pass-by-reference in exception", he.getMessage(), "Param was null"); | ||
| } | ||
| } | ||
|
|
||
| @Test | ||
| public void testPassByReferenceSerializable() throws Exception { | ||
| final HelloRemote remote = lookup(HelloBean.class.getSimpleName(), HelloRemote.class); | ||
| // invoke on the remote interface | ||
| SerializableObject ret = remote.helloSerializable(new SerializableObject("Hello")); | ||
| Assert.assertEquals("Invocation on remote interface of Hello did *not* use pass-by-reference semantics", ret.getValue(), "Bye"); | ||
|
|
||
| try { | ||
| remote.helloSerializable(null); | ||
| } catch(RemoteByReferenceException he) { | ||
| Assert.assertEquals("Invocation on remote interface of an EJB did *not* use pass-by-reference in exception", he.getMessage(), "Param was null"); | ||
| } | ||
| } | ||
|
|
||
| @Test | ||
| public void testPassByReferenceSerializableToNonSerializable() throws Exception { | ||
| final HelloRemote remote = lookup(HelloBean.class.getSimpleName(), HelloRemote.class); | ||
| // invoke on the remote interface | ||
| NonSerializableObject ret = remote.helloSerializableToNonSerializable(new SerializableObject("Hello")); | ||
| Assert.assertEquals("Invocation on remote interface of Hello did *not* use pass-by-reference semantics", ret.getValue(), "Bye"); | ||
|
|
||
| try { | ||
| remote.helloSerializableToNonSerializable(null); | ||
| } catch(RemoteByReferenceException he) { | ||
| Assert.assertEquals("Invocation on remote interface of an EJB did *not* use pass-by-reference in exception", he.getMessage(), "Param was null"); | ||
| } | ||
| } | ||
|
|
||
| @Test | ||
| public void testPassByReferenceNonSerializableToSerializable() throws Exception { | ||
| final HelloRemote remote = lookup(HelloBean.class.getSimpleName(), HelloRemote.class); | ||
| // invoke on the remote interface | ||
| SerializableObject ret = remote.helloNonSerializableToSerializable(new NonSerializableObject("Hello")); | ||
| Assert.assertEquals("Invocation on remote interface of Hello did *not* use pass-by-reference semantics", ret.getValue(), "Bye"); | ||
|
|
||
| try { | ||
| remote.helloNonSerializableToSerializable(null); | ||
| } catch(RemoteByReferenceException he) { | ||
| Assert.assertEquals("Invocation on remote interface of an EJB did *not* use pass-by-reference in exception", he.getMessage(), "Param was null"); | ||
| } | ||
| } | ||
| } | ||
Oops, something went wrong.