You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2007/02/28 06:58:26 UTC
svn commit: r512614 [2/2] - in
/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine:
builder/xml/ impl/ mapping/statement/
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)