ingo@1127: /*
ingo@1127: * Copyright (c) 2010 by Intevation GmbH
ingo@1127: *
ingo@1127: * This program is free software under the LGPL (>=v2.1)
ingo@1127: * Read the file LGPL.txt coming with the software for details
ingo@1127: * or visit http://www.gnu.org/licenses/ if it does not exist.
ingo@1127: */
ingo@1127:
tim@132: package de.intevation.gnv.geobackend.base.query;
tim@132:
sascha@886: import de.intevation.gnv.geobackend.base.Result;
sascha@886:
sascha@886: import de.intevation.gnv.geobackend.base.connectionpool.ConnectionPool;
sascha@886: import de.intevation.gnv.geobackend.base.connectionpool.ConnectionPoolFactory;
sascha@886:
sascha@886: import de.intevation.gnv.geobackend.base.connectionpool.exception.ConnectionException;
sascha@886:
sascha@886: import de.intevation.gnv.geobackend.base.query.container.QueryContainerFactory;
sascha@886:
sascha@886: import de.intevation.gnv.geobackend.base.query.container.exception.QueryContainerException;
sascha@886:
sascha@886: import de.intevation.gnv.geobackend.base.query.exception.QueryException;
sascha@886:
ingo@1123: import de.intevation.gnv.geobackend.sde.datasources.Uncacheable;
ingo@1123:
tim@132: import java.sql.Connection;
tim@132: import java.sql.ResultSet;
tim@132: import java.sql.SQLException;
tim@132: import java.sql.Statement;
sascha@886:
tim@132: import java.util.Collection;
ingo@1120: import java.util.Date;
tim@132:
tim@132: import org.apache.log4j.Logger;
tim@132:
tim@132: /**
tim@132: * This is an Standard Implementation of the Interface QueryExecutor.
tim@132: * It fetchs the Query from the Querycontainer an put the Filtervalues into the Query.
sascha@887: * @author Tim Englich
tim@132: *
tim@132: */
tim@132: public class DefaultQueryExceutor extends QueryExecutorBase{
sascha@885:
sascha@885:
tim@132: /**
tim@132: * the logger, used to log exceptions and additonaly information
tim@132: */
tim@132: private static Logger log = Logger.getLogger(DefaultQueryExceutor.class);
sascha@885:
tim@132: /**
tim@132: * The ConnectionID identifing the Connection to use executing the Query.
tim@132: */
tim@132: private String connectionID = "N/N";
sascha@885:
tim@132: /**
tim@132: * Constructor
tim@132: */
tim@132: public DefaultQueryExceutor() {
tim@132: super();
tim@132: }
tim@132:
tim@132: /**
tim@132: * @see de.intevation.gnv.geobackend.base.query.QueryExecutor#executeQuery(java.lang.String, java.lang.String[])
tim@132: */
tim@132: public Collection executeQuery(String queryID, String[] filter) throws QueryException {
tim@132: Collection returnValue = null;
tim@132: try {
tim@132: String queryString = QueryContainerFactory.getInstance().getQueryContainer().getQuery(queryID);
tim@132: if (queryString != null){
tim@132: if (filter != null && filter.length > 0){
tim@132: //Insert the Filtervalues into the QueryString
tim@132: queryString = super.setFilterValues(queryString, filter);
tim@132: }
sascha@885:
sascha@541: if (log.isDebugEnabled()) {
sascha@541: log.debug("############ QUERY ##################");
sascha@541: log.debug(queryString);
sascha@541: log.debug("#######################################");
sascha@541: }
sascha@541:
sascha@541: returnValue = cachedResults(queryString);
sascha@541:
sascha@541: if (returnValue != null) {
sascha@541: return returnValue;
sascha@541: }
sascha@541:
ingo@1123: boolean cacheable = true;
ingo@1123: Connection connection = null;
tim@132: ConnectionPool connectionPool = ConnectionPoolFactory.getInstance().getConnectionPool();
tim@132: try {
tim@132: // Submit the Query
tim@132: connection = connectionPool.getConnection(this.connectionID);
tim@132: if (connection != null){
tim@132: Statement stmt = connection.createStatement();
ingo@1120: Date start = new Date();
tim@132: ResultSet rs = stmt.executeQuery(queryString);
ingo@1120: Date end = new Date();
ingo@1120: log.info("-> Database query took " +
ingo@1120: (end.getTime() - start.getTime()) + " ms.");
ingo@1123:
sascha@1128: cacheable = !(rs instanceof Uncacheable);
ingo@1123:
tim@132: returnValue = super.createResultCollection(rs);
tim@132: }else{
tim@132: log.error("Could not establish Databaseconnection.");
tim@132: throw new QueryException("Could not establish Databaseconnection.");
tim@132: }
sascha@541:
ingo@1123: if (cacheable) {
ingo@1123: log.debug("Elements are cacheable.");
ingo@1123: cacheResults(queryString, returnValue);
ingo@1123: }
ingo@1123: else {
ingo@1123: log.debug("Elements are NOT cacheable.");
ingo@1123: }
sascha@885:
tim@132: } catch (ConnectionException e) {
tim@132: log.error(e,e);
tim@132: throw new QueryException("Could not establish Databaseconnection.",e);
tim@132: } catch (SQLException e) {
tim@132: log.error(e,e);
tim@132: throw new QueryException(e);
tim@132: }finally{
tim@132: if (connection != null){
tim@132: try {
tim@132: connectionPool.closeConnection(connection);
tim@132: } catch (ConnectionException e) {
tim@132: log.error("Connection could not be returned to ConnectionPool.");
tim@132: log.error(e,e);
tim@132: }
tim@132: }
tim@132: }
tim@132: }else{
tim@132: log.error("No QueryString defined for "+queryID);
tim@132: throw new QueryException("Cannot get the Querystring");
tim@132: }
sascha@885:
tim@132: } catch (QueryContainerException e) {
tim@132: log.error(e,e);
tim@132: throw new QueryException("Cannot get the Querystring",e);
tim@132: }
sascha@541:
tim@132: return returnValue;
tim@132: }
tim@132: }