001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.monitoring.jdbc;
019    
020    
021    import org.apache.commons.monitoring.Role;
022    import org.apache.commons.monitoring.counters.Counter;
023    import org.apache.commons.monitoring.repositories.Repository;
024    
025    import javax.sql.DataSource;
026    import java.io.PrintWriter;
027    import java.sql.Connection;
028    import java.sql.SQLException;
029    import java.sql.SQLFeatureNotSupportedException;
030    import java.util.logging.Logger;
031    
032    
033    /**
034     * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
035     */
036    public class MonitoredDataSource implements DataSource {
037        /**
038         * delegate DataSource
039         */
040        private DataSource dataSource;
041    
042        /**
043         * dataSource name
044         */
045        private String dataSourceName = DataSource.class.getName();
046        private Counter counter;
047    
048        /**
049         * Constructor
050         *
051         * @param dataSource the datasource to counter
052         */
053        public MonitoredDataSource(final DataSource dataSource) {
054            this.dataSource = dataSource;
055            this.counter = Repository.INSTANCE.getCounter(new Counter.Key(Role.JDBC, dataSourceName));
056        }
057    
058        public MonitoredDataSource() {
059            super();
060        }
061    
062        public void setDataSource(final DataSource dataSource) {
063            this.dataSource = dataSource;
064        }
065    
066        /**
067         * @param dataSourceName the dataSourceName to set
068         */
069        public void setDataSourceName(final String dataSourceName) {
070            this.dataSourceName = dataSourceName;
071        }
072    
073        /**
074         * @param counter the counter to set
075         */
076        public void setCounter(final Counter counter) {
077            this.counter = counter;
078        }
079    
080        protected Connection monitor(final Connection connection) {
081            return MonitoredConnection.monitor(connection, counter);
082        }
083    
084        /**
085         * @return the dataSource
086         */
087        protected DataSource getDataSource() {
088            return dataSource;
089        }
090    
091        /**
092         * {@inheritDoc}
093         *
094         * @see javax.sql.DataSource#getConnection()
095         */
096        public Connection getConnection()
097            throws SQLException {
098            return monitor(getDataSource().getConnection());
099        }
100    
101        /**
102         * {@inheritDoc}
103         *
104         * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String)
105         */
106        public Connection getConnection(String username, String password)
107            throws SQLException {
108            return monitor(getDataSource().getConnection(username, password));
109        }
110    
111        public int getLoginTimeout()
112            throws SQLException {
113            return getDataSource().getLoginTimeout();
114        }
115    
116        public PrintWriter getLogWriter()
117            throws SQLException {
118            return getDataSource().getLogWriter();
119        }
120    
121        public void setLoginTimeout(int seconds)
122            throws SQLException {
123            getDataSource().setLoginTimeout(seconds);
124        }
125    
126        public void setLogWriter(PrintWriter out)
127            throws SQLException {
128            getDataSource().setLogWriter(out);
129        }
130    
131        // --- jdbc4 ----
132    
133        public boolean isWrapperFor(Class<?> iface)
134            throws SQLException {
135            return getDataSource().isWrapperFor(iface);
136        }
137    
138        public <T> T unwrap(Class<T> iface)
139            throws SQLException {
140            return getDataSource().unwrap(iface);
141        }
142    
143        public Logger getParentLogger()
144            throws SQLFeatureNotSupportedException {
145            return Logger.getLogger("commons-monitoring.datasource");
146        }
147    }