blob: 776cd1930149f187a2da72eb8cec9ef72decb887 [file] [log] [blame]
// Copyright 2009, 2010 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.tapestry5.beanvalidator;
import javax.validation.MessageInterpolator;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import javax.validation.groups.Default;
import org.apache.tapestry5.Asset;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.RenderSupport;
import org.apache.tapestry5.internal.beanvalidator.BeanFieldValidatorDefaultSource;
import org.apache.tapestry5.internal.beanvalidator.BeanValidationGroupSourceImpl;
import org.apache.tapestry5.internal.beanvalidator.BeanValidatorSourceImpl;
import org.apache.tapestry5.internal.beanvalidator.ClientConstraintDescriptorImpl;
import org.apache.tapestry5.internal.beanvalidator.MessageInterpolatorImpl;
import org.apache.tapestry5.ioc.Configuration;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.OrderedConfiguration;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Local;
import org.apache.tapestry5.ioc.services.PropertyShadowBuilder;
import org.apache.tapestry5.ioc.services.ThreadLocale;
import org.apache.tapestry5.services.AssetSource;
import org.apache.tapestry5.services.Environment;
import org.apache.tapestry5.services.FieldValidatorDefaultSource;
import org.apache.tapestry5.services.MarkupRenderer;
import org.apache.tapestry5.services.MarkupRendererFilter;
/**
* Module for JSR-303 services.
*
* @since 5.2.0.0
*/
public class BeanValidatorModule
{
public static void bind(final ServiceBinder binder)
{
binder.bind(FieldValidatorDefaultSource.class, BeanFieldValidatorDefaultSource.class)
.withId("BeanFieldValidatorDefaultSource");
binder.bind(BeanValidatorGroupSource.class, BeanValidationGroupSourceImpl.class);
binder.bind(BeanValidatorSource.class, BeanValidatorSourceImpl.class);
binder.bind(ClientConstraintDescriptorSource.class, ClientConstraintDescriptorImpl.class);
}
public static void contributeServiceOverride(
MappedConfiguration<Class, Object> configuration,
@Local FieldValidatorDefaultSource source)
{
configuration.add(FieldValidatorDefaultSource.class, source);
}
public static Validator buildBeanValidator(ValidatorFactory validatorFactory, PropertyShadowBuilder propertyShadowBuilder)
{
return propertyShadowBuilder.build(validatorFactory, "validator", Validator.class);
}
public static ValidatorFactory buildValidatorFactory( BeanValidatorSource beanValidatorSource, PropertyShadowBuilder propertyShadowBuilder)
{
return propertyShadowBuilder.build(beanValidatorSource, "validatorFactory", ValidatorFactory.class);
}
public static void contributeBeanValidatorGroupSource(
final Configuration<Class> configuration)
{
configuration.add(Default.class);
}
public static void contributeBeanValidatorSource(
final OrderedConfiguration<BeanValidatorConfigurer> configuration, final ThreadLocale threadLocale)
{
configuration.add("LocaleAwareMessageInterpolator", new BeanValidatorConfigurer()
{
public void configure(javax.validation.Configuration<?> configuration)
{
MessageInterpolator defaultInterpolator = configuration.getDefaultMessageInterpolator();
configuration.messageInterpolator(new MessageInterpolatorImpl(defaultInterpolator, threadLocale));
}
});
}
public static void contributeClientConstraintDescriptorSource(
final Configuration<ClientConstraintDescriptor> configuration)
{
configuration.add(new ClientConstraintDescriptor(Max.class, "maxnumber", "value"));
configuration.add(new ClientConstraintDescriptor(Min.class, "minnumber", "value"));
configuration.add(new ClientConstraintDescriptor(NotNull.class, "notnull"));
configuration.add(new ClientConstraintDescriptor(Null.class, "isnull"));
configuration.add(new ClientConstraintDescriptor(Pattern.class, "pattern", "regexp"));
configuration.add(new ClientConstraintDescriptor(Size.class, "size", "min", "max"));
}
public void contributeMarkupRenderer(
OrderedConfiguration<MarkupRendererFilter> configuration,
final AssetSource assetSource,
final ThreadLocale threadLocale,
final Environment environment)
{
MarkupRendererFilter injectBeanValidatorScript = new MarkupRendererFilter()
{
public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer)
{
RenderSupport renderSupport = environment.peek(RenderSupport.class);
Asset validators = assetSource.getAsset(null, "org/apache/tapestry5/beanvalidator/tapestry-beanvalidator.js",
threadLocale.getLocale());
renderSupport.addScriptLink(validators);
renderer.renderMarkup(writer);
}
};
configuration.add("BeanValidatorScript", injectBeanValidatorScript, "after:*");
}
}