view artifact-database/src/main/java/de/intevation/artifactdatabase/db/SQL.java @ 359:f93edbfcf2bc

Improved the Settings and Section interfaces and added default implementations for both. artifacts/trunk@3416 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 14 Dec 2011 12:20:06 +0000
parents d96bcb40dbf9
children c40729bfe06d
line wrap: on
line source
package de.intevation.artifactdatabase.db;

import java.util.Properties;

import java.io.IOException;
import java.io.InputStream;

import org.apache.log4j.Logger;

public class SQL {

    private static Logger logger = Logger.getLogger(SQL.class);

    protected Properties statements;

    public SQL() {
    }

    public SQL(String driver) {
        this(SQL.class, driver);
    }

    public SQL(Class clazz, String driver) {
        this(clazz, "/sql", driver);
    }

    public SQL(Class clazz, String resourcePath, String driver) {
        statements = loadStatements(clazz, resourcePath, driver);
    }

    public static final String driverToProperties(String driver) {
        return driver.replace('.', '-').toLowerCase() + ".properties";
    }

    /**
     * Returns key/value pairs of SQL statements for the used database
     * backend.
     * The concrete set of SQL statements is determined by the
     * used JDBC database driver which is configured in conf.xml.
     * The class name of the driver is transformed by replacing
     * all '.' with '_' and lower case the resulting string.
     * The transformed string is used to load a properties file
     * in '/sql/' which should contain the statements.
     * Example:<br>
     * <code>org.postgresql.Driver</code> results in loading of
     * <code>/sql/org-postgresql-driver.properties</code>.
     * @return The key/value pairs of SQL statements.
     */
    protected Properties loadStatements(
        Class  clazz,
        String resourcePath,
        String driver
    ) { 
        logger.debug("loadStatements");

        Properties properties = new Properties();

        String resDriver = driverToProperties(driver);

        InputStream in = null;
        try {
            String res = resourcePath + "/" + resDriver;

            in = clazz.getResourceAsStream(res);

            if (in == null) {
                logger.warn("No SQL file for driver '" + driver + "' found.");
                resDriver = driverToProperties(DBConnection.DEFAULT_DRIVER);
                res = resourcePath + "/" + resDriver;

                in = clazz.getResourceAsStream(res);
                if (in == null) {
                    logger.error("No SQL file for driver '" +
                        DBConnection.DEFAULT_DRIVER + "' found.");
                }
            }
            else {
                if (logger.isDebugEnabled()) {
                    logger.debug("found resource: " + res);
                }
            }

            if (in != null) {
                properties.load(in);
            }
        }
        catch (IOException ioe) {
            logger.error(ioe);
        }

        return properties;
    }

    public String get(String key) {
        boolean debug = logger.isDebugEnabled();
        if (debug) {
            logger.debug("looking for SQL " + key);
            logger.debug("statements != null: " + (statements != null));
        }

        String sql = statements.getProperty(key);

        if (sql == null) {
            logger.error("cannot find SQL for key '" + key + "'");
        }

        if (debug) {
            logger.debug("-> '" + sql + "'"); 
        }

        return sql;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org