You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by tv...@apache.org on 2018/01/18 15:43:54 UTC
[06/50] tomee git commit: Makes EndpointHandler to use the
AbstractEndpointHandler
Makes EndpointHandler to use the AbstractEndpointHandler
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/ba61cf07
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/ba61cf07
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/ba61cf07
Branch: refs/heads/master
Commit: ba61cf0733b82f7d5e578151f392f69e6eaa3c4c
Parents: 8e2aad5
Author: Otavio Santana <ot...@gmail.com>
Authored: Fri Dec 15 07:56:44 2017 -0300
Committer: Otavio Santana <ot...@gmail.com>
Committed: Fri Dec 15 07:56:44 2017 -0300
----------------------------------------------------------------------
.../core/mdb/AbstractEndpointHandler.java | 11 +-
.../openejb/core/mdb/EndpointHandler.java | 160 +------------------
2 files changed, 13 insertions(+), 158 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/ba61cf07/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/AbstractEndpointHandler.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/AbstractEndpointHandler.java b/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/AbstractEndpointHandler.java
index 3df2438..5310c44 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/AbstractEndpointHandler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/AbstractEndpointHandler.java
@@ -25,18 +25,23 @@ import javax.ejb.EJBException;
import javax.jms.Message;
import javax.resource.spi.ApplicationServerInternalException;
import javax.resource.spi.UnavailableException;
+import javax.resource.spi.endpoint.MessageEndpoint;
+import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;
-abstract class AbstractEndpointHandler {
+abstract class AbstractEndpointHandler implements InvocationHandler, MessageEndpoint {
protected State state = State.NONE;
protected volatile Boolean isAmq;
protected Object instance;
- //final
- protected BaseMdbContainer container;
+ protected final BaseMdbContainer container;
+
+ AbstractEndpointHandler(BaseMdbContainer container) {
+ this.container = container;
+ }
public abstract void beforeDelivery(final Method method) throws ApplicationServerInternalException;
http://git-wip-us.apache.org/repos/asf/tomee/blob/ba61cf07/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/EndpointHandler.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/EndpointHandler.java b/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/EndpointHandler.java
index 026e94c..0ab2938 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/EndpointHandler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/EndpointHandler.java
@@ -17,36 +17,24 @@
package org.apache.openejb.core.mdb;
-import org.apache.openejb.ApplicationException;
import org.apache.openejb.BeanContext;
import org.apache.openejb.SystemException;
-import org.apache.openejb.resource.activemq.jms2.DelegateMessage;
-import org.apache.openejb.resource.activemq.jms2.JMS2;
-import javax.ejb.EJBException;
-import javax.jms.Message;
import javax.resource.spi.ApplicationServerInternalException;
import javax.resource.spi.UnavailableException;
-import javax.resource.spi.endpoint.MessageEndpoint;
import javax.transaction.xa.XAResource;
-import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
-import java.util.Arrays;
-public class EndpointHandler implements InvocationHandler, MessageEndpoint {
- private volatile Boolean isAmq;
+public class EndpointHandler extends AbstractEndpointHandler {
- private final BaseMdbContainer container;
private final BeanContext deployment;
private final MdbInstanceFactory instanceFactory;
private final XAResource xaResource;
- private State state = State.NONE;
- private Object instance;
public EndpointHandler(final BaseMdbContainer container, final BeanContext deployment, final MdbInstanceFactory instanceFactory, final XAResource xaResource) throws UnavailableException {
- this.container = container;
+ super(container);
this.deployment = deployment;
this.instanceFactory = instanceFactory;
this.xaResource = xaResource;
@@ -54,38 +42,7 @@ public class EndpointHandler implements InvocationHandler, MessageEndpoint {
}
- public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
-
- final String methodName = method.getName();
- final Class<?>[] parameterTypes = method.getParameterTypes();
-
- if (method.getDeclaringClass() == Object.class) {
- if ("toString".equals(methodName) && parameterTypes.length == 0) {
- return toString();
- } else if ("equals".equals(methodName) && parameterTypes.length == 1) {
- return equals(args[0]);
- } else if ("hashCode".equals(methodName) && parameterTypes.length == 0) {
- return hashCode();
- } else {
- throw new UnsupportedOperationException("Unkown method: " + method);
- }
- }
-
- if ("beforeDelivery".equals(methodName) && Arrays.deepEquals(new Class[]{Method.class}, parameterTypes)) {
- beforeDelivery((Method) args[0]);
- return null;
- } else if ("afterDelivery".equals(methodName) && parameterTypes.length == 0) {
- afterDelivery();
- return null;
- } else if ("release".equals(methodName) && parameterTypes.length == 0) {
- release();
- return null;
- } else {
- final Object value = deliverMessage(method, args);
- return value;
- }
- }
-
+ @Override
public void beforeDelivery(final Method method) throws ApplicationServerInternalException {
// verify current state
switch (state) {
@@ -109,115 +66,8 @@ public class EndpointHandler implements InvocationHandler, MessageEndpoint {
// before completed successfully we are now ready to invoke bean
state = State.BEFORE_CALLED;
}
-
- public Object deliverMessage(final Method method, final Object[] args) throws Throwable {
-
- boolean callBeforeAfter = false;
-
- // verify current state
- switch (state) {
- case NONE:
- try {
- beforeDelivery(method);
- } catch (final ApplicationServerInternalException e) {
- throw (EJBException) new EJBException().initCause(e.getCause());
- }
- callBeforeAfter = true;
- state = State.METHOD_CALLED;
- break;
- case BEFORE_CALLED:
- state = State.METHOD_CALLED;
- break;
- case RELEASED:
- throw new IllegalStateException("Message endpoint factory has been released");
- case METHOD_CALLED:
- case SYSTEM_EXCEPTION:
- throw new IllegalStateException("The last message delivery must be completed with an afterDeliver before another message can be delivered");
- }
-
- Throwable throwable = null;
- Object value = null;
- try {
- // deliver the message
- value = container.invoke(instance, method, null, wrapMessageForAmq5(args));
- } catch (final SystemException se) {
- throwable = se.getRootCause() != null ? se.getRootCause() : se;
- state = State.SYSTEM_EXCEPTION;
- } catch (final ApplicationException ae) {
- throwable = ae.getRootCause() != null ? ae.getRootCause() : ae;
- } finally {
- // if the adapter is not using before/after, we must call afterDelivery to clean up
- if (callBeforeAfter) {
- try {
- afterDelivery();
- } catch (final ApplicationServerInternalException e) {
- throwable = throwable == null ? e.getCause() : throwable;
- } catch (final UnavailableException e) {
- throwable = throwable == null ? e : throwable;
- }
- }
- }
-
- if (throwable != null) {
- throwable.printStackTrace();
- if (isValidException(method, throwable)) {
- throw throwable;
- } else {
- throw new EJBException().initCause(throwable);
- }
- }
- return value;
- }
-
- // workaround for AMQ 5/JMS 2 support
- private Object[] wrapMessageForAmq5(final Object[] args) {
- if (args == null || args.length != 1 || DelegateMessage.class.isInstance(args[0])) {
- return args;
- }
-
- if (isAmq == null) {
- synchronized (this) {
- if (isAmq == null) {
- isAmq = args[0].getClass().getName().startsWith("org.apache.activemq.");
- }
- }
- }
- if (isAmq) {
- args[0] = JMS2.wrap(Message.class.cast(args[0]));
- }
- return args;
- }
-
- public void afterDelivery() throws ApplicationServerInternalException, UnavailableException {
- // verify current state
- switch (state) {
- case RELEASED:
- throw new IllegalStateException("Message endpoint factory has been released");
- case NONE:
- throw new IllegalStateException("afterDelivery may only be called if message delivery began with a beforeDelivery call");
- }
-
-
- // call afterDelivery on the container
- boolean exceptionThrown = false;
- try {
- container.afterDelivery(instance);
- } catch (final SystemException se) {
- exceptionThrown = true;
-
- final Throwable throwable = se.getRootCause() != null ? se.getRootCause() : se;
- throwable.printStackTrace();
- throw new ApplicationServerInternalException(throwable);
- } finally {
- if (state == State.SYSTEM_EXCEPTION) {
- recreateInstance(exceptionThrown);
- }
- // we are now in the default NONE state
- state = State.NONE;
- }
- }
-
- private void recreateInstance(final boolean exceptionAlreadyThrown) throws UnavailableException {
+ @Override
+ protected void recreateInstance(final boolean exceptionAlreadyThrown) throws UnavailableException {
try {
instance = instanceFactory.recreateInstance(instance);
} catch (final UnavailableException e) {