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());
   }
 
 }


Reply via email to