private FieldConfig parseFieldConfig(Node fieldNode) throws ConfigException { NamedNodeMap attr = fieldNode.getAttributes(); Node nameNode = attr.getNamedItem(XMLConfigConstant.NAME); if (nameNode == null) { throw new ConfigException(ErrorMsg.NO_NAME_PROPERTY_FOR_FIELD); } FieldConfig fieldConfig = new FieldConfig(nameNode.getNodeValue()); NodeList validateRule = fieldNode.getChildNodes(); if (validateRule == null || validateRule.getLength() == 0) { return null; } for (int i = 0; i < validateRule.getLength(); i++) { Node node = validateRule.item(i); if (node.getNodeType() != Node.ELEMENT_NODE) { continue; } AbstractValidator validator = ValidatorRegistry.getInstance().getValidator(node.getNodeName()); if (validator == null) { throw new ConfigException(ErrorMsg.NO_SUCH_VALIDATOR_ERROR + node.getNodeName()); } else { fieldConfig.addRule(validator.parseRuleConfig(node)); } } return fieldConfig; }
/** * 将XML配置中节点解析出来返回一个validator的list * * @param doc * @return * @throws ConfigException * @throws InstantiationException * @throws IllegalAccessException * @throws ClassNotFoundException */ private List<AbstractValidator> parseValidators(Document doc) throws ConfigException, InstantiationException, IllegalAccessException, ClassNotFoundException { NodeList children = doc.getDocumentElement().getChildNodes(); List<AbstractValidator> validators = new ArrayList<AbstractValidator>(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (XMLConfigConstant.VALIDATOR.equals(node.getNodeName())) { NamedNodeMap attrMap = node.getAttributes(); Node classNameAttr = attrMap.getNamedItem(XMLConfigConstant.CLASS_NAME); if (classNameAttr == null) { throw new ConfigException(ErrorMsg.VALIDATOR_CLASS_NAME_EMPTY); } String className = classNameAttr.getNodeValue(); Object obj = Class.forName(className).newInstance(); if (!(obj instanceof AbstractValidator)) { throw new ConfigException(ErrorMsg.VALIDATOR_BASE_CLASS_ERROR); } AbstractValidator validator = (AbstractValidator) obj; if (validator != null) { validators.add(validator); // 如果XML中指定了name属性,则重置name Node nameAttr = attrMap.getNamedItem(XMLConfigConstant.NAME); if (nameAttr != null) { validator.setName(nameAttr.getNodeValue()); } // 如果有property子元素,则赋值给validator NodeList properties = node.getChildNodes(); for (int j = 0; j < properties.getLength(); j++) { Node propNode = properties.item(j); if (XMLConfigConstant.PROPERTY.equals(propNode.getNodeName())) { NamedNodeMap propAttr = propNode.getAttributes(); Node propName = propAttr.getNamedItem(XMLConfigConstant.NAME); if (propName != null) { String methodName = propName.getNodeValue(); methodName = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); BeanUtil.invoke( validator, "set" + methodName, String.class, propNode.getTextContent()); } } } } } } return validators; }