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.Asset; 017 import org.apache.tapestry5.MarkupWriter; 018 import org.apache.tapestry5.RenderSupport; 019 import org.apache.tapestry5.internal.beanvalidator.*; 020 import org.apache.tapestry5.ioc.Configuration; 021 import org.apache.tapestry5.ioc.MappedConfiguration; 022 import org.apache.tapestry5.ioc.OrderedConfiguration; 023 import org.apache.tapestry5.ioc.ServiceBinder; 024 import org.apache.tapestry5.ioc.annotations.Local; 025 import org.apache.tapestry5.ioc.services.PropertyShadowBuilder; 026 import org.apache.tapestry5.ioc.services.ThreadLocale; 027 import org.apache.tapestry5.services.*; 028 029 import javax.validation.MessageInterpolator; 030 import javax.validation.Validator; 031 import javax.validation.ValidatorFactory; 032 import javax.validation.constraints.*; 033 import javax.validation.groups.Default; 034 035 /** 036 * Module for JSR-303 services. 037 * 038 * @since 5.2.0.0 039 */ 040 public class BeanValidatorModule 041 { 042 public static void bind(final ServiceBinder binder) 043 { 044 binder.bind(FieldValidatorDefaultSource.class, BeanFieldValidatorDefaultSource.class).withSimpleId(); 045 binder.bind(BeanValidatorGroupSource.class, BeanValidationGroupSourceImpl.class); 046 binder.bind(BeanValidatorSource.class, BeanValidatorSourceImpl.class); 047 binder.bind(ClientConstraintDescriptorSource.class, ClientConstraintDescriptorImpl.class); 048 } 049 050 public static void contributeServiceOverride( 051 MappedConfiguration<Class, Object> configuration, 052 @Local FieldValidatorDefaultSource source) 053 { 054 configuration.add(FieldValidatorDefaultSource.class, source); 055 } 056 057 public static Validator buildBeanValidator(ValidatorFactory validatorFactory, PropertyShadowBuilder propertyShadowBuilder) 058 { 059 return propertyShadowBuilder.build(validatorFactory, "validator", Validator.class); 060 } 061 062 063 public static ValidatorFactory buildValidatorFactory(BeanValidatorSource beanValidatorSource, PropertyShadowBuilder propertyShadowBuilder) 064 { 065 return propertyShadowBuilder.build(beanValidatorSource, "validatorFactory", ValidatorFactory.class); 066 } 067 068 public static void contributeBeanValidatorGroupSource( 069 final Configuration<Class> configuration) 070 { 071 configuration.add(Default.class); 072 } 073 074 public static void contributeBeanValidatorSource( 075 final OrderedConfiguration<BeanValidatorConfigurer> configuration, final ThreadLocale threadLocale) 076 { 077 configuration.add("LocaleAwareMessageInterpolator", new BeanValidatorConfigurer() 078 { 079 public void configure(javax.validation.Configuration<?> configuration) 080 { 081 MessageInterpolator defaultInterpolator = configuration.getDefaultMessageInterpolator(); 082 083 configuration.messageInterpolator(new MessageInterpolatorImpl(defaultInterpolator, threadLocale)); 084 } 085 }); 086 } 087 088 public static void contributeClientConstraintDescriptorSource( 089 final Configuration<ClientConstraintDescriptor> configuration) 090 { 091 configuration.add(new ClientConstraintDescriptor(Max.class, "maxnumber", "value")); 092 configuration.add(new ClientConstraintDescriptor(Min.class, "minnumber", "value")); 093 configuration.add(new ClientConstraintDescriptor(NotNull.class, "notnull")); 094 configuration.add(new ClientConstraintDescriptor(Null.class, "isnull")); 095 configuration.add(new ClientConstraintDescriptor(Pattern.class, "pattern", "regexp")); 096 configuration.add(new ClientConstraintDescriptor(Size.class, "size", "min", "max")); 097 } 098 099 public void contributeMarkupRenderer( 100 OrderedConfiguration<MarkupRendererFilter> configuration, 101 102 final AssetSource assetSource, 103 104 final ThreadLocale threadLocale, 105 106 final Environment environment) 107 { 108 MarkupRendererFilter injectBeanValidatorScript = new MarkupRendererFilter() 109 { 110 public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer) 111 { 112 RenderSupport renderSupport = environment.peek(RenderSupport.class); 113 114 Asset validators = assetSource.getAsset(null, "org/apache/tapestry5/beanvalidator/tapestry-beanvalidator.js", 115 threadLocale.getLocale()); 116 117 renderSupport.addScriptLink(validators); 118 119 renderer.renderMarkup(writer); 120 } 121 }; 122 123 124 configuration.add("BeanValidatorScript", injectBeanValidatorScript, "after:*"); 125 } 126 127 }