001// Copyright 2009, 2010, 2011 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.beanvalidator;
015
016import org.apache.tapestry5.internal.beanvalidator.*;
017import org.apache.tapestry5.ioc.Configuration;
018import org.apache.tapestry5.ioc.MappedConfiguration;
019import org.apache.tapestry5.ioc.OrderedConfiguration;
020import org.apache.tapestry5.ioc.ServiceBinder;
021import org.apache.tapestry5.ioc.annotations.Contribute;
022import org.apache.tapestry5.ioc.annotations.Local;
023import org.apache.tapestry5.ioc.annotations.Primary;
024import org.apache.tapestry5.ioc.services.PropertyShadowBuilder;
025import org.apache.tapestry5.ioc.services.ThreadLocale;
026import org.apache.tapestry5.services.FieldValidatorDefaultSource;
027import org.apache.tapestry5.services.javascript.JavaScriptStack;
028import org.apache.tapestry5.services.javascript.JavaScriptStackSource;
029import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
030
031import javax.validation.MessageInterpolator;
032import javax.validation.Validator;
033import javax.validation.ValidatorFactory;
034import javax.validation.constraints.*;
035import javax.validation.groups.Default;
036
037/**
038 * Module for JSR-303 services.
039 *
040 * @since 5.2.0.0
041 */
042public class BeanValidatorModule
043{
044    public static void bind(final ServiceBinder binder)
045    {
046        binder.bind(FieldValidatorDefaultSource.class, BeanFieldValidatorDefaultSource.class).withSimpleId();
047        binder.bind(BeanValidatorGroupSource.class, BeanValidationGroupSourceImpl.class);
048        binder.bind(BeanValidatorSource.class, BeanValidatorSourceImpl.class);
049        binder.bind(ClientConstraintDescriptorSource.class, ClientConstraintDescriptorImpl.class);
050    }
051
052    public static void contributeServiceOverride(
053            MappedConfiguration<Class, Object> configuration,
054            @Local FieldValidatorDefaultSource source)
055    {
056        configuration.add(FieldValidatorDefaultSource.class, source);
057    }
058
059    public static Validator buildBeanValidator(ValidatorFactory validatorFactory, PropertyShadowBuilder propertyShadowBuilder)
060    {
061        return propertyShadowBuilder.build(validatorFactory, "validator", Validator.class);
062    }
063
064
065    public static ValidatorFactory buildValidatorFactory(BeanValidatorSource beanValidatorSource, PropertyShadowBuilder propertyShadowBuilder)
066    {
067        return propertyShadowBuilder.build(beanValidatorSource, "validatorFactory", ValidatorFactory.class);
068    }
069
070    public static void contributeBeanValidatorGroupSource(
071            final Configuration<Class> configuration)
072    {
073        configuration.add(Default.class);
074    }
075
076    public static void contributeBeanValidatorSource(
077            final OrderedConfiguration<BeanValidatorConfigurer> configuration, final ThreadLocale threadLocale)
078    {
079        configuration.add("LocaleAwareMessageInterpolator", new BeanValidatorConfigurer()
080        {
081            public void configure(javax.validation.Configuration<?> configuration)
082            {
083                MessageInterpolator defaultInterpolator = configuration.getDefaultMessageInterpolator();
084
085                configuration.messageInterpolator(new MessageInterpolatorImpl(defaultInterpolator, threadLocale));
086            }
087        });
088    }
089
090    public static void contributeClientConstraintDescriptorSource(
091            final Configuration<ClientConstraintDescriptor> configuration)
092    {
093        configuration.add(new ClientConstraintDescriptor(Max.class, "maxnumber", "value"));
094        configuration.add(new ClientConstraintDescriptor(Min.class, "minnumber", "value"));
095        configuration.add(new ClientConstraintDescriptor(NotNull.class, "notnull"));
096        configuration.add(new ClientConstraintDescriptor(Null.class, "isnull"));
097        configuration.add(new ClientConstraintDescriptor(Pattern.class, "pattern", "regexp"));
098        configuration.add(new ClientConstraintDescriptor(Size.class, "size", "min", "max"));
099    }
100
101    @Contribute(JavaScriptStackSource.class)
102    public static void addBeanValidationStack(MappedConfiguration<String, JavaScriptStack> configuration)
103    {
104        configuration.addInstance(BeanValidatorStack.STACK_ID, BeanValidatorStack.class);
105    }
106
107    @Contribute(ComponentClassTransformWorker2.class)
108    @Primary
109    public static void addWorker(OrderedConfiguration<ComponentClassTransformWorker2> configuration)
110    {
111        configuration.addInstance("FeebboFormResourcesInclusionWorker", FormResourcesInclusionWorker.class);
112    }
113
114}