/** * Copyright 2005-2016 hdiv.org * * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.hdiv.config.factory; import java.io.Serializable; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.hdiv.regex.PatternMatcher; import org.hdiv.regex.PatternMatcherFactory; import org.hdiv.validator.DefaultValidationRepository; import org.hdiv.validator.IValidation; import org.hdiv.validator.ValidationTarget; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.config.AbstractFactoryBean; /** * {@link FactoryBean} to create {@link DefaultValidationRepository} instances. * * @since 2.1.10 */ public class ValidationRepositoryFactoryBean extends AbstractFactoryBean<DefaultValidationRepository> { /** * Regular expression executor factory. */ protected PatternMatcherFactory patternMatcherFactory; /** * <p> * Map for configuration purpose. * </p> * <p> * ValidationTargetData :: List of Validation ids. * </p> */ protected Map<ValidationTargetData, List<String>> validationsData; /** * All default editable validations. */ protected List<IValidation> defaultValidations; @Override public Class<?> getObjectType() { return DefaultValidationRepository.class; } @Override protected DefaultValidationRepository createInstance() throws Exception { // create DefaultValidationRepository instance from XML config DefaultValidationRepository repository = new DefaultValidationRepository(); Map<ValidationTarget, List<IValidation>> vals = new LinkedHashMap<ValidationTarget, List<IValidation>>(); for (Entry<ValidationTargetData, List<String>> entry : validationsData.entrySet()) { ValidationTarget target = new ValidationTarget(); ValidationTargetData data = entry.getKey(); List<String> ids = entry.getValue(); if (data.getUrl() != null) { PatternMatcher matcher = patternMatcherFactory.getPatternMatcher(data.getUrl()); target.setUrl(matcher); } if (data.getParams() != null && !data.getParams().isEmpty()) { List<String> params = data.getParams(); List<PatternMatcher> matchers = new ArrayList<PatternMatcher>(); for (String param : params) { PatternMatcher matcher = patternMatcherFactory.getPatternMatcher(param); matchers.add(matcher); } target.setParams(matchers); } vals.put(target, createValidationList(ids)); } repository.setValidations(vals); repository.setDefaultValidations(defaultValidations); return repository; } /** * Convert List with bean ids in another List with the bean instances. * * @param ids List with bean ids. * @return List with bean instances. */ @SuppressWarnings("unchecked") protected List<IValidation> createValidationList(final List<String> ids) { List<IValidation> newList = new ArrayList<IValidation>(); for (String id : ids) { Object bean = getBeanFactory().getBean(id); if (bean instanceof IValidation) { IValidation validation = (IValidation) bean; newList.add(validation); } else if (bean instanceof List<?>) { List<IValidation> validations = (List<IValidation>) bean; newList.addAll(validations); } } return newList; } public static class ValidationTargetData implements Serializable { private static final long serialVersionUID = 4991119416021943596L; private String url; private List<String> params; public String getUrl() { return url; } public List<String> getParams() { return params; } public void setUrl(final String url) { this.url = url; } public void setParams(final List<String> params) { this.params = params; } } public void setPatternMatcherFactory(final PatternMatcherFactory patternMatcherFactory) { this.patternMatcherFactory = patternMatcherFactory; } public void setValidationsData(final Map<ValidationTargetData, List<String>> validationsData) { this.validationsData = validationsData; } public void setDefaultValidations(final List<IValidation> defaultValidations) { this.defaultValidations = defaultValidations; } }