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


Reply via email to