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}