June 2003 SETT: Transaction Manager Java

C:\devel\mocks\src\com\ociweb\jnb\ex1\TransactionManager.java
1    package com.ociweb.jnb.ex1; 
2     
3    import java.util.Properties; 
4    import java.io.IOException; 
5    import java.sql.DriverManager; 
6    import java.sql.Connection; 
7    import java.sql.SQLException; 
8    import java.lang.reflect.Proxy; 
9    import java.lang.reflect.InvocationHandler; 
10   import java.lang.reflect.Method; 
11    
12   public class TransactionManager { 
13       private static final String PROPERTIES_NAME = "TransactionManager.properties"; 
14       private static final String DB_DRIVER; 
15       private static final String DB_URL; 
16       private static final String USERNAME; 
17       private static final String PASSWORD; 
18    
19       private Connection conn; 
20       private Connection proxy; 
21    
22       private static TransactionManager instance; 
23    
24       static { 
25           Properties props = new Properties(); 
26           try { 
27               props.load(TransactionManager.class.getResourceAsStream(PROPERTIES_NAME)); 
28           } catch (IOException e) { 
29               e.printStackTrace(); 
30           } 
31           DB_DRIVER = props.getProperty("DB_DRIVER"); 
32           DB_URL = props.getProperty("DB_URL"); 
33           USERNAME = props.getProperty("USERNAME"); 
34           PASSWORD = props.getProperty("PASSWORD"); 
35    
36           try { 
37               Class.forName(DB_DRIVER).newInstance(); 
38           } catch (InstantiationException e) { 
39               e.printStackTrace(); 
40           } catch (IllegalAccessException e) { 
41               e.printStackTrace(); 
42           } catch (ClassNotFoundException e) { 
43               e.printStackTrace(); 
44           } 
45    
46           instance = new TransactionManager(); 
47       } 
48    
49       private TransactionManager() { 
50           initialize(); 
51       } 
52    
53       private void initialize() { 
54           //Connect to database 
55           try { 
56               conn = DriverManager.getConnection(DB_URL, USERNAME, PASSWORD); 
57               conn.setAutoCommit(false); 
58               proxy = createConnectionProxy(); 
59           } catch (SQLException e) { 
60               e.printStackTrace(); 
61           } 
62       } 
63    
64       public static TransactionManager getInstance() { 
65           return instance; 
66       } 
67    
68       public void commit() throws TransactionException { 
69           try { 
70               conn.commit(); 
71           } catch (SQLException e) { 
72               throw new TransactionException(e); 
73           } 
74       } 
75    
76       public void rollback() throws TransactionException { 
77           try { 
78               conn.rollback(); 
79           } catch (SQLException e) { 
80               throw new TransactionException(e); 
81           } 
82       } 
83    
84       public Connection getConnection() { 
85           return proxy; 
86       } 
87    
88       private Connection createConnectionProxy() { 
89           return (Connection) Proxy.newProxyInstance( 
90                   getClass().getClassLoader(), new Class[]{Connection.class}, new ConnectionProxy(conn)); 
91       } 
92    
93       private static class ConnectionProxy implements InvocationHandler { 
94           private Connection delegate; 
95    
96           ConnectionProxy(Connection delegate) { 
97               this.delegate = delegate; 
98           } 
99    
100          public Object invoke(Object proxy, Method method, Object[] args) 
101                  throws Throwable { 
102              if (method.getName().equalsIgnoreCase("commit")) { 
103                  return null; 
104              } else if (method.getName().equalsIgnoreCase("rollback")) { 
105                  return null; 
106              } 
107              return method.invoke(delegate, args); 
108          } 
109      } 
110  } 
111