<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ShortValidator.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Intake Service</a> &gt; <a href="index.source.html" class="el_package">org.apache.fulcrum.intake.validator</a> &gt; <span class="el_source">ShortValidator.java</span></div><h1>ShortValidator.java</h1><pre class="source lang-java linenums">package org.apache.fulcrum.intake.validator;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * &quot;License&quot;); 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
 * &quot;AS IS&quot; 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.
 */

import java.util.Locale;

/**
 * Validates Shorts with the following constraints in addition to those
 * listed in NumberValidator and DefaultValidator.
 *
 * &lt;table&gt;
 * &lt;caption&gt;Validation rules&lt;/caption&gt;
 * &lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Valid Values&lt;/th&gt;&lt;th&gt;Default Value&lt;/th&gt;&lt;/tr&gt;
 * &lt;tr&gt;&lt;td&gt;minValue&lt;/td&gt;&lt;td&gt;greater than Short.MIN_VALUE&lt;/td&gt;
 * &lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
 * &lt;tr&gt;&lt;td&gt;maxValue&lt;/td&gt;&lt;td&gt;less than Short.MAX_VALUE&lt;/td&gt;
 * &lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
 * &lt;tr&gt;&lt;td&gt;invalidNumberMessage&lt;/td&gt;&lt;td&gt;Some text&lt;/td&gt;
 * &lt;td&gt;Entry was not a valid Short&lt;/td&gt;&lt;/tr&gt;
 * &lt;/table&gt;
 *
 * @author &lt;a href=&quot;mailto:jmcnally@collab.net&quot;&gt;John McNally&lt;/a&gt;
 * @author &lt;a href=&quot;mailto:Colin.Chalmers@maxware.nl&quot;&gt;Colin Chalmers&lt;/a&gt;
 * @author &lt;a href=&quot;mailto:jh@byteaction.de&quot;&gt;J&amp;uuml;rgen Hoffmann&lt;/a&gt;
 * @version $Id$
 */
public class ShortValidator
        extends NumberValidator&lt;Short&gt;
{
    /**
     * Default Constructor
     */
    public ShortValidator()
    {
<span class="fc" id="L52">        super();</span>
<span class="fc" id="L53">        invalidNumberMessage = &quot;Entry was not a valid Short&quot;;</span>
<span class="fc" id="L54">    }</span>

    /**
     * @see org.apache.fulcrum.intake.validator.NumberValidator#parseNumber(java.lang.String, java.util.Locale)
     */
    @Override
    protected Short parseNumber(String stringValue, Locale locale) throws NumberFormatException
    {
<span class="fc" id="L62">        return Short.valueOf(stringValue);</span>
    }
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>