
redora.db.DatabaseFactory Maven / Gradle / Ivy
/*
* Copyright 2009-2010 Nanjing RedOrange ltd (http://www.red-orange.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package redora.db;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import redora.exceptions.ConnectException;
import redora.util.ResourceFileHandler;
import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Logger;
import static java.io.File.separator;
import static java.util.logging.Level.*;
/**
* Central connection manager that connects to the database as set up in
* /etc/redora/configuration.xml. This factory primarily loads and caches the
* configuration file. Possible settings are:
*
* database.default.host = 127.0.0.1
* database.default.database = test
* database.default.user = root
* database.default.password =
* database.default.runConfig = maxPerformance
* database.default.useUnicode = true
* database.default.characterEncoding = utf8
* database.default.autoReconnect = true
* database.default.autoCommit = true
*
* @author Nanjing RedOrange (http://www.red-orange.cn)
*/
public class DatabaseFactory {
static final transient Logger l = Logger.getLogger("redora.db.Database");
final static Properties pDefault = new Properties();
static {
pDefault.setProperty("database.default.host", "127.0.0.1");
pDefault.setProperty("database.default.database", "test");
pDefault.setProperty("database.default.user", "root");
pDefault.setProperty("database.default.password", "");
pDefault.setProperty("database.default.runConfig", "maxPerformance");
pDefault.setProperty("database.default.useUnicode", "true");
pDefault.setProperty("database.default.characterEncoding", "utf8");
pDefault.setProperty("database.default.autoReconnect", "true");
pDefault.setProperty("database.default.autoCommit", "true");
}
/**
* Local Database configuration file:
* /etc/redora/configuration.properties
* ~/redora/configuration.properties
* Or uses default values
*
*/
static final String LOCAL_CONFIGURATION_FILE = separator + "etc" + separator
+ "redora" + separator + "configuration.properties";
static final Map info = new HashMap();
static Properties p = null;
static final Map connect = new HashMap();
protected static Properties info(String schema) throws ConnectException {
if (!info.containsKey(schema)) {
info.put(schema, new Properties());
String pre = "database." + schema;
for (String key : new String[]{"user", "password", "runConfig", "useUnicode", "characterEncoding", "autoReconnect"}) {
String value = getConfiguration().getProperty(pre + key);
if (StringUtils.isNotEmpty(value))
info.get(schema).put(key, value);
else
info.get(schema).put(key, getConfiguration().getProperty("database.default." + key));
}
}
return info.get(schema);
}
@NotNull
protected static String connect(@NotNull String schema) throws ConnectException {
if (!connect.containsKey(schema)) {
String host = getConfiguration().getProperty("database." + schema + ".host");
if (StringUtils.isEmpty(host))
host = getConfiguration().getProperty("database.default.host");
String db = getConfiguration().getProperty("database." + schema + ".database");
if (StringUtils.isEmpty(db))
db = getConfiguration().getProperty("database.default.database");
connect.put(schema, "jdbc:mysql://" + host + '/' + db);
}
return connect.get(schema);
}
private DatabaseFactory() { //avoid instantiation
}
/**
* Searches for requested in: database.schema.key or database.default.key.
* Because of the fallback to default, there is always a value for key. If not
* an IllegalArgumentException is thrown.
* @param schema (Mandatory)
* @param key (Mandatory)
* @return
* @throws ConnectException When there is an IOException when getting the properties file.
*/
@NotNull
public static String getDBProperty(@NotNull String schema, @NotNull String key)
throws ConnectException {
String retVal = getConfiguration().getProperty("database." + schema + '.' + key);
if (StringUtils.isEmpty(retVal))
retVal = getConfiguration().getProperty("database.default." + key);
if (retVal == null)
throw new IllegalArgumentException("The key " + key + " is not found in the properties schema or default. So, this key is invalid");
return retVal;
}
/**
* Loads and caches the configuration file.
*
* @return Connection details for DB connection \
* @throws ConnectException On IOException loading the properties file
*/
@NotNull
static Properties getConfiguration() throws ConnectException {
if (p == null) {
l.log(INFO, "Loading configuration");
p = new Properties(pDefault);
try {
File props = new File(System.getProperty("user.home") + separator + "redora"
+ separator + "configuration.properties");
if (props.exists()) {
Object[] sources = {props};
p.load(ResourceFileHandler.find(sources, null));
l.log(INFO, "Using {0}", props.getAbsolutePath());
} else {
props = new File(LOCAL_CONFIGURATION_FILE);
if (props.exists()) {
Object[] sources = {props};
p.load(ResourceFileHandler.find(sources, null));
l.log(INFO, "Using {0}", props.getAbsolutePath());
} else {
l.log(INFO, "No configuration file found, I will use the defaults.");
}
}
} catch (IOException e) {
l.log(SEVERE, "I could not load the configuration.properties for Redora", e);
throw new ConnectException("I could not load the configuration.properties for Redora", e);
}
}
return p;
}
/**
* Creates a new Statement object with active Connection.
*
* @return Active statement
* @throws ConnectException When a connection to te database appears to be impossible.
*/
@NotNull
public static Statement statement(@NotNull String schema) throws ConnectException {
Statement ret = new Statement(new Connection(schema));
try {
ret.st = ret.con.con.createStatement();
} catch (SQLException e) {
l.log(WARNING, "Cannot initialize statement", e);
throw new ConnectException("Cannot initialize statement", e);
}
return ret;
}
/**
* Quietly closes the ResultSet.
* @param rs (Optional) ResultSet that might br open
*/
public static void close(@Nullable ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
l.log(WARNING, "Failed to close result set", e);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy