Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java?view=diff&rev=512614&r1=512613&r2=512614 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java Tue Feb 27 21:58:25 2007 @@ -1,36 +1,13 @@ package com.ibatis.sqlmap.engine.builder.xml; -import com.ibatis.common.beans.Probe; -import com.ibatis.common.beans.ProbeFactory; -import com.ibatis.common.resources.Resources; import com.ibatis.common.xml.NodeletUtils; -import com.ibatis.sqlmap.client.SqlMapException; -import com.ibatis.sqlmap.engine.cache.CacheModel; -import com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap; -import com.ibatis.sqlmap.engine.mapping.parameter.InlineParameterMapParser; -import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap; -import com.ibatis.sqlmap.engine.mapping.result.AutoResultMap; -import com.ibatis.sqlmap.engine.mapping.result.BasicResultMap; -import com.ibatis.sqlmap.engine.mapping.sql.Sql; -import com.ibatis.sqlmap.engine.mapping.sql.SqlText; -import com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql; -import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.*; -import com.ibatis.sqlmap.engine.mapping.sql.simple.SimpleDynamicSql; -import com.ibatis.sqlmap.engine.mapping.sql.stat.StaticSql; import com.ibatis.sqlmap.engine.mapping.statement.*; -import org.w3c.dom.CharacterData; import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import java.sql.ResultSet; -import java.util.*; +import java.util.Properties; public class SqlStatementParser { - private static final Probe PROBE = ProbeFactory.getProbe(); - - private static final InlineParameterMapParser PARAM_PARSER = new InlineParameterMapParser(); - private ParserState state; public SqlStatementParser(ParserState state) { @@ -38,16 +15,10 @@ } public MappedStatement parseGeneralStatement(Node node, GeneralStatement statement) { - state.errorContext.setActivity("parsing a mapped statement"); // get attributes Properties attributes = NodeletUtils.parseAttributes(node, state.globalProps); String id = attributes.getProperty("id"); - - if (state.useStatementNamespaces) { - id = state.applyNamespace(id); - } - String parameterMapName = state.applyNamespace(attributes.getProperty("parameterMap")); String parameterClassName = attributes.getProperty("parameterClass"); String resultMapName = attributes.getProperty("resultMap"); @@ -59,388 +30,7 @@ String allowRemapping = attributes.getProperty("remapResults"); String timeout = attributes.getProperty("timeout"); - String[] additionalResultMapNames; - - state.errorContext.setObjectId(id + " statement"); - - - // get parameter and result maps - - state.errorContext.setMoreInfo("Check the result map name."); - //BasicResultMap resultMap = null; - if (resultMapName != null) { - additionalResultMapNames = getAllButFirstToken(resultMapName); - resultMapName = getFirstToken (resultMapName); - statement.setResultMap((BasicResultMap) state.client.getDelegate().getResultMap(state.applyNamespace(resultMapName))); - for (int i=0; i < additionalResultMapNames.length; i++) { - statement.addResultMap((BasicResultMap) state.client.getDelegate().getResultMap(state.applyNamespace(additionalResultMapNames[i]))); - } - } - - state.errorContext.setMoreInfo("Check the parameter map name."); - - if (parameterMapName != null) { - statement.setParameterMap((BasicParameterMap) state.client.getDelegate().getParameterMap(parameterMapName)); - } - - statement.setId(id); - statement.setResource(state.errorContext.getResource()); - - if (resultSetType != null) { - if ("FORWARD_ONLY".equals(resultSetType)) { - statement.setResultSetType(new Integer(ResultSet.TYPE_FORWARD_ONLY)); - } else if ("SCROLL_INSENSITIVE".equals(resultSetType)) { - statement.setResultSetType(new Integer(ResultSet.TYPE_SCROLL_INSENSITIVE)); - } else if ("SCROLL_SENSITIVE".equals(resultSetType)) { - statement.setResultSetType(new Integer(ResultSet.TYPE_SCROLL_SENSITIVE)); - } - } - - if (fetchSize != null) { - statement.setFetchSize(new Integer(fetchSize)); - } - - // set parameter class either from attribute or from map (make sure to match) - ParameterMap parameterMap = statement.getParameterMap(); - if (parameterMap == null) { - try { - if (parameterClassName != null) { - state.errorContext.setMoreInfo("Check the parameter class."); - parameterClassName = state.typeHandlerFactory.resolveAlias(parameterClassName); - Class parameterClass = Resources.classForName(parameterClassName); - statement.setParameterClass(parameterClass); - } - } catch (ClassNotFoundException e) { - throw new SqlMapException("Error. Could not set parameter class. Cause: " + e, e); - } - } else { - statement.setParameterClass(parameterMap.getParameterClass()); - } - - // process SQL statement, including inline parameter maps - state.errorContext.setMoreInfo("Check the SQL statement."); - processSqlStatement(node, statement); - - // set up either null result map or automatic result mapping - BasicResultMap resultMap = (BasicResultMap)statement.getResultMap(); - if (resultMap == null && resultClassName == null) { - statement.setResultMap(null); - } else if (resultMap == null) { - String firstResultClass = getFirstToken(resultClassName); - resultMap = buildAutoResultMap(allowRemapping, statement, firstResultClass, xmlResultName); - statement.setResultMap(resultMap); - String[] additionalResultClasses = getAllButFirstToken(resultClassName); - for (int i=0; i<additionalResultClasses.length; i++) { - statement.addResultMap(buildAutoResultMap(allowRemapping, statement, additionalResultClasses[i],xmlResultName)); - } - - } - - statement.setTimeout(state.defaultStatementTimeout); - if (timeout != null) { - try { - statement.setTimeout(Integer.valueOf(timeout)); - } catch (NumberFormatException e) { - throw new SqlMapException("Specified timeout value for statement " - + statement.getId() + " is not a valid integer"); - } - } - - state.errorContext.setMoreInfo(null); - state.errorContext.setObjectId(null); - - statement.setSqlMapClient(state.client); - if (cacheModelName != null && cacheModelName.length() > 0 && state.client.getDelegate().isCacheModelsEnabled()) { - CacheModel cacheModel = state.client.getDelegate().getCacheModel(cacheModelName); - return new CachingStatement(statement, cacheModel); - } else { - return statement; - } - - } - - private BasicResultMap buildAutoResultMap(String allowRemapping, GeneralStatement statement, String firstResultClass, String xmlResultName) { - BasicResultMap resultMap; - resultMap = new AutoResultMap(state.client.getDelegate(), "true".equals(allowRemapping)); - resultMap.setId(statement.getId() + "-AutoResultMap"); - resultMap.setResultClass(resolveClass(firstResultClass)); - resultMap.setXmlName(xmlResultName); - resultMap.setResource(statement.getResource()); - return resultMap; - } - - private Class resolveClass(String resultClassName) { - try { - if (resultClassName != null) { - state.errorContext.setMoreInfo("Check the result class."); - return Resources.classForName(state.typeHandlerFactory.resolveAlias(resultClassName)); - } else { - return null; - } - } catch (ClassNotFoundException e) { - throw new SqlMapException("Error. Could not set result class. Cause: " + e, e); - } - } - - private String getFirstToken (String s) { - return new StringTokenizer(s, ", ", false).nextToken(); - } - - private String[] getAllButFirstToken (String s) { - List strings = new ArrayList(); - StringTokenizer parser = new StringTokenizer(s, ", ", false); - parser.nextToken(); - while (parser.hasMoreTokens()) { - strings.add(parser.nextToken()); - } - return (String[]) strings.toArray(new String[strings.size()]); - } - - private void processSqlStatement(Node n, GeneralStatement statement) { - state.errorContext.setActivity("processing an SQL statement"); - - boolean isDynamic = false; - DynamicSql dynamic = new DynamicSql(state.client.getDelegate()); - StringBuffer sqlBuffer = new StringBuffer(); - - isDynamic = parseDynamicTags(n, dynamic, sqlBuffer, isDynamic, false); - if (statement instanceof InsertStatement) { - InsertStatement insertStatement = ((InsertStatement) statement); - SelectKeyStatement selectKeyStatement = findAndParseSelectKeyStatement(n, statement); - insertStatement.setSelectKeyStatement(selectKeyStatement); - } - - String sqlStatement = sqlBuffer.toString(); - if (isDynamic) { - statement.setSql(dynamic); - } else { - applyInlineParameterMap(statement, sqlStatement); - } - - } - - private boolean parseDynamicTags(Node node, DynamicParent dynamic, StringBuffer sqlBuffer, boolean isDynamic, boolean postParseRequired) { - state.errorContext.setActivity("parsing dynamic SQL tags"); - - NodeList children = node.getChildNodes(); - for (int i = 0; i < children.getLength(); i++) { - Node child = children.item(i); - String nodeName = child.getNodeName(); - if (child.getNodeType() == Node.CDATA_SECTION_NODE - || child.getNodeType() == Node.TEXT_NODE) { - - String data = ((CharacterData) child).getData(); - data = NodeletUtils.parsePropertyTokens(data, state.globalProps); - - SqlText sqlText; - - if (postParseRequired) { - sqlText = new SqlText(); - sqlText.setPostParseRequired(postParseRequired); - sqlText.setText(data); - } else { - sqlText = PARAM_PARSER.parseInlineParameterMap(state.client.getDelegate().getTypeHandlerFactory(), data, null); - sqlText.setPostParseRequired(postParseRequired); - } - - dynamic.addChild(sqlText); - - sqlBuffer.append(data); - } else if ("include".equals(nodeName)) { - Properties attributes = NodeletUtils.parseAttributes(child, state.globalProps); - String refid = (String) attributes.get("refid"); - Node includeNode = (Node) state.sqlIncludes.get(refid); - if (includeNode == null) { - String nsrefid = state.applyNamespace(refid); - includeNode = (Node) state.sqlIncludes.get(nsrefid); - if (includeNode == null) { - throw new RuntimeException("Could not find SQL statement to include with refid '" + refid + "'"); - } - } - isDynamic = parseDynamicTags(includeNode, dynamic, sqlBuffer, isDynamic, false); - } else { - state.errorContext.setMoreInfo("Check the dynamic tags."); - - SqlTagHandler handler = SqlTagHandlerFactory.getSqlTagHandler(nodeName); - if (handler != null) { - isDynamic = true; - - SqlTag tag = new SqlTag(); - tag.setName(nodeName); - tag.setHandler(handler); - - Properties attributes = NodeletUtils.parseAttributes(child, state.globalProps); - - tag.setPrependAttr(attributes.getProperty("prepend")); - tag.setPropertyAttr(attributes.getProperty("property")); - tag.setRemoveFirstPrepend(attributes.getProperty("removeFirstPrepend")); - - tag.setOpenAttr(attributes.getProperty("open")); - tag.setCloseAttr(attributes.getProperty("close")); - - tag.setComparePropertyAttr(attributes.getProperty("compareProperty")); - tag.setCompareValueAttr(attributes.getProperty("compareValue")); - tag.setConjunctionAttr(attributes.getProperty("conjunction")); - - // an iterate ancestor requires a post parse - - if(dynamic instanceof SqlTag) { - SqlTag parentSqlTag = (SqlTag)dynamic; - if(parentSqlTag.isPostParseRequired() || - tag.getHandler() instanceof IterateTagHandler) { - tag.setPostParseRequired(true); - } - } else if (dynamic instanceof DynamicSql) { - if(tag.getHandler() instanceof IterateTagHandler) { - tag.setPostParseRequired(true); - } - } - - dynamic.addChild(tag); - - if (child.hasChildNodes()) { - isDynamic = parseDynamicTags(child, tag, sqlBuffer, isDynamic, tag.isPostParseRequired()); - } - } - } - } - state.errorContext.setMoreInfo(null); - return isDynamic; - } - - private SelectKeyStatement findAndParseSelectKeyStatement(Node n, GeneralStatement insertStatement) { - state.errorContext.setActivity("parsing select key tags"); - - SelectKeyStatement selectKeyStatement = null; - - boolean foundTextFirst = false; - boolean hasType = false; - - NodeList children = n.getChildNodes(); - for (int i = 0; i < children.getLength(); i++) { - Node child = children.item(i); - if (child.getNodeType() == Node.CDATA_SECTION_NODE - || child.getNodeType() == Node.TEXT_NODE) { - String data = ((CharacterData) child).getData(); - if (data.trim().length() > 0) { - foundTextFirst = true; - } - } else if (child.getNodeType() == Node.ELEMENT_NODE - && "selectKey".equals(child.getNodeName())) { - selectKeyStatement = new SelectKeyStatement(); - hasType = parseSelectKey(child, insertStatement, selectKeyStatement); - break; - } - } - if (selectKeyStatement != null && !hasType) { - selectKeyStatement.setAfter(foundTextFirst); - } - state.errorContext.setMoreInfo(null); - return selectKeyStatement; - } - - /** - * - * @param node - * @param insertStatement - * @param selectKeyStatement - * @return true is the type (pre or post) was set from the configuration - * false if the type (pre or post) should be inferred from the position - * of the element in the text (the legacy behavior) - */ - private boolean parseSelectKey(Node node, GeneralStatement insertStatement, SelectKeyStatement selectKeyStatement) { - state.errorContext.setActivity("parsing a select key"); - - // get attributes - Properties attributes = NodeletUtils.parseAttributes(node, state.globalProps); - String keyPropName = attributes.getProperty("keyProperty"); - String resultClassName = attributes.getProperty("resultClass"); - resultClassName = state.typeHandlerFactory.resolveAlias(resultClassName); - Class resultClass = null; - - // get parameter and result maps - selectKeyStatement.setSqlMapClient(state.client); - - selectKeyStatement.setId(insertStatement.getId() + "-SelectKey"); - selectKeyStatement.setResource(state.errorContext.getResource()); - selectKeyStatement.setKeyProperty(keyPropName); - - // process the type (pre or post) attribute - boolean hasType; - String type = attributes.getProperty("type"); - if (type == null) { - hasType = false; - } else { - hasType = true; - selectKeyStatement.setAfter("post".equals(type)); - } - - try { - if (resultClassName != null) { - state.errorContext.setMoreInfo("Check the select key result class."); - resultClass = Resources.classForName(resultClassName); - } else { - Class parameterClass = insertStatement.getParameterClass(); - if (keyPropName != null && parameterClass != null) { - resultClass = PROBE.getPropertyTypeForSetter(parameterClass, selectKeyStatement.getKeyProperty()); - } - } - } catch (ClassNotFoundException e) { - throw new SqlMapException("Error. Could not set result class. Cause: " + e, e); - } - - if (resultClass == null) { - resultClass = Object.class; - } - - // process SQL statement, including inline parameter maps - state.errorContext.setMoreInfo("Check the select key SQL statement."); - processSqlStatement(node, selectKeyStatement); - - BasicResultMap resultMap; - resultMap = new AutoResultMap(state.client.getDelegate(), false); - resultMap.setId(selectKeyStatement.getId() + "-AutoResultMap"); - resultMap.setResultClass(resultClass); - resultMap.setResource(selectKeyStatement.getResource()); - selectKeyStatement.setResultMap(resultMap); - - state.errorContext.setMoreInfo(null); - return hasType; - } - - private void applyInlineParameterMap(GeneralStatement statement, String sqlStatement) { - String newSql = sqlStatement; - - state.errorContext.setActivity("building an inline parameter map"); - - ParameterMap parameterMap = statement.getParameterMap(); - - state.errorContext.setMoreInfo("Check the inline parameters."); - if (parameterMap == null) { - - BasicParameterMap map; - map = new BasicParameterMap(state.client.getDelegate()); - - map.setId(statement.getId() + "-InlineParameterMap"); - map.setParameterClass(statement.getParameterClass()); - map.setResource(statement.getResource()); - statement.setParameterMap(map); - - SqlText sqlText = PARAM_PARSER.parseInlineParameterMap(state.client.getDelegate().getTypeHandlerFactory(), newSql, statement.getParameterClass()); - newSql = sqlText.getText(); - List mappingList = Arrays.asList(sqlText.getParameterMappings()); - - map.setParameterMappingList(mappingList); - - } - - Sql sql = null; - if (SimpleDynamicSql.isSimpleDynamicSql(newSql)) { - sql = new SimpleDynamicSql(state.client.getDelegate(), newSql); - } else { - sql = new StaticSql(newSql); - } - statement.setSql(sql); + return state.prepareGeneralStatement(new XMLStatementProcessor(state, node), statement, id, resultMapName, parameterMapName, resultSetType, fetchSize, parameterClassName, resultClassName, allowRemapping, xmlResultName, timeout, cacheModelName); }
Added: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/StatementProcessor.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/StatementProcessor.java?view=auto&rev=512614 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/StatementProcessor.java (added) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/StatementProcessor.java Tue Feb 27 21:58:25 2007 @@ -0,0 +1,9 @@ +package com.ibatis.sqlmap.engine.builder.xml; + +import com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement; + +public interface StatementProcessor { + + void processStatement(GeneralStatement statement); + +} Added: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/XMLStatementProcessor.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/XMLStatementProcessor.java?view=auto&rev=512614 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/XMLStatementProcessor.java (added) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/XMLStatementProcessor.java Tue Feb 27 21:58:25 2007 @@ -0,0 +1,171 @@ +package com.ibatis.sqlmap.engine.builder.xml; + +import org.w3c.dom.*; +import com.ibatis.sqlmap.engine.mapping.statement.*; +import com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql; +import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.*; +import com.ibatis.sqlmap.engine.mapping.sql.SqlText; +import com.ibatis.sqlmap.engine.mapping.parameter.InlineParameterMapParser; +import com.ibatis.common.xml.NodeletUtils; + +import java.util.Properties; + +public class XMLStatementProcessor implements StatementProcessor { + + private static final InlineParameterMapParser PARAM_PARSER = new InlineParameterMapParser(); + + private ParserState state; + private Node parentNode; + + + public XMLStatementProcessor(ParserState state, Node parentNode) { + this.state = state; + this.parentNode = parentNode; + } + + public void processStatement(GeneralStatement statement) { + state.errorContext.setActivity("processing an SQL statement"); + + boolean isDynamic = false; + DynamicSql dynamic = new DynamicSql(state.client.getDelegate()); + StringBuffer sqlBuffer = new StringBuffer(); + + isDynamic = parseDynamicTags(parentNode, dynamic, sqlBuffer, isDynamic, false); + + if (statement instanceof InsertStatement) { + InsertStatement insertStatement = ((InsertStatement) statement); + SelectKeyStatement selectKeyStatement = findAndParseSelectKeyStatement(parentNode, statement.getId(), statement.getParameterClass()); + insertStatement.setSelectKeyStatement(selectKeyStatement); + } + + String sqlStatement = sqlBuffer.toString(); + if (isDynamic) { + statement.setSql(dynamic); + } else { + state.applyInlineParameterMap(statement, sqlStatement); + } + + } + + private boolean parseDynamicTags(Node node, DynamicParent dynamic, StringBuffer sqlBuffer, boolean isDynamic, boolean postParseRequired) { + state.errorContext.setActivity("parsing dynamic SQL tags"); + + NodeList children = node.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + String nodeName = child.getNodeName(); + if (child.getNodeType() == Node.CDATA_SECTION_NODE + || child.getNodeType() == Node.TEXT_NODE) { + + String data = ((CharacterData) child).getData(); + data = NodeletUtils.parsePropertyTokens(data, state.globalProps); + + SqlText sqlText; + + if (postParseRequired) { + sqlText = new SqlText(); + sqlText.setPostParseRequired(postParseRequired); + sqlText.setText(data); + } else { + sqlText = PARAM_PARSER.parseInlineParameterMap(state.client.getDelegate().getTypeHandlerFactory(), data, null); + sqlText.setPostParseRequired(postParseRequired); + } + + dynamic.addChild(sqlText); + + sqlBuffer.append(data); + } else if ("include".equals(nodeName)) { + Properties attributes = NodeletUtils.parseAttributes(child, state.globalProps); + String refid = (String) attributes.get("refid"); + Node includeNode = (Node) state.sqlIncludes.get(refid); + if (includeNode == null) { + String nsrefid = state.applyNamespace(refid); + includeNode = (Node) state.sqlIncludes.get(nsrefid); + if (includeNode == null) { + throw new RuntimeException("Could not find SQL statement to include with refid '" + refid + "'"); + } + } + isDynamic = parseDynamicTags(includeNode, dynamic, sqlBuffer, isDynamic, false); + } else { + state.errorContext.setMoreInfo("Check the dynamic tags."); + + SqlTagHandler handler = SqlTagHandlerFactory.getSqlTagHandler(nodeName); + if (handler != null) { + isDynamic = true; + + SqlTag tag = new SqlTag(); + tag.setName(nodeName); + tag.setHandler(handler); + + Properties attributes = NodeletUtils.parseAttributes(child, state.globalProps); + + tag.setPrependAttr(attributes.getProperty("prepend")); + tag.setPropertyAttr(attributes.getProperty("property")); + tag.setRemoveFirstPrepend(attributes.getProperty("removeFirstPrepend")); + + tag.setOpenAttr(attributes.getProperty("open")); + tag.setCloseAttr(attributes.getProperty("close")); + + tag.setComparePropertyAttr(attributes.getProperty("compareProperty")); + tag.setCompareValueAttr(attributes.getProperty("compareValue")); + tag.setConjunctionAttr(attributes.getProperty("conjunction")); + + // an iterate ancestor requires a post parse + + if (dynamic instanceof SqlTag) { + SqlTag parentSqlTag = (SqlTag) dynamic; + if (parentSqlTag.isPostParseRequired() || + tag.getHandler() instanceof IterateTagHandler) { + tag.setPostParseRequired(true); + } + } else if (dynamic instanceof DynamicSql) { + if (tag.getHandler() instanceof IterateTagHandler) { + tag.setPostParseRequired(true); + } + } + + dynamic.addChild(tag); + + if (child.hasChildNodes()) { + isDynamic = parseDynamicTags(child, tag, sqlBuffer, isDynamic, tag.isPostParseRequired()); + } + } + } + } + state.errorContext.setMoreInfo(null); + return isDynamic; + } + + private SelectKeyStatement findAndParseSelectKeyStatement(Node n, String statementId, Class parameterClass) { + state.errorContext.setActivity("parsing select key tags"); + + SelectKeyStatement selectKeyStatement = null; + + boolean foundSQLFirst = false; + + NodeList children = n.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.CDATA_SECTION_NODE + || child.getNodeType() == Node.TEXT_NODE) { + String data = ((CharacterData) child).getData(); + if (data.trim().length() > 0) { + foundSQLFirst = true; + } + } else if (child.getNodeType() == Node.ELEMENT_NODE + && "selectKey".equals(child.getNodeName())) { + + // get attributes + Properties attributes = NodeletUtils.parseAttributes(child, state.globalProps); + String keyPropName = attributes.getProperty("keyProperty"); + String resultClassName = attributes.getProperty("resultClass"); + String type = attributes.getProperty("type"); + + selectKeyStatement = state.prepareSelectKeyStatement(new XMLStatementProcessor(state, child), resultClassName, statementId, keyPropName, foundSQLFirst, type, parameterClass); + break; + } + } + state.errorContext.setMoreInfo(null); + return selectKeyStatement; + } +} Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/impl/SqlMapExecutorDelegate.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/impl/SqlMapExecutorDelegate.java?view=diff&rev=512614&r1=512613&r2=512614 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/impl/SqlMapExecutorDelegate.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/impl/SqlMapExecutorDelegate.java Tue Feb 27 21:58:25 2007 @@ -438,7 +438,7 @@ selectKeyStatement = ((InsertStatement) ms).getSelectKeyStatement(); } - if (selectKeyStatement != null && !selectKeyStatement.isAfter()) { + if (selectKeyStatement != null && !selectKeyStatement.isRunAfterSQL()) { generatedKey = executeSelectKey(session, trans, ms, param); } @@ -449,7 +449,7 @@ pushRequest(request); } - if (selectKeyStatement != null && selectKeyStatement.isAfter()) { + if (selectKeyStatement != null && selectKeyStatement.isRunAfterSQL()) { generatedKey = executeSelectKey(session, trans, ms, param); } Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/SelectKeyStatement.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/SelectKeyStatement.java?view=diff&rev=512614&r1=512613&r2=512614 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/SelectKeyStatement.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/SelectKeyStatement.java Tue Feb 27 21:58:25 2007 @@ -25,7 +25,7 @@ public class SelectKeyStatement extends SelectStatement { private String keyProperty; - private boolean after; + private boolean runAfterSQL; public String getKeyProperty() { return keyProperty; @@ -35,12 +35,12 @@ this.keyProperty = keyProperty; } - public boolean isAfter() { - return after; + public boolean isRunAfterSQL() { + return runAfterSQL; } - public void setAfter(boolean after) { - this.after = after; + public void setRunAfterSQL(boolean runAfterSQL) { + this.runAfterSQL = runAfterSQL; } public List executeQueryForList(RequestScope request, Transaction trans, Object parameterObject, int skipResults, int maxResults)
