* @author jianghang 2011-6-21 下午01:40:18
*/
public class BeanMappingParse {
public static BeanMappingObject parse(Node node, BeanMappingBehavior parent) {
BeanMappingObject config = new BeanMappingObject();
// mapping source class
Node nameNode = node.getAttributes().getNamedItem("name");
// mapping source class
Node srcNode = node.getAttributes().getNamedItem("srcClass");
// mapping target class
Node targetNode = node.getAttributes().getNamedItem("targetClass");
if (srcNode == null || targetNode == null) {
throw new BeanMappingException("Parse error for bean-mapping srcClass or targetClass is null");
}
Node srcKeyNode = node.getAttributes().getNamedItem("srcKey");
Node targetKeyNode = node.getAttributes().getNamedItem("targetKey");
// 设置reversable
Node reversableNode = node.getAttributes().getNamedItem("reversable");
Node batchNode = node.getAttributes().getNamedItem("batch");
String src = srcNode.getNodeValue();
String target = targetNode.getNodeValue();
config.setSrcClass(ReflectionHelper.forName(src));
config.setTargetClass(ReflectionHelper.forName(target));
if (nameNode != null) {
config.setName(nameNode.getNodeValue()); // v1.0.2增加了mapping name定义
}
if (srcKeyNode != null) {
config.setSrcKey(srcKeyNode.getNodeValue());
}
if (targetNode != null) {
config.setTargetKey(targetKeyNode.getNodeValue());
}
if (reversableNode != null) {
config.setReversable(Boolean.valueOf(reversableNode.getNodeValue()));
}
if (batchNode != null) {
config.setBatch(Boolean.valueOf(batchNode.getNodeValue()));
}
// 解析下BeanHaivor参数
BeanMappingBehavior beanbeHavior = BeanMappingBehaviorParse.parse(node, parent);
config.setBehavior(beanbeHavior);
if (beanbeHavior.isMappingEmptyStrings() == false || beanbeHavior.isMappingNullValue() == false) {
config.setBatch(false);// 强制设置为false,因为batch处理无法过滤null/empty value不做set处理
}
// 解析bean fields
NodeList nodeList = node.getChildNodes();
List<BeanMappingField> beanFields = new ArrayList<BeanMappingField>(10);
for (int i = 0; i < nodeList.getLength(); i++) {
Node clildNode = nodeList.item(i);
if ("field-mapping".equals(clildNode.getNodeName())) {
BeanMappingField field = parseField(clildNode);
BeanMappingBehavior fieldbehavior = BeanMappingBehaviorParse.parse(clildNode, beanbeHavior);// 解析下behaivor参数
field.setBehavior(fieldbehavior);
if (fieldbehavior.isMappingEmptyStrings() == false || fieldbehavior.isMappingNullValue() == false) {
config.setBatch(false);// 强制设置为false,因为batch处理无法过滤null/empty value不做set处理
}
beanFields.add(field);
}
}
config.setBeanFields(beanFields);
return config;
}