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 2005/05/14 08:07:35 UTC

svn commit: r170125 - in /incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine: builder/xml/BaseParser.java builder/xml/SqlMapParser.java builder/xml/sql-map-2.dtd mapping/result/BasicResultMap.java mapping/result/Discriminator.java

Author: cbegin
Date: Fri May 13 23:07:33 2005
New Revision: 170125

URL: http://svn.apache.org/viewcvs?rev=170125&view=rev
Log: (empty)

Added:
    incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/Discriminator.java
Modified:
    incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/BaseParser.java
    incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java
    incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd
    incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/BasicResultMap.java

Modified: incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/BaseParser.java
URL: http://svn.apache.org/viewcvs/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/BaseParser.java?rev=170125&r1=170124&r2=170125&view=diff
==============================================================================
--- incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/BaseParser.java (original)
+++ incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/BaseParser.java Fri May 13 23:07:33 2005
@@ -9,6 +9,9 @@
 import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
 import com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap;
 import com.ibatis.sqlmap.engine.mapping.result.BasicResultMap;
+import com.ibatis.sqlmap.engine.mapping.result.BasicResultMapping;
+import com.ibatis.sqlmap.engine.mapping.result.ResultMapping;
+import com.ibatis.sqlmap.engine.mapping.result.Discriminator;
 import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
 import com.ibatis.sqlmap.engine.scope.ErrorContext;
 import com.ibatis.sqlmap.engine.type.DomTypeMarker;
@@ -125,6 +128,7 @@
     public List resultMappingList;
     public int resultMappingIndex;
     public Map sqlIncludes = new HashMap();
+    public Discriminator discriminator;
   }
 
 }

Modified: incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java
URL: http://svn.apache.org/viewcvs/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java?rev=170125&r1=170124&r2=170125&view=diff
==============================================================================
--- incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java (original)
+++ incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java Fri May 13 23:07:33 2005
@@ -13,6 +13,7 @@
 import com.ibatis.sqlmap.engine.mapping.result.BasicResultMap;
 import com.ibatis.sqlmap.engine.mapping.result.BasicResultMapping;
 import com.ibatis.sqlmap.engine.mapping.result.ResultMapping;
+import com.ibatis.sqlmap.engine.mapping.result.Discriminator;
 import com.ibatis.sqlmap.engine.mapping.statement.*;
 import com.ibatis.sqlmap.engine.type.CustomTypeHandler;
 import com.ibatis.sqlmap.engine.type.TypeHandler;
@@ -262,7 +263,6 @@
           throw new NestedRuntimeException("Error setting javaType on parameter mapping.  Cause: " + e);
         }
 
-
         vars.parameterMappingList.add(mapping);
 
       }
@@ -274,6 +274,8 @@
       public void process(Node node) throws Exception {
         vars.currentResultMap.setResultMappingList(vars.resultMappingList);
 
+        vars.currentResultMap.setDiscriminator(vars.discriminator);
+
         vars.client.getDelegate().addResultMap(vars.currentResultMap);
 
         vars.errorCtx.setMoreInfo(null);
@@ -403,6 +405,85 @@
         }
 
         vars.resultMappingList.add(mapping);
+      }
+    });
+
+    parser.addNodelet("/sqlMap/resultMap/discriminator/subMap", new Nodelet() {
+      public void process(Node node) throws Exception {
+        if (vars.discriminator == null) {
+          throw new NestedRuntimeException ("The discriminator is null, but somehow a subMap was reached.  This is a bug.");
+        }
+        Properties childAttributes = NodeletUtils.parseAttributes(node, vars.properties);
+        String value = childAttributes.getProperty("value");
+        String resultMap = childAttributes.getProperty("resultMap");
+        vars.discriminator.addSubMap(value, resultMap);
+      }
+    });
+
+    parser.addNodelet("/sqlMap/resultMap/discriminator/end()", new Nodelet() {
+      public void process(Node node) throws Exception {
+        if (vars.discriminator != null) {
+          vars.discriminator.bindSubMaps();
+        }
+      }
+    });
+
+    parser.addNodelet("/sqlMap/resultMap/discriminator", new Nodelet() {
+      public void process(Node node) throws Exception {
+        Properties childAttributes = NodeletUtils.parseAttributes(node, vars.properties);
+        String propertyName = childAttributes.getProperty("property");
+        String nullValue = childAttributes.getProperty("nullValue");
+        String jdbcType = childAttributes.getProperty("jdbcType");
+        String javaType = childAttributes.getProperty("javaType");
+        String columnName = childAttributes.getProperty("column");
+        String columnIndex = childAttributes.getProperty("columnIndex");
+        String callback = childAttributes.getProperty("typeHandler");
+
+        callback = vars.typeHandlerFactory.resolveAlias(callback);
+        javaType = vars.typeHandlerFactory.resolveAlias(javaType);
+
+        vars.errorCtx.setObjectId(propertyName + " mapping of the " + vars.currentResultMap.getId() + " result map");
+
+        TypeHandler handler = null;
+        if (callback != null) {
+          vars.errorCtx.setMoreInfo("Check the result mapping typeHandler attribute '" + callback + "' (must be a TypeHandlerCallback implementation).");
+          try {
+            Object impl = Resources.classForName(callback).newInstance();
+            if (impl instanceof TypeHandlerCallback) {
+              handler = new CustomTypeHandler((TypeHandlerCallback) impl);
+            } else if (impl instanceof TypeHandler) {
+              handler = (TypeHandler) impl;
+            } else {
+              throw new NestedRuntimeException ("The class '' is not a valid implementation of TypeHandler or TypeHandlerCallback");
+            }
+          } catch (Exception e) {
+            throw new NestedRuntimeException("Error occurred during custom type handler configuration.  Cause: " + e, e);
+          }
+        } else {
+          vars.errorCtx.setMoreInfo("Check the result mapping property type or name.");
+          handler = resolveTypeHandler(vars.client.getDelegate().getTypeHandlerFactory(), vars.currentResultMap.getResultClass(), propertyName, javaType, jdbcType, true);
+        }
+
+        BasicResultMapping mapping = new BasicResultMapping();
+        mapping.setPropertyName(propertyName);
+        mapping.setColumnName(columnName);
+        mapping.setJdbcTypeName(jdbcType);
+        mapping.setTypeHandler(handler);
+        mapping.setNullValue(nullValue);
+
+        try {
+          if (javaType != null && javaType.length() > 0) {
+            mapping.setJavaType(Class.forName(javaType));
+          }
+        } catch (ClassNotFoundException e) {
+          throw new NestedRuntimeException("Error setting javaType on result mapping.  Cause: " + e);
+        }
+
+        if (columnIndex != null && columnIndex.length() > 0) {
+          mapping.setColumnIndex(Integer.parseInt(columnIndex));
+        }
+
+        vars.discriminator = new Discriminator (vars.delegate, mapping);
       }
     });
   }

Modified: incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd
URL: http://svn.apache.org/viewcvs/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd?rev=170125&r1=170124&r2=170125&view=diff
==============================================================================
--- incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd (original)
+++ incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd Fri May 13 23:07:33 2005
@@ -36,7 +36,7 @@
 mode (IN | OUT | INOUT) #IMPLIED
 typeHandler CDATA #IMPLIED
 >
-<!ELEMENT resultMap (result+)>
+<!ELEMENT resultMap (result+, discriminator?)>
 <!ATTLIST resultMap
 id CDATA #REQUIRED
 class CDATA #REQUIRED
@@ -55,6 +55,21 @@
 select CDATA #IMPLIED
 resultMap CDATA #IMPLIED
 typeHandler CDATA #IMPLIED
+>
+<!ELEMENT discriminator (subMap+)>
+<!ATTLIST discriminator
+property CDATA #REQUIRED
+javaType CDATA #IMPLIED
+column CDATA #IMPLIED
+columnIndex CDATA #IMPLIED
+jdbcType CDATA #IMPLIED
+nullValue CDATA #IMPLIED
+typeHandler CDATA #IMPLIED
+>
+<!ELEMENT subMap EMPTY>
+<!ATTLIST subMap
+value CDATA #REQUIRED
+resultMap CDATA #REQUIRED
 >
 <!ELEMENT cacheModel (flushInterval?, flushOnExecute*, property*)+>
 <!ATTLIST cacheModel

Modified: incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/BasicResultMap.java
URL: http://svn.apache.org/viewcvs/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/BasicResultMap.java?rev=170125&r1=170124&r2=170125&view=diff
==============================================================================
--- incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/BasicResultMap.java (original)
+++ incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/BasicResultMap.java Fri May 13 23:07:33 2005
@@ -59,6 +59,8 @@
 
   private List nestedResultMappings;
 
+  private Discriminator discriminator;
+
   private Set groupByProps;
 
   private String xmlName;
@@ -209,6 +211,13 @@
     }
   }
 
+  public void setDiscriminator (Discriminator discriminator) {
+    if (this.discriminator != null) {
+      throw new SqlMapException ("A discriminator may only be set once per result map.");
+    }
+    this.discriminator = discriminator;
+  }
+
   /**
    * Setter for a list of the individual ResultMapping objects
    *
@@ -277,7 +286,7 @@
       foundData = foundData || columnValues[i] != null;
     }
 
-    request.setRowDataFound (foundData);
+    request.setRowDataFound(foundData);
 
     return columnValues;
   }

Added: incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/Discriminator.java
URL: http://svn.apache.org/viewcvs/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/Discriminator.java?rev=170125&view=auto
==============================================================================
--- incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/Discriminator.java (added)
+++ incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/Discriminator.java Fri May 13 23:07:33 2005
@@ -0,0 +1,56 @@
+package com.ibatis.sqlmap.engine.mapping.result;
+
+import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: cbegin
+ * Date: May 13, 2005
+ * Time: 11:11:05 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Discriminator {
+
+  private SqlMapExecutorDelegate delegate;
+  private ResultMapping resultMapping;
+  private Map subMaps;
+
+  public Discriminator(SqlMapExecutorDelegate delegate, ResultMapping resultMapping) {
+    this.delegate = delegate;
+    this.resultMapping = resultMapping;
+  }
+
+  public void setResultMapping(ResultMapping resultMapping) {
+    this.resultMapping = resultMapping;
+  }
+
+  public ResultMapping getResultMapping() {
+    return resultMapping;
+  }
+
+  public void addSubMap(String discriminatorValue, String resultMapName) {
+    if (subMaps == null) {
+      subMaps = new HashMap();
+    }
+    subMaps.put(discriminatorValue, resultMapName);
+  }
+
+  public void bindSubMaps() {
+    if (subMaps != null) {
+      Iterator keys = subMaps.keySet().iterator();
+      while (keys.hasNext()) {
+        Object key = keys.next();
+        Object id = subMaps.get(key);
+        if(id instanceof String) {
+          subMaps.put(key, delegate.getResultMap((String)id));
+        }
+      }
+    }
+  }
+
+
+}