/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.sys.spring.datadictionary;
import org.apache.log4j.Logger;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class AttributeBeanDefinitionParser extends KualiBeanDefinitionParserBase {
private static Logger LOG = Logger.getLogger(AttributeBeanDefinitionParser.class);
@Override
protected String getBaseBeanTypeParent(Element element) {
return "AttributeDefinition";
}
@Override
protected void doParse(Element element, ParserContext context, BeanDefinitionBuilder bean) {
// get all attributes
handleAbstractAttribute( element, bean );
processAttributeAttributes(element, bean);
// parse inner tags
NodeList children = element.getChildNodes();
processChildNodes( children, bean );
parseEmbeddedPropertyElements(element, bean);
}
protected void processAttributeAttributes( Element element, BeanDefinitionBuilder bean ) {
String attributeName = element.getAttribute("attributeName");
String label = element.getAttribute("label");
String shortLabel = element.getAttribute("shortLabel");
String required = element.getAttribute("required");
String forceUppercase = element.getAttribute("forceUppercase");
String maxLength = element.getAttribute("maxLength");
String displayLabelAttribute = element.getAttribute("displayLabelAttribute");
String formatterClass = element.getAttribute("formatterClass");
if ( StringUtils.hasText( attributeName ) ) {
bean.addPropertyValue("name", attributeName);
}
if ( StringUtils.hasText( label ) ) {
bean.addPropertyValue("label", label);
}
if ( StringUtils.hasText( shortLabel ) ) {
bean.addPropertyValue("shortLabel", shortLabel);
}
if ( StringUtils.hasText( displayLabelAttribute ) ) {
bean.addPropertyValue("displayLabelAttribute", displayLabelAttribute);
}
if ( StringUtils.hasText( formatterClass ) ) {
bean.addPropertyValue("formatterClass", formatterClass);
}
if ( StringUtils.hasText( required ) ) {
bean.addPropertyValue("required", Boolean.valueOf(required));
}
if ( StringUtils.hasText( forceUppercase ) ) {
bean.addPropertyValue("forceUppercase", Boolean.valueOf(forceUppercase));
}
if ( StringUtils.hasText( maxLength ) ) {
bean.addPropertyValue("maxLength", Integer.valueOf(maxLength));
}
}
protected void processChildNodes( NodeList children, BeanDefinitionBuilder bean ) {
for ( int i = 0; i < children.getLength(); i++ ) {
Node child = children.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE ) continue;
Element ele = (Element)child;
String elementName = ele.getLocalName();
if ( elementName == null ) continue;
if ( elementName.equals( "text" ) ) {
bean.addPropertyValue("control", processTextControlElement(ele) );
} else if ( elementName.equals( "textarea" ) ) {
bean.addPropertyValue("control", processTextareaControlElement(ele) );
} else if ( elementName.equals( "select" ) ) {
bean.addPropertyValue("control", processSelectControlElement(ele) );
} else if ( elementName.equals( "radio" ) ) {
bean.addPropertyValue("control", processRadioControlElement(ele) );
} else if ( elementName.equals( "hidden" ) ) {
bean.addPropertyValue("control", processHiddenControlElement(ele) );
} else if ( elementName.equals( "user" ) ) {
bean.addPropertyValue("control", processUserControlElement(ele) );
} else if ( elementName.equals( "checkbox" ) ) {
bean.addPropertyValue("control", processCheckboxControlElement(ele) );
} else if ( elementName.equals( "validationPattern") ) {
bean.addPropertyValue("validationPattern", processValidationPatternElement(ele) );
}
}
}
protected BeanDefinition processTextControlElement( Element ele ) {
BeanDefinitionBuilder controlBean = BeanDefinitionBuilder.childBeanDefinition( "TextControlDefinition" );
String size = ele.getAttribute("size");
if ( StringUtils.hasText(size) ) {
controlBean.addPropertyValue("size", Integer.valueOf(size) );
}
parseEmbeddedPropertyElements(ele, controlBean);
return controlBean.getBeanDefinition();
}
protected BeanDefinition processUserControlElement( Element ele ) {
BeanDefinitionBuilder controlBean = BeanDefinitionBuilder.childBeanDefinition( "KualiUserControlDefinition" );
String universalIdAttribute = ele.getAttribute("universalIdAttribute");
if ( StringUtils.hasText(universalIdAttribute) ) {
controlBean.addPropertyValue("universalIdAttributeName", universalIdAttribute );
}
String userObjectAttribute = ele.getAttribute("userObjectAttribute");
if ( StringUtils.hasText(userObjectAttribute) ) {
controlBean.addPropertyValue("userIdAttributeName", userObjectAttribute + "." + KFSPropertyConstants.PERSON_USER_ID );
controlBean.addPropertyValue("personNameAttributeName", userObjectAttribute + "." + KFSPropertyConstants.PERSON_NAME );
}
parseEmbeddedPropertyElements(ele, controlBean);
return controlBean.getBeanDefinition();
}
protected BeanDefinition processTextareaControlElement( Element ele ) {
BeanDefinitionBuilder controlBean = BeanDefinitionBuilder.childBeanDefinition( "TextareaControlDefinition" );
String rows = ele.getAttribute("rows");
if ( StringUtils.hasText(rows) ) {
controlBean.addPropertyValue("rows", Integer.valueOf(rows) );
}
String cols = ele.getAttribute("rows");
if ( StringUtils.hasText(cols) ) {
controlBean.addPropertyValue("cols", Integer.valueOf(cols) );
}
parseEmbeddedPropertyElements(ele, controlBean);
return controlBean.getBeanDefinition();
}
protected BeanDefinition processHiddenControlElement( Element ele ) {
BeanDefinitionBuilder controlBean = BeanDefinitionBuilder.childBeanDefinition( "HiddenControlDefinition" );
parseEmbeddedPropertyElements(ele, controlBean);
return controlBean.getBeanDefinition();
}
protected BeanDefinition processCheckboxControlElement( Element ele ) {
BeanDefinitionBuilder controlBean = BeanDefinitionBuilder.childBeanDefinition( "CheckboxControlDefinition" );
parseEmbeddedPropertyElements(ele, controlBean);
return controlBean.getBeanDefinition();
}
protected void setMultiValueControlAttributes( Element ele, BeanDefinitionBuilder controlBean ) {
String valuesFinderClass = ele.getAttribute("valuesFinderClass");
if ( StringUtils.hasText(valuesFinderClass) ) {
controlBean.addPropertyValue("valuesFinderClass", valuesFinderClass );
}
String boClass = ele.getAttribute("boClass");
if ( StringUtils.hasText(boClass) ) {
controlBean.addPropertyValue("boClass", boClass );
}
String keyAttribute = ele.getAttribute("keyAttribute");
if ( StringUtils.hasText(keyAttribute) ) {
controlBean.addPropertyValue("keyAttribute", keyAttribute );
}
String labelAttribute = ele.getAttribute("labelAttribute");
if ( StringUtils.hasText(labelAttribute) ) {
controlBean.addPropertyValue("labelAttribute", labelAttribute );
}
String includeKeyInLabel = ele.getAttribute("includeKeyInLabel");
if ( StringUtils.hasText(includeKeyInLabel) ) {
controlBean.addPropertyValue("includeKeyInLabel", Boolean.valueOf(includeKeyInLabel) );
}
}
protected BeanDefinition processSelectControlElement( Element ele ) {
BeanDefinitionBuilder controlBean = BeanDefinitionBuilder.childBeanDefinition( "SelectControlDefinition" );
setMultiValueControlAttributes( ele, controlBean );
parseEmbeddedPropertyElements(ele, controlBean);
return controlBean.getBeanDefinition();
}
protected BeanDefinition processRadioControlElement( Element ele ) {
BeanDefinitionBuilder controlBean = BeanDefinitionBuilder.childBeanDefinition( "RadioControlDefinition" );
setMultiValueControlAttributes( ele, controlBean );
parseEmbeddedPropertyElements(ele, controlBean);
return controlBean.getBeanDefinition();
}
protected BeanDefinition processValidationPatternElement( Element ele ) {
BeanDefinitionBuilder validatorBean = null;
String parent = ele.getAttribute( "parent" );
String validationPatternClass = ele.getAttribute( "validationPatternClass" );
if ( StringUtils.hasText(parent) ) {
validatorBean = BeanDefinitionBuilder.childBeanDefinition( parent );
} else if ( StringUtils.hasText(validationPatternClass)) {
try {
validatorBean = BeanDefinitionBuilder.rootBeanDefinition(Class.forName(validationPatternClass));
} catch ( ClassNotFoundException ex ) {
LOG.fatal( "Invalid class name given for validationPattern bean: " + validationPatternClass );
throw new RuntimeException( "Invalid class name given for validationPattern bean: " + validationPatternClass, ex );
}
}
parseEmbeddedPropertyElements(ele, validatorBean);
return validatorBean.getBeanDefinition();
}
}