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