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        @Override
060        public FieldValidator createDefaultValidator(final Field field,
061                        final String overrideId, final Messages overrideMessages,
062                        final Locale locale, final Class propertyType,
063                        final AnnotationProvider propertyAnnotations) 
064        {
065                
066                FieldValidator validator = fieldValidatorDefaultSource.createDefaultValidator(
067                                field, overrideId, overrideMessages, locale, propertyType, propertyAnnotations);
068
069                
070                FieldValidator beanValidator 
071                        = new BeanFieldValidator(field, validatorFactory, beanValidationGroupSource, 
072                                        clientValidatorSource, formSupport, environment);
073                
074                return new CompositeFieldValidator(Arrays.asList(validator, beanValidator));
075        }
076
077        @Override
078        public FieldValidator createDefaultValidator(
079                        final ComponentResources resources, final String parameterName) 
080        {
081                final Class propertyType = resources.getBoundType(parameterName);
082                
083                if (propertyType == null)
084                        return null;
085
086                final Field field = (Field) resources.getComponent();
087
088                return createDefaultValidator(field, resources.getId(), resources
089                                .getContainerMessages(), resources.getLocale(), propertyType,
090                                resources.getAnnotationProvider(parameterName));
091        }
092}