    001// Copyright 2007, 2008, 2012 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
    015package org.apache.tapestry5.validator;
    016
    017import org.apache.tapestry5.Field;
    018import org.apache.tapestry5.MarkupWriter;
    019import org.apache.tapestry5.ValidationException;
    020import org.apache.tapestry5.commons.MessageFormatter;
    021import org.apache.tapestry5.services.FormSupport;
    022import org.apache.tapestry5.services.Html5Support;
    023import org.apache.tapestry5.services.javascript.DataConstants;
    024import org.apache.tapestry5.services.javascript.JavaScriptSupport;
    025
    026/**
    027 * Enforces a maximum integer value.
    028 */
    029public class Max extends AbstractValidator<Long, Number>
    030{
    031
    032    final private Html5Support html5Support;
    033
    034    public Max(JavaScriptSupport javaScriptSupport, Html5Support html5Support)
    035    {
    036        super(Long.class, Number.class, "max-integer", javaScriptSupport);
    037        this.html5Support = html5Support;
    038    }
    039
    040    public void validate(Field field, Long constraintValue, MessageFormatter formatter, Number value)
    041            throws ValidationException
    042    {
    043        if (value.longValue() > constraintValue)
    044            throw new ValidationException(buildMessage(formatter, field, constraintValue));
    045    }
    046
    047    private String buildMessage(MessageFormatter formatter, Field field, Long constraintValue)
    048    {
    049        return formatter.format(constraintValue, field.getLabel());
    050    }
    051
    052    public void render(Field field, Long constraintValue, MessageFormatter formatter, MarkupWriter writer,
    053                       FormSupport formSupport)
    054    {
    055        if (formSupport.isClientValidationEnabled())
    056        {
    057            javaScriptSupport.require("t5/core/validation");
    058
    059            writer.attributes(DataConstants.VALIDATION_ATTRIBUTE, true,
    060                    "data-validate-max", constraintValue.toString(),
    061                    "data-max-message", buildMessage(formatter, field, constraintValue));
    062        }
    063        if (html5Support.isHtml5SupportEnabled())
    064        {
    065            writer.getElement().forceAttributes("type", "number", "max", String.valueOf(constraintValue));
    066        }
    067    }
    068
    069}