Return-Path: X-Original-To: apmail-activemq-commits-archive@www.apache.org Delivered-To: apmail-activemq-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 483F710784 for ; Tue, 25 Nov 2014 16:10:52 +0000 (UTC) Received: (qmail 24395 invoked by uid 500); 25 Nov 2014 16:10:52 -0000 Delivered-To: apmail-activemq-commits-archive@activemq.apache.org Received: (qmail 24323 invoked by uid 500); 25 Nov 2014 16:10:52 -0000 Mailing-List: contact commits-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@activemq.apache.org Delivered-To: mailing list commits@activemq.apache.org Received: (qmail 24246 invoked by uid 99); 25 Nov 2014 16:10:52 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Nov 2014 16:10:52 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id AC293A19A9B; Tue, 25 Nov 2014 16:10:51 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: andytaylor@apache.org To: commits@activemq.apache.org Date: Tue, 25 Nov 2014 16:10:51 -0000 Message-Id: <5fcd2613e59f40ac9c729142025816b3@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/2] activemq-6 git commit: ACTIVEMQ6-6 Add Service Extension Component Repository: activemq-6 Updated Branches: refs/heads/master d59417340 -> 5996d697c ACTIVEMQ6-6 Add Service Extension Component Adds a new service extensions components used to house any extension points for integration and extension. In addition this patch adds initial extension points for XAResource wrapping. Project: http://git-wip-us.apache.org/repos/asf/activemq-6/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-6/commit/60fbb105 Tree: http://git-wip-us.apache.org/repos/asf/activemq-6/tree/60fbb105 Diff: http://git-wip-us.apache.org/repos/asf/activemq-6/diff/60fbb105 Branch: refs/heads/master Commit: 60fbb1055b01aa3c757a83013c0e3a4b66f00787 Parents: d594173 Author: Martyn Taylor Authored: Tue Nov 25 12:20:20 2014 +0000 Committer: Martyn Taylor Committed: Tue Nov 25 15:51:03 2014 +0000 ---------------------------------------------------------------------- activemq-ra/pom.xml | 11 +- .../ra/ActiveMQRAManagedConnection.java | 12 +- .../activemq/ra/ActiveMQXAResourceWrapper.java | 143 ------------------- .../ra/inflow/ActiveMQMessageHandler.java | 16 ++- activemq-service-extensions/pom.xml | 39 +++++ .../service/extensions/ServiceUtils.java | 58 ++++++++ .../xa/ActiveMQXAResourceWrapper.java | 32 +++++ .../xa/ActiveMQXAResourceWrapperFactory.java | 26 ++++ .../ActiveMQXAResourceWrapperFactoryImpl.java | 31 ++++ .../xa/ActiveMQXAResourceWrapperImpl.java | 138 ++++++++++++++++++ .../xa/ActiveMQXAResourceWrapperImplTest.java | 51 +++++++ .../xa/MockActiveMQResourceWrapperFactory.java | 33 +++++ .../extensions/tests/xa/MockXAResource.java | 85 +++++++++++ .../extensions/tests/xa/ServiceUtilsTest.java | 62 ++++++++ pom.xml | 12 +- tests/integration-tests/pom.xml | 5 - .../integration/ra/OutgoingConnectionTest.java | 5 +- tests/unit-tests/pom.xml | 5 - .../tests/unit/xa/XAResourceWrapperTest.java | 43 ------ 19 files changed, 590 insertions(+), 217 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-ra/pom.xml ---------------------------------------------------------------------- diff --git a/activemq-ra/pom.xml b/activemq-ra/pom.xml index b9954b9..c027026 100644 --- a/activemq-ra/pom.xml +++ b/activemq-ra/pom.xml @@ -53,19 +53,14 @@ provided - org.jboss.ironjacamar - ironjacamar-core-api - provided - - org.apache.geronimo.specs geronimo-ejb_3.0_spec provided - org.jboss - jboss-transaction-spi - provided + org.apache.activemq + activemq-service-extensions + ${project.version} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAManagedConnection.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAManagedConnection.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAManagedConnection.java index 7ec8379..710a7ea 100644 --- a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAManagedConnection.java +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAManagedConnection.java @@ -35,8 +35,10 @@ import javax.transaction.xa.XAResource; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -46,6 +48,9 @@ import org.apache.activemq.core.client.impl.ClientSessionInternal; import org.apache.activemq.jms.client.ActiveMQConnection; import org.apache.activemq.jms.client.ActiveMQConnectionFactory; import org.apache.activemq.jms.client.ActiveMQXAConnection; +import org.apache.activemq.service.extensions.ServiceUtils; +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapper; +import org.apache.activemq.utils.VersionLoader; /** * The managed connection @@ -531,7 +536,12 @@ public final class ActiveMQRAManagedConnection implements ManagedConnection, Exc { ClientSessionInternal csi = (ClientSessionInternal) xaSession.getXAResource(); ActiveMQRAXAResource activeMQRAXAResource = new ActiveMQRAXAResource(this, xaSession.getXAResource()); - xaResource = new ActiveMQXAResourceWrapper(activeMQRAXAResource, ra.getJndiName(), csi.getNodeId()); + Map xaResourceProperties = new HashMap(); + xaResourceProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_JNDI_NAME, ra.getJndiName()); + xaResourceProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_NODE_ID, csi.getNodeId()); + xaResourceProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_PRODUCT_NAME, ActiveMQResourceAdapter.PRODUCT_NAME); + xaResourceProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_PRODUCT_VERSION, VersionLoader.getVersion().getFullVersion()); + xaResource = ServiceUtils.wrapXAResource(activeMQRAXAResource, xaResourceProperties); } if (ActiveMQRAManagedConnection.trace) http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQXAResourceWrapper.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQXAResourceWrapper.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQXAResourceWrapper.java deleted file mode 100644 index b862424..0000000 --- a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQXAResourceWrapper.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2005-2014 Red Hat, Inc. - * Red Hat 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.activemq.ra; - -import javax.transaction.xa.XAException; -import javax.transaction.xa.XAResource; -import javax.transaction.xa.Xid; - -import org.apache.activemq.core.client.impl.ActiveMQXAResource; -import org.apache.activemq.utils.VersionLoader; - -/** - * @author Martyn Taylor - * - * Wraps XAResource with org.jboss.tm.XAResourceWrapper. This adds extra meta-data to to the XAResource used by - * Transaction Manager for recovery scenarios. - */ - -public class ActiveMQXAResourceWrapper implements org.jboss.tm.XAResourceWrapper, org.jboss.jca.core.spi.transaction.xa.XAResourceWrapper, ActiveMQXAResource -{ - private final XAResource xaResource; - - // The EIS Name - private final String productName; - - // The EIS Version - private final String productVersion; - - // A composite of NodeID + JNDIName that allows adminstrator looking at an XAResource to determine it's origin. - private final String jndiNameNodeId; - - /** - * Creates a new XAResourceWrapper. PRODUCT_NAME, productVersion and jndiName are useful for log output in the - * Transaction Manager. For ActiveMQ only the resourceManagerID is required to allow Transaction Manager to recover - * from relevant recovery scenarios. - * - * @param xaResource - * @param jndiName - */ - public ActiveMQXAResourceWrapper(XAResource xaResource, String jndiName, String nodeId) - { - this.xaResource = xaResource; - this.productName = ActiveMQResourceAdapter.PRODUCT_NAME; - this.productVersion = VersionLoader.getVersion().getFullVersion(); - this.jndiNameNodeId = jndiName + " NodeId:" + nodeId; - } - - @Override - public XAResource getResource() - { - return xaResource; - } - - @Override - public String getProductName() - { - return productName; - } - - @Override - public String getProductVersion() - { - return productVersion; - } - - @Override - public String getJndiName() - { - return jndiNameNodeId; - } - - @Override - public void commit(Xid xid, boolean b) throws XAException - { - getResource().commit(xid, b); - } - - @Override - public void end(Xid xid, int i) throws XAException - { - getResource().end(xid, i); - } - - @Override - public void forget(Xid xid) throws XAException - { - getResource().forget(xid); - } - - @Override - public int getTransactionTimeout() throws XAException - { - return getResource().getTransactionTimeout(); - } - - @Override - public boolean isSameRM(XAResource xaResource) throws XAException - { - return getResource().isSameRM(xaResource); - } - - @Override - public int prepare(Xid xid) throws XAException - { - return getResource().prepare(xid); - } - - @Override - public Xid[] recover(int i) throws XAException - { - return getResource().recover(i); - } - - @Override - public void rollback(Xid xid) throws XAException - { - getResource().rollback(xid); - } - - @Override - public boolean setTransactionTimeout(int i) throws XAException - { - return getResource().setTransactionTimeout(i); - } - - @Override - public void start(Xid xid, int i) throws XAException - { - getResource().start(xid, i); - } - -} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-ra/src/main/java/org/apache/activemq/ra/inflow/ActiveMQMessageHandler.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/inflow/ActiveMQMessageHandler.java b/activemq-ra/src/main/java/org/apache/activemq/ra/inflow/ActiveMQMessageHandler.java index abd68d0..5ec09e8 100644 --- a/activemq-ra/src/main/java/org/apache/activemq/ra/inflow/ActiveMQMessageHandler.java +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/inflow/ActiveMQMessageHandler.java @@ -19,6 +19,8 @@ import javax.resource.spi.endpoint.MessageEndpointFactory; import javax.transaction.Transaction; import javax.transaction.TransactionManager; import javax.transaction.xa.XAResource; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; import org.apache.activemq.api.core.ActiveMQException; @@ -34,8 +36,10 @@ import org.apache.activemq.jms.client.ActiveMQDestination; import org.apache.activemq.jms.client.ActiveMQMessage; import org.apache.activemq.ra.ActiveMQRALogger; import org.apache.activemq.ra.ActiveMQResourceAdapter; -import org.apache.activemq.ra.ActiveMQXAResourceWrapper; +import org.apache.activemq.service.extensions.ServiceUtils; +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapper; import org.apache.activemq.utils.FutureLatch; +import org.apache.activemq.utils.VersionLoader; /** * The message handler @@ -191,9 +195,13 @@ public class ActiveMQMessageHandler implements MessageHandler transacted = activation.isDeliveryTransacted(); if (activation.isDeliveryTransacted() && !activation.getActivationSpec().isUseLocalTx()) { - XAResource xaResource = new ActiveMQXAResourceWrapper(session, - ((ActiveMQResourceAdapter) spec.getResourceAdapter()).getJndiName(), - ((ClientSessionFactoryInternal) cf).getLiveNodeId()); + Map xaResourceProperties = new HashMap(); + xaResourceProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_JNDI_NAME, ((ActiveMQResourceAdapter) spec.getResourceAdapter()).getJndiName()); + xaResourceProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_NODE_ID, ((ClientSessionFactoryInternal) cf).getLiveNodeId()); + xaResourceProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_PRODUCT_NAME, ActiveMQResourceAdapter.PRODUCT_NAME); + xaResourceProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_PRODUCT_VERSION, VersionLoader.getVersion().getFullVersion()); + XAResource xaResource = ServiceUtils.wrapXAResource(session, xaResourceProperties); + endpoint = endpointFactory.createEndpoint(xaResource); useXA = true; } http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-service-extensions/pom.xml ---------------------------------------------------------------------- diff --git a/activemq-service-extensions/pom.xml b/activemq-service-extensions/pom.xml new file mode 100644 index 0000000..ea44ad2 --- /dev/null +++ b/activemq-service-extensions/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + + + org.apache.activemq + activemq-pom + 6.0.0-SNAPSHOT + + + activemq-service-extensions + jar + ActiveMQ6 Service Extensions + + + + org.apache.activemq + activemq-core-client + ${project.version} + + + org.jboss.logging + jboss-logging + + + org.jboss.logging + jboss-logging-processor + + + junit + junit + test + + + + + ${project.basedir}/.. + + http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/ServiceUtils.java ---------------------------------------------------------------------- diff --git a/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/ServiceUtils.java b/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/ServiceUtils.java new file mode 100644 index 0000000..3079348 --- /dev/null +++ b/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/ServiceUtils.java @@ -0,0 +1,58 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.service.extensions; + +import javax.transaction.xa.XAResource; +import java.util.Map; +import java.util.ServiceLoader; + +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapper; +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapperFactory; +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapperFactoryImpl; + +/** + * @author Martyn Taylor + */ + +public class ServiceUtils +{ + private static ActiveMQXAResourceWrapperFactory activeMQXAResourceWrapperFactory; + + private static ActiveMQXAResourceWrapperFactory getActiveMQXAResourceWrapperFactory() + { + if (activeMQXAResourceWrapperFactory == null) + { + setActiveMQXAResourceWrapperFactory(ServiceLoader.load(ActiveMQXAResourceWrapperFactory.class)); + } + return activeMQXAResourceWrapperFactory; + } + + public static ActiveMQXAResourceWrapper wrapXAResource(XAResource xaResource, Map properties) + { + return getActiveMQXAResourceWrapperFactory().wrap(xaResource, properties); + } + + private static void setActiveMQXAResourceWrapperFactory(Iterable iterable) + { + if (iterable.iterator().hasNext()) + { + activeMQXAResourceWrapperFactory = iterable.iterator().next(); + } + else + { + activeMQXAResourceWrapperFactory = new ActiveMQXAResourceWrapperFactoryImpl(); + } + } + +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapper.java ---------------------------------------------------------------------- diff --git a/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapper.java b/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapper.java new file mode 100644 index 0000000..8930960 --- /dev/null +++ b/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapper.java @@ -0,0 +1,32 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.service.extensions.xa; + +import javax.transaction.xa.XAResource; + +/** + * @author Martyn Taylor + */ + +public interface ActiveMQXAResourceWrapper extends XAResource +{ + // List of supported properties + String ACTIVEMQ_JNDI_NAME = "ACTIVEMQ_JNDI_ID"; + + String ACTIVEMQ_PRODUCT_NAME = "ACTIVEMQ_PRODUCT_NAME"; + + String ACTIVEMQ_PRODUCT_VERSION = "ACTIVEMQ_PRODUCT_VERSION"; + + String ACTIVEMQ_NODE_ID = "ACTIVEMQ_NODE_ID"; +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperFactory.java ---------------------------------------------------------------------- diff --git a/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperFactory.java b/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperFactory.java new file mode 100644 index 0000000..007621b --- /dev/null +++ b/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperFactory.java @@ -0,0 +1,26 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.service.extensions.xa; + +import javax.transaction.xa.XAResource; +import java.util.Map; + +/** + * @author Martyn Taylor + */ + +public interface ActiveMQXAResourceWrapperFactory +{ + ActiveMQXAResourceWrapper wrap(XAResource xaResource, Map properties); +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperFactoryImpl.java ---------------------------------------------------------------------- diff --git a/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperFactoryImpl.java b/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperFactoryImpl.java new file mode 100644 index 0000000..e790442 --- /dev/null +++ b/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperFactoryImpl.java @@ -0,0 +1,31 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.service.extensions.xa; + +import javax.transaction.xa.XAResource; +import java.util.Map; + +/** + * @author Martyn Taylor + */ + +public class ActiveMQXAResourceWrapperFactoryImpl implements ActiveMQXAResourceWrapperFactory +{ + + @Override + public ActiveMQXAResourceWrapper wrap(XAResource xaResource, Map properties) + { + return new ActiveMQXAResourceWrapperImpl(xaResource, properties); + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperImpl.java ---------------------------------------------------------------------- diff --git a/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperImpl.java b/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperImpl.java new file mode 100644 index 0000000..3e4c496 --- /dev/null +++ b/activemq-service-extensions/src/main/java/org/apache/activemq/service/extensions/xa/ActiveMQXAResourceWrapperImpl.java @@ -0,0 +1,138 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.service.extensions.xa; + +import javax.transaction.xa.XAException; +import javax.transaction.xa.XAResource; +import javax.transaction.xa.Xid; +import java.util.Map; + +/** + * @author Martyn Taylor + */ + +public class ActiveMQXAResourceWrapperImpl implements ActiveMQXAResourceWrapper +{ + private final XAResource xaResource; + + // The EIS Name + private final String productName; + + // The EIS Version + private final String productVersion; + + // A composite of NodeID + JNDIName that allows adminstrator looking at an XAResource to determine it's origin. + private final String jndiNameNodeId; + + /** + * Creates a new XAResourceWrapper. PRODUCT_NAME, productVersion and jndiName are useful for log output in the + * Transaction Manager. For ActiveMQ only the resourceManagerID is required to allow Transaction Manager to recover + * from relevant recovery scenarios. + * + * @param xaResource + * @param properties + */ + public ActiveMQXAResourceWrapperImpl(XAResource xaResource, Map properties) + { + this.xaResource = xaResource; + //this.productName = ActiveMQResourceAdapter.PRODUCT_NAME; + this.productName = (String) properties.get(ActiveMQXAResourceWrapper.ACTIVEMQ_PRODUCT_NAME); + //this.productVersion = VersionLoader.getVersion().getFullVersion(); + this.productVersion = (String) properties.get(ActiveMQXAResourceWrapper.ACTIVEMQ_PRODUCT_VERSION); + + this.jndiNameNodeId = properties.get(ActiveMQXAResourceWrapper.ACTIVEMQ_JNDI_NAME) + + " NodeId:" + properties.get(ActiveMQXAResourceWrapper.ACTIVEMQ_NODE_ID); + } + + public XAResource getResource() + { + return xaResource; + } + + public String getProductName() + { + return productName; + } + + public String getProductVersion() + { + return productVersion; + } + + public String getJndiName() + { + return jndiNameNodeId; + } + + @Override + public void commit(Xid xid, boolean b) throws XAException + { + getResource().commit(xid, b); + } + + @Override + public void end(Xid xid, int i) throws XAException + { + getResource().end(xid, i); + } + + @Override + public void forget(Xid xid) throws XAException + { + getResource().forget(xid); + } + + @Override + public int getTransactionTimeout() throws XAException + { + return getResource().getTransactionTimeout(); + } + + @Override + public boolean isSameRM(XAResource xaResource) throws XAException + { + return getResource().isSameRM(xaResource); + } + + @Override + public int prepare(Xid xid) throws XAException + { + return getResource().prepare(xid); + } + + @Override + public Xid[] recover(int i) throws XAException + { + return getResource().recover(i); + } + + @Override + public void rollback(Xid xid) throws XAException + { + getResource().rollback(xid); + } + + @Override + public boolean setTransactionTimeout(int i) throws XAException + { + return getResource().setTransactionTimeout(i); + } + + @Override + public void start(Xid xid, int i) throws XAException + { + getResource().start(xid, i); + } + +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/ActiveMQXAResourceWrapperImplTest.java ---------------------------------------------------------------------- diff --git a/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/ActiveMQXAResourceWrapperImplTest.java b/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/ActiveMQXAResourceWrapperImplTest.java new file mode 100644 index 0000000..fdfdced --- /dev/null +++ b/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/ActiveMQXAResourceWrapperImplTest.java @@ -0,0 +1,51 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.service.extensions.tests.xa; + +import javax.transaction.xa.XAResource; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapper; +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapperImpl; +import org.junit.Test; + +import static org.jgroups.util.Util.assertEquals; + +/** + * @author Martyn Taylor + */ + +public class ActiveMQXAResourceWrapperImplTest +{ + @Test + public void testXAResourceWrapper() + { + String jndiName = "java://jmsXA"; + String nodeId = "0"; + XAResource xaResource = new MockXAResource(); + + Map xaResourceWrapperProperties = new HashMap(); + xaResourceWrapperProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_JNDI_NAME, jndiName); + xaResourceWrapperProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_NODE_ID, nodeId); + xaResourceWrapperProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_PRODUCT_VERSION, "6"); + xaResourceWrapperProperties.put(ActiveMQXAResourceWrapper.ACTIVEMQ_PRODUCT_NAME, "ActiveMQ"); + ActiveMQXAResourceWrapperImpl xaResourceWrapper = new ActiveMQXAResourceWrapperImpl(xaResource, xaResourceWrapperProperties); + + String expectedJndiNodeId = jndiName + " NodeId:" + nodeId; + assertEquals(xaResource, xaResourceWrapper.getResource()); + assertEquals(expectedJndiNodeId, xaResourceWrapper.getJndiName()); + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/MockActiveMQResourceWrapperFactory.java ---------------------------------------------------------------------- diff --git a/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/MockActiveMQResourceWrapperFactory.java b/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/MockActiveMQResourceWrapperFactory.java new file mode 100644 index 0000000..9576051 --- /dev/null +++ b/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/MockActiveMQResourceWrapperFactory.java @@ -0,0 +1,33 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.service.extensions.tests.xa; + +import javax.transaction.xa.XAResource; +import java.util.Map; + +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapper; +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapperFactory; + +/** + * @author Martyn Taylor + */ + +public class MockActiveMQResourceWrapperFactory implements ActiveMQXAResourceWrapperFactory +{ + @Override + public ActiveMQXAResourceWrapper wrap(XAResource xaResource, Map properties) + { + return null; + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/MockXAResource.java ---------------------------------------------------------------------- diff --git a/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/MockXAResource.java b/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/MockXAResource.java new file mode 100644 index 0000000..3524e87 --- /dev/null +++ b/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/MockXAResource.java @@ -0,0 +1,85 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.service.extensions.tests.xa; + +import javax.transaction.xa.XAException; +import javax.transaction.xa.XAResource; +import javax.transaction.xa.Xid; + +/** + * @author Martyn Taylor + */ + +public class MockXAResource implements XAResource +{ + @Override + public void commit(Xid xid, boolean b) throws XAException + { + + } + + @Override + public void end(Xid xid, int i) throws XAException + { + + } + + @Override + public void forget(Xid xid) throws XAException + { + + } + + @Override + public int getTransactionTimeout() throws XAException + { + return 0; + } + + @Override + public boolean isSameRM(XAResource xaResource) throws XAException + { + return false; + } + + @Override + public int prepare(Xid xid) throws XAException + { + return 0; + } + + @Override + public Xid[] recover(int i) throws XAException + { + return new Xid[0]; + } + + @Override + public void rollback(Xid xid) throws XAException + { + + } + + @Override + public boolean setTransactionTimeout(int i) throws XAException + { + return false; + } + + @Override + public void start(Xid xid, int i) throws XAException + { + + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/ServiceUtilsTest.java ---------------------------------------------------------------------- diff --git a/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/ServiceUtilsTest.java b/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/ServiceUtilsTest.java new file mode 100644 index 0000000..391db73 --- /dev/null +++ b/activemq-service-extensions/src/test/java/org/apache/activemq/service/extensions/tests/xa/ServiceUtilsTest.java @@ -0,0 +1,62 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.service.extensions.tests.xa; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +import org.apache.activemq.service.extensions.ServiceUtils; +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapperFactory; +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapperFactoryImpl; +import org.junit.Test; + +import static org.jgroups.util.Util.assertTrue; + +/** + * @author Martyn Taylor + */ + +public class ServiceUtilsTest +{ + @Test + public void testSetActiveMQXAResourceWrapperFactorySetsDefaultImplWhenNoOther() throws Exception + { + List factories = new ArrayList(); + + Method method = ServiceUtils.class.getDeclaredMethod("setActiveMQXAResourceWrapperFactory", Iterable.class); + method.setAccessible(true); + method.invoke(null, factories); + + Field field = ServiceUtils.class.getDeclaredField("activeMQXAResourceWrapperFactory"); + field.setAccessible(true); + assertTrue(field.get(null) instanceof ActiveMQXAResourceWrapperFactoryImpl); + } + + @Test + public void testSetActiveMQXAResourceWrapperFactorySetsExtensionImplWhenSupplied() throws Exception + { + List factories = new ArrayList(); + factories.add(new MockActiveMQResourceWrapperFactory()); + + Method method = ServiceUtils.class.getDeclaredMethod("setActiveMQXAResourceWrapperFactory", Iterable.class); + method.setAccessible(true); + method.invoke(null, factories); + + Field field = ServiceUtils.class.getDeclaredField("activeMQXAResourceWrapperFactory"); + field.setAccessible(true); + assertTrue(field.get(null) instanceof MockActiveMQResourceWrapperFactory); + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 568df79..9ae2e1c 100644 --- a/pom.xml +++ b/pom.xml @@ -242,12 +242,6 @@ jbossjts-jacorb 4.17.13.Final - - - org.jboss.ironjacamar - ironjacamar-core-api - 1.2.0.Beta2 - org.jboss.security @@ -489,6 +483,7 @@ activemq-ra activemq-rest activemq-tools + activemq-service-extensions integration/activemq-spring-integration integration/activemq-twitter-integration @@ -513,6 +508,7 @@ activemq-ra activemq-rest activemq-tools + activemq-service-extensions integration/activemq-jboss-as-integration integration/activemq-spring-integration integration/activemq-twitter-integration @@ -537,6 +533,7 @@ activemq-ra activemq-rest activemq-tools + activemq-service-extensions integration/activemq-jboss-as-integration integration/activemq-spring-integration integration/activemq-twitter-integration @@ -563,6 +560,7 @@ activemq-ra activemq-rest activemq-tools + activemq-service-extensions integration/activemq-jboss-as-integration integration/activemq-spring-integration integration/activemq-twitter-integration @@ -600,6 +598,7 @@ activemq-ra activemq-rest activemq-tools + activemq-service-extensions integration/activemq-jboss-as-integration integration/activemq-spring-integration integration/activemq-twitter-integration @@ -633,6 +632,7 @@ activemq-ra activemq-rest activemq-tools + activemq-service-extensions integration/activemq-jboss-as-integration integration/activemq-spring-integration integration/activemq-twitter-integration http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/tests/integration-tests/pom.xml ---------------------------------------------------------------------- diff --git a/tests/integration-tests/pom.xml b/tests/integration-tests/pom.xml index ab54fba..42a31ba 100644 --- a/tests/integration-tests/pom.xml +++ b/tests/integration-tests/pom.xml @@ -220,11 +220,6 @@ 1.0.1 test - - org.jboss.ironjacamar - ironjacamar-core-api - test - http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/tests/integration-tests/src/test/java/org/apache/activemq/tests/integration/ra/OutgoingConnectionTest.java ---------------------------------------------------------------------- diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/tests/integration/ra/OutgoingConnectionTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/tests/integration/ra/OutgoingConnectionTest.java index 8cbed72..3f8b8d3 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/tests/integration/ra/OutgoingConnectionTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/tests/integration/ra/OutgoingConnectionTest.java @@ -49,8 +49,9 @@ import org.apache.activemq.ra.ActiveMQRAConnectionManager; import org.apache.activemq.ra.ActiveMQRAManagedConnectionFactory; import org.apache.activemq.ra.ActiveMQRASession; import org.apache.activemq.ra.ActiveMQResourceAdapter; +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapper; +import org.apache.activemq.service.extensions.xa.ActiveMQXAResourceWrapperImpl; import org.apache.activemq.utils.UUIDGenerator; -import org.apache.activemq.ra.ActiveMQXAResourceWrapper; import org.apache.activemq.utils.VersionLoader; import org.junit.After; import org.junit.Before; @@ -525,7 +526,7 @@ public class OutgoingConnectionTest extends ActiveMQRATestBase XAResource resource = s.getXAResource(); assertTrue(resource instanceof ActiveMQXAResourceWrapper); - ActiveMQXAResourceWrapper xaResourceWrapper = (ActiveMQXAResourceWrapper) resource; + ActiveMQXAResourceWrapperImpl xaResourceWrapper = (ActiveMQXAResourceWrapperImpl) resource; assertTrue(xaResourceWrapper.getJndiName().equals("java://jmsXA NodeId:" + server.getNodeID())); assertTrue(xaResourceWrapper.getProductVersion().equals(VersionLoader.getVersion().getFullVersion())); assertTrue(xaResourceWrapper.getProductName().equals(ActiveMQResourceAdapter.PRODUCT_NAME)); http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/tests/unit-tests/pom.xml ---------------------------------------------------------------------- diff --git a/tests/unit-tests/pom.xml b/tests/unit-tests/pom.xml index b159159..c8f19c4 100644 --- a/tests/unit-tests/pom.xml +++ b/tests/unit-tests/pom.xml @@ -75,11 +75,6 @@ org.jboss.logging jboss-logging-processor - - - org.jboss.ironjacamar - ironjacamar-core-api - http://git-wip-us.apache.org/repos/asf/activemq-6/blob/60fbb105/tests/unit-tests/src/test/java/org/apache/activemq/tests/unit/xa/XAResourceWrapperTest.java ---------------------------------------------------------------------- diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/tests/unit/xa/XAResourceWrapperTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/tests/unit/xa/XAResourceWrapperTest.java deleted file mode 100644 index e78258d..0000000 --- a/tests/unit-tests/src/test/java/org/apache/activemq/tests/unit/xa/XAResourceWrapperTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2005-2014 Red Hat, Inc. - * Red Hat 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.activemq.tests.unit.xa; - -import javax.transaction.xa.XAResource; - -import org.apache.activemq.ra.ActiveMQRAXAResource; -import org.apache.activemq.ra.ActiveMQXAResourceWrapper; -import org.apache.activemq.tests.util.UnitTestCase; -import org.jboss.tm.XAResourceWrapper; -import org.junit.Test; - -/** - * @author Martyn Taylor - */ - -public class XAResourceWrapperTest extends UnitTestCase -{ - @Test - public void testXAResourceWrapper() - { - String jndiName = "java://jmsXA"; - String nodeId = "0"; - XAResource xaResource = new ActiveMQRAXAResource(null, null); - XAResourceWrapper xaResourceWrapper = new ActiveMQXAResourceWrapper(xaResource, jndiName, nodeId); - - assertEquals(xaResource, xaResourceWrapper.getResource()); - - String expectedJndiNodeId = jndiName + " NodeId:" + nodeId; - assertEquals(expectedJndiNodeId, xaResourceWrapper.getJndiName()); - } -}