1 package org.apache.ojb.otm.transaction;
2
3 /* Copyright 2003-2005 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 import org.apache.ojb.broker.PBKey;
19 import org.apache.ojb.otm.OTMConnection;
20 import org.apache.ojb.otm.core.BaseConnection;
21 import org.apache.ojb.otm.core.Transaction;
22 import org.apache.ojb.otm.core.TransactionException;
23
24 import java.util.HashMap;
25
26 /**
27 *
28 * Factory for local transactions. Each OTMConnection is associated with exactly one transaction.
29 *
30 * @author <a href="mailto:rraghuram@hotmail.com">Raghu Rajah</a>
31 *
32 */
33 public class LocalTransactionFactory implements TransactionFactory
34 {
35
36 private HashMap _transactionMap;
37
38 public LocalTransactionFactory ()
39 {
40 _transactionMap = new HashMap();
41 }
42
43 /**
44 * @see org.apache.ojb.otm.transaction.TransactionFactory#getTransactionForConnection(OTMConnection)
45 */
46 public Transaction getTransactionForConnection (OTMConnection connection)
47 {
48 if (!(connection instanceof BaseConnection))
49 {
50 StringBuffer msg = new StringBuffer();
51 msg.append("Unknown connection type: ");
52 if (connection != null)
53 msg.append(connection.getClass().getName());
54 else
55 msg.append(" null. Make sure you pass a non-null OTMConnection to this method. An OTMConnection can be acquired by calling acquireConnection (PBKey pbKey)");
56 throw new TransactionFactoryException(msg.toString());
57 }
58
59 Transaction tx = (Transaction) _transactionMap.get(connection);
60 if (tx == null)
61 {
62 tx = new Transaction();
63 _transactionMap.put(connection, tx);
64 }
65 // ensure that this connection is registered into this transaction
66 tx.registerConnection(connection);
67 return tx;
68 }
69
70
71 /**
72 * @see org.apache.ojb.otm.transaction.TransactionFactory#acquireConnection(PBKey)
73 */
74 public OTMConnection acquireConnection (PBKey pbKey)
75 {
76 OTMConnection newConnection = new LocalConnection(pbKey);
77 // Ensure the transaction is established for this connection.
78 getTransactionForConnection(newConnection);
79 return newConnection;
80 }
81
82 /**
83 *
84 * Represents a local connection. This is a private static inner class to restrict visibility
85 * to others.
86 *
87 * @author <a href="mailto:rraghuram@hotmail.com">Raghu Rajah</a>
88 *
89 */
90 private static class LocalConnection extends BaseConnection
91 {
92 public LocalConnection (PBKey pbKey)
93 {
94 super(pbKey);
95 }
96
97
98 /**
99 * @see org.apache.ojb.otm.core.BaseConnection#transactionBegin()
100 */
101 public void transactionBegin() throws TransactionException
102 {
103 getKernelBroker().beginTransaction();
104 }
105
106 /**
107 * @see org.apache.ojb.otm.core.BaseConnection#transactionPrepare()
108 */
109 public void transactionPrepare() throws TransactionException
110 {
111 // Nothing to do!
112 }
113
114 /**
115 * @see org.apache.ojb.otm.core.BaseConnection#transactionCommit()
116 */
117 public void transactionCommit() throws TransactionException
118 {
119 getKernelBroker().commitTransaction();
120 }
121
122 /**
123 * @see org.apache.ojb.otm.core.BaseConnection#transactionRollback()
124 */
125 public void transactionRollback() throws TransactionException
126 {
127 getKernelBroker().abortTransaction();
128 }
129
130 }
131 }