View Javadoc

1   /*
2    * $Id: SpringTransactionFactory.java 19191 2010-08-25 21:05:23Z tcarlson $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.module.spring.transaction;
12  
13  import org.mule.api.MuleContext;
14  import org.mule.api.transaction.Transaction;
15  import org.mule.api.transaction.TransactionException;
16  import org.mule.api.transaction.TransactionFactory;
17  import org.mule.transaction.AbstractSingleResourceTransaction;
18  
19  import org.springframework.jdbc.datasource.ConnectionHolder;
20  import org.springframework.jms.connection.JmsResourceHolder;
21  import org.springframework.transaction.PlatformTransactionManager;
22  import org.springframework.transaction.TransactionStatus;
23  import org.springframework.transaction.support.TransactionSynchronizationManager;
24  
25  /**
26   * TODO: document this class
27   */
28  public class SpringTransactionFactory implements TransactionFactory
29  {
30  
31      private PlatformTransactionManager manager;
32  
33      public SpringTransactionFactory()
34      {
35          super();
36      }
37  
38      public Transaction beginTransaction(MuleContext muleContext) throws TransactionException
39      {
40          Transaction tx = new SpringTransaction(muleContext);
41          tx.begin();
42          return tx;
43      }
44  
45      public boolean isTransacted()
46      {
47          return true;
48      }
49  
50      /**
51       * @return Returns the manager.
52       */
53      synchronized public PlatformTransactionManager getManager()
54      {
55          return manager;
56      }
57  
58      /**
59       * @param manager The manager to set.
60       */
61      synchronized public void setManager(PlatformTransactionManager manager)
62      {
63          this.manager = manager;
64      }
65  
66      /**
67       * TODO: document this class
68       */
69      public class SpringTransaction extends AbstractSingleResourceTransaction
70      {
71          protected final TransactionStatus status;
72  
73          public SpringTransaction(MuleContext muleContext)
74          {
75              super(muleContext);
76              status = manager.getTransaction(null);
77          }
78  
79          protected void doBegin() throws TransactionException
80          {
81              // nothing to do
82          }
83  
84          protected void doCommit() throws TransactionException
85          {
86             manager.commit(status);
87          }
88  
89          protected void doRollback() throws TransactionException
90          {
91             manager.rollback(status);
92          }
93  
94          public Object getResource(Object key)
95          {
96              Object res = TransactionSynchronizationManager.getResource(key);
97              if (res != null)
98              {
99                  if (!(res instanceof ConnectionHolder))
100                 {
101                     if (res instanceof JmsResourceHolder)
102                     {
103                         return ((JmsResourceHolder)res).getConnection();
104                     }
105                 }
106                 else
107                 {
108                     return ((ConnectionHolder)res).getConnection();
109                 }
110             }
111             return res;
112         }
113 
114         public boolean hasResource(Object key)
115         {
116             return getResource(key) != null;
117         }
118 
119         public void bindResource(Object key, Object resource) throws TransactionException
120         {
121             throw new UnsupportedOperationException();
122         }
123 
124         public void setRollbackOnly()
125         {
126             super.setRollbackOnly();
127             status.setRollbackOnly();
128         }
129 
130     }
131 
132 }