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");
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);
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) {