/** * Copyright (c) 2008--2012 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package com.redhat.satellite.search.db; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.Properties; import com.redhat.satellite.search.config.Configuration; import com.redhat.satellite.search.config.ConfigException; import org.apache.commons.lang.StringUtils; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.log4j.Logger; /** * Manages DB activity - connections, running queries, etc * @version $Rev$ */ public class DatabaseManager { private SqlSessionFactory sessionFactory = null; private static boolean isOracle; private static Logger log = Logger.getLogger(DatabaseManager.class); /** * Constructor * @param config * @throws IOException */ public DatabaseManager(Configuration config) throws IOException { String configPath = config.getString("search.db_config_path", "classpath"); Reader reader = null; if (configPath.equals("classpath")) { ClassLoader cl = Thread.currentThread().getContextClassLoader(); InputStream stream = cl .getResourceAsStream("com/redhat/satellite/search/db/config.xml"); if (stream == null) { throw new IllegalArgumentException( "com/redhat/satellite/search/db/" + "config.xml resource missing"); } reader = new InputStreamReader(stream); } else { reader = new FileReader(configPath); } Properties overrides = config.getNamespaceProperties("search"); String[] options = {"db_name", "db_password", "db_user"}; for (String option : options) { overrides.setProperty(option, config.getString(option)); } isOracle = config.getString("db_backend").equals("oracle"); if (isOracle) { overrides.setProperty("db_name", "@" + overrides.getProperty("db_name")); } else { String dbHost = config.getString("db_host"); if (!StringUtils.isEmpty(dbHost)) { String connectionUrl = "//" + dbHost; String dbPort = config.getString("db_port"); if (!StringUtils.isEmpty(dbPort)) { connectionUrl += ":" + dbPort; } connectionUrl += "/" + overrides.getProperty("db_name"); if (config.getBoolean("db_ssl_enabled")) { connectionUrl += "?ssl=true"; String trustStore = config.getString("java.ssl_truststore"); if (trustStore == null || ! new File(trustStore).isFile()) { throw new ConfigException("Can not find java truststore at " + trustStore + ". Path can be changed with java.ssl_truststore option."); } System.setProperty("javax.net.ssl.trustStore", trustStore); } overrides.setProperty("db_name", connectionUrl); } } sessionFactory = new SqlSessionFactoryBuilder(). build(reader, overrides); } /** * Open a named select query * @param <T> type returned by query * @param name name of query * @return query object */ public <T> Query<T> getQuery(String name) { return new Query<T>(sessionFactory.openSession(), name); } /** * Open a named write (insert, update, delete) query * @param name of query * @return query object */ public WriteQuery getWriterQuery(String name) { return new WriteQuery(sessionFactory.openSession(), name); } public static boolean isOracle() { return isOracle; } }