001// Copyright 2009, 2010 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.
014package org.apache.tapestry5.internal.beanvalidator;
015
016import java.util.Arrays;
017import java.util.Locale;
018
019import javax.validation.ValidatorFactory;
020
021import org.apache.tapestry5.ComponentResources;
022import org.apache.tapestry5.Field;
023import org.apache.tapestry5.FieldValidator;
024import org.apache.tapestry5.beanvalidator.BeanValidatorGroupSource;
025import org.apache.tapestry5.beanvalidator.ClientConstraintDescriptorSource;
026import org.apache.tapestry5.internal.services.CompositeFieldValidator;
027import org.apache.tapestry5.ioc.AnnotationProvider;
028import org.apache.tapestry5.ioc.Messages;
029import org.apache.tapestry5.services.Core;
030import org.apache.tapestry5.services.Environment;
031import org.apache.tapestry5.services.FieldValidatorDefaultSource;
032import org.apache.tapestry5.services.FormSupport;
033
034public class BeanFieldValidatorDefaultSource implements FieldValidatorDefaultSource 
035{
036        private final FieldValidatorDefaultSource fieldValidatorDefaultSource;
037        private final ValidatorFactory validatorFactory;
038        private final BeanValidatorGroupSource beanValidationGroupSource;
039        private final ClientConstraintDescriptorSource clientValidatorSource;
040        private final FormSupport formSupport;
041        private final Environment environment;
042
043        public BeanFieldValidatorDefaultSource(
044                        @Core FieldValidatorDefaultSource fieldValidatorDefaultSource,
045                        final ValidatorFactory validatorFactory,
046                        final BeanValidatorGroupSource beanValidationGroupSource,
047                        final ClientConstraintDescriptorSource clientValidatorSource,
048                        final FormSupport formSupport,
049                        final Environment environment) 
050        {
051                this.fieldValidatorDefaultSource = fieldValidatorDefaultSource;
052                this.validatorFactory = validatorFactory;
053                this.beanValidationGroupSource = beanValidationGroupSource;
054                this.clientValidatorSource = clientValidatorSource;
055                this.formSupport = formSupport;
056                this.environment = environment;
057        }
058
059        public FieldValidator createDefaultValidator(final Field field,
060                        final String overrideId, final Messages overrideMessages,
061                        final Locale locale, final Class propertyType,
062                        final AnnotationProvider propertyAnnotations) 
063        {
064                
065                FieldValidator validator = fieldValidatorDefaultSource.createDefaultValidator(
066                                field, overrideId, overrideMessages, locale, propertyType, propertyAnnotations);
067
068                
069                FieldValidator beanValidator 
070                        = new BeanFieldValidator(field, validatorFactory, beanValidationGroupSource, 
071                                        clientValidatorSource, formSupport, environment);
072                
073                return new CompositeFieldValidator(Arrays.asList(validator, beanValidator));
074        }
075
076        public FieldValidator createDefaultValidator(
077                        final ComponentResources resources, final String parameterName) 
078        {
079                final Class propertyType = resources.getBoundType(parameterName);
080                
081                if (propertyType == null)
082                        return null;
083
084                final Field field = (Field) resources.getComponent();
085
086                return createDefaultValidator(field, resources.getId(), resources
087                                .getContainerMessages(), resources.getLocale(), propertyType,
088                                resources.getAnnotationProvider(parameterName));
089        }
090}