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>
+ * &lt;transaction 
action="new|use-existing-or-new|fault-if-no-tx|commit|rollback|suspend|resume" 
/&gt;
+ * <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;
+    }
+
+}


Reply via email to