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