001 // Copyright 2007, 2008 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry5.internal.services;
016
017 import org.apache.tapestry5.ComponentResources;
018 import org.apache.tapestry5.Field;
019 import org.apache.tapestry5.FieldValidator;
020 import org.apache.tapestry5.internal.beaneditor.EnvironmentMessages;
021 import org.apache.tapestry5.ioc.AnnotationProvider;
022 import org.apache.tapestry5.ioc.Messages;
023 import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newList;
024 import org.apache.tapestry5.services.FieldValidatorDefaultSource;
025 import org.apache.tapestry5.services.FieldValidatorSource;
026 import org.apache.tapestry5.services.ValidationConstraintGenerator;
027 import org.apache.tapestry5.services.Environment;
028
029 import java.util.List;
030 import java.util.Locale;
031
032 public class FieldValidatorDefaultSourceImpl implements FieldValidatorDefaultSource
033 {
034 private final ValidationConstraintGenerator validationConstraintGenerator;
035
036 private final FieldValidatorSource fieldValidatorSource;
037
038 public FieldValidatorDefaultSourceImpl(
039 ValidationConstraintGenerator validationConstraintGenerator,
040 FieldValidatorSource fieldValidatorSource)
041 {
042 this.validationConstraintGenerator = validationConstraintGenerator;
043 this.fieldValidatorSource = fieldValidatorSource;
044 }
045
046 public FieldValidator createDefaultValidator(Field field, String overrideId,
047 Messages overrideMessages, Locale locale, Class propertyType,
048 AnnotationProvider propertyAnnotations)
049 {
050 List<FieldValidator> validators = newList();
051
052 for (String constraint : validationConstraintGenerator.buildConstraints(
053 propertyType,
054 propertyAnnotations))
055 {
056 int equalsx = constraint.indexOf('=');
057
058 String validatorType = equalsx > 0 ? constraint.substring(0, equalsx) : constraint;
059 String constraintValue = equalsx > 0 ? constraint.substring(equalsx + 1) : null;
060
061 FieldValidator validator = fieldValidatorSource.createValidator(
062 field,
063 validatorType,
064 constraintValue,
065 overrideId,
066 overrideMessages,
067 locale);
068
069 validators.add(validator);
070 }
071 return validators.size() == 1 ? validators.get(0) : new CompositeFieldValidator(validators);
072 }
073
074 public FieldValidator createDefaultValidator(ComponentResources resources, String parameterName)
075 {
076 Class propertyType = resources.getBoundType(parameterName);
077
078 if (propertyType == null) return null;
079
080 Field field = (Field) resources.getComponent();
081
082 return createDefaultValidator(field, resources.getId(), resources.getContainerMessages(), resources.getLocale(),
083 propertyType, resources.getAnnotationProvider(parameterName));
084 }
085 }