Author: cbegin
Date: Sun Jun 10 15:19:10 2007
New Revision: 545954

URL: http://svn.apache.org/viewvc?view=rev&rev=545954
Log:
improved type safety for parameter map config

Modified:
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/conifg/ParameterMapConfig.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/conifg/SqlMapConfiguration.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMap.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMapping.java

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java?view=diff&rev=545954&r1=545953&r2=545954
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java
 Sun Jun 10 15:19:10 2007
@@ -143,7 +143,8 @@
   private void addParameterMapNodelets() {
     parser.addNodelet("/sqlMap/parameterMap/end()", new Nodelet() {
       public void process(Node node) throws Exception {
-        state.getParamConfig().saveParameterMap();
+        state.getConfig().getErrorContext().setMoreInfo(null);
+        state.getConfig().getErrorContext().setObjectId(null);
         state.setParamConfig(null);
       }
     });
@@ -152,8 +153,14 @@
         Properties attributes = NodeletUtils.parseAttributes(node, 
state.getGlobalProps());
         String id = state.applyNamespace(attributes.getProperty("id"));
         String parameterClassName = attributes.getProperty("class");
-        ParameterMapConfig paramConf = 
state.getConfig().newParameterMapConfig(id, parameterClassName);
-        state.setParamConfig(paramConf);
+        parameterClassName = 
state.getConfig().getTypeHandlerFactory().resolveAlias(parameterClassName);
+        try {
+          state.getConfig().getErrorContext().setMoreInfo("Check the parameter 
class.");
+          ParameterMapConfig paramConf = 
state.getConfig().newParameterMapConfig(id, 
Resources.classForName(parameterClassName));
+          state.setParamConfig(paramConf);
+        } catch (Exception e) {
+          throw new SqlMapException("Error configuring ParameterMap.  Could 
not set ParameterClass.  Cause: " + e, e);
+        }
       }
     });
     parser.addNodelet("/sqlMap/parameterMap/parameter", new Nodelet() {
@@ -167,8 +174,30 @@
         String nullValue = childAttributes.getProperty("nullValue");
         String mode = childAttributes.getProperty("mode");
         String callback = childAttributes.getProperty("typeHandler");
-        String numericScale = childAttributes.getProperty("numericScale");
-        state.getParamConfig().addParameterMapping(propertyName, javaType, 
jdbcType, nullValue, mode, type, numericScale, callback, resultMap);
+        String numericScaleProp = childAttributes.getProperty("numericScale");
+
+        callback = 
state.getConfig().getTypeHandlerFactory().resolveAlias(callback);
+        Object typeHandlerImpl = null;
+        if (callback != null) {
+          typeHandlerImpl = Resources.instantiate(callback);
+        }
+
+        javaType = 
state.getConfig().getTypeHandlerFactory().resolveAlias(javaType);
+        Class javaClass = null;
+        try {
+          if (javaType != null && javaType.length() > 0) {
+            javaClass = Resources.classForName(javaType);
+          }
+        } catch (ClassNotFoundException e) {
+          throw new RuntimeException("Error setting javaType on parameter 
mapping.  Cause: " + e);
+        }
+
+        Integer numericScale = null;
+        if (numericScaleProp != null) {
+          numericScale = new Integer(numericScaleProp);
+        }
+
+        state.getParamConfig().addParameterMapping(propertyName, javaClass, 
jdbcType, nullValue, mode, type, numericScale, typeHandlerImpl, resultMap);
       }
     });
   }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/conifg/ParameterMapConfig.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/conifg/ParameterMapConfig.java?view=diff&rev=545954&r1=545953&r2=545954
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/conifg/ParameterMapConfig.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/conifg/ParameterMapConfig.java
 Sun Jun 10 15:19:10 2007
@@ -1,7 +1,5 @@
 package com.ibatis.sqlmap.engine.conifg;
 
-import com.ibatis.common.resources.*;
-import com.ibatis.sqlmap.client.*;
 import com.ibatis.sqlmap.client.extensions.*;
 import com.ibatis.sqlmap.engine.impl.*;
 import com.ibatis.sqlmap.engine.mapping.parameter.*;
@@ -11,66 +9,46 @@
 import java.util.*;
 
 public class ParameterMapConfig {
+  public static final String MODE_IN = "IN";
+  public static final String MODE_OUT = "OUT";
+  public static final String MODE_INOUT = "INUOT";
+
   private SqlMapConfiguration config;
   private ErrorContext errorContext;
   private ExtendedSqlMapClient client;
-  private TypeHandlerFactory typeHandlerFactory;
   private BasicParameterMap parameterMap;
   private List parameterMappingList;
 
-  ParameterMapConfig(SqlMapConfiguration config, String id, String 
parameterClassName) {
+  ParameterMapConfig(SqlMapConfiguration config, String id, Class 
parameterClass) {
     this.config = config;
     this.errorContext = config.getErrorContext();
     this.client = config.getClient();
-    this.typeHandlerFactory = config.getTypeHandlerFactory();
     errorContext.setActivity("building a parameter map");
     parameterMap = new BasicParameterMap(client.getDelegate());
-    parameterClassName = typeHandlerFactory.resolveAlias(parameterClassName);
     parameterMap.setId(id);
     parameterMap.setResource(errorContext.getResource());
     errorContext.setObjectId(id + " parameter map");
-    Class parameterClass;
-    try {
-      errorContext.setMoreInfo("Check the parameter class.");
-      parameterClass = Resources.classForName(parameterClassName);
-    } catch (Exception e) {
-      throw new SqlMapException("Error configuring ParameterMap.  Could not 
set ParameterClass.  Cause: " + e, e);
-    }
     parameterMap.setParameterClass(parameterClass);
     errorContext.setMoreInfo("Check the parameter mappings.");
     this.parameterMappingList = new ArrayList();
+    client.getDelegate().addParameterMap(parameterMap);
   }
 
-  public void addParameterMapping(String propertyName, String javaType, String 
jdbcType, String nullValue, String mode, String outParamType, String 
numericScale, String typeHandlerCallback, String resultMap) {
-    typeHandlerCallback = typeHandlerFactory.resolveAlias(typeHandlerCallback);
-    javaType = typeHandlerFactory.resolveAlias(javaType);
+  public void addParameterMapping(String propertyName, Class javaClass, String 
jdbcType, String nullValue, String mode, String outParamType, Integer 
numericScale, Object typeHandlerImpl, String resultMap) {
     errorContext.setObjectId(propertyName + " mapping of the " + 
parameterMap.getId() + " parameter map");
     TypeHandler handler;
-    if (typeHandlerCallback != null) {
-      errorContext.setMoreInfo("Check the parameter mapping typeHandler 
attribute '" + typeHandlerCallback + "' (must be a TypeHandler or 
TypeHandlerCallback implementation).");
-      try {
-        Object impl = Resources.instantiate(typeHandlerCallback);
-        if (impl instanceof TypeHandlerCallback) {
-          handler = new CustomTypeHandler((TypeHandlerCallback) impl);
-        } else if (impl instanceof TypeHandler) {
-          handler = (TypeHandler) impl;
-        } else {
-          throw new RuntimeException("The class '" + typeHandlerCallback + "' 
is not a valid implementation of TypeHandler or TypeHandlerCallback");
-        }
-      } catch (Exception e) {
-        throw new RuntimeException("Error occurred during custom type handler 
configuration.  Cause: " + e, e);
+    if (typeHandlerImpl != null) {
+      errorContext.setMoreInfo("Check the parameter mapping typeHandler 
attribute '" + typeHandlerImpl + "' (must be a TypeHandler or 
TypeHandlerCallback implementation).");
+      if (typeHandlerImpl instanceof TypeHandlerCallback) {
+        handler = new CustomTypeHandler((TypeHandlerCallback) typeHandlerImpl);
+      } else if (typeHandlerImpl instanceof TypeHandler) {
+        handler = (TypeHandler) typeHandlerImpl;
+      } else {
+        throw new RuntimeException("The class '" + typeHandlerImpl + "' is not 
a valid implementation of TypeHandler or TypeHandlerCallback");
       }
     } else {
       errorContext.setMoreInfo("Check the parameter mapping property type or 
name.");
-      try {
-        Class javaClass = null;
-        if (javaType != null) {
-          javaClass = Resources.classForName(javaType);
-        }
-        handler = 
config.resolveTypeHandler(client.getDelegate().getTypeHandlerFactory(), 
parameterMap.getParameterClass(), propertyName, javaClass, jdbcType);
-      } catch (ClassNotFoundException e) {
-        throw new RuntimeException("Error setting type handler on parameter 
mapping.  Cause: " + e);
-      }
+      handler = 
config.resolveTypeHandler(client.getDelegate().getTypeHandlerFactory(), 
parameterMap.getParameterClass(), propertyName, javaClass, jdbcType);
     }
     BasicParameterMapping mapping = new BasicParameterMapping();
     mapping.setPropertyName(propertyName);
@@ -82,33 +60,10 @@
       mapping.setMode(mode);
     }
     mapping.setTypeHandler(handler);
-    try {
-      if (javaType != null && javaType.length() > 0) {
-        mapping.setJavaType(Resources.classForName(javaType));
-      }
-    } catch (ClassNotFoundException e) {
-      throw new RuntimeException("Error setting javaType on parameter mapping. 
 Cause: " + e);
-    }
-    if (numericScale != null) {
-      try {
-        Integer scale = Integer.valueOf(numericScale);
-        if (scale.intValue() < 0) {
-          throw new RuntimeException("Error setting numericScale on parameter 
mapping.  Cause: scale must be greater than or equal to zero");
-        }
-        mapping.setNumericScale(scale);
-      } catch (NumberFormatException e) {
-        throw new RuntimeException("Error setting numericScale on parameter 
mapping.  Cause: " + numericScale + " is not a valid integer");
-      }
-    }
+    mapping.setJavaType(javaClass);
+    mapping.setNumericScale(numericScale);
     parameterMappingList.add(mapping);
-  }
-
-  public void saveParameterMap() {
     parameterMap.setParameterMappingList(parameterMappingList);
-    client.getDelegate().addParameterMap(parameterMap);
-    errorContext.setMoreInfo(null);
-    errorContext.setObjectId(null);
   }
-
 
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/conifg/SqlMapConfiguration.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/conifg/SqlMapConfiguration.java?view=diff&rev=545954&r1=545953&r2=545954
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/conifg/SqlMapConfiguration.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/conifg/SqlMapConfiguration.java
 Sun Jun 10 15:19:10 2007
@@ -133,8 +133,8 @@
     return new CacheModelConfig(this, id, controller, readOnly, serialize);
   }
 
-  public ParameterMapConfig newParameterMapConfig(String id, String 
parameterClassName) {
-    return new ParameterMapConfig(this, id, parameterClassName);
+  public ParameterMapConfig newParameterMapConfig(String id, Class 
parameterClass) {
+    return new ParameterMapConfig(this, id, parameterClass);
   }
 
   public ResultMapConfig newResultMapConfig(String id, String resultClassName, 
String groupBy, String extended, String xmlName) {

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMap.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMap.java?view=diff&rev=545954&r1=545953&r2=545954
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMap.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMap.java
 Sun Jun 10 15:19:10 2007
@@ -83,6 +83,7 @@
 
   public void setParameterMappingList(List parameterMappingList) {
     this.parameterMappings = (BasicParameterMapping[]) 
parameterMappingList.toArray(new 
BasicParameterMapping[parameterMappingList.size()]);
+    parameterMappingIndex.clear();
     for (int i = 0; i < parameterMappings.length; i++) {
       parameterMappingIndex.put(parameterMappings[i].getPropertyName(), new 
Integer(i));
     }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMapping.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMapping.java?view=diff&rev=545954&r1=545953&r2=545954
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMapping.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMapping.java
 Sun Jun 10 15:19:10 2007
@@ -165,6 +165,9 @@
   }
 
   public void setNumericScale(Integer numericScale) {
+    if (numericScale != null && numericScale.intValue() < 0) {
+      throw new RuntimeException("Error setting numericScale on parameter 
mapping.  Cause: scale must be greater than or equal to zero");
+    }
     this.numericScale = numericScale;
   }
 


Reply via email to