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: ingo@1123: cacheable = rs instanceof Uncacheable ? false : true; 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: }