Author: cbegin
Date: Mon Sep 1 17:18:00 2008
New Revision: 691084
URL: http://svn.apache.org/viewvc?rev=691084&view=rev
Log:
More skeleton mapper config code
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/BaseParser.java
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/MapperConfigParser.java
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/MapperParser.java
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/BaseParser.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/BaseParser.java?rev=691084&r1=691083&r2=691084&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/BaseParser.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/BaseParser.java
Mon Sep 1 17:18:00 2008
@@ -37,6 +37,7 @@
}
protected JdbcType resolveJdbcType(String alias) {
+ if (alias == null) return null;
try {
return JdbcType.valueOf(resolveAlias(alias));
} catch (IllegalArgumentException e) {
@@ -45,6 +46,7 @@
}
protected Class resolveClass(String alias) {
+ if (alias == null) return null;
try {
return Class.forName(resolveAlias(alias));
} catch (ClassNotFoundException e) {
@@ -52,6 +54,16 @@
}
}
+ protected Object resolveInstance(String alias) {
+ if (alias == null) return null;
+ try {
+ Class type = resolveClass(alias);
+ return type.newInstance();
+ } catch (Exception e) {
+ throw new RuntimeException("Error instantiating class. Cause: " + e, e);
+ }
+ }
+
protected String resolveAlias(String alias) {
return typeAliasRegistry.resolveAlias(alias);
}
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/MapperConfigParser.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/MapperConfigParser.java?rev=691084&r1=691083&r2=691084&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/MapperConfigParser.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/MapperConfigParser.java
Mon Sep 1 17:18:00 2008
@@ -35,7 +35,7 @@
return configuration;
}
- // <typeAlias alias="" type=""/>
+ // <typeAlias alias="" type=""/>
@Nodelet("/configuration/typeAliases/typeAlias")
public void typeAliasElement(NodeletContext context) throws Exception {
String alias = context.getStringAttribute("alias");
@@ -43,8 +43,8 @@
typeAliasRegistry.registerAlias(alias, type);
}
- // <plugin interceptor="">
- // <property name="" value=""/>
+ // <plugin interceptor="">
+ // <property name="" value=""/>
@Nodelet("/configuration/plugins/plugin")
public void pluginElement(NodeletContext context) throws Exception {
String interceptor = context.getStringAttribute("interceptor");
@@ -54,8 +54,8 @@
configuration.addInterceptor(interceptorInstance);
}
- // <objectFactory type="">
- // <property name="" value=""/>
+ // <objectFactory type="">
+ // <property name="" value=""/>
@Nodelet("/configuration/objectFactory")
public void objectFactoryElement(NodeletContext context) throws Exception {
String type = context.getStringAttribute("type");
@@ -65,8 +65,8 @@
configuration.setObjectFactory(factory);
}
- // <settings>
- // <setting name="" value=""/>
+ // <settings>
+ // <setting name="" value=""/>
@Nodelet("/configuration/settings")
public void settingsElement(NodeletContext context) throws Exception {
Properties props = context.getChildrenAsProperties();
@@ -86,22 +86,22 @@
}
}
- // <environments default="development">
+ // <environments default="development">
@Nodelet("/configuration/environments")
public void environmentsElement(NodeletContext context) throws Exception {
String defaultEnv = context.getStringAttribute("default","default");
configuration.setDefaultEnvironment(defaultEnv);
}
- // <environment id="development">
+ // <environment id="development">
@Nodelet("/configuration/environments/environment")
public void environmentElement(NodeletContext context) throws Exception {
String id = context.getStringAttribute("id","default");
environmentBuilder = new Environment.Builder(id);
}
- // <transactionManager type="JDBC|JTA|EXTERNAL">
- // <property name="" value=""/>
+ // <transactionManager type="JDBC|JTA|EXTERNAL">
+ // <property name="" value=""/>
@Nodelet("/configuration/environments/environment/transactionManager")
public void transactionManagerElement(NodeletContext context) throws
Exception {
String type = context.getStringAttribute("type");
@@ -113,8 +113,8 @@
environmentBuilder.transactionManager(factory.getTransactionManager());
}
- // <dataSource type="POOLED|UNPOOLED|JNDI">
- // <property name="" value=""/>
+ // <dataSource type="POOLED|UNPOOLED|JNDI">
+ // <property name="" value=""/>
@Nodelet("/configuration/environments/environment/dataSource")
public void dataSourceElement(NodeletContext context) throws Exception {
String type = context.getStringAttribute("type");
@@ -126,13 +126,13 @@
environmentBuilder.dataSource(factory.getDataSource());
}
- // </environment>
+ // </environment>
@Nodelet("/configuration/environments/environment/end()")
public void environmentClosingElement(NodeletContext context) throws
Exception {
configuration.addEnvironment(environmentBuilder.build());
}
- // <typeHandler javaType="" jdbcType="" handler=""/>
+ // <typeHandler javaType="" jdbcType="" handler=""/>
@Nodelet("/configuration/typeHandlers/typeHandler")
public void typeHandlerElement(NodeletContext context) throws Exception {
String javaType = context.getStringAttribute("javaType");
@@ -149,7 +149,7 @@
}
}
- // <mapper url="" resource="resources/AnotherMapper.xml"/>
+ // <mapper url="" resource="resources/AnotherMapper.xml"/>
@Nodelet("/configuration/mappers/mapper")
public void mapperElement(NodeletContext context) throws Exception {
String resource = context.getStringAttribute("resource");
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/MapperParser.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/MapperParser.java?rev=691084&r1=691083&r2=691084&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/MapperParser.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/main/java/org/apache/ibatis/monarch/builder/MapperParser.java
Mon Sep 1 17:18:00 2008
@@ -1,11 +1,18 @@
package org.apache.ibatis.monarch.builder;
-import org.apache.ibatis.xml.NodeletParser;
+import org.apache.ibatis.mapping.*;
+import org.apache.ibatis.reflection.MetaClass;
+import org.apache.ibatis.type.*;
+import org.apache.ibatis.xml.*;
import java.io.Reader;
+import java.util.*;
public class MapperParser extends BaseParser {
+ private ResultMap.Builder resultMapBuilder;
+ private List<ResultMapping> resultMappings;
+
public MapperParser(Reader reader, MonarchConfiguration configuration) {
this.reader = reader;
@@ -19,6 +26,136 @@
this.parser.setEntityResolver(new MapperEntityResolver());
}
+ // <resultMap id="" type="" extends="">
+ @Nodelet("/mapper/resultMap")
+ public void resultMapElement(NodeletContext context) throws Exception {
+ String id = context.getStringAttribute("id");
+ String type = context.getStringAttribute("type");
+ String extend = context.getStringAttribute("extends");
+
+ Class typeClass = resolveClass(type);
+
+ resultMappings = new ArrayList<ResultMapping>();
+ resultMapBuilder = new ResultMap.Builder(id, typeClass, resultMappings);
+
+ if (extend != null) {
+ ResultMap resultMap = configuration.getResultMap(extend);
+ if (resultMap == null) {
+ throw new RuntimeException("ResultMap named in extends attribute of "
+ id + "does not exist or is not defined yet.");
+ }
+ resultMappings.addAll(resultMap.getResultMappings());
+ }
+ }
+
+ // <constructor>
+ // <id column="" javaType="" jdbcType="" typeHandler=""/>
+ @Nodelet("/mapper/resultMap/constructor/id")
+ public void resultMapConstructorIdElement(NodeletContext context) throws
Exception {
+ ResultMapping.Builder builder = buildMappingFromContext(context);
+ builder.flags(new ArrayList<ResultFlag>(){{
+ add(ResultFlag.CONSTRUCTOR);
+ add(ResultFlag.ID);
+ }});
+ resultMappings.add(builder.build());
+ }
+
+ // <constructor>
+ // <result column="" javaType="" jdbcType="" typeHandler=""/>
+ @Nodelet("/mapper/resultMap/constructor/result")
+ public void resultMapConstructorResultElement(NodeletContext context) throws
Exception {
+ ResultMapping.Builder builder = buildMappingFromContext(context);
+ builder.flags(new ArrayList<ResultFlag>(){{
+ add(ResultFlag.CONSTRUCTOR);
+ }});
+ resultMappings.add(builder.build());
+ }
+
+ // <id property="" column="" javaType="" jdbcType="" typeHandler=""/>
+ @Nodelet("/mapper/resultMap/id")
+ public void resultMapIdElement(NodeletContext context) throws Exception {
+ ResultMapping.Builder builder = buildMappingFromContext(context);
+ builder.flags(new ArrayList<ResultFlag>(){{
+ add(ResultFlag.ID);
+ }});
+ resultMappings.add(builder.build());
+ }
+
+ // <result property="" column="" javaType="" jdbcType="" typeHandler=""/>
+ @Nodelet("/mapper/resultMap/result")
+ public void resultMapResultElement(NodeletContext context) throws Exception {
+ ResultMapping.Builder builder = buildMappingFromContext(context);
+ resultMappings.add(builder.build());
+ }
+
+ // <collection property="" column="" javaType="" select="" resultMap=""/>
+ @Nodelet("/mapper/resultMap/result")
+ public void resultMapCollectionElement(NodeletContext context) throws
Exception {
+ ResultMapping.Builder builder = buildMappingFromContext(context);
+ resultMappings.add(builder.build());
+ }
+
+ // </resultMap>
+ @Nodelet("/mapper/resultMap/end()")
+ public void resultMapClosingElement(NodeletContext context) throws Exception
{
+ configuration.addResultMap(resultMapBuilder.build());
+ }
+
+ private ResultMapping.Builder buildMappingFromContext(NodeletContext
context) {
+ 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");
+
+ Class resultType = resultMapBuilder.type();
+ Class javaTypeClass = resolveResultJavaType(resultType, property,
javaType);
+ TypeHandler typeHandlerInstance = resolveResultTypeHandler(context,
resultType);
+ JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
+
+ ResultMapping.Builder builder = new ResultMapping.Builder(property,
column, typeHandlerInstance);
+ builder.javaType(javaTypeClass);
+ builder.jdbcType(jdbcTypeEnum);
+ builder.nestedQueryId(nestedSelect);
+ builder.nestedResultMapId(nestedResultMap);
+ return builder;
+ }
+
+ private Class resolveResultJavaType(Class resultType, String property,
String javaType) {
+ Class javaTypeClass = resolveClass(javaType);
+ if (javaTypeClass == null) {
+ MetaClass metaResultType = MetaClass.forClass(resultType);
+ javaTypeClass = metaResultType.getSetterType(property);
+ }
+ if (javaTypeClass == null) {
+ throw new RuntimeException("Could not determine javaType for result.
Specify property or javaType attribute.");
+ }
+ return javaTypeClass;
+ }
+
+ private TypeHandler resolveResultTypeHandler(NodeletContext context, Class
resultType) {
+ String property = context.getStringAttribute("property");
+ String javaType = context.getStringAttribute("javaType");
+ String jdbcType = context.getStringAttribute("jdbcType");
+ String typeHandler = context.getStringAttribute("typeHandler");
+ JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
+ Class javaTypeClass = resolveClass(javaType);
+ TypeHandler typeHandlerInstance = (TypeHandler)
resolveInstance(typeHandler);
+ if (typeHandler == null) {
+ if (javaTypeClass == null) {
+ if (property != null) {
+ Class propertyType =
resolveResultJavaType(resultType,property,javaType);
+ typeHandlerInstance =
typeHandlerRegistry.getTypeHandler(propertyType, jdbcTypeEnum);
+ }
+ } else {
+ typeHandlerInstance =
typeHandlerRegistry.getTypeHandler(javaTypeClass, jdbcTypeEnum);
+ }
+ }
+ if (typeHandlerInstance == null) {
+ throw new RuntimeException("Could not determine typehandler for result.
Specify property, javaType or typeHandler attribute.");
+ }
+ return typeHandlerInstance;
+ }
}
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml?rev=691084&r1=691083&r2=691084&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
Mon Sep 1 17:18:00 2008
@@ -1,4 +1,5 @@
<mapper type="com.domain.PersonMapper">
+
<defaultCache cacheType="MyLRU" cacheDomain="PersonMapper"/>
<resultMap id="" type="" extends="">
@@ -20,6 +21,7 @@
select * from PERSON order by
${opts.order,javaType="",jdbcType="",typeHandler="",mode="",scale="",resultMap=""}
</select>
+
<select id="selectPersonInDept" cacheType="" cacheDomain=""
flushCache="" parameterType="" resultType=""
resultMap="">