View Javadoc

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    // Constructors
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    // Public methods
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    // Package methods
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    // Private classes
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     // Constructors
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     // Public methods
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   } // Logging manager class
165 
166 } //  Database class