/* Copyright (c) 2001 - 2011 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.monitor.hib;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.io.IOUtils;
import org.geoserver.config.GeoServerDataDirectory;
import org.geoserver.monitor.MonitorConfig;
public class MonitoringDataSource extends BasicDataSource {
MonitorConfig config;
GeoServerDataDirectory dataDirectory;
public void setConfig(MonitorConfig config) {
this.config = config;
}
public void setDataDirectory(GeoServerDataDirectory dataDir) {
this.dataDirectory = dataDir;
}
@Override
public Connection getConnection() throws SQLException {
try {
if(getDriverClassName() == null) {
synchronized(this) {
if (getDriverClassName() == null) {
initializeDataSource();
}
}
}
return super.getConnection();
}
catch(Exception e) {
//LOGGER.log(Level.WARNING, "Database connection error", e);
config.setError(e);
config.setEnabled(false);
if (e instanceof SQLException) {
throw (SQLException) e;
}
throw (SQLException) new SQLException().initCause(e);
}
}
void initializeDataSource() throws Exception {
File monitoringDir = dataDirectory.findOrCreateDataDir("monitoring");
File dbprops = new File(monitoringDir, "db.properties");
if (dbprops.exists()) {
//attempt to configure
try {
configureDataSource(dbprops, monitoringDir);
}
catch(SQLException e) {
//configure failed, try db1.properties
dbprops = new File(monitoringDir, "db1.properties");
if (dbprops.exists()) {
try {
configureDataSource(dbprops, monitoringDir);
//secondary file worked, return
return;
}
catch(SQLException e1) {
//secondary file failed as well, try for third
dbprops = new File(monitoringDir, "db2.properties");
if (dbprops.exists()) {
try {
configureDataSource(dbprops, monitoringDir);
//third file worked, return
return;
}
catch(SQLException e2) {}
}
}
}
throw e;
}
}
else {
//no db.properties file, use internal default
configureDataSource(null, monitoringDir);
}
}
void configureDataSource(File dbprops, File monitoringDir) throws Exception {
Properties db = new Properties();
if (dbprops == null) {
dbprops = new File(monitoringDir, "db.properties");
//use a default, and copy the template over
InputStream in = getClass().getResourceAsStream("db.properties");
IOUtils.copy(in, new FileOutputStream(dbprops));
db.load(getClass().getResourceAsStream("db.properties"));
}
else {
FileInputStream in = new FileInputStream(dbprops);
db.load(in);
in.close();
}
//TODO: check for nulls
setDriverClassName(db.getProperty("driver"));
setUrl(getURL(db));
if (db.containsKey("username")) {
setUsername(db.getProperty("username"));
}
if (db.containsKey("password")) {
setPassword(db.getProperty("password"));
}
setDefaultAutoCommit(Boolean.valueOf(db.getProperty("defaultAutoCommit", "true")));
//TODO: make other parameters configurable
setMinIdle(1);
setMaxActive(4);
//test the connection
super.getConnection();
}
String getURL(Properties db) {
return db.getProperty("url").replace("${GEOSERVER_DATA_DIR}", dataDirectory.root().getAbsolutePath());
}
}