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="">