|
C:\devel\mocks\src\com\ociweb\jnb\ex2\TransactionManagerImpl.java
|
1 package com.ociweb.jnb.ex2;
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 final String DB_DRIVER;
14 private static final String DB_URL;
15 private static final String USERNAME;
16 private static final String PASSWORD;
17
18 private Connection conn;
19 private Connection proxy;
20
21 static {
22 Properties props = new Properties();
23 try {
24 props.load(TransactionManagerImpl.class.getResourceAsStream(PROPERTIES_NAME));
25 } catch (IOException e) {
26 e.printStackTrace();
27 }
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 }
33
34 public TransactionManagerImpl(ConnectionFactory connectionFactory) {
35 initialize(connectionFactory);
36 }
37
38 private void initialize(ConnectionFactory connectionFactory) {
39 //Connect to database
40 try {
41 conn = connectionFactory.createConnection(DB_DRIVER, DB_URL, USERNAME, PASSWORD);
42 conn.setAutoCommit(false);
43 proxy = createConnectionProxy();
44 } catch (SQLException e) {
45 e.printStackTrace();
46 }
47 }
48
49 public void commit() throws TransactionException {
50 try {
51 conn.commit();
52 } catch (SQLException e) {
53 throw new TransactionException(e);
54 }
55 }
56
57 public void rollback() throws TransactionException {
58 try {
59 conn.rollback();
60 } catch (SQLException e) {
61 throw new TransactionException(e);
62 }
63 }
64
65 public Connection getConnection() {
66 return proxy;
67 }
68
69 private Connection createConnectionProxy() {
70 return (Connection) Proxy.newProxyInstance(
71 getClass().getClassLoader(), new Class[]{Connection.class}, new ConnectionProxy(conn));
72 }
73
74 private static class ConnectionProxy implements InvocationHandler {
75 private Connection delegate;
76
77 ConnectionProxy(Connection delegate) {
78 this.delegate = delegate;
79 }
80
81 public Object invoke(Object proxy, Method method, Object[] args)
82 throws Throwable {
83 if (method.getName().equalsIgnoreCase("commit")) {
84 return null;
85 } else if (method.getName().equalsIgnoreCase("rollback")) {
86 return null;
87 }
88 return method.invoke(delegate, args);
89 }
90 }
91 }
92