1 package pl.aislib.fm;
2
3 import java.sql.Connection;
4 import java.sql.SQLException;
5
6 import org.apache.commons.logging.Log;
7 import org.apache.commons.logging.LogFactory;
8
9 import pl.aislib.fm.jdbc.Manager;
10
11 /***
12 * Core implementation of database object.
13 *
14 * @author <a href="mailto:pikus@ais.pl">Tomasz Pik</a>, AIS.PL
15 * @version $Revision: 1.4 $
16 * @since AISLIB 0.1
17 */
18 public class Database {
19
20 /***
21 * Logging object.
22 */
23 protected Log log;
24
25 /***
26 * <code>Manager</code> implementation object.
27 */
28 protected Manager manager;
29
30
31
32
33 /***
34 * @param _manager <code>Manager</code> implementation object.
35 */
36 public Database(Manager _manager) {
37 log = LogFactory.getLog("pl.aislib.fm.database");
38 manager = new LoggedManager(_manager, log);
39 }
40
41
42
43
44 /***
45 * Gets wrapped <code>Manager</code> instance used to operate with database connections.
46 *
47 * @return manager used by the database.
48 */
49 public Manager getManager() {
50 return manager;
51 }
52
53 /***
54 * Gets {@link Connection} from {@link Manager#getConnection()}.
55 *
56 * @return Connection from {@link Manager#getConnection()}.
57 * @throws SQLException throws by called method.
58 */
59 public Connection getConnection() throws SQLException {
60 return manager.getConnection();
61 }
62
63 /***
64 * Passes {@link Connection} to {@link Manager#releaseConnection(Connection)}.
65 *
66 * @param con which should be passed to {@link Manager#getConnection()}.
67 * @throws SQLException thrown by called method.
68 */
69 public void releaseConnection(Connection con) throws SQLException {
70 manager.releaseConnection(con);
71 }
72
73
74
75
76 /***
77 * @param _log logging object.
78 */
79 void setLog(Log _log) {
80 log = _log;
81 ((LoggedManager) manager).setLog(_log);
82 }
83
84
85
86
87 /***
88 * Wrapper of manager logging information about connections.
89 *
90 * @author <a href="mailto:pikus@ais.pl">Tomasz Pik</a>, AIS.PL
91 */
92 private class LoggedManager extends Manager {
93
94 /***
95 * Manager to trace.
96 */
97 private Manager manager;
98
99 /***
100 * Logging object.
101 */
102 private Log log;
103
104 /***
105 * Number of current connections.
106 */
107 private int counter;
108
109
110
111
112 /***
113 * @param _manager manager to trace.
114 * @param _log logging object.
115 */
116 public LoggedManager(Manager _manager, Log _log) {
117 manager = _manager;
118 log = _log;
119 counter = 0;
120 }
121
122
123
124
125 /***
126 * @param _log logging object.
127 */
128 public void setLog(Log _log) {
129 log = _log;
130 }
131
132 /***
133 * @see pl.aislib.fm.jdbc.Manager#getConnection()
134 */
135 public Connection getConnection() throws SQLException {
136 counter++;
137 if (log.isTraceEnabled()) {
138 log.trace("getting connection " + counter);
139 }
140 try {
141 return manager.getConnection();
142 } catch (SQLException sqle) {
143 log.fatal("getting connection", sqle);
144 throw sqle;
145 }
146 }
147
148 /***
149 * @see pl.aislib.fm.jdbc.Manager#releaseConnection(java.sql.Connection)
150 */
151 public void releaseConnection(Connection con) throws SQLException {
152 if (log.isTraceEnabled()) {
153 log.trace("release connection " + counter);
154 }
155 counter--;
156 try {
157 manager.releaseConnection(con);
158 } catch (SQLException sqle) {
159 log.fatal("release connection", sqle);
160 throw sqle;
161 }
162 }
163
164 }
165
166 }