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.
014    package org.apache.tapestry5.beanvalidator;
015    
016    import org.apache.tapestry5.internal.beanvalidator.*;
017    import org.apache.tapestry5.ioc.Configuration;
018    import org.apache.tapestry5.ioc.MappedConfiguration;
019    import org.apache.tapestry5.ioc.OrderedConfiguration;
020    import org.apache.tapestry5.ioc.ServiceBinder;
021    import org.apache.tapestry5.ioc.annotations.Contribute;
022    import org.apache.tapestry5.ioc.annotations.Local;
023    import org.apache.tapestry5.ioc.annotations.Primary;
024    import org.apache.tapestry5.ioc.services.PropertyShadowBuilder;
025    import org.apache.tapestry5.ioc.services.ThreadLocale;
026    import org.apache.tapestry5.services.FieldValidatorDefaultSource;
027    import org.apache.tapestry5.services.javascript.JavaScriptStack;
028    import org.apache.tapestry5.services.javascript.JavaScriptStackSource;
029    import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
030    
031    import javax.validation.MessageInterpolator;
032    import javax.validation.Validator;
033    import javax.validation.ValidatorFactory;
034    import javax.validation.constraints.*;
035    import javax.validation.groups.Default;
036    
037    /**
038     * Module for JSR-303 services.
039     *
040     * @since 5.2.0.0
041     */
042    public 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    }