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 }