Author: ruwan
Date: Tue Mar 3 20:19:53 2009
New Revision: 749727
URL: http://svn.apache.org/viewvc?rev=749727&view=rev
Log:
applying the patch with minor changes from irantha, to add the transaction
mediator https://issues.apache.org/jira/browse/SYNAPSE-480
Added:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/TransactionMediatorFactory.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/TransactionMediatorSerializer.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transaction/
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transaction/TransactionMediator.java
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorFactoryFinder.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorSerializerFinder.java
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorFactoryFinder.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorFactoryFinder.java?rev=749727&r1=749726&r2=749727&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorFactoryFinder.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorFactoryFinder.java
Tue Mar 3 20:19:53 2009
@@ -72,7 +72,8 @@
DBLookupMediatorFactory.class,
CacheMediatorFactory.class,
CalloutMediatorFactory.class,
- EventPublisherMediatorFactory.class
+ EventPublisherMediatorFactory.class,
+ TransactionMediatorFactory.class
};
private final static MediatorFactoryFinder instance = new
MediatorFactoryFinder();
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorSerializerFinder.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorSerializerFinder.java?rev=749727&r1=749726&r2=749727&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorSerializerFinder.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorSerializerFinder.java
Tue Mar 3 20:19:53 2009
@@ -59,7 +59,8 @@
DBReportMediatorSerializer.class,
CacheMediatorSerializer.class,
CalloutMediatorSerializer.class,
- EventPublisherMediatorSerializer.class
+ EventPublisherMediatorSerializer.class,
+ TransactionMediatorSerializer.class
};
private final static MediatorSerializerFinder instance = new
MediatorSerializerFinder();
Added:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/TransactionMediatorFactory.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/TransactionMediatorFactory.java?rev=749727&view=auto
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/TransactionMediatorFactory.java
(added)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/TransactionMediatorFactory.java
Tue Mar 3 20:19:53 2009
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.synapse.config.xml;
+
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.synapse.Mediator;
+import org.apache.synapse.mediators.transaction.TransactionMediator;
+
+import javax.xml.namespace.QName;
+
+/**
+ * The Factory for create transaction mediator- InLine XML need to provide
+ * <p/>
+ * <pre>
+ * <transaction
action="new|use-existing-or-new|fault-if-no-tx|commit|rollback|suspend|resume"
/>
+ * <p/>
+ * <p/>
+ */
+public class TransactionMediatorFactory extends AbstractMediatorFactory {
+
+ private static final QName TAG_NAME
+ = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "transaction");
+
+ /**
+ * Create a Transaction mediator instance referring to the bean and
configuration given
+ * by the OMElement declaration
+ *
+ * @param elem the OMElement that specifies the Transaction mediator
configuration
+ * @return the Transaction mediator instance created
+ */
+ public Mediator createMediator(OMElement elem) {
+
+ TransactionMediator tm = new TransactionMediator();
+ OMAttribute action
+ = elem.getAttribute(new
QName(XMLConfigConstants.NULL_NAMESPACE, "action"));
+
+ if (action == null) {
+ handleException("The 'action' attribute " +
+ "is required for Transaction mediator definition");
+ } else {
+
+ // after successfully creating the mediator
+ // set its common attributes such as tracing etc
+ processAuditStatus(tm, elem);
+ tm.setAction(action.getAttributeValue());
+
+ return tm;
+ }
+
+ return null;
+ }
+
+ public QName getTagQName() {
+ return TAG_NAME;
+ }
+
+}
Added:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/TransactionMediatorSerializer.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/TransactionMediatorSerializer.java?rev=749727&view=auto
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/TransactionMediatorSerializer.java
(added)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/TransactionMediatorSerializer.java
Tue Mar 3 20:19:53 2009
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.synapse.config.xml;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.synapse.Mediator;
+import org.apache.synapse.mediators.transaction.TransactionMediator;
+
+/**
+ * Serializer for {...@link
org.apache.synapse.mediators.transaction.TransactionMediator} instances.
+ *
+ * @see org.apache.synapse.config.xml.TransactionMediatorFactory
+ */
+public class TransactionMediatorSerializer extends AbstractMediatorSerializer {
+
+ public OMElement serializeMediator(OMElement parent, Mediator m) {
+
+ if (!(m instanceof TransactionMediator)) {
+ handleException("Unsupported mediator passed in for serialization
: " + m.getType());
+ }
+
+ TransactionMediator mediator = (TransactionMediator) m;
+ OMElement transaction = fac.createOMElement("transaction", synNS);
+ transaction.addAttribute(fac.createOMAttribute("action", nullNS,
mediator.getAction()));
+
+ saveTracingState(transaction, mediator);
+
+ if (parent != null) {
+ parent.addChild(transaction);
+ }
+ return transaction;
+ }
+
+ public String getMediatorClassName() {
+ return TransactionMediator.class.getName();
+ }
+}
Added:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transaction/TransactionMediator.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transaction/TransactionMediator.java?rev=749727&view=auto
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transaction/TransactionMediator.java
(added)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transaction/TransactionMediator.java
Tue Mar 3 20:19:53 2009
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.synapse.mediators.transaction;
+
+import org.apache.axis2.AxisFault;
+import org.apache.synapse.MessageContext;
+import org.apache.synapse.SynapseException;
+import org.apache.synapse.mediators.AbstractMediator;
+
+import javax.transaction.Status;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+/**
+ * The Mediator for commit, rollback, suspend, resume jta transactions
+ */
+public class TransactionMediator extends AbstractMediator {
+
+ public static final String ACTION_COMMIT = "commit";
+ public static final String ACTION_ROLLBACK = "rollback";
+ public static final String ACTION_SUSPEND = "suspend";
+ public static final String ACTION_RESUME = "resume";
+ public static final String ACTION_NEW = "new";
+ public static final String ACTION_USE_EXISTING_OR_NEW =
"use-existing-or-new";
+ public static final String ACTION_FAULT_IF_NO_TX = "fault-if-no-tx";
+ public static final String SUSPENDED_TRANSACTION = "suspendedTransaction";
+
+ private String action = "";
+
+ public boolean mediate(MessageContext synCtx) {
+
+ TransactionManager transactionManager;
+
+ boolean traceOn = isTraceOn(synCtx);
+ boolean traceOrDebugOn = isTraceOrDebugOn(traceOn);
+
+ if (traceOrDebugOn) {
+ traceOrDebug(traceOn, "Start : Transaction mediator (" + action +
")");
+
+ if (traceOn && trace.isTraceEnabled()) {
+ trace.trace("Message : " + synCtx.getEnvelope());
+ }
+ }
+
+ transactionManager = getTransactionManager(synCtx);
+
+ if (action.equals(ACTION_COMMIT)) {
+
+ try {
+ transactionManager.commit();
+ } catch (Exception e) {
+ handleException("Unable to commit transaction", e, synCtx);
+ }
+
+ } else if (action.equals(ACTION_ROLLBACK)) {
+
+ try {
+ transactionManager.rollback();
+ } catch (Exception e) {
+ handleException("Unable to rollback transaction", e, synCtx);
+ }
+
+ } else if (action.equals(ACTION_NEW)) {
+
+ int status = Status.STATUS_UNKNOWN;
+ try {
+ status = transactionManager.getStatus();
+ } catch (Exception e) {
+ handleException("Unable to query transaction status", e,
synCtx);
+ }
+
+ if (status != Status.STATUS_NO_TRANSACTION) {
+ throw new SynapseException("Require to begin a new
transaction, " +
+ "but a tansaction already exist");
+ }
+
+ try {
+ transactionManager.begin();
+ } catch (Exception e) {
+ handleException("Unable to begin a new transaction", e,
synCtx);
+ }
+
+ } else if (action.equals(ACTION_USE_EXISTING_OR_NEW)) {
+
+ int status = Status.STATUS_UNKNOWN;
+ try {
+ status = transactionManager.getStatus();
+ } catch (Exception e) {
+ handleException("Unable to query transaction status", e,
synCtx);
+ }
+
+ try {
+ if (status == Status.STATUS_NO_TRANSACTION) {
+ transactionManager.begin();
+ }
+ } catch (Exception e) {
+ handleException("Unable to begin a new transaction", e,
synCtx);
+ }
+
+ } else if (action.equals(ACTION_FAULT_IF_NO_TX)) {
+
+ int status = Status.STATUS_UNKNOWN;
+ try {
+ status = transactionManager.getStatus();
+ } catch (Exception e) {
+ handleException("Unable to query transaction status", e,
synCtx);
+ }
+
+ if (status != Status.STATUS_ACTIVE)
+ throw new SynapseException("No active transaction. Require an
active transaction");
+
+ } else if (action.equals(ACTION_SUSPEND)) {
+
+ try {
+ Transaction tx = transactionManager.suspend();
+ synCtx.setProperty(SUSPENDED_TRANSACTION, tx);
+ } catch (Exception e) {
+ handleException("Unable to suspend transaction", e, synCtx);
+ }
+
+ } else if (action.equals(ACTION_RESUME)) {
+
+ Transaction tx = (Transaction)
synCtx.getProperty(SUSPENDED_TRANSACTION);
+ if (tx == null)
+ handleException("Couldn't find a suspended transaction to
resume", synCtx);
+ try {
+ transactionManager.resume(tx);
+ } catch (Exception e) {
+ handleException("Unable to resume transaction", e, synCtx);
+ }
+
+ } else {
+ handleException("Invalid transaction mediator action : " + action,
synCtx);
+ }
+
+ if (traceOrDebugOn) {
+ traceOrDebug(traceOn, "End : Transaction mediator");
+ }
+
+ return true;
+ }
+
+ private TransactionManager getTransactionManager(MessageContext synCtx) {
+
+ TransactionManager transactionManager = null;
+ try {
+ transactionManager =
synCtx.getConfiguration().getAxisConfiguration()
+ .getTransactionConfiguration().getTransactionManager();
+ } catch (AxisFault ex) {
+ handleException("Unable to get Transaction Manager", ex, synCtx);
+ }
+
+ if (transactionManager == null) {
+ handleException("Unable to get Transaction Manager", synCtx);
+ }
+
+ return transactionManager;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+ public String getAction() {
+ return action;
+ }
+
+}