You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2005/05/14 08:07:35 UTC
svn commit: r170125 - in
/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine:
builder/xml/BaseParser.java builder/xml/SqlMapParser.java
builder/xml/sql-map-2.dtd mapping/result/BasicResultMap.java
mapping/result/Discriminator.java
Author: cbegin
Date: Fri May 13 23:07:33 2005
New Revision: 170125
URL: http://svn.apache.org/viewcvs?rev=170125&view=rev
Log: (empty)
Added:
incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/Discriminator.java
Modified:
incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/BaseParser.java
incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java
incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd
incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/BasicResultMap.java
Modified: incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/BaseParser.java
URL: http://svn.apache.org/viewcvs/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/BaseParser.java?rev=170125&r1=170124&r2=170125&view=diff
==============================================================================
--- incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/BaseParser.java (original)
+++ incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/BaseParser.java Fri May 13 23:07:33 2005
@@ -9,6 +9,9 @@
import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
import com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap;
import com.ibatis.sqlmap.engine.mapping.result.BasicResultMap;
+import com.ibatis.sqlmap.engine.mapping.result.BasicResultMapping;
+import com.ibatis.sqlmap.engine.mapping.result.ResultMapping;
+import com.ibatis.sqlmap.engine.mapping.result.Discriminator;
import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
import com.ibatis.sqlmap.engine.scope.ErrorContext;
import com.ibatis.sqlmap.engine.type.DomTypeMarker;
@@ -125,6 +128,7 @@
public List resultMappingList;
public int resultMappingIndex;
public Map sqlIncludes = new HashMap();
+ public Discriminator discriminator;
}
}
Modified: incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java
URL: http://svn.apache.org/viewcvs/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java?rev=170125&r1=170124&r2=170125&view=diff
==============================================================================
--- incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java (original)
+++ incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java Fri May 13 23:07:33 2005
@@ -13,6 +13,7 @@
import com.ibatis.sqlmap.engine.mapping.result.BasicResultMap;
import com.ibatis.sqlmap.engine.mapping.result.BasicResultMapping;
import com.ibatis.sqlmap.engine.mapping.result.ResultMapping;
+import com.ibatis.sqlmap.engine.mapping.result.Discriminator;
import com.ibatis.sqlmap.engine.mapping.statement.*;
import com.ibatis.sqlmap.engine.type.CustomTypeHandler;
import com.ibatis.sqlmap.engine.type.TypeHandler;
@@ -262,7 +263,6 @@
throw new NestedRuntimeException("Error setting javaType on parameter mapping. Cause: " + e);
}
-
vars.parameterMappingList.add(mapping);
}
@@ -274,6 +274,8 @@
public void process(Node node) throws Exception {
vars.currentResultMap.setResultMappingList(vars.resultMappingList);
+ vars.currentResultMap.setDiscriminator(vars.discriminator);
+
vars.client.getDelegate().addResultMap(vars.currentResultMap);
vars.errorCtx.setMoreInfo(null);
@@ -403,6 +405,85 @@
}
vars.resultMappingList.add(mapping);
+ }
+ });
+
+ parser.addNodelet("/sqlMap/resultMap/discriminator/subMap", new Nodelet() {
+ public void process(Node node) throws Exception {
+ if (vars.discriminator == null) {
+ throw new NestedRuntimeException ("The discriminator is null, but somehow a subMap was reached. This is a bug.");
+ }
+ Properties childAttributes = NodeletUtils.parseAttributes(node, vars.properties);
+ String value = childAttributes.getProperty("value");
+ String resultMap = childAttributes.getProperty("resultMap");
+ vars.discriminator.addSubMap(value, resultMap);
+ }
+ });
+
+ parser.addNodelet("/sqlMap/resultMap/discriminator/end()", new Nodelet() {
+ public void process(Node node) throws Exception {
+ if (vars.discriminator != null) {
+ vars.discriminator.bindSubMaps();
+ }
+ }
+ });
+
+ parser.addNodelet("/sqlMap/resultMap/discriminator", new Nodelet() {
+ public void process(Node node) throws Exception {
+ Properties childAttributes = NodeletUtils.parseAttributes(node, vars.properties);
+ String propertyName = childAttributes.getProperty("property");
+ String nullValue = childAttributes.getProperty("nullValue");
+ String jdbcType = childAttributes.getProperty("jdbcType");
+ String javaType = childAttributes.getProperty("javaType");
+ String columnName = childAttributes.getProperty("column");
+ String columnIndex = childAttributes.getProperty("columnIndex");
+ String callback = childAttributes.getProperty("typeHandler");
+
+ callback = vars.typeHandlerFactory.resolveAlias(callback);
+ javaType = vars.typeHandlerFactory.resolveAlias(javaType);
+
+ vars.errorCtx.setObjectId(propertyName + " mapping of the " + vars.currentResultMap.getId() + " result map");
+
+ TypeHandler handler = null;
+ if (callback != null) {
+ vars.errorCtx.setMoreInfo("Check the result mapping typeHandler attribute '" + callback + "' (must be a TypeHandlerCallback implementation).");
+ try {
+ Object impl = Resources.classForName(callback).newInstance();
+ if (impl instanceof TypeHandlerCallback) {
+ handler = new CustomTypeHandler((TypeHandlerCallback) impl);
+ } else if (impl instanceof TypeHandler) {
+ handler = (TypeHandler) impl;
+ } else {
+ throw new NestedRuntimeException ("The class '' is not a valid implementation of TypeHandler or TypeHandlerCallback");
+ }
+ } catch (Exception e) {
+ throw new NestedRuntimeException("Error occurred during custom type handler configuration. Cause: " + e, e);
+ }
+ } else {
+ vars.errorCtx.setMoreInfo("Check the result mapping property type or name.");
+ handler = resolveTypeHandler(vars.client.getDelegate().getTypeHandlerFactory(), vars.currentResultMap.getResultClass(), propertyName, javaType, jdbcType, true);
+ }
+
+ BasicResultMapping mapping = new BasicResultMapping();
+ mapping.setPropertyName(propertyName);
+ mapping.setColumnName(columnName);
+ mapping.setJdbcTypeName(jdbcType);
+ mapping.setTypeHandler(handler);
+ mapping.setNullValue(nullValue);
+
+ try {
+ if (javaType != null && javaType.length() > 0) {
+ mapping.setJavaType(Class.forName(javaType));
+ }
+ } catch (ClassNotFoundException e) {
+ throw new NestedRuntimeException("Error setting javaType on result mapping. Cause: " + e);
+ }
+
+ if (columnIndex != null && columnIndex.length() > 0) {
+ mapping.setColumnIndex(Integer.parseInt(columnIndex));
+ }
+
+ vars.discriminator = new Discriminator (vars.delegate, mapping);
}
});
}
Modified: incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd
URL: http://svn.apache.org/viewcvs/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd?rev=170125&r1=170124&r2=170125&view=diff
==============================================================================
--- incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd (original)
+++ incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd Fri May 13 23:07:33 2005
@@ -36,7 +36,7 @@
mode (IN | OUT | INOUT) #IMPLIED
typeHandler CDATA #IMPLIED
>
-<!ELEMENT resultMap (result+)>
+<!ELEMENT resultMap (result+, discriminator?)>
<!ATTLIST resultMap
id CDATA #REQUIRED
class CDATA #REQUIRED
@@ -55,6 +55,21 @@
select CDATA #IMPLIED
resultMap CDATA #IMPLIED
typeHandler CDATA #IMPLIED
+>
+<!ELEMENT discriminator (subMap+)>
+<!ATTLIST discriminator
+property CDATA #REQUIRED
+javaType CDATA #IMPLIED
+column CDATA #IMPLIED
+columnIndex CDATA #IMPLIED
+jdbcType CDATA #IMPLIED
+nullValue CDATA #IMPLIED
+typeHandler CDATA #IMPLIED
+>
+<!ELEMENT subMap EMPTY>
+<!ATTLIST subMap
+value CDATA #REQUIRED
+resultMap CDATA #REQUIRED
>
<!ELEMENT cacheModel (flushInterval?, flushOnExecute*, property*)+>
<!ATTLIST cacheModel
Modified: incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/BasicResultMap.java
URL: http://svn.apache.org/viewcvs/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/BasicResultMap.java?rev=170125&r1=170124&r2=170125&view=diff
==============================================================================
--- incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/BasicResultMap.java (original)
+++ incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/BasicResultMap.java Fri May 13 23:07:33 2005
@@ -59,6 +59,8 @@
private List nestedResultMappings;
+ private Discriminator discriminator;
+
private Set groupByProps;
private String xmlName;
@@ -209,6 +211,13 @@
}
}
+ public void setDiscriminator (Discriminator discriminator) {
+ if (this.discriminator != null) {
+ throw new SqlMapException ("A discriminator may only be set once per result map.");
+ }
+ this.discriminator = discriminator;
+ }
+
/**
* Setter for a list of the individual ResultMapping objects
*
@@ -277,7 +286,7 @@
foundData = foundData || columnValues[i] != null;
}
- request.setRowDataFound (foundData);
+ request.setRowDataFound(foundData);
return columnValues;
}
Added: incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/Discriminator.java
URL: http://svn.apache.org/viewcvs/incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/Discriminator.java?rev=170125&view=auto
==============================================================================
--- incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/Discriminator.java (added)
+++ incubator/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/Discriminator.java Fri May 13 23:07:33 2005
@@ -0,0 +1,56 @@
+package com.ibatis.sqlmap.engine.mapping.result;
+
+import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: cbegin
+ * Date: May 13, 2005
+ * Time: 11:11:05 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Discriminator {
+
+ private SqlMapExecutorDelegate delegate;
+ private ResultMapping resultMapping;
+ private Map subMaps;
+
+ public Discriminator(SqlMapExecutorDelegate delegate, ResultMapping resultMapping) {
+ this.delegate = delegate;
+ this.resultMapping = resultMapping;
+ }
+
+ public void setResultMapping(ResultMapping resultMapping) {
+ this.resultMapping = resultMapping;
+ }
+
+ public ResultMapping getResultMapping() {
+ return resultMapping;
+ }
+
+ public void addSubMap(String discriminatorValue, String resultMapName) {
+ if (subMaps == null) {
+ subMaps = new HashMap();
+ }
+ subMaps.put(discriminatorValue, resultMapName);
+ }
+
+ public void bindSubMaps() {
+ if (subMaps != null) {
+ Iterator keys = subMaps.keySet().iterator();
+ while (keys.hasNext()) {
+ Object key = keys.next();
+ Object id = subMaps.get(key);
+ if(id instanceof String) {
+ subMaps.put(key, delegate.getResultMap((String)id));
+ }
+ }
+ }
+ }
+
+
+}