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