}
});
}
private void addResultMapNodelets() {
parser.addNodelet("/sqlMap/resultMap/end()", new Nodelet() {
public void process(Node node) throws Exception {
if (vars.resultMappingList.size() == 0) {
throw new RuntimeException("resultMap " + vars.currentResultMap.getId() + " must have at least one result mapping");
}
vars.currentResultMap.setResultMappingList(vars.resultMappingList);
vars.currentResultMap.setDiscriminator(vars.discriminator);
vars.discriminator = null;
vars.client.getDelegate().addResultMap(vars.currentResultMap);
vars.errorCtx.setMoreInfo(null);
vars.errorCtx.setObjectId(null);
}
});
parser.addNodelet("/sqlMap/resultMap", new Nodelet() {
public void process(Node node) throws Exception {
vars.errorCtx.setActivity("building a result map");
vars.currentResultMap = new BasicResultMap(vars.client.getDelegate());
Properties attributes = NodeletUtils.parseAttributes(node, vars.properties);
String id = applyNamespace(attributes.getProperty("id"));
String resultClassName = attributes.getProperty("class");
String extended = applyNamespace(attributes.getProperty("extends"));
String xmlName = attributes.getProperty("xmlName");
String groupBy = attributes.getProperty("groupBy");
resultClassName = vars.typeHandlerFactory.resolveAlias(resultClassName);
vars.errorCtx.setObjectId(id + " result map");
vars.currentResultMap.setId(id);
vars.currentResultMap.setXmlName(xmlName);
vars.currentResultMap.setResource(vars.errorCtx.getResource());
if (groupBy != null && groupBy.length() > 0) {
StringTokenizer parser = new StringTokenizer(groupBy, ", ", false);
while (parser.hasMoreTokens()) {
vars.currentResultMap.addGroupByProperty(parser.nextToken());
}
}
Class resultClass = null;
try {
vars.errorCtx.setMoreInfo("Check the result class.");
resultClass = Resources.classForName(resultClassName);
} catch (Exception e) {
throw new RuntimeException("Error configuring Result. Could not set ResultClass. Cause: " + e, e);
}
vars.currentResultMap.setResultClass(resultClass);
vars.resultMappingList = new ArrayList();
vars.errorCtx.setMoreInfo("Check the extended result map.");
if (extended != null) {
BasicResultMap extendedResultMap = (BasicResultMap) vars.client.getDelegate().getResultMap(extended);
ResultMapping[] resultMappings = extendedResultMap.getResultMappings();
for (int i = 0; i < resultMappings.length; i++) {
vars.resultMappingList.add(resultMappings[i]);
}
List nestedResultMappings = extendedResultMap.getNestedResultMappings();
if (nestedResultMappings != null) {
Iterator iter = nestedResultMappings.iterator();
while (iter.hasNext()) {
vars.currentResultMap.addNestedResultMappings((ResultMapping) iter.next());
}
}
if (groupBy == null || groupBy.length() == 0) {
if (extendedResultMap.hasGroupBy()) {
Iterator i = extendedResultMap.groupByProps();
while (i.hasNext()) {
vars.currentResultMap.addGroupByProperty((String) i.next());
}
}
}
}
vars.errorCtx.setMoreInfo("Check the result mappings.");
vars.resultMappingIndex = vars.resultMappingList.size();
}
});
parser.addNodelet("/sqlMap/resultMap/result", 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 statementName = childAttributes.getProperty("select");
String resultMapName = childAttributes.getProperty("resultMap");
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 TypeHandler or 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 RuntimeException ("The class '"+callback+"' 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);
}
} 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);
mapping.setStatementName(statementName);
mapping.setNestedResultMapName(resultMapName);
if (resultMapName != null && resultMapName.length() > 0) {
vars.currentResultMap.addNestedResultMappings(mapping);
}
try {
if (javaType != null && javaType.length() > 0) {
mapping.setJavaType(Resources.classForName(javaType));
}
} catch (ClassNotFoundException e) {
throw new RuntimeException("Error setting javaType on result mapping. Cause: " + e);
}
if (columnIndex != null && columnIndex.length() > 0) {
mapping.setColumnIndex(Integer.parseInt(columnIndex));
} else {
vars.resultMappingIndex++;
mapping.setColumnIndex(vars.resultMappingIndex);
}
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 RuntimeException ("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, applyNamespace(resultMap));
}
});
parser.addNodelet("/sqlMap/resultMap/discriminator", new Nodelet() {
public void process(Node node) throws Exception {
Properties childAttributes = NodeletUtils.parseAttributes(node, vars.properties);
String nullValue = childAttributes.getProperty("nullValue");
String jdbcType = childAttributes.getProperty("jdbcType");
String javaType = childAttributes.getProperty("javaType");