View Javadoc

1   /*
2    * $Id: SpringTransactionFactory.java 10789 2008-02-12 20:04:43Z dfeist $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.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();
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()
74          {
75              status = manager.getTransaction(null);
76          }
77  
78          protected void doBegin() throws TransactionException
79          {
80              // nothing to do
81          }
82  
83          protected void doCommit() throws TransactionException
84          {
85             manager.commit(status);
86          }
87  
88          protected void doRollback() throws TransactionException
89          {
90             manager.rollback(status);
91          }
92  
93          public Object getResource(Object key)
94          {
95              Object res = TransactionSynchronizationManager.getResource(key);
96              if (res != null)
97              {
98                  if (!(res instanceof ConnectionHolder))
99                  {
100                     if (res instanceof JmsResourceHolder)
101                     {
102                         return ((JmsResourceHolder)res).getConnection();
103                     }
104                 }
105                 else
106                 {
107                     return ((ConnectionHolder)res).getConnection();
108                 }
109             }
110             return res;
111         }
112 
113         public boolean hasResource(Object key)
114         {
115             return getResource(key) != null;
116         }
117 
118         public void bindResource(Object key, Object resource) throws TransactionException
119         {
120             throw new UnsupportedOperationException();
121         }
122 
123         public void setRollbackOnly()
124         {
125             super.setRollbackOnly();
126             status.setRollbackOnly();
127         }
128 
129     }
130 
131 }