Skip to content
Permalink
Browse files

Merge pull request #12167 from wfink/WFLY-11866

WFLY-11866 Exception can not be passed-by-reference
  • Loading branch information
bstansberry committed Apr 4, 2019
2 parents 21a7f29 + 0c5a314 commit a82eabcfd41bbeb41923b1c2d84aaaf0c0fa770f
@@ -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");
}
}
}

0 comments on commit a82eabc

Please sign in to comment.
You can’t perform that action at this time.