Author: cbegin
Date: Sat May 30 17:14:37 2009
New Revision: 780301

URL: http://svn.apache.org/viewvc?rev=780301&view=rev
Log:
Refactored MapperBuilderAssistant to allow for recursive map processing

Added:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java
      - copied, changed from r780275, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/SequentialMapperBuilder.java
Removed:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/SequentialMapperBuilder.java
Modified:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/NestedBlogMapper.xml

Copied: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java
 (from r780275, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/SequentialMapperBuilder.java)
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java?p2=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java&p1=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/SequentialMapperBuilder.java&r1=780275&r2=780301&rev=780301&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/SequentialMapperBuilder.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java
 Sat May 30 17:14:37 2009
@@ -11,53 +11,50 @@
 
 import java.util.*;
 
-public class SequentialMapperBuilder extends BaseBuilder {
+public class MapperBuilderAssistant extends BaseBuilder {
 
-  private String namespace;
+  private String currentNamespace;
   private String resource;
+  private Cache currentCache;
 
-  private ParameterMap.Builder parameterMapBuilder;
-  private List<ParameterMapping> parameterMappings;
-
-  private ResultMap.Builder resultMapBuilder;
-  private List<ResultMapping> resultMappings;
-
-  private Discriminator.Builder discriminatorBuilder;
-  private HashMap<String, String> discriminatorMap;
-
-  private Cache cache;
-
-  public SequentialMapperBuilder(Configuration configuration, String resource) 
{
+  public MapperBuilderAssistant(Configuration configuration, String resource) {
     super(configuration);
     ErrorContext.instance().resource(resource);
     this.resource = resource;
   }
 
-  public String getNamespace() {
-    return namespace;
+  public String getCurrentNamespace() {
+    return currentNamespace;
   }
 
-  public void namespace(String namespace) {
-    if (namespace != null) {
-      this.namespace = namespace;
+  public void setCurrentNamespace(String currentNamespace) {
+    if (currentNamespace != null) {
+      this.currentNamespace = currentNamespace;
     }
-    if (this.namespace == null) {
+    if (this.currentNamespace == null) {
       throw new BulderException("The mapper element requires a namespace 
attribute to be specified.");
     }
   }
 
-  public void cacheRef(String namespace) {
+  public String applyCurrentNamespace(String base) {
+    if (base == null) return null;
+    if (base.contains(".")) return base;
+    return currentNamespace + "." + base;
+  }
+
+  public Cache useCacheRef(String namespace) {
     if (namespace == null) {
       throw new BulderException("cache-ref element requires a namespace 
attribute.");
     }
-    cache = configuration.getCache(namespace);
+    Cache cache = configuration.getCache(namespace);
     if (cache == null) {
       throw new BulderException("No cache for namespace '" + namespace + "' 
could be found.");
     }
+    currentCache = cache;
+    return cache;
   }
 
-  //  <cache type="LRU" flushInterval="3600000" size="1000" readOnly="false" />
-  public void cache(Class typeClass,
+  public Cache useNewCache(Class typeClass,
                     Class evictionClass,
                     Long flushInterval,
                     Integer size,
@@ -65,7 +62,7 @@
                     Properties props) {
     typeClass = valueOrDefault(typeClass, PerpetualCache.class);
     evictionClass = valueOrDefault(evictionClass, LruCache.class);
-    cache = new CacheBuilder(namespace)
+    Cache cache = new CacheBuilder(currentNamespace)
         .implementation(typeClass)
         .addDecorator(evictionClass)
         .clearInterval(flushInterval)
@@ -74,18 +71,20 @@
         .properties(props)
         .build();
     configuration.addCache(cache);
+    currentCache = cache;
+    return cache;
   }
 
-  //  <parameterMap id="" type="">
-  public void parameterMapStart(String id, Class parameterClass) {
-    id = applyNamespace(id);
-    parameterMappings = new ArrayList<ParameterMapping>();
-    parameterMapBuilder = new ParameterMap.Builder(configuration, id, 
parameterClass, parameterMappings);
+  public ParameterMap addParameterMap(String id, Class parameterClass, 
List<ParameterMapping> parameterMappings) {
+    id = applyCurrentNamespace(id);
+    ParameterMap.Builder parameterMapBuilder = new 
ParameterMap.Builder(configuration, id, parameterClass, parameterMappings);
+    ParameterMap parameterMap = parameterMapBuilder.build();
+    configuration.addParameterMap(parameterMap);
+    return parameterMap;
   }
 
-  //  <parameterMap id="" type="">
-  //    <param property="id" javaType="" jdbcType="" typeHandler="" mode="" 
scale="" resultMap=""/>
-  public void parameterMapping(
+  public ParameterMapping buildParameterMapping(
+      Class parameterType,
       String property,
       Class javaType,
       JdbcType jdbcType,
@@ -93,10 +92,10 @@
       ParameterMode parameterMode,
       Class typeHandler,
       Integer numericScale) {
-    resultMap = applyNamespace(resultMap);
+    resultMap = applyCurrentNamespace(resultMap);
 
-    Class resultType = parameterMapBuilder.type();
-    Class javaTypeClass = resolveParameterJavaType(resultType, property, 
javaType);
+    // Class parameterType = parameterMapBuilder.type();
+    Class javaTypeClass = resolveParameterJavaType(parameterType, property, 
javaType);
     TypeHandler typeHandlerInstance = (TypeHandler) 
resolveInstance(typeHandler);
 
     ParameterMapping.Builder builder = new 
ParameterMapping.Builder(configuration, property, javaTypeClass);
@@ -105,40 +104,31 @@
     builder.mode(parameterMode);
     builder.numericScale(numericScale);
     builder.typeHandler(typeHandlerInstance);
-    parameterMappings.add(builder.build());
-  }
-
-  //  </parameterMap>
-  public void parameterMapEnd() {
-    configuration.addParameterMap(parameterMapBuilder.build());
+    return builder.build();
   }
 
-  //  <resultMap id="" type="" extends="">
-  public void resultMapStart(
+  public ResultMap addResultMap(
       String id,
       Class type,
-      String extend) {
-    id = applyNamespace(id);
-    extend = applyNamespace(extend);
-
-    resultMappings = new ArrayList<ResultMapping>();
-    resultMapBuilder = new ResultMap.Builder(configuration, id, type, 
resultMappings);
+      String extend,
+      Discriminator discriminator,
+      List<ResultMapping> resultMappings) {
+    id = applyCurrentNamespace(id);
+    extend = applyCurrentNamespace(extend);
 
+    ResultMap.Builder resultMapBuilder = new ResultMap.Builder(configuration, 
id, type, resultMappings);
     if (extend != null) {
       ResultMap resultMap = configuration.getResultMap(extend);
       resultMappings.addAll(resultMap.getResultMappings());
     }
+    resultMapBuilder.discriminator(discriminator);
+    ResultMap resultMap = resultMapBuilder.build();
+    configuration.addResultMap(resultMap);
+    return resultMap;
   }
 
-  //  <constructor>
-  //    <id column="" javaType="" jdbcType="" typeHandler=""/>
-  //  <constructor>
-  //    <result column="" javaType="" jdbcType="" typeHandler=""/>
-  //  <id property="" column="" javaType="" jdbcType="" typeHandler=""/>
-  //  <result property="" column="" javaType="" jdbcType="" typeHandler=""/>
-  //  <collection property="" column="" javaType="" select="" resultMap=""/>
-  //  <association property="" column="" javaType="" select="" resultMap=""/>
-  public void resultMapping(
+  public ResultMapping buildResultMapping(
+      Class resultType,
       String property,
       String column,
       Class javaType,
@@ -147,7 +137,8 @@
       String nestedResultMap,
       Class typeHandler,
       List<ResultFlag> flags) {
-    ResultMapping resultMapping = buildResultMapping(
+    ResultMapping resultMapping = assembleResultMapping(
+        resultType,
         property,
         column,
         javaType,
@@ -156,17 +147,19 @@
         nestedResultMap,
         typeHandler,
         flags);
-    resultMappings.add(resultMapping);
+    return resultMapping;
   }
 
 
-  //  <discriminator column="" javaType="" jdbcType="">
-  public void resultMapDiscriminatorStart(
+  public Discriminator buildDiscriminator(
+      Class resultType,
       String column,
       Class javaType,
       JdbcType jdbcType,
-      Class typeHandler) {
-    ResultMapping resultMapping = buildResultMapping(
+      Class typeHandler,
+      Map<String, String> discriminatorMap) {
+    ResultMapping resultMapping = assembleResultMapping(
+        resultType,
         null,
         column,
         javaType,
@@ -175,33 +168,22 @@
         null,
         typeHandler,
         new ArrayList<ResultFlag>());
-    discriminatorMap = new HashMap<String, String>();
-    discriminatorBuilder = new Discriminator.Builder(configuration, 
resultMapping, discriminatorMap);
-  }
-
-  //  <discriminator column="" javaType="" jdbcType="">
-  //    <case value="" resultMap=""/>
-  public void resultMapDiscriminatorCase(
-      String value,
-      String resultMap) {
-    resultMap = applyNamespace(resultMap);
-    discriminatorMap.put(value, resultMap);
-  }
-
-  //  </discriminator>
-  public void resultMapDiscriminatorEnd() {
-    resultMapBuilder.discriminator(discriminatorBuilder.build());
-  }
-
-  //  </resultMap>
-  public void resultMapEnd() {
-    configuration.addResultMap(resultMapBuilder.build());
+    Map<String,String> namespaceDiscriminatorMap = new 
HashMap<String,String>();
+    for (Map.Entry<String,String> e: discriminatorMap.entrySet()) {
+      String resultMap = e.getValue();
+      resultMap = applyCurrentNamespace(resultMap);
+      namespaceDiscriminatorMap .put(e.getKey(), resultMap);
+    }
+    Discriminator.Builder discriminatorBuilder = new 
Discriminator.Builder(configuration, resultMapping, namespaceDiscriminatorMap);
+    return discriminatorBuilder.build();
   }
 
-  public void statement(
+  public MappedStatement addMappedStatement(
       String id,
       SqlSource sqlSource,
-      StatementType statementType, SqlCommandType sqlCommandType, Integer 
fetchSize,
+      StatementType statementType,
+      SqlCommandType sqlCommandType,
+      Integer fetchSize,
       Integer timeout,
       String parameterMap,
       Class parameterType,
@@ -212,7 +194,7 @@
       boolean useCache,
       KeyGenerator keyGenerator,
       String keyProperty) {
-    id = applyNamespace(id);
+    id = applyCurrentNamespace(id);
     boolean isSelect = sqlCommandType == SqlCommandType.SELECT;
 
     MappedStatement.Builder statementBuilder = new 
MappedStatement.Builder(configuration, id, sqlSource, sqlCommandType);
@@ -225,16 +207,11 @@
 
     setStatementParameterMap(parameterMap, parameterType, statementBuilder);
     setStatementResultMap(resultMap, resultType, resultSetType, 
statementBuilder);
-    setStatementCache(isSelect, flushCache, useCache, statementBuilder);
+    setStatementCache(isSelect, flushCache, useCache, currentCache, 
statementBuilder);
 
     MappedStatement statement = statementBuilder.build();
     configuration.addMappedStatement(statement);
-  }
-
-  public String applyNamespace(String base) {
-    if (base == null) return null;
-    if (base.contains(".")) return base;
-    return namespace + "." + base;
+    return statement;
   }
 
   private <T> T valueOrDefault(T value, T defaultValue) {
@@ -245,6 +222,7 @@
       boolean isSelect,
       boolean flushCache,
       boolean useCache,
+      Cache cache,
       MappedStatement.Builder statementBuilder) {
     flushCache = valueOrDefault(flushCache, !isSelect);
     useCache = valueOrDefault(useCache, isSelect);
@@ -257,7 +235,7 @@
       String parameterMap,
       Class parameterTypeClass,
       MappedStatement.Builder statementBuilder) {
-    parameterMap = applyNamespace(parameterMap);
+    parameterMap = applyCurrentNamespace(parameterMap);
 
     if (parameterMap != null) {
       
statementBuilder.parameterMap(configuration.getParameterMap(parameterMap));
@@ -277,7 +255,7 @@
       Class resultType,
       ResultSetType resultSetType,
       MappedStatement.Builder statementBuilder) {
-    resultMap = applyNamespace(resultMap);
+    resultMap = applyCurrentNamespace(resultMap);
 
     List<ResultMap> resultMaps = new ArrayList<ResultMap>();
     if (resultMap != null) {
@@ -305,7 +283,8 @@
     statementBuilder.timeout(timeout);
   }
 
-  private ResultMapping buildResultMapping(
+  private ResultMapping assembleResultMapping(
+      Class resultType,
       String property,
       String column,
       Class javaType,
@@ -314,16 +293,15 @@
       String nestedResultMap,
       Class typeHandler,
       List<ResultFlag> flags) {
-
-    nestedResultMap = applyNamespace(nestedResultMap);
-    Class resultType = resultMapBuilder.type();
+    // Class resultType = resultMapBuilder.type();
+    nestedResultMap = applyCurrentNamespace(nestedResultMap);
     Class javaTypeClass = resolveResultJavaType(resultType, property, 
javaType);
     TypeHandler typeHandlerInstance = (TypeHandler) 
resolveInstance(typeHandler);
 
     ResultMapping.Builder builder = new ResultMapping.Builder(configuration, 
property, column, javaTypeClass);
     builder.jdbcType(jdbcType);
-    builder.nestedQueryId(applyNamespace(nestedSelect));
-    builder.nestedResultMapId(applyNamespace(nestedResultMap));
+    builder.nestedQueryId(applyCurrentNamespace(nestedSelect));
+    builder.nestedResultMapId(applyCurrentNamespace(nestedResultMap));
     builder.typeHandler(typeHandlerInstance);
     builder.flags(flags == null ? new ArrayList<ResultFlag>() : flags);
 

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java?rev=780301&r1=780300&r2=780301&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java
 Sat May 30 17:14:37 2009
@@ -16,18 +16,18 @@
 
 public class MapperAnnotationBuilder {
 
-  private SequentialMapperBuilder sequentialBuilder;
+  private MapperBuilderAssistant assistant;
   private Class type;
 
   public MapperAnnotationBuilder(Configuration config, Class type) {
     String resource = type.getName().replace('.', '/') + ".java (best guess)";
-    this.sequentialBuilder = new SequentialMapperBuilder(config, resource);
+    this.assistant = new MapperBuilderAssistant(config, resource);
     this.type = type;
   }
 
   public void parse() {
     loadXmlResource();
-    sequentialBuilder.namespace(type.getName());
+    assistant.setCurrentNamespace(type.getName());
     parseCache();
     parseCacheRef();
     Method[] methods = type.getMethods();
@@ -46,7 +46,7 @@
       // ignore, resource is not required
     }
     if (xmlReader != null) {
-      XMLMapperBuilder xmlParser = new XMLMapperBuilder(xmlReader, 
sequentialBuilder.getConfiguration(), xmlResource, type.getName());
+      XMLMapperBuilder xmlParser = new XMLMapperBuilder(xmlReader, 
assistant.getConfiguration(), xmlResource, type.getName());
       xmlParser.parse();
     }
   }
@@ -54,14 +54,14 @@
   private void parseCache() {
     CacheDomain cacheDomain = (CacheDomain) 
type.getAnnotation(CacheDomain.class);
     if (cacheDomain != null) {
-      sequentialBuilder.cache(cacheDomain.implementation(), 
cacheDomain.eviction(), cacheDomain.flushInterval(), cacheDomain.size(), 
!cacheDomain.readWrite(), null);
+      assistant.useNewCache(cacheDomain.implementation(), 
cacheDomain.eviction(), cacheDomain.flushInterval(), cacheDomain.size(), 
!cacheDomain.readWrite(), null);
     }
   }
 
   private void parseCacheRef() {
     CacheDomainRef cacheDomainRef = (CacheDomainRef) 
type.getAnnotation(CacheDomainRef.class);
     if (cacheDomainRef != null) {
-      sequentialBuilder.cacheRef(cacheDomainRef.value().getName());
+      assistant.useCacheRef(cacheDomainRef.value().getName());
     }
   }
 
@@ -89,27 +89,28 @@
   }
 
   private void applyResultMap(String resultMapId, Class returnType, Arg[] 
args, Result[] results, TypeDiscriminator discriminator) {
-    sequentialBuilder.resultMapStart(resultMapId, returnType, null);
-    applyConstructorArgs(args);
-    applyResults(results);
-    applyDiscriminator(resultMapId, discriminator);
-    sequentialBuilder.resultMapEnd();
-    createDiscriminatorResultMaps(resultMapId, discriminator);
+    List<ResultMapping> resultMappings = new ArrayList<ResultMapping>();
+    applyConstructorArgs(args, returnType, resultMappings);
+    applyResults(results, returnType, resultMappings);
+    Discriminator disc = applyDiscriminator(resultMapId, returnType, 
discriminator);
+    assistant.addResultMap(resultMapId, returnType, null, disc, 
resultMappings);
+    createDiscriminatorResultMaps(resultMapId, returnType, discriminator);
   }
 
-  private void createDiscriminatorResultMaps(String resultMapId, 
TypeDiscriminator discriminator) {
+  private void createDiscriminatorResultMaps(String resultMapId, Class 
resultType, TypeDiscriminator discriminator) {
     if (discriminator != null) {
       for (Case c : discriminator.cases()) {
         String value = c.value();
         Class type = c.type();
         String caseResultMapId = resultMapId + "-" + value;
-        sequentialBuilder.resultMapStart(caseResultMapId, type, resultMapId);
+        List<ResultMapping> resultMappings = new ArrayList<ResultMapping>();
         for (Result result : c.results()) {
           List<ResultFlag> flags = new ArrayList<ResultFlag>();
           if (result.id()) {
             flags.add(ResultFlag.ID);
           }
-          sequentialBuilder.resultMapping(
+          ResultMapping resultMapping = assistant.buildResultMapping(
+              resultType,
               result.property(),
               result.column(),
               result.javaType() == void.class ? null : result.javaType(),
@@ -118,32 +119,33 @@
               null,
               result.typeHandler() == void.class ? null : result.typeHandler(),
               flags);
+          resultMappings.add(resultMapping);
         }
-        sequentialBuilder.resultMapEnd();
+        assistant.addResultMap(caseResultMapId, type, resultMapId, null, 
resultMappings);
       }
     }
   }
 
-  private void applyDiscriminator(String resultMapId, TypeDiscriminator 
discriminator) {
+  private Discriminator applyDiscriminator(String resultMapId, Class 
resultType, TypeDiscriminator discriminator) {
     if (discriminator != null) {
       String column = discriminator.column();
       Class javaType = discriminator.javaType() == void.class ? String.class : 
discriminator.javaType();
       JdbcType jdbcType = discriminator.jdbcType() == JdbcType.UNDEFINED ? 
null : discriminator.jdbcType();
       Class typeHandler = discriminator.typeHandler() == void.class ? null : 
discriminator.typeHandler();
       Case[] cases = discriminator.cases();
-
-      sequentialBuilder.resultMapDiscriminatorStart(column, javaType, 
jdbcType, typeHandler);
+      Map<String, String> discriminatorMap = new HashMap<String,String>();
       for (Case c : cases) {
         String value = c.value();
         String caseResultMapId = resultMapId + "-" + value;
-        sequentialBuilder.resultMapDiscriminatorCase(value, caseResultMapId);
+        discriminatorMap.put(value, caseResultMapId);
       }
-      sequentialBuilder.resultMapDiscriminatorEnd();
+      return assistant.buildDiscriminator(resultType, column, javaType, 
jdbcType, typeHandler, discriminatorMap);
     }
+    return null;
   }
 
   private void parseStatement(Method method) {
-    Configuration configuration = sequentialBuilder.getConfiguration();
+    Configuration configuration = assistant.getConfiguration();
     SqlSource sqlSource = getSqlSourceFromAnnotations(method);
     if (sqlSource != null) {
       Options options = method.getAnnotation(Options.class);
@@ -168,10 +170,12 @@
         keyGenerator = options.useGeneratedKeys() ? new Jdbc3KeyGenerator() : 
null;
         keyProperty = options.keyProperty();
       }
-      sequentialBuilder.statement(
+      assistant.addMappedStatement(
           mappedStatementId,
           sqlSource,
-          statementType, sqlCommandType, fetchSize,
+          statementType,
+          sqlCommandType,
+          fetchSize,
           timeout,
           null,                             // ParameterMapID
           getParameterType(method),
@@ -228,11 +232,11 @@
           sql.append(fragment);
           sql.append(" ");
         }
-        SqlSourceBuilder parser = new 
SqlSourceBuilder(sequentialBuilder.getConfiguration());
+        SqlSourceBuilder parser = new 
SqlSourceBuilder(assistant.getConfiguration());
         return parser.parse(sql.toString(), getParameterType(method));
       } else if (sqlProviderAnnotationType != null) {
         Annotation sqlProviderAnnotation = 
method.getAnnotation(sqlProviderAnnotationType);
-        return new ProviderSqlSource(sequentialBuilder.getConfiguration(), 
sqlProviderAnnotation);
+        return new ProviderSqlSource(assistant.getConfiguration(), 
sqlProviderAnnotation);
       }
       return null;
     } catch (Exception e) {
@@ -269,12 +273,14 @@
     return null;
   }
 
-  private void applyResults(Result[] results) {
+  private void applyResults(Result[] results, Class resultType, 
List<ResultMapping> resultMappings) {
     if (results.length > 0) {
       for (Result result : results) {
         ArrayList<ResultFlag> flags = new ArrayList<ResultFlag>();
         if (result.id()) flags.add(ResultFlag.ID);
-        sequentialBuilder.resultMapping(
+
+        ResultMapping resultMapping = assistant.buildResultMapping(
+            resultType,
             result.property(),
             result.column(),
             result.javaType() == void.class ? null : result.javaType(),
@@ -283,6 +289,7 @@
             null,
             result.typeHandler() == void.class ? null : result.typeHandler(),
             flags);
+        resultMappings.add(resultMapping);
       }
     }
   }
@@ -303,13 +310,14 @@
         || result.many().select().length() > 0;
   }
 
-  private void applyConstructorArgs(Arg[] args) {
+  private void applyConstructorArgs(Arg[] args, Class resultType, 
List<ResultMapping> resultMappings) {
     if (args.length > 0) {
       for (Arg arg : args) {
         ArrayList<ResultFlag> flags = new ArrayList<ResultFlag>();
         flags.add(ResultFlag.CONSTRUCTOR);
         if (arg.id()) flags.add(ResultFlag.ID);
-        sequentialBuilder.resultMapping(
+        ResultMapping resultMapping = assistant.buildResultMapping(
+            resultType,
             null,
             arg.column(),
             arg.javaType() == void.class ? null : arg.javaType(),
@@ -318,6 +326,7 @@
             null,
             arg.typeHandler() == void.class ? null : arg.typeHandler(),
             flags);
+        resultMappings.add(resultMapping);
       }
     }
   }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java?rev=780301&r1=780300&r2=780301&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java
 Sat May 30 17:14:37 2009
@@ -12,17 +12,17 @@
 public class XMLMapperBuilder extends BaseBuilder {
 
   private XPathParser parser;
-  private SequentialMapperBuilder sequentialBuilder;
+  private MapperBuilderAssistant assistant;
   private Map<String, XNode> sqlFragments = new HashMap<String, XNode>();
 
   public XMLMapperBuilder(Reader reader, Configuration configuration, String 
resource, String namespace) {
     this(reader, configuration, resource);
-    this.sequentialBuilder.namespace(namespace);
+    this.assistant.setCurrentNamespace(namespace);
   }
 
   public XMLMapperBuilder(Reader reader, Configuration configuration, String 
resource) {
     super(configuration);
-    this.sequentialBuilder = new SequentialMapperBuilder(configuration, 
resource);
+    this.assistant = new MapperBuilderAssistant(configuration, resource);
     this.parser = new XPathParser(reader,true,new 
XMLMapperEntityResolver(),configuration.getVariables());
   }
 
@@ -38,7 +38,7 @@
   private void configurationElement(XNode context) {
     try {
       String namespace = context.getStringAttribute("namespace");
-      sequentialBuilder.namespace(namespace);
+      assistant.setCurrentNamespace(namespace);
       cacheRefElement(context.evalNode("cache-ref"));
       cacheElement(context.evalNode("cache"));
       parameterMapElement(context.evalNodes("/mapper/parameterMap"));
@@ -53,7 +53,7 @@
 
   private void cacheRefElement(XNode context) {
     if (context != null) {
-      sequentialBuilder.cacheRef(context.getStringAttribute("namespace"));
+      assistant.useCacheRef(context.getStringAttribute("namespace"));
     }
   }
 
@@ -69,7 +69,7 @@
       Integer size = context.getIntAttribute("size");
       boolean readOnly = context.getBooleanAttribute("readOnly", false);
       Properties props = context.getChildrenAsProperties();
-      sequentialBuilder.cache(typeClass, evictionClass, flushInterval, size, 
readOnly, props);
+      assistant.useNewCache(typeClass, evictionClass, flushInterval, size, 
readOnly, props);
     }
   }
 
@@ -78,8 +78,8 @@
       String id = parameterMapNode.getStringAttribute("id");
       String type = parameterMapNode.getStringAttribute("type");
       Class parameterClass = resolveClass(type);
-      sequentialBuilder.parameterMapStart(id, parameterClass);
       List<XNode> parameterNodes = parameterMapNode.evalNodes("parameter");
+      List<ParameterMapping> parameterMappings = new 
ArrayList<ParameterMapping>();
       for (XNode parameterNode : parameterNodes) {
         String property = parameterNode.getStringAttribute("property");
         String javaType = parameterNode.getStringAttribute("javaType");
@@ -92,9 +92,10 @@
         Class javaTypeClass = resolveClass(javaType);
         JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
         Class typeHandlerClass = resolveClass(typeHandler);
-        sequentialBuilder.parameterMapping(property, javaTypeClass, 
jdbcTypeEnum, resultMap, modeEnum, typeHandlerClass, numericScale);
+        ParameterMapping parameterMapping = 
assistant.buildParameterMapping(parameterClass, property, javaTypeClass, 
jdbcTypeEnum, resultMap, modeEnum, typeHandlerClass, numericScale);
+        parameterMappings.add(parameterMapping);
       }
-      sequentialBuilder.parameterMapEnd();
+      assistant.addParameterMap(id, parameterClass, parameterMappings);
     }
   }
 
@@ -114,22 +115,23 @@
       }
       Class typeClass = resolveClass(type);
       processChildrenAsResultMap(resultMapNode);
-      sequentialBuilder.resultMapStart(id, typeClass, extend);
+      Discriminator discriminator = null;
+      List<ResultMapping> resultMappings = new ArrayList<ResultMapping>();
       List<XNode> resultChildren = resultMapNode.getChildren();
       for (XNode resultChild : resultChildren) {
         if ("constructor".equals(resultChild.getName())) {
-          processConstructorElement(resultChild);
+          processConstructorElement(resultChild,typeClass,resultMappings);
         } else if ("discriminator".equals(resultChild.getName())) {
-          processDiscriminatorElement(resultChild);
+          discriminator = processDiscriminatorElement(resultChild,typeClass);
         } else {
           ArrayList<ResultFlag> flags = new ArrayList<ResultFlag>();
           if ("id".equals(resultChild.getName())) {
             flags.add(ResultFlag.ID);
           }
-          buildResultMappingFromContext(resultChild, flags);
+          resultMappings.add(buildResultMappingFromContext(resultChild, 
typeClass, flags));
         }
       }
-      sequentialBuilder.resultMapEnd();
+    assistant.addResultMap(id, typeClass, extend, discriminator, 
resultMappings);
   }
 
   private void processChildrenAsResultMap(XNode resultChild) throws Exception {
@@ -141,7 +143,7 @@
     }
   }
 
-  private void processConstructorElement(XNode resultChild) throws Exception {
+  private void processConstructorElement(XNode resultChild, Class resultType, 
List<ResultMapping> resultMappings) throws Exception {
     List<XNode> argChildren = resultChild.getChildren();
     for (XNode argChild : argChildren) {
       ArrayList<ResultFlag> flags = new ArrayList<ResultFlag>();
@@ -149,11 +151,11 @@
       if ("idArg".equals(argChild.getName())) {
         flags.add(ResultFlag.ID);
       }
-      buildResultMappingFromContext(argChild, flags);
+      resultMappings.add(buildResultMappingFromContext(argChild, resultType, 
flags));
     }
   }
 
-  private void processDiscriminatorElement(XNode context) throws Exception {
+  private Discriminator processDiscriminatorElement(XNode context, Class 
resultType) throws Exception {
     String column = context.getStringAttribute("column");
     String javaType = context.getStringAttribute("javaType");
     String jdbcType = context.getStringAttribute("jdbcType");
@@ -161,14 +163,14 @@
     Class javaTypeClass = resolveClass(javaType);
     Class typeHandlerClass = resolveClass(typeHandler);
     JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
-    sequentialBuilder.resultMapDiscriminatorStart(column, javaTypeClass, 
jdbcTypeEnum, typeHandlerClass);
+    Map<String, String> discriminatorMap = new HashMap<String,String>();
     for (XNode caseChild : context.getChildren()) {
       processChildrenAsResultMap(caseChild);
       String value = caseChild.getStringAttribute("value");
       String resultMap = caseChild.getStringAttribute("resultMap");
-      sequentialBuilder.resultMapDiscriminatorCase(value, resultMap);
+      discriminatorMap.put(value, resultMap);
     }
-    sequentialBuilder.resultMapDiscriminatorEnd();
+    return assistant.buildDiscriminator(resultType, column, javaTypeClass, 
jdbcTypeEnum, typeHandlerClass, discriminatorMap);
   }
 
   private void sqlElement(List<XNode> list) throws Exception {
@@ -180,12 +182,12 @@
 
   private void buildStatementFromContext(List<XNode> list) {
     for (XNode context : list) {
-      final XMLStatementBuilder statementParser = new 
XMLStatementBuilder(configuration, sequentialBuilder, this);
+      final XMLStatementBuilder statementParser = new 
XMLStatementBuilder(configuration, assistant, this);
       statementParser.parseStatementNode(context);
     }
   }
 
-  private void buildResultMappingFromContext(XNode context, 
ArrayList<ResultFlag> flags) {
+  private ResultMapping buildResultMappingFromContext(XNode context, Class 
resultType, ArrayList<ResultFlag> flags) {
     String property = context.getStringAttribute("property");
     String column = context.getStringAttribute("column");
     String javaType = context.getStringAttribute("javaType");
@@ -196,11 +198,11 @@
     Class javaTypeClass = resolveClass(javaType);
     Class typeHandlerClass = resolveClass(typeHandler);
     JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
-    sequentialBuilder.resultMapping(property, column, javaTypeClass, 
jdbcTypeEnum, nestedSelect, nestedResultMap, typeHandlerClass, flags);
+    return assistant.buildResultMapping(resultType, property, column, 
javaTypeClass, jdbcTypeEnum, nestedSelect, nestedResultMap, typeHandlerClass, 
flags);
   }
 
   private void bindMapperForNamespace() {
-    String namespace = sequentialBuilder.getNamespace();
+    String namespace = assistant.getCurrentNamespace();
     if (namespace != null) {
       Class boundType = null;
       try {

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java?rev=780301&r1=780300&r2=780301&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java
 Sat May 30 17:14:37 2009
@@ -5,16 +5,17 @@
 import org.apache.ibatis.executor.keygen.*;
 import org.apache.ibatis.mapping.*;
 import org.apache.ibatis.parsing.XNode;
+import org.apache.ibatis.cache.Cache;
 import org.w3c.dom.*;
 
 import java.util.*;
 
 public class XMLStatementBuilder extends BaseBuilder {
 
-  private SequentialMapperBuilder sequentialBuilder;
+  private MapperBuilderAssistant sequentialBuilder;
   private XMLMapperBuilder xmlMapperParser;
 
-  public XMLStatementBuilder(Configuration configuration, 
SequentialMapperBuilder sequentialBuilder, XMLMapperBuilder xmlMapperParser) {
+  public XMLStatementBuilder(Configuration configuration, 
MapperBuilderAssistant sequentialBuilder, XMLMapperBuilder xmlMapperParser) {
     super(configuration);
     this.sequentialBuilder = sequentialBuilder;
     this.xmlMapperParser = xmlMapperParser;
@@ -55,8 +56,9 @@
         ? new Jdbc3KeyGenerator() : new NoKeyGenerator();
     }
 
-    sequentialBuilder.statement(id, sqlSource, statementType, sqlCommandType, 
fetchSize, timeout, parameterMap, parameterTypeClass,
-        resultMap, resultTypeClass, resultSetTypeEnum, flushCache, useCache, 
keyGenerator,keyProperty);
+    sequentialBuilder.addMappedStatement(id, sqlSource, statementType, 
sqlCommandType,
+        fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, 
resultTypeClass,
+        resultSetTypeEnum, flushCache, useCache, keyGenerator,keyProperty);
   }
 
 
@@ -128,11 +130,11 @@
       SqlSource sqlSource = new DynamicSqlSource(configuration, rootSqlNode);
       SqlCommandType sqlCommandType = SqlCommandType.SELECT;
 
-      sequentialBuilder.statement(id, sqlSource, statementType, 
sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClass,
-          resultMap, resultTypeClass, resultSetTypeEnum, flushCache, useCache,
-          keyGenerator,keyProperty);
+      sequentialBuilder.addMappedStatement(id, sqlSource, statementType, 
sqlCommandType,
+          fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, 
resultTypeClass,
+          resultSetTypeEnum, flushCache, useCache, keyGenerator,keyProperty);
 
-      MappedStatement keyStatement = 
configuration.getMappedStatement(sequentialBuilder.applyNamespace(id));
+      MappedStatement keyStatement = 
configuration.getMappedStatement(sequentialBuilder.applyCurrentNamespace(id));
 
       configuration.addKeyGenerator(id, new 
SelectKeyGenerator(keyStatement,executeBefore));
     }
@@ -143,7 +145,7 @@
       String refid = nodeToHandle.getStringAttribute("refid");
       XNode includeNode = xmlMapperParser.getSqlFragment(refid);
       if (includeNode == null) {
-        String nsrefid = sequentialBuilder.applyNamespace(refid);
+        String nsrefid = sequentialBuilder.applyCurrentNamespace(refid);
         includeNode = xmlMapperParser.getSqlFragment(nsrefid);
         if (includeNode == null) {
           throw new BulderException("Could not find SQL statement to include 
with refid '" + refid + "'");

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/NestedBlogMapper.xml
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/NestedBlogMapper.xml?rev=780301&r1=780300&r2=780301&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/NestedBlogMapper.xml
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/NestedBlogMapper.xml
 Sat May 30 17:14:37 2009
@@ -4,7 +4,7 @@
     PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
     "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd";>
 
-<mapper namespace="domain.blog.mappers.BlogMapper">
+<mapper namespace="domain.blog.mappers.NestedBlogMapper">
 
   <resultMap id="blogJoinedWithPostsAndAuthor" type="Blog">
     <id property="id" column="blog_id"/>


Reply via email to