001// Copyright 2005 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.tapestry.valid;
016
017import java.util.HashMap;
018import java.util.Map;
019
020import org.apache.tapestry.IMarkupWriter;
021import org.apache.tapestry.IRequestCycle;
022import org.apache.tapestry.form.IFormComponent;
023
024/**
025 * A type-specific replacement for {@link org.apache.tapestry.valid.NumberValidator}.
026 * 
027 * @author Howard M. Lewis Ship
028 */
029public class IntValidator extends AbstractNumericValidator
030{
031    private boolean _minimumSet;
032
033    private int _minimum;
034
035    private boolean _maximumSet;
036
037    private int _maximum;
038
039    public IntValidator()
040    {
041    }
042
043    public IntValidator(String initializer)
044    {
045        super(initializer);
046    }
047
048    public String toString(IFormComponent field, Object value)
049    {
050        if (value == null)
051            return null;
052
053        // Be generous; maybe it isn't quite an int, so
054        // treat it as a Number
055
056        Number number = (Number) value;
057
058        if (getZeroIsNull() && number.intValue() == 0)
059            return null;
060
061        return number.toString();
062    }
063
064    public Object toObject(IFormComponent field, String value) throws ValidatorException
065    {
066        if (checkRequired(field, value))
067            return null;
068
069        try
070        {
071            int intValue = Integer.parseInt(value);
072
073            if (_minimumSet && intValue < _minimum)
074                throw new ValidatorException(buildNumberTooSmallMessage(
075                        field,
076                        new Integer(_minimum)), ValidationConstraint.TOO_SMALL);
077
078            if (_maximumSet && intValue > _maximum)
079                throw new ValidatorException(buildNumberTooLargeMessage(
080                        field,
081                        new Integer(_maximum)), ValidationConstraint.TOO_LARGE);
082
083            return new Integer(intValue);
084        }
085        catch (NumberFormatException ex)
086        {
087            throw new ValidatorException(buildInvalidNumericFormatMessage(field),
088                    ValidationConstraint.NUMBER_FORMAT);
089        }
090    }
091
092    public void renderValidatorContribution(IFormComponent field, IMarkupWriter writer,
093            IRequestCycle cycle)
094    {
095        if (!isClientScriptingEnabled())
096            return;
097
098        if (!(isRequired() || _minimumSet || _maximumSet))
099            return;
100
101        Map symbols = buildSymbols(field);
102
103        processValidatorScript(getScriptPath(), cycle, field, symbols);
104    }
105
106    Map buildSymbols(IFormComponent field)
107    {
108        Map symbols = new HashMap();
109
110        if (isRequired())
111            symbols.put("requiredMessage", buildRequiredMessage(field));
112
113        symbols.put("formatMessage", buildInvalidIntegerFormatMessage(field));
114
115        if (_minimumSet || _maximumSet)
116        {
117            Number minimum = _minimumSet ? new Integer(_minimum) : null;
118            Number maximum = _maximumSet ? new Integer(_maximum) : null;
119
120            symbols.put("minimum", minimum);
121            symbols.put("maximum", maximum);
122
123            symbols.put("rangeMessage", buildRangeMessage(field, minimum, maximum));
124        }
125
126        return symbols;
127    }
128
129    public void setMaximum(int maximum)
130    {
131        _maximum = maximum;
132        _maximumSet = true;
133    }
134
135    public void setMinimum(int minimum)
136    {
137        _minimum = minimum;
138        _minimumSet = true;
139    }
140
141    protected String getDefaultScriptPath()
142    {
143        return "/org/apache/tapestry/valid/IntegerValidator.script";
144    }
145}