Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java?view=diff&rev=547856&r1=547855&r2=547856 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java Fri Jun 15 20:53:30 2007 @@ -1,391 +1,391 @@ -/* - * Copyright 2004 Clinton Begin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.ibatis.sqlmap.engine.mapping.statement; - -import com.ibatis.common.jdbc.exception.NestedSQLException; -import com.ibatis.common.io.ReaderInputStream; - -import com.ibatis.sqlmap.client.event.RowHandler; -import com.ibatis.sqlmap.client.*; -import com.ibatis.sqlmap.engine.execution.SqlExecutor; -import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap; -import com.ibatis.sqlmap.engine.mapping.result.ResultMap; -import com.ibatis.sqlmap.engine.mapping.sql.Sql; -import com.ibatis.sqlmap.engine.scope.ErrorContext; -import com.ibatis.sqlmap.engine.scope.StatementScope; -import com.ibatis.sqlmap.engine.transaction.Transaction; -import com.ibatis.sqlmap.engine.transaction.TransactionException; -import com.ibatis.sqlmap.engine.type.*; -import com.ibatis.sqlmap.engine.cache.*; -import com.ibatis.sqlmap.engine.impl.*; -import org.w3c.dom.Document; - -import javax.xml.parsers.*; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.*; -import java.io.*; - -public class MappedStatement { - private String id; - private Integer resultSetType; - private Integer fetchSize; - private ResultMap resultMap; - private ParameterMap parameterMap; - private Class parameterClass; - private Sql sql; - private int baseCacheKey; - private ExtendedSqlMapClient sqlMapClient; - private Integer timeout; - private ResultMap[] additionalResultMaps = new ResultMap[0]; - private List executeListeners = new ArrayList(); - private String resource; - - public StatementType getStatementType() { - return StatementType.UNKNOWN; - } - - public int executeUpdate(StatementScope statementScope, Transaction trans, Object parameterObject) - throws SQLException { - ErrorContext errorContext = statementScope.getErrorContext(); - errorContext.setActivity("preparing the mapped statement for execution"); - errorContext.setObjectId(this.getId()); - errorContext.setResource(this.getResource()); - - statementScope.getSession().setCommitRequired(true); - - try { - parameterObject = validateParameter(parameterObject); - - Sql sql = getSql(); - - errorContext.setMoreInfo("Check the parameter map."); - ParameterMap parameterMap = sql.getParameterMap(statementScope, parameterObject); - - errorContext.setMoreInfo("Check the result map."); - ResultMap resultMap = sql.getResultMap(statementScope, parameterObject); - - statementScope.setResultMap(resultMap); - statementScope.setParameterMap(parameterMap); - - int rows = 0; - - errorContext.setMoreInfo("Check the parameter map."); - Object[] parameters = parameterMap.getParameterObjectValues(statementScope, parameterObject); - - errorContext.setMoreInfo("Check the SQL statement."); - String sqlString = sql.getSql(statementScope, parameterObject); - - errorContext.setActivity("executing mapped statement"); - errorContext.setMoreInfo("Check the statement or the result map."); - rows = sqlExecuteUpdate(statementScope, trans.getConnection(), sqlString, parameters); - - errorContext.setMoreInfo("Check the output parameters."); - if (parameterObject != null) { - postProcessParameterObject(statementScope, parameterObject, parameters); - } - - errorContext.reset(); - sql.cleanup(statementScope); - notifyListeners(); - return rows; - } catch (SQLException e) { - errorContext.setCause(e); - throw new NestedSQLException(errorContext.toString(), e.getSQLState(), e.getErrorCode(), e); - } catch (Exception e) { - errorContext.setCause(e); - throw new NestedSQLException(errorContext.toString(), e); - } - } - - public Object executeQueryForObject(StatementScope statementScope, Transaction trans, Object parameterObject, Object resultObject) - throws SQLException { - try { - Object object = null; - - DefaultRowHandler rowHandler = new DefaultRowHandler(); - executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, resultObject, rowHandler, SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS); - List list = rowHandler.getList(); - - if (list.size() > 1) { - throw new SQLException("Error: executeQueryForObject returned too many results."); - } else if (list.size() > 0) { - object = list.get(0); - } - - return object; - } catch (TransactionException e) { - throw new NestedSQLException("Error getting Connection from Transaction. Cause: " + e, e); - } - } - - public List executeQueryForList(StatementScope statementScope, Transaction trans, Object parameterObject, int skipResults, int maxResults) - throws SQLException { - try { - DefaultRowHandler rowHandler = new DefaultRowHandler(); - executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, null, rowHandler, skipResults, maxResults); - return rowHandler.getList(); - } catch (TransactionException e) { - throw new NestedSQLException("Error getting Connection from Transaction. Cause: " + e, e); - } - } - - public void executeQueryWithRowHandler(StatementScope statementScope, Transaction trans, Object parameterObject, RowHandler rowHandler) - throws SQLException { - try { - executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, null, rowHandler, SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS); - } catch (TransactionException e) { - throw new NestedSQLException("Error getting Connection from Transaction. Cause: " + e, e); - } - } - - // - // PROTECTED METHODS - // - - protected void executeQueryWithCallback(StatementScope statementScope, Connection conn, Object parameterObject, Object resultObject, RowHandler rowHandler, int skipResults, int maxResults) - throws SQLException { - ErrorContext errorContext = statementScope.getErrorContext(); - errorContext.setActivity("preparing the mapped statement for execution"); - errorContext.setObjectId(this.getId()); - errorContext.setResource(this.getResource()); - - try { - parameterObject = validateParameter(parameterObject); - - Sql sql = getSql(); - - errorContext.setMoreInfo("Check the parameter map."); - ParameterMap parameterMap = sql.getParameterMap(statementScope, parameterObject); - - errorContext.setMoreInfo("Check the result map."); - ResultMap resultMap = sql.getResultMap(statementScope, parameterObject); - - statementScope.setResultMap(resultMap); - statementScope.setParameterMap(parameterMap); - - errorContext.setMoreInfo("Check the parameter map."); - Object[] parameters = parameterMap.getParameterObjectValues(statementScope, parameterObject); - - errorContext.setMoreInfo("Check the SQL statement."); - String sqlString = sql.getSql(statementScope, parameterObject); - - errorContext.setActivity("executing mapped statement"); - errorContext.setMoreInfo("Check the SQL statement or the result map."); - RowHandlerCallback callback = new RowHandlerCallback(resultMap, resultObject, rowHandler); - sqlExecuteQuery(statementScope, conn, sqlString, parameters, skipResults, maxResults, callback); - - errorContext.setMoreInfo("Check the output parameters."); - if (parameterObject != null) { - postProcessParameterObject(statementScope, parameterObject, parameters); - } - - errorContext.reset(); - sql.cleanup(statementScope); - notifyListeners(); - } catch (SQLException e) { - errorContext.setCause(e); - throw new NestedSQLException(errorContext.toString(), e.getSQLState(), e.getErrorCode(), e); - } catch (Exception e) { - errorContext.setCause(e); - throw new NestedSQLException(errorContext.toString(), e); - } - } - - protected void postProcessParameterObject(StatementScope statementScope, Object parameterObject, Object[] parameters) { - } - - protected int sqlExecuteUpdate(StatementScope statementScope, Connection conn, String sqlString, Object[] parameters) throws SQLException { - if (statementScope.getSession().isInBatch()) { - getSqlExecutor().addBatch(statementScope, conn, sqlString, parameters); - return 0; - } else { - return getSqlExecutor().executeUpdate(statementScope, conn, sqlString, parameters); - } - } - - protected void sqlExecuteQuery(StatementScope statementScope, Connection conn, String sqlString, Object[] parameters, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException { - getSqlExecutor().executeQuery(statementScope, conn, sqlString, parameters, skipResults, maxResults, callback); - } - - protected Object validateParameter(Object param) - throws SQLException { - Object newParam = param; - Class parameterClass = getParameterClass(); - if (newParam != null && parameterClass != null) { - if (DomTypeMarker.class.isAssignableFrom(parameterClass)) { - if (XmlTypeMarker.class.isAssignableFrom(parameterClass)) { - if (!(newParam instanceof String) - && !(newParam instanceof Document)) { - throw new SQLException("Invalid parameter object type. Expected '" + String.class.getName() + "' or '" + Document.class.getName() + "' but found '" + newParam.getClass().getName() + "'."); - } - if (!(newParam instanceof Document)) { - newParam = stringToDocument ((String)newParam); - } - } else { - if (!Document.class.isAssignableFrom(newParam.getClass())) { - throw new SQLException("Invalid parameter object type. Expected '" + Document.class.getName() + "' but found '" + newParam.getClass().getName() + "'."); - } - } - } else { - if (!parameterClass.isAssignableFrom(newParam.getClass())) { - throw new SQLException("Invalid parameter object type. Expected '" + parameterClass.getName() + "' but found '" + newParam.getClass().getName() + "'."); - } - } - } - return newParam; - } - - private Document stringToDocument (String s) { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - return documentBuilder.parse(new ReaderInputStream(new StringReader(s))); - } catch (Exception e) { - throw new RuntimeException("Error occurred. Cause: " + e, e); - } - } - - public String getId() { - return id; - } - - public Integer getResultSetType() { - return resultSetType; - } - - public void setResultSetType(Integer resultSetType) { - this.resultSetType = resultSetType; - } - - public Integer getFetchSize() { - return fetchSize; - } - - public void setFetchSize(Integer fetchSize) { - this.fetchSize = fetchSize; - } - - public void setId(String id) { - this.id = id; - } - - public Sql getSql() { - return sql; - } - - public void setSql(Sql sql) { - this.sql = sql; - } - - public ResultMap getResultMap() { - return resultMap; - } - - public void setResultMap(ResultMap resultMap) { - this.resultMap = resultMap; - } - - public ParameterMap getParameterMap() { - return parameterMap; - } - - public void setParameterMap(ParameterMap parameterMap) { - this.parameterMap = parameterMap; - } - - public Class getParameterClass() { - return parameterClass; - } - - public void setParameterClass(Class parameterClass) { - this.parameterClass = parameterClass; - } - - public String getResource() { - return resource; - } - - public void setResource(String resource) { - this.resource = resource; - } - - public CacheKey getCacheKey(StatementScope statementScope, Object parameterObject) { - Sql sql = statementScope.getSql(); - ParameterMap pmap = sql.getParameterMap(statementScope, parameterObject); - CacheKey cacheKey = pmap.getCacheKey(statementScope, parameterObject); - cacheKey.update(id); - cacheKey.update(baseCacheKey); - cacheKey.update(sql.getSql(statementScope, parameterObject)); //Fixes bug 953001 - return cacheKey; - } - - public void setBaseCacheKey(int base) { - this.baseCacheKey = base; - } - - public void addExecuteListener(ExecuteListener listener) { - executeListeners.add(listener); - } - - public void notifyListeners() { - for (int i = 0, n = executeListeners.size(); i < n; i++) { - ((ExecuteListener) executeListeners.get(i)).onExecuteStatement(this); - } - } - - public SqlExecutor getSqlExecutor() { - return sqlMapClient.getSqlExecutor(); - } - - public SqlMapClient getSqlMapClient() { - return sqlMapClient; - } - - public void setSqlMapClient(SqlMapClient sqlMapClient) { - this.sqlMapClient = (ExtendedSqlMapClient) sqlMapClient; - } - - public void initRequest(StatementScope statementScope) { - statementScope.setStatement(this); - statementScope.setParameterMap(parameterMap); - statementScope.setResultMap(resultMap); - statementScope.setSql(sql); - } - - public Integer getTimeout() { - return timeout; - } - - public void setTimeout(Integer timeout) { - this.timeout = timeout; - } - - public void addResultMap(ResultMap resultMap) { - List resultMapList = Arrays.asList(additionalResultMaps); - resultMapList = new ArrayList(resultMapList); - resultMapList.add(resultMap); - additionalResultMaps = (ResultMap[])resultMapList.toArray(new ResultMap[resultMapList.size()]); - } - - public boolean hasMultipleResultMaps() { - return additionalResultMaps.length > 0; - } - - public ResultMap[] getAdditionalResultMaps() { - return additionalResultMaps; - } -} +/* + * Copyright 2004 Clinton Begin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibatis.sqlmap.engine.mapping.statement; + +import com.ibatis.common.jdbc.exception.NestedSQLException; +import com.ibatis.common.io.ReaderInputStream; + +import com.ibatis.sqlmap.client.event.RowHandler; +import com.ibatis.sqlmap.client.*; +import com.ibatis.sqlmap.engine.execution.SqlExecutor; +import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap; +import com.ibatis.sqlmap.engine.mapping.result.ResultMap; +import com.ibatis.sqlmap.engine.mapping.sql.Sql; +import com.ibatis.sqlmap.engine.scope.ErrorContext; +import com.ibatis.sqlmap.engine.scope.StatementScope; +import com.ibatis.sqlmap.engine.transaction.Transaction; +import com.ibatis.sqlmap.engine.transaction.TransactionException; +import com.ibatis.sqlmap.engine.type.*; +import com.ibatis.sqlmap.engine.cache.*; +import com.ibatis.sqlmap.engine.impl.*; +import org.w3c.dom.Document; + +import javax.xml.parsers.*; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.*; +import java.io.*; + +public class MappedStatement { + private String id; + private Integer resultSetType; + private Integer fetchSize; + private ResultMap resultMap; + private ParameterMap parameterMap; + private Class parameterClass; + private Sql sql; + private int baseCacheKey; + private SqlMapClientImpl sqlMapClient; + private Integer timeout; + private ResultMap[] additionalResultMaps = new ResultMap[0]; + private List executeListeners = new ArrayList(); + private String resource; + + public StatementType getStatementType() { + return StatementType.UNKNOWN; + } + + public int executeUpdate(StatementScope statementScope, Transaction trans, Object parameterObject) + throws SQLException { + ErrorContext errorContext = statementScope.getErrorContext(); + errorContext.setActivity("preparing the mapped statement for execution"); + errorContext.setObjectId(this.getId()); + errorContext.setResource(this.getResource()); + + statementScope.getSession().setCommitRequired(true); + + try { + parameterObject = validateParameter(parameterObject); + + Sql sql = getSql(); + + errorContext.setMoreInfo("Check the parameter map."); + ParameterMap parameterMap = sql.getParameterMap(statementScope, parameterObject); + + errorContext.setMoreInfo("Check the result map."); + ResultMap resultMap = sql.getResultMap(statementScope, parameterObject); + + statementScope.setResultMap(resultMap); + statementScope.setParameterMap(parameterMap); + + int rows = 0; + + errorContext.setMoreInfo("Check the parameter map."); + Object[] parameters = parameterMap.getParameterObjectValues(statementScope, parameterObject); + + errorContext.setMoreInfo("Check the SQL statement."); + String sqlString = sql.getSql(statementScope, parameterObject); + + errorContext.setActivity("executing mapped statement"); + errorContext.setMoreInfo("Check the statement or the result map."); + rows = sqlExecuteUpdate(statementScope, trans.getConnection(), sqlString, parameters); + + errorContext.setMoreInfo("Check the output parameters."); + if (parameterObject != null) { + postProcessParameterObject(statementScope, parameterObject, parameters); + } + + errorContext.reset(); + sql.cleanup(statementScope); + notifyListeners(); + return rows; + } catch (SQLException e) { + errorContext.setCause(e); + throw new NestedSQLException(errorContext.toString(), e.getSQLState(), e.getErrorCode(), e); + } catch (Exception e) { + errorContext.setCause(e); + throw new NestedSQLException(errorContext.toString(), e); + } + } + + public Object executeQueryForObject(StatementScope statementScope, Transaction trans, Object parameterObject, Object resultObject) + throws SQLException { + try { + Object object = null; + + DefaultRowHandler rowHandler = new DefaultRowHandler(); + executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, resultObject, rowHandler, SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS); + List list = rowHandler.getList(); + + if (list.size() > 1) { + throw new SQLException("Error: executeQueryForObject returned too many results."); + } else if (list.size() > 0) { + object = list.get(0); + } + + return object; + } catch (TransactionException e) { + throw new NestedSQLException("Error getting Connection from Transaction. Cause: " + e, e); + } + } + + public List executeQueryForList(StatementScope statementScope, Transaction trans, Object parameterObject, int skipResults, int maxResults) + throws SQLException { + try { + DefaultRowHandler rowHandler = new DefaultRowHandler(); + executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, null, rowHandler, skipResults, maxResults); + return rowHandler.getList(); + } catch (TransactionException e) { + throw new NestedSQLException("Error getting Connection from Transaction. Cause: " + e, e); + } + } + + public void executeQueryWithRowHandler(StatementScope statementScope, Transaction trans, Object parameterObject, RowHandler rowHandler) + throws SQLException { + try { + executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, null, rowHandler, SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS); + } catch (TransactionException e) { + throw new NestedSQLException("Error getting Connection from Transaction. Cause: " + e, e); + } + } + + // + // PROTECTED METHODS + // + + protected void executeQueryWithCallback(StatementScope statementScope, Connection conn, Object parameterObject, Object resultObject, RowHandler rowHandler, int skipResults, int maxResults) + throws SQLException { + ErrorContext errorContext = statementScope.getErrorContext(); + errorContext.setActivity("preparing the mapped statement for execution"); + errorContext.setObjectId(this.getId()); + errorContext.setResource(this.getResource()); + + try { + parameterObject = validateParameter(parameterObject); + + Sql sql = getSql(); + + errorContext.setMoreInfo("Check the parameter map."); + ParameterMap parameterMap = sql.getParameterMap(statementScope, parameterObject); + + errorContext.setMoreInfo("Check the result map."); + ResultMap resultMap = sql.getResultMap(statementScope, parameterObject); + + statementScope.setResultMap(resultMap); + statementScope.setParameterMap(parameterMap); + + errorContext.setMoreInfo("Check the parameter map."); + Object[] parameters = parameterMap.getParameterObjectValues(statementScope, parameterObject); + + errorContext.setMoreInfo("Check the SQL statement."); + String sqlString = sql.getSql(statementScope, parameterObject); + + errorContext.setActivity("executing mapped statement"); + errorContext.setMoreInfo("Check the SQL statement or the result map."); + RowHandlerCallback callback = new RowHandlerCallback(resultMap, resultObject, rowHandler); + sqlExecuteQuery(statementScope, conn, sqlString, parameters, skipResults, maxResults, callback); + + errorContext.setMoreInfo("Check the output parameters."); + if (parameterObject != null) { + postProcessParameterObject(statementScope, parameterObject, parameters); + } + + errorContext.reset(); + sql.cleanup(statementScope); + notifyListeners(); + } catch (SQLException e) { + errorContext.setCause(e); + throw new NestedSQLException(errorContext.toString(), e.getSQLState(), e.getErrorCode(), e); + } catch (Exception e) { + errorContext.setCause(e); + throw new NestedSQLException(errorContext.toString(), e); + } + } + + protected void postProcessParameterObject(StatementScope statementScope, Object parameterObject, Object[] parameters) { + } + + protected int sqlExecuteUpdate(StatementScope statementScope, Connection conn, String sqlString, Object[] parameters) throws SQLException { + if (statementScope.getSession().isInBatch()) { + getSqlExecutor().addBatch(statementScope, conn, sqlString, parameters); + return 0; + } else { + return getSqlExecutor().executeUpdate(statementScope, conn, sqlString, parameters); + } + } + + protected void sqlExecuteQuery(StatementScope statementScope, Connection conn, String sqlString, Object[] parameters, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException { + getSqlExecutor().executeQuery(statementScope, conn, sqlString, parameters, skipResults, maxResults, callback); + } + + protected Object validateParameter(Object param) + throws SQLException { + Object newParam = param; + Class parameterClass = getParameterClass(); + if (newParam != null && parameterClass != null) { + if (DomTypeMarker.class.isAssignableFrom(parameterClass)) { + if (XmlTypeMarker.class.isAssignableFrom(parameterClass)) { + if (!(newParam instanceof String) + && !(newParam instanceof Document)) { + throw new SQLException("Invalid parameter object type. Expected '" + String.class.getName() + "' or '" + Document.class.getName() + "' but found '" + newParam.getClass().getName() + "'."); + } + if (!(newParam instanceof Document)) { + newParam = stringToDocument ((String)newParam); + } + } else { + if (!Document.class.isAssignableFrom(newParam.getClass())) { + throw new SQLException("Invalid parameter object type. Expected '" + Document.class.getName() + "' but found '" + newParam.getClass().getName() + "'."); + } + } + } else { + if (!parameterClass.isAssignableFrom(newParam.getClass())) { + throw new SQLException("Invalid parameter object type. Expected '" + parameterClass.getName() + "' but found '" + newParam.getClass().getName() + "'."); + } + } + } + return newParam; + } + + private Document stringToDocument (String s) { + try { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + return documentBuilder.parse(new ReaderInputStream(new StringReader(s))); + } catch (Exception e) { + throw new RuntimeException("Error occurred. Cause: " + e, e); + } + } + + public String getId() { + return id; + } + + public Integer getResultSetType() { + return resultSetType; + } + + public void setResultSetType(Integer resultSetType) { + this.resultSetType = resultSetType; + } + + public Integer getFetchSize() { + return fetchSize; + } + + public void setFetchSize(Integer fetchSize) { + this.fetchSize = fetchSize; + } + + public void setId(String id) { + this.id = id; + } + + public Sql getSql() { + return sql; + } + + public void setSql(Sql sql) { + this.sql = sql; + } + + public ResultMap getResultMap() { + return resultMap; + } + + public void setResultMap(ResultMap resultMap) { + this.resultMap = resultMap; + } + + public ParameterMap getParameterMap() { + return parameterMap; + } + + public void setParameterMap(ParameterMap parameterMap) { + this.parameterMap = parameterMap; + } + + public Class getParameterClass() { + return parameterClass; + } + + public void setParameterClass(Class parameterClass) { + this.parameterClass = parameterClass; + } + + public String getResource() { + return resource; + } + + public void setResource(String resource) { + this.resource = resource; + } + + public CacheKey getCacheKey(StatementScope statementScope, Object parameterObject) { + Sql sql = statementScope.getSql(); + ParameterMap pmap = sql.getParameterMap(statementScope, parameterObject); + CacheKey cacheKey = pmap.getCacheKey(statementScope, parameterObject); + cacheKey.update(id); + cacheKey.update(baseCacheKey); + cacheKey.update(sql.getSql(statementScope, parameterObject)); //Fixes bug 953001 + return cacheKey; + } + + public void setBaseCacheKey(int base) { + this.baseCacheKey = base; + } + + public void addExecuteListener(ExecuteListener listener) { + executeListeners.add(listener); + } + + public void notifyListeners() { + for (int i = 0, n = executeListeners.size(); i < n; i++) { + ((ExecuteListener) executeListeners.get(i)).onExecuteStatement(this); + } + } + + public SqlExecutor getSqlExecutor() { + return sqlMapClient.getSqlExecutor(); + } + + public SqlMapClient getSqlMapClient() { + return sqlMapClient; + } + + public void setSqlMapClient(SqlMapClient sqlMapClient) { + this.sqlMapClient = (SqlMapClientImpl) sqlMapClient; + } + + public void initRequest(StatementScope statementScope) { + statementScope.setStatement(this); + statementScope.setParameterMap(parameterMap); + statementScope.setResultMap(resultMap); + statementScope.setSql(sql); + } + + public Integer getTimeout() { + return timeout; + } + + public void setTimeout(Integer timeout) { + this.timeout = timeout; + } + + public void addResultMap(ResultMap resultMap) { + List resultMapList = Arrays.asList(additionalResultMaps); + resultMapList = new ArrayList(resultMapList); + resultMapList.add(resultMap); + additionalResultMaps = (ResultMap[])resultMapList.toArray(new ResultMap[resultMapList.size()]); + } + + public boolean hasMultipleResultMaps() { + return additionalResultMaps.length > 0; + } + + public ResultMap[] getAdditionalResultMaps() { + return additionalResultMaps; + } +}