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 2009/03/15 04:09:51 UTC

svn commit: r754607 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis: annotations/Annotations.java binding/MapperAnnotationParser.java parser/MapperConfigurator.java parser/MapperParser.java

Author: cbegin
Date: Sun Mar 15 03:09:50 2009
New Revision: 754607

URL: http://svn.apache.org/viewvc?rev=754607&view=rev
Log:
Added discriminator support

Modified:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/annotations/Annotations.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperAnnotationParser.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigurator.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperParser.java

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/annotations/Annotations.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/annotations/Annotations.java?rev=754607&r1=754606&r2=754607&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/annotations/Annotations.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/annotations/Annotations.java Sun Mar 15 03:09:50 2009
@@ -124,4 +124,22 @@
     int timeout() default -1;
   }
 
+  @Retention(RetentionPolicy.RUNTIME)
+  @Target(ElementType.METHOD)
+  public @interface TypeDiscriminator {
+    String column();
+    Class javaType() default void.class;
+    JdbcType jdbcType() default JdbcType.UNDEFINED;
+    Class typeHandler() default void.class;
+    Case[] cases();
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @Target(ElementType.METHOD)
+  public @interface Case {
+    String value();
+    Class type();
+    Result[] results();
+  }
+
 }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperAnnotationParser.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperAnnotationParser.java?rev=754607&r1=754606&r2=754607&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperAnnotationParser.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperAnnotationParser.java Sun Mar 15 03:09:50 2009
@@ -1,18 +1,18 @@
 package org.apache.ibatis.binding;
 
 import static org.apache.ibatis.annotations.Annotations.*;
-import org.apache.ibatis.mapping.Configuration;
-import org.apache.ibatis.mapping.ResultFlag;
-import org.apache.ibatis.mapping.ResultSetType;
-import org.apache.ibatis.mapping.StatementType;
+import org.apache.ibatis.mapping.*;
 import org.apache.ibatis.parser.MapperConfigurator;
-import org.apache.ibatis.type.JdbcType;
 import org.apache.ibatis.reflection.MetaClass;
+import org.apache.ibatis.type.JdbcType;
 
 import java.lang.annotation.Annotation;
-import java.lang.reflect.*;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 public class MapperAnnotationParser {
 
@@ -56,16 +56,64 @@
     Class returnType = getReturnType(method);
     String resultMapId = type.getName() + "." + method.getName();
     if (hasResults(method)) {
-      applyResultMap(resultMapId, returnType, argsIf(args), resultsIf(results));
+      TypeDiscriminator typeDiscriminator = method.getAnnotation(TypeDiscriminator.class);
+      applyResultMap(resultMapId, returnType, argsIf(args), resultsIf(results), typeDiscriminator);
     }
   }
 
-  private void applyResultMap(String resultMapId, Class returnType, Arg[] args, Result[] results) {
+  private void applyResultMap(String resultMapId, Class returnType, Arg[] args, Result[] results, TypeDiscriminator discriminator) {
     applyNestedResultMaps(resultMapId, returnType, results);
     configurator.resultMapStart(resultMapId, returnType, null);
     applyConstructorArgs(args);
     applyResults(resultMapId, results);
+    applyDiscriminator(resultMapId, discriminator);
     configurator.resultMapEnd();
+    createDiscriminatorResultMaps(resultMapId, discriminator);
+  }
+
+  private void createDiscriminatorResultMaps(String resultMapId, TypeDiscriminator discriminator) {
+    if (discriminator != null) {
+      for (Case c : discriminator.cases()) {
+        String value = c.value();
+        Class type = c.type();
+        String caseResultMapId = resultMapId + "-" + value;
+        configurator.resultMapStart(caseResultMapId, type, resultMapId);
+        for (Result result : c.results()) {
+          List<ResultFlag> flags = new ArrayList<ResultFlag>();
+          if (result.id()) {
+            flags.add(ResultFlag.ID);
+          }
+          configurator.resultMapping(
+            result.property(),
+            result.column(),
+            result.javaType() == void.class ? null : result.javaType(),
+            result.jdbcType() == JdbcType.UNDEFINED ? null : result.jdbcType(),
+            hasNestedSelect(result) ? nestedSelectId(result) : null,
+            hasCollectionOrAssociation(result) ? nestedResultMapId(resultMapId, result) : null,
+            result.typeHandler() == void.class ? null : result.typeHandler(),
+            flags);
+        }
+
+      }
+    }
+  }
+
+  private void applyDiscriminator(String resultMapId, TypeDiscriminator discriminator) {
+    if (discriminator != null) {
+      String column = discriminator.column();
+      Class javaType = discriminator.javaType();
+      JdbcType jdbcType = discriminator.jdbcType();
+      Class typeHandler = discriminator.typeHandler();
+      Case[] cases = discriminator.cases();
+
+      configurator.resultMapDiscriminatorStart(column, javaType, jdbcType, typeHandler);
+      for (Case c : cases) {
+        String value = c.value();
+        String caseResultMapId = resultMapId + "-" + value;
+        configurator.resultMapDiscriminatorCase(value, caseResultMapId);
+      }
+      configurator.resultMapDiscriminatorEnd();
+    }
   }
 
   private void applyNestedResultMaps(String resultMapId, Class returnType, Result[] results) {
@@ -76,13 +124,13 @@
           Class propertyType = result.many().javaType();
           Arg[] nestedArgs = result.many().constructor().value();
           Result[] nestedResults = result.many().results().value();
-          applyResultMap(nestedResultMapId(resultMapId, result),propertyType, nestedArgs, nestedResults);
+          applyResultMap(nestedResultMapId(resultMapId, result), propertyType, nestedArgs, nestedResults, null);
         }
         if (hasAssociation(result)) {
           Class propertyType = MetaClass.forClass(returnType).getSetterType(result.property());
           Arg[] nestedArgs = result.one().constructor().value();
           Result[] nestedResults = result.one().results().value();
-          applyResultMap(nestedResultMapId(resultMapId, result),propertyType, nestedArgs, nestedResults);
+          applyResultMap(nestedResultMapId(resultMapId, result), propertyType, nestedArgs, nestedResults, null);
         }
       }
     }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigurator.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigurator.java?rev=754607&r1=754606&r2=754607&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigurator.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigurator.java Sun Mar 15 03:09:50 2009
@@ -145,7 +145,7 @@
       String nestedSelect,
       String nestedResultMap,
       Class typeHandler,
-      ArrayList<ResultFlag> flags) {
+      List<ResultFlag> flags) {
     ResultMapping resultMapping = buildResultMapping(
         property,
         column,
@@ -161,20 +161,17 @@
 
   //  <discriminator column="" javaType="" jdbcType="">
   public void resultMapDiscriminatorStart(
-      String property,
       String column,
       Class javaType,
       JdbcType jdbcType,
-      String nestedSelect,
-      String nestedResultMap,
       Class typeHandler) {
     ResultMapping resultMapping = buildResultMapping(
-        property,
+        null,
         column,
         javaType,
         jdbcType,
-        nestedSelect,
-        nestedResultMap,
+        null,
+        null,
         typeHandler,
         new ArrayList<ResultFlag>());
     discriminatorMap = new HashMap<String, String>();
@@ -314,7 +311,7 @@
       String nestedSelect,
       String nestedResultMap,
       Class typeHandler,
-      ArrayList<ResultFlag> flags) {
+      List<ResultFlag> flags) {
 
     nestedResultMap = applyNamespace(nestedResultMap);
     Class resultType = resultMapBuilder.type();

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperParser.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperParser.java?rev=754607&r1=754606&r2=754607&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperParser.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperParser.java Sun Mar 15 03:09:50 2009
@@ -164,17 +164,14 @@
   //  <discriminator column="" javaType="" jdbcType="">
   @Nodelet("/mapper/resultMap/discriminator")
   public void resultMapDiscriminatorElement(NodeletContext context) throws Exception {
-    String property = context.getStringAttribute("property");
     String column = context.getStringAttribute("column");
     String javaType = context.getStringAttribute("javaType");
     String jdbcType = context.getStringAttribute("jdbcType");
-    String nestedSelect = context.getStringAttribute("select");
-    String nestedResultMap = context.getStringAttribute("resultMap");
     String typeHandler = context.getStringAttribute("typeHandler");
     Class javaTypeClass = resolveClass(javaType);
     Class typeHandlerClass =  resolveClass(typeHandler);
     JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
-    mapperConfigurator.resultMapDiscriminatorStart(property,column,javaTypeClass,jdbcTypeEnum,nestedSelect,nestedResultMap,typeHandlerClass);
+    mapperConfigurator.resultMapDiscriminatorStart(column,javaTypeClass,jdbcTypeEnum,typeHandlerClass);
   }
 
   //  <discriminator column="" javaType="" jdbcType="">