sascha@305: package de.intevation.artifactdatabase.db;
sascha@305: 
sascha@305: import java.util.Properties;
sascha@305: 
sascha@305: import java.io.IOException;
sascha@305: import java.io.InputStream;
sascha@305: 
sascha@305: import org.apache.log4j.Logger;
sascha@305: 
sascha@305: public class SQL {
sascha@305: 
sascha@305:     private static Logger logger = Logger.getLogger(SQL.class);
sascha@305: 
sascha@305:     protected Properties statements;
sascha@305: 
sascha@305:     public SQL() {
sascha@305:     }
sascha@305: 
sascha@305:     public SQL(String driver) {
sascha@305:         this(SQL.class, driver);
sascha@305:     }
sascha@305: 
sascha@305:     public SQL(Class clazz, String driver) {
sascha@305:         this(clazz, "/sql", driver);
sascha@305:     }
sascha@305: 
sascha@305:     public SQL(Class clazz, String resourcePath, String driver) {
sascha@307:         statements = loadStatements(clazz, resourcePath, driver);
sascha@305:     }
sascha@305: 
sascha@305:     public static final String driverToProperties(String driver) {
sascha@305:         return driver.replace('.', '-').toLowerCase() + ".properties";
sascha@305:     }
sascha@305: 
sascha@305:     /**
sascha@305:      * Returns key/value pairs of SQL statements for the used database
sascha@305:      * backend.
sascha@305:      * The concrete set of SQL statements is determined by the
sascha@305:      * used JDBC database driver which is configured in conf.xml.
sascha@305:      * The class name of the driver is transformed by replacing
sascha@305:      * all '.' with '_' and lower case the resulting string.
sascha@305:      * The transformed string is used to load a properties file
sascha@305:      * in '/sql/' which should contain the statements.
sascha@305:      * Example:<br>
sascha@305:      * <code>org.postgresql.Driver</code> results in loading of
sascha@305:      * <code>/sql/org-postgresql-driver.properties</code>.
sascha@305:      * @return The key/value pairs of SQL statements.
sascha@305:      */
sascha@305:     protected Properties loadStatements(
sascha@305:         Class  clazz,
sascha@305:         String resourcePath,
sascha@305:         String driver
sascha@305:     ) { 
sascha@307:         logger.debug("loadStatements");
sascha@307: 
sascha@305:         Properties properties = new Properties();
sascha@305: 
sascha@305:         String resDriver = driverToProperties(driver);
sascha@305: 
sascha@305:         InputStream in = null;
sascha@305:         try {
sascha@305:             String res = resourcePath + "/" + resDriver;
sascha@305: 
sascha@305:             in = clazz.getResourceAsStream(res);
sascha@305: 
sascha@305:             if (in == null) {
sascha@305:                 logger.warn("No SQL file for driver '" + driver + "' found.");
sascha@305:                 resDriver = driverToProperties(DBConnection.DEFAULT_DRIVER);
sascha@305:                 res = resourcePath + "/" + resDriver;
sascha@305: 
sascha@305:                 in = clazz.getResourceAsStream(res);
sascha@305:                 if (in == null) {
sascha@305:                     logger.error("No SQL file for driver '" +
sascha@305:                         DBConnection.DEFAULT_DRIVER + "' found.");
sascha@305:                 }
sascha@305:             }
sascha@307:             else {
sascha@307:                 if (logger.isDebugEnabled()) {
sascha@307:                     logger.debug("found resource: " + res);
sascha@307:                 }
sascha@307:             }
sascha@305: 
sascha@305:             if (in != null) {
sascha@305:                 properties.load(in);
sascha@305:             }
sascha@305:         }
sascha@305:         catch (IOException ioe) {
sascha@305:             logger.error(ioe);
sascha@305:         }
sascha@305: 
sascha@305:         return properties;
sascha@305:     }
sascha@305: 
sascha@305:     public String get(String key) {
sascha@307:         boolean debug = logger.isDebugEnabled();
sascha@307:         if (debug) {
sascha@307:             logger.debug("looking for SQL " + key);
sascha@307:             logger.debug("statements != null: " + (statements != null));
sascha@307:         }
sascha@307: 
sascha@307:         String sql = statements.getProperty(key);
sascha@307: 
sascha@307:         if (sql == null) {
sascha@307:             logger.error("cannot find SQL for key '" + key + "'");
sascha@307:         }
sascha@307: 
sascha@307:         if (debug) {
sascha@307:             logger.debug("-> '" + sql + "'"); 
sascha@307:         }
sascha@307: 
sascha@307:         return sql;
sascha@305:     }
sascha@305: }
sascha@305: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :