Author: cbegin
Date: Sun May 24 16:43:52 2009
New Revision: 778190
URL: http://svn.apache.org/viewvc?rev=778190&view=rev
Log:
more prep for nested result mappings
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLMapperParser.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parsing/XNode.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parsing/XPathParserTest.java
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLMapperParser.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLMapperParser.java?rev=778190&r1=778189&r2=778190&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLMapperParser.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLMapperParser.java
Sun May 24 16:43:52 2009
@@ -1,13 +1,9 @@
package org.apache.ibatis.builder.xml;
-import org.apache.ibatis.builder.BaseParser;
-import org.apache.ibatis.builder.SequentialMapperBuilder;
-import org.apache.ibatis.mapping.Configuration;
-import org.apache.ibatis.mapping.ParameterMode;
-import org.apache.ibatis.mapping.ResultFlag;
-import org.apache.ibatis.parsing.NodeEvent;
-import org.apache.ibatis.parsing.NodeEventParser;
-import org.apache.ibatis.parsing.XNode;
+import org.apache.ibatis.builder.*;
+import org.apache.ibatis.executor.ErrorContext;
+import org.apache.ibatis.mapping.*;
+import org.apache.ibatis.parsing.*;
import org.apache.ibatis.type.JdbcType;
import java.io.Reader;
@@ -112,34 +108,48 @@
// <resultMap id="" type="" extends="">
@NodeEvent("/mapper/resultMap")
public void resultMapElement(XNode context) throws Exception {
+ ErrorContext.instance().activity("processing " +
context.getValueBasedIdentifier());
String id = context.getStringAttribute("id");
String type = context.getStringAttribute("type");
String extend = context.getStringAttribute("extends");
+ if (id == null) {
+ id = context.getValueBasedIdentifier();
+ }
Class typeClass = resolveClass(type);
+ processChildrenAsResultMap(context);
sequentialBuilder.resultMapStart(id, typeClass, extend);
List<XNode> resultChildren = context.getChildren();
for (XNode resultChild : resultChildren) {
- if ("constructor".equals(resultChild.getNodeName())) {
- processConstructorChildren(resultChild);
- } else if ("discriminator".equals(resultChild.getNodeName())) {
+ if ("constructor".equals(resultChild.getName())) {
+ processConstructorElement(resultChild);
+ } else if ("discriminator".equals(resultChild.getName())) {
processDiscriminatorElement(resultChild);
} else {
ArrayList<ResultFlag> flags = new ArrayList<ResultFlag>();
- if ("id".equals(resultChild.getNodeName())) {
+ if ("id".equals(resultChild.getName())) {
flags.add(ResultFlag.ID);
}
- buildResultMappingFromContext(resultChild,flags);
+ buildResultMappingFromContext(resultChild, flags);
}
}
sequentialBuilder.resultMapEnd();
}
- private void processConstructorChildren(XNode resultChild) throws Exception {
+ private void processChildrenAsResultMap(XNode resultChild) throws Exception {
+ List<String> acceptedResultMapElements = Arrays.asList(new
String[]{"association","collection","case"});
+ for (XNode arg : resultChild.getChildren()) {
+ if (acceptedResultMapElements.contains(resultChild.getName()) &&
arg.getChildren().size() > 0) {
+ resultMapElement(arg);
+ }
+ }
+ }
+
+ private void processConstructorElement(XNode resultChild) throws Exception {
List<XNode> argChildren = resultChild.getChildren();
for (XNode argChild : argChildren) {
ArrayList<ResultFlag> flags = new ArrayList<ResultFlag>();
flags.add(ResultFlag.CONSTRUCTOR);
- if ("idArg".equals(argChild.getNodeName())) {
+ if ("idArg".equals(argChild.getName())) {
flags.add(ResultFlag.ID);
}
buildResultMappingFromContext(argChild, flags);
@@ -156,6 +166,7 @@
JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
sequentialBuilder.resultMapDiscriminatorStart(column, javaTypeClass,
jdbcTypeEnum, typeHandlerClass);
for (XNode caseChild : context.getChildren()) {
+ processChildrenAsResultMap(caseChild);
String value = caseChild.getStringAttribute("value");
String resultMap = caseChild.getStringAttribute("resultMap");
sequentialBuilder.resultMapDiscriminatorCase(value, resultMap);
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parsing/XNode.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parsing/XNode.java?rev=778190&r1=778189&r2=778190&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parsing/XNode.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parsing/XNode.java
Sun May 24 16:43:52 2009
@@ -26,19 +26,50 @@
return new XNode(xpathParser,node,variables);
}
- public String getNodeName() {
- return node.getNodeName();
- }
-
public XNode getParent() {
Node parent = node.getParentNode();
- if (parent == null) {
+ if (parent == null || !(parent instanceof Element)) {
return null;
} else {
return new XNode(xpathParser, parent,variables);
}
}
+ public String getPath() {
+ StringBuilder builder = new StringBuilder();
+ Node current = node;
+ while (current != null && current instanceof Element) {
+ if (current != node) {
+ builder.insert(0,"/");
+ }
+ builder.insert(0,current.getNodeName());
+ current = current.getParentNode();
+ }
+ return builder.toString();
+ }
+
+ public String getValueBasedIdentifier() {
+ StringBuilder builder = new StringBuilder();
+ XNode current = this;
+ while (current != null) {
+ if (current != this) {
+ builder.insert(0,"_");
+ }
+ String value = current.getStringAttribute("id",
+ current.getStringAttribute("value",
+ current.getStringAttribute("property", null)));
+ if (value != null) {
+ builder.insert(0, "]");
+ builder.insert(0,
+ value);
+ builder.insert(0, "[");
+ }
+ builder.insert(0, current.getName());
+ current = current.getParent();
+ }
+ return builder.toString();
+ }
+
public String evalString(String expression) {
return xpathParser.evalString(node, expression);
}
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parsing/XPathParserTest.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parsing/XPathParserTest.java?rev=778190&r1=778189&r2=778190&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parsing/XPathParserTest.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parsing/XPathParserTest.java
Sun May 24 16:43:52 2009
@@ -18,6 +18,9 @@
assertEquals(Boolean.TRUE,parser.evalBoolean("/employee/active"));
assertEquals("<id>${id_var}</id>",
parser.evalNode("/employee/@id").toString().trim());
assertEquals(7, parser.evalNodes("/employee/*").size());
+ XNode node = parser.evalNode("/employee/height");
+ assertEquals("employee/height", node.getPath());
+ assertEquals("employee[${id_var}]_height", node.getValueBasedIdentifier());
}
}