Java tutorial
/** * The contents of this file are subject to the OpenMRS Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.contrib.metadatarepository.webapp.spring; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.PropertyValue; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import java.util.List; /** * <p>Adds commons validator configuration files to an existing Spring commons Validator Factory bean, possibly defined * within a seperate Spring configuration file in a seperate jar file. By using this extension factory developers can * add validation configuration for their own persistent classes to an AppFuse application without modifying any of the * existing AppFuse Spring configuration or jar distribution files. * <p>As an example consider the following Spring bean configuration: * <pre> * <bean class="org.openmrs.contrib.spring.ValidatorExtensionPostProcessor"> * <property name="validationConfigLocations"> * <list> * <value>/WEB-INF/foo-validation.xml</value> * </list> * </property> * </bean> * </pre> * <p>The sample adds a single validation configuration file (foo-validation.xml) to an existing Spring commons * Validator Factory bean (a bean of class org.springmodules.validation.commons.DefaultValidatorFactory). Assuming the * validator extension is included in a Spring configuration file called applicationContext-foo-validation.xml, and * that this configuration file is added directly below WEB-INF in the Foo web project, then the normal war overlay * process coupled with AppFuse's configuration file auto detection will ensure that the validation extension is * automatically included into the application without requiring any modification of AppFuse's existing config files. * * @author Michael Horwitz */ public class ValidatorExtensionPostProcessor implements BeanFactoryPostProcessor { private String validatorFactoryBeanName = "validatorFactory"; private List validationConfigLocations; /** * Adds the validation configuration files to the list already held in the validator factory bean configuration. * @param configurableListableBeanFactory the bean factory */ public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) { if (configurableListableBeanFactory.containsBean(validatorFactoryBeanName)) { BeanDefinition validatorFactoryBeanDefinition = configurableListableBeanFactory .getBeanDefinition(validatorFactoryBeanName); MutablePropertyValues propertyValues = validatorFactoryBeanDefinition.getPropertyValues(); PropertyValue propertyValue = propertyValues.getPropertyValue("validationConfigLocations"); //value is expected to be a list. List existingValidationConfigLocations = (List) propertyValue.getValue(); existingValidationConfigLocations.addAll(validationConfigLocations); } } /** * Set the name of the validator factory bean. This defaults to "validatorFactory" * * @param validatorFactoryBeanName The validator factory bean name. */ public void setValidatorFactoryBeanName(String validatorFactoryBeanName) { this.validatorFactoryBeanName = validatorFactoryBeanName; } /** * The list of validation config locations to be added to the validator factory. * * @param validationConfigLocations The list of additional validation configuration locations. */ public void setValidationConfigLocations(List validationConfigLocations) { this.validationConfigLocations = validationConfigLocations; } }