Author: cbegin
Date: Mon Sep  1 22:10:25 2008
New Revision: 691106

URL: http://svn.apache.org/viewvc?rev=691106&view=rev
Log:
added parameter map and statement builders

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/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=691106&r1=691105&r2=691106&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 22:10:25 2008
@@ -3,6 +3,8 @@
 import org.apache.ibatis.type.*;
 import org.apache.ibatis.xml.NodeletParser;
 import org.apache.ibatis.mapping.Configuration;
+import org.apache.ibatis.mapping.ResultSetType;
+import org.apache.ibatis.mapping.ParameterMode;
 
 import java.io.Reader;
 import java.util.Properties;
@@ -41,7 +43,25 @@
     try {
       return JdbcType.valueOf(resolveAlias(alias));
     } catch (IllegalArgumentException e) {
-      throw new RuntimeException("Error resolving JDBC type. Cause: " + e, e);
+      throw new RuntimeException("Error resolving JdbcType. Cause: " + e, e);
+    }
+  }
+
+  protected ResultSetType resolveResultSetType(String alias) {
+    if (alias == null) return null;
+    try {
+      return ResultSetType.valueOf(resolveAlias(alias));
+    } catch (IllegalArgumentException e) {
+      throw new RuntimeException("Error resolving ResultSetType. Cause: " + e, 
e);
+    }
+  }
+
+  protected ParameterMode resolveParameterMode(String alias) {
+    if (alias == null) return null;
+    try {
+      return ParameterMode.valueOf(resolveAlias(alias));
+    } catch (IllegalArgumentException e) {
+      throw new RuntimeException("Error resolving ParameterMode. Cause: " + e, 
e);
     }
   }
 

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=691106&r1=691105&r2=691106&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 22:10:25 2008
@@ -10,6 +10,9 @@
 
 public class MapperParser extends BaseParser {
 
+  private ParameterMap.Builder parameterMapBuilder;
+  private List<ParameterMapping> parameterMappings;
+
   private ResultMap.Builder resultMapBuilder;
   private List<ResultMapping> resultMappings;
 
@@ -29,6 +32,31 @@
     this.parser.setEntityResolver(new MapperEntityResolver());
   }
 
+  //  <parameterMap id="" type="">
+  @Nodelet("/mapper/parameterMap")
+  public void parameterMapElement(NodeletContext context) throws Exception {
+    String id = context.getStringAttribute("id");
+    String type = context.getStringAttribute("type");
+    Class parameterClass = resolveClass(type);
+    parameterMappings = new ArrayList<ParameterMapping>();
+    parameterMapBuilder = new ParameterMap.Builder(id, parameterClass, 
parameterMappings);
+  }
+
+  //  <parameterMap id="" type="">
+  //    <param property="id" javaType="" jdbcType="" typeHandler="" mode="" 
scale="" resultMap=""/>
+  @Nodelet("/mapper/parameterMap/parameter")
+  public void parameterMapParameterElement(NodeletContext context) throws 
Exception {
+    ParameterMapping.Builder builder = 
buildParameterMappingFromContext(context);
+    ParameterMapping parameterMapping = builder.build();
+    parameterMappings.add(parameterMapping);
+  }
+
+  //  </parameterMap>
+  @Nodelet("/mapper/parameterMap/end()")
+  public void parameterMapClosingElement(NodeletContext context) throws 
Exception {
+    configuration.addParameterMap(parameterMapBuilder.build());
+  }
+
   //  <resultMap id="" type="" extends="">
   @Nodelet("/mapper/resultMap")
   public void resultMapElement(NodeletContext context) throws Exception {
@@ -54,11 +82,13 @@
   //    <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);
-    }});
+    ResultMapping.Builder builder = buildResultMappingFromContext(context);
+    builder.flags(new ArrayList<ResultFlag>() {
+      {
+        add(ResultFlag.CONSTRUCTOR);
+        add(ResultFlag.ID);
+      }
+    });
     resultMappings.add(builder.build());
   }
 
@@ -66,43 +96,47 @@
   //    <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);
-    }});
+    ResultMapping.Builder builder = buildResultMappingFromContext(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);
-    }});
+    ResultMapping.Builder builder = buildResultMappingFromContext(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);
+    ResultMapping.Builder builder = buildResultMappingFromContext(context);
     resultMappings.add(builder.build());
   }
 
   //  <collection property="" column="" javaType="" select="" resultMap=""/>
   @Nodelet("/mapper/resultMap/collection")
   public void resultMapCollectionElement(NodeletContext context) throws 
Exception {
-    ResultMapping.Builder builder = buildMappingFromContext(context);
+    ResultMapping.Builder builder = buildResultMappingFromContext(context);
     resultMappings.add(builder.build());
   }
 
   //  <discriminator column="" javaType="" jdbcType="">
   @Nodelet("/mapper/resultMap/discriminator")
   public void resultMapDiscriminatorElement(NodeletContext context) throws 
Exception {
-    ResultMapping.Builder resultMappingBuilder = 
buildMappingFromContext(context);
-    discriminatorMap = new HashMap<String,String>();
-    discriminatorBuilder = new 
Discriminator.Builder(resultMappingBuilder.build(),discriminatorMap);
+    ResultMapping.Builder resultMappingBuilder = 
buildResultMappingFromContext(context);
+    discriminatorMap = new HashMap<String, String>();
+    discriminatorBuilder = new 
Discriminator.Builder(resultMappingBuilder.build(), discriminatorMap);
   }
 
   //  <discriminator column="" javaType="" jdbcType="">
@@ -111,7 +145,7 @@
   public void resultMapDiscriminatorCaseElement(NodeletContext context) throws 
Exception {
     String value = context.getStringAttribute("value");
     String resultMap = context.getStringAttribute("resultMap");
-    discriminatorMap.put(value,resultMap);
+    discriminatorMap.put(value, resultMap);
   }
 
   //  </discriminator>
@@ -126,7 +160,82 @@
     configuration.addResultMap(resultMapBuilder.build());
   }
 
-  private ResultMapping.Builder buildMappingFromContext(NodeletContext 
context) {
+  //  <select id="selectAllPeople" cacheType="" cacheDomain=""
+  //          flushCache="" parameterType="" resultType="" resultMap="">
+  @Nodelet("/mapper/select")
+  public void selectElement(NodeletContext context) throws Exception {
+    String id = context.getStringAttribute("id");
+    String sql = context.getStringBody();
+    SqlSource sqlSource = new BasicSqlSource(sql);
+
+    MappedStatement.Builder statementBuilder = new 
MappedStatement.Builder(configuration, id, sqlSource);
+    Integer fetchSize = context.getIntAttribute("fetchSize", null);
+    statementBuilder.fetchSize(fetchSize);
+    statementBuilder.statementType(StatementType.PREPARED);
+    setStatementTimeout(context, statementBuilder);
+
+    setStatementParameterMap(context, statementBuilder);
+    setStatementResultMap(context, statementBuilder);
+    setStatementCache(context, statementBuilder);
+  }
+
+  private void setStatementCache(NodeletContext context, 
MappedStatement.Builder statementBuilder) {
+    //TODO: Implement cache templates
+    String cacheType = context.getStringAttribute("cacheType");
+    String flushCache = context.getStringAttribute("flushCache");
+    statementBuilder.cache(null);
+  }
+
+  private void setStatementParameterMap(NodeletContext context, 
MappedStatement.Builder statementBuilder) {
+    String parameterMap = context.getStringAttribute("parameterMap");
+    String parameterType = context.getStringAttribute("parameterType");
+    if (parameterMap != null) {
+      
statementBuilder.parameterMap(configuration.getParameterMap(parameterMap));
+    } else if (parameterType != null) {
+      //TODO: Parse Paremeter Mappings from SQL
+      List<ParameterMapping> parameterMappings = new 
ArrayList<ParameterMapping>();
+      Class parameterTypeClass = resolveClass(parameterType);
+      ParameterMap.Builder inlineParameterMapBuilder = new 
ParameterMap.Builder(
+          context.getStringAttribute("id") + "-inline-parameter-map",
+          parameterTypeClass,
+          parameterMappings);
+      statementBuilder.parameterMap(inlineParameterMapBuilder.build());
+    }
+  }
+
+  private void setStatementResultMap(NodeletContext context, 
MappedStatement.Builder statementBuilder) {
+    String resultMap = context.getStringAttribute("resultMap");
+    String resultType = context.getStringAttribute("resultType");
+    List<ResultMap> resultMaps = new ArrayList<ResultMap>();
+    if (resultMap != null) {
+      String[] resultMapNames = resultMap.split(",");
+      for (String resultMapName : resultMapNames) {
+        resultMaps.add(configuration.getResultMap(resultMapName.trim()));
+      }
+    } else if (resultType != null) {
+      Class resultTypeClass = resolveClass(resultType);
+      ResultMap.Builder inlineResultMapBuilder = new ResultMap.Builder(
+          context.getStringAttribute("id")+ "-inline-result-map",
+          resultTypeClass,
+          new ArrayList<ResultMapping>());
+      resultMaps.add(inlineResultMapBuilder.build());
+    }
+    statementBuilder.resultMaps(resultMaps);
+
+    String resultSetType = context.getStringAttribute("resultSetType");
+    ResultSetType resultSetTypeEnum = resolveResultSetType(resultSetType);
+    statementBuilder.resultSetType(resultSetTypeEnum);
+  }
+
+  private void setStatementTimeout(NodeletContext context, 
MappedStatement.Builder statementBuilder) {
+    Integer timeout = context.getIntAttribute("timeout", null);
+    if (timeout != null) {
+      timeout = configuration.getDefaultStatementTimeout();
+    }
+    statementBuilder.timeout(timeout);
+  }
+
+  private ResultMapping.Builder buildResultMappingFromContext(NodeletContext 
context) {
     String property = context.getStringAttribute("property");
     String column = context.getStringAttribute("column");
     String javaType = context.getStringAttribute("javaType");
@@ -171,7 +280,68 @@
     if (typeHandler == null) {
       if (javaTypeClass == null) {
         if (property != null) {
-          Class propertyType = 
resolveResultJavaType(resultType,property,javaType);
+          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;
+  }
+
+  private ParameterMapping.Builder 
buildParameterMappingFromContext(NodeletContext context) {
+    String property = context.getStringAttribute("property");
+    String javaType = context.getStringAttribute("javaType");
+    String jdbcType = context.getStringAttribute("jdbcType");
+    String resultMap = context.getStringAttribute("resultMap");
+    String mode = context.getStringAttribute("mode");
+    Integer numericScale = context.getIntAttribute("numericScale",null);
+
+    ParameterMode modeEnum = resolveParameterMode(mode);
+
+    Class resultType = resultMapBuilder.type();
+    Class javaTypeClass = resolveParameterJavaType(resultType, property, 
javaType);
+    TypeHandler typeHandlerInstance = resolveParameterTypeHandler(context, 
resultType);
+    JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
+
+    ParameterMapping.Builder builder = new ParameterMapping.Builder(property, 
typeHandlerInstance);
+    builder.javaType(javaTypeClass);
+    builder.jdbcType(jdbcTypeEnum);
+    builder.resultMapId(resultMap);
+    builder.mode(modeEnum);
+    builder.numericScale(numericScale);
+
+    return builder;
+  }
+
+  private Class resolveParameterJavaType(Class resultType, String property, 
String javaType) {
+    Class javaTypeClass = resolveClass(javaType);
+    if (javaTypeClass == null) {
+      MetaClass metaResultType = MetaClass.forClass(resultType);
+      javaTypeClass = metaResultType.getGetterType(property);
+    }
+    if (javaTypeClass == null) {
+      throw new RuntimeException("Could not determine javaType for result.  
Specify property or javaType attribute.");
+    }
+    return javaTypeClass;
+  }
+
+  private TypeHandler resolveParameterTypeHandler(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 = resolveParameterJavaType(resultType, property, 
javaType);
           typeHandlerInstance = 
typeHandlerRegistry.getTypeHandler(propertyType, jdbcTypeEnum);
         }
       } else {

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=691106&r1=691105&r2=691106&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 22:10:25 2008
@@ -15,6 +15,13 @@
     </discriminator>
   </resultMap>
 
+  <parameterMap id="" type="">
+    <param property="id" javaType="" jdbcType="" typeHandler=""
+           mode="" scale="" resultMap=""/>
+    <param property="dept" javaType="" jdbcType="" typeHandler=""
+           mode="" scale="" resultMap=""/>
+  </parameterMap>
+
   <select id="selectAllPeople" cacheType="" cacheDomain=""
           flushCache="" parameterType="" resultType="" resultMap="">
     select * from PERSON order by
@@ -24,10 +31,6 @@
   <select id="selectPersonInDept" cacheType="" cacheDomain=""
           flushCache="" parameterType="" resultType=""
           resultMap="">
-    <param property="id" javaType="" jdbcType="" typeHandler=""
-           mode="" scale="" resultMap=""/>
-    <param property="dept" javaType="" jdbcType="" typeHandler=""
-           mode="" scale="" resultMap=""/>
     select * from PERSON
     where PERSON_ID = #param.id --or #{params.id}
     <!-- if(expr) foreach(x,expr) dynamic() propavail(name)


Reply via email to