blob: ff5739043493a1ef6eae2e76db4b4ff621a7a493 [file] [log] [blame]
// Copyright 2009-2013 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.modules;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.beanvalidator.*;
import org.apache.tapestry5.internal.beanvalidator.*;
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.FieldValidatorDefaultSource;
import org.apache.tapestry5.services.javascript.DataConstants;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import javax.validation.MessageInterpolator;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.*;
import javax.validation.groups.Default;
import java.util.Map;
/**
* Module for JSR-303 services.
*
* @since 5.2.0.0
*/
public class BeanValidatorModule
{
private static final String MODULE_NAME = "t5/beanvalidator/beanvalidator-validation";
public static void bind(final ServiceBinder binder)
{
binder.bind(FieldValidatorDefaultSource.class, BeanFieldValidatorDefaultSource.class).withSimpleId();
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()
{
@Override
public void configure(javax.validation.Configuration<?> configuration)
{
MessageInterpolator defaultInterpolator = configuration.getDefaultMessageInterpolator();
configuration.messageInterpolator(new MessageInterpolatorImpl(defaultInterpolator, threadLocale));
}
});
}
public static void contributeClientConstraintDescriptorSource(final JavaScriptSupport javaScriptSupport,
final Configuration<ClientConstraintDescriptor> configuration)
{
configuration.add(new BaseCCD(Max.class, "value")
{
@Override
public void applyClientValidation(MarkupWriter writer, String message, Map<String, Object> attributes)
{
javaScriptSupport.require("t5/core/validation");
writer.attributes(
"data-validate", true,
"data-validate-max", attributes.get("value"),
"data-max-message", message);
}
});
configuration.add(new BaseCCD(Min.class, "value")
{
@Override
public void applyClientValidation(MarkupWriter writer, String message, Map<String, Object> attributes)
{
javaScriptSupport.require("t5/core/validation");
writer.attributes(
DataConstants.VALIDATION_ATTRIBUTE, true,
"data-validate-min", attributes.get("value"),
"data-min-message", message);
}
});
configuration.add(new BaseCCD(NotNull.class)
{
@Override
public void applyClientValidation(MarkupWriter writer, String message, Map<String, Object> attributes)
{
javaScriptSupport.require("t5/core/validation");
writer.attributes(
DataConstants.VALIDATION_ATTRIBUTE, true,
"data-optionality", "required",
"data-required-message", message);
}
});
configuration.add(new BaseCCD(Null.class)
{
@Override
public void applyClientValidation(MarkupWriter writer, String message, Map<String, Object> attributes)
{
javaScriptSupport.require(MODULE_NAME);
writer.attributes(
DataConstants.VALIDATION_ATTRIBUTE, true,
"data-optionality", "prohibited",
"data-prohibited-message", message);
}
});
configuration.add(new BaseCCD(Pattern.class, "regexp")
{
@Override
public void applyClientValidation(MarkupWriter writer, String message, Map<String, Object> attributes)
{
javaScriptSupport.require(MODULE_NAME);
writer.attributes(
DataConstants.VALIDATION_ATTRIBUTE, true,
"data-validate-regexp", attributes.get("regexp"),
"data-regexp-message", message);
}
});
configuration.add(new BaseCCD(Size.class, "min", "max")
{
@Override
public void applyClientValidation(MarkupWriter writer, String message, Map<String, Object> attributes)
{
javaScriptSupport.require(MODULE_NAME);
writer.attributes(
DataConstants.VALIDATION_ATTRIBUTE, true,
"data-range-message", message);
int min = (Integer) attributes.get("min");
if (min != 0)
{
writer.attributes("data-range-min", min);
}
int max = (Integer) attributes.get("max");
if (max != Integer.MAX_VALUE)
{
writer.attributes("data-range-max", max);
}
}
});
configuration.add(new BaseCCD(AssertTrue.class)
{
@Override
public void applyClientValidation(MarkupWriter writer, String message, Map<String, Object> attributes)
{
javaScriptSupport.require("t5/core/validation");
writer.attributes(
DataConstants.VALIDATION_ATTRIBUTE, true,
"data-expected-status", "checked",
"data-checked-message", message);
}
});
configuration.add(new BaseCCD(AssertFalse.class)
{
@Override
public void applyClientValidation(MarkupWriter writer, String message, Map<String, Object> attributes)
{
javaScriptSupport.require("t5/core/validation");
writer.attributes(
DataConstants.VALIDATION_ATTRIBUTE, true,
"data-expected-status", "unchecked",
"data-checked-message", message);
}
});
}
}