You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by mm...@apache.org on 2006/09/21 13:08:00 UTC

svn commit: r448511 - in /myfaces/core/trunk/api/src/main/java/javax/faces/validator: DoubleRangeValidator.java LengthValidator.java LongRangeValidator.java NumberRangeValidator.java

Author: mmarinschek
Date: Thu Sep 21 04:07:59 2006
New Revision: 448511

URL: http://svn.apache.org/viewvc?view=rev&rev=448511
Log:
fix for [MYFACES-1418] : javax.faces.validator - DoubleRangeValidator, LengthValidator, LongRangeValidator are very similar, refactor common behaviour. Thanks to Nikolay Petrov.

Added:
    myfaces/core/trunk/api/src/main/java/javax/faces/validator/NumberRangeValidator.java
Modified:
    myfaces/core/trunk/api/src/main/java/javax/faces/validator/DoubleRangeValidator.java
    myfaces/core/trunk/api/src/main/java/javax/faces/validator/LengthValidator.java
    myfaces/core/trunk/api/src/main/java/javax/faces/validator/LongRangeValidator.java

Modified: myfaces/core/trunk/api/src/main/java/javax/faces/validator/DoubleRangeValidator.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/validator/DoubleRangeValidator.java?view=diff&rev=448511&r1=448510&r2=448511
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/validator/DoubleRangeValidator.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/validator/DoubleRangeValidator.java Thu Sep 21 04:07:59 2006
@@ -15,172 +15,79 @@
  */
 package javax.faces.validator;
 
-import javax.faces.component.StateHolder;
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-
 /**
  * see Javadoc of <a href="http://java.sun.com/j2ee/javaserverfaces/1.1_01/docs/api/index.html">JSF Specification</a>
- *
+ * 
  * @author Manfred Geiler (latest modification by $Author$)
  * @author Thomas Spiegl
  * @version $Revision$ $Date$
  */
-public class DoubleRangeValidator
-        implements Validator, StateHolder
-{
-    // FIELDS
-    public static final String VALIDATOR_ID       = "javax.faces.DoubleRange";
-    public static final String MAXIMUM_MESSAGE_ID = "javax.faces.validator.DoubleRangeValidator.MAXIMUM";
-    public static final String MINIMUM_MESSAGE_ID = "javax.faces.validator.DoubleRangeValidator.MINIMUM";
-    public static final String TYPE_MESSAGE_ID    = "javax.faces.validator.DoubleRangeValidator.TYPE";
-
-    private Double _minimum = null;
-    private Double _maximum = null;
-    private boolean _transient = false;
-
-    // CONSTRUCTORS
-    public DoubleRangeValidator()
-    {
-    }
-
-    public DoubleRangeValidator(double maximum)
-    {
-        _maximum = new Double(maximum);
-    }
-
-    public DoubleRangeValidator(double maximum,
-                                double minimum)
-    {
-        _maximum = new Double(maximum);
-        _minimum = new Double(minimum);
-    }
-
-    // VALIDATE
-    public void validate(FacesContext facesContext,
-                         UIComponent uiComponent,
-                         Object value)
-            throws ValidatorException
-    {
-        if (facesContext == null) throw new NullPointerException("facesContext");
-        if (uiComponent == null) throw new NullPointerException("uiComponent");
-
-        if (value == null)
-        {
-            return;
-        }
-
-        double dvalue = parseDoubleValue(facesContext, uiComponent,value);
-        if (_minimum != null && _maximum != null)
-        {
-            if (dvalue < _minimum.doubleValue() ||
-                dvalue > _maximum.doubleValue())
-            {
-                Object[] args = {_minimum, _maximum,uiComponent.getId()};
-                throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, NOT_IN_RANGE_MESSAGE_ID, args));
-            }
-        }
-        else if (_minimum != null)
-        {
-            if (dvalue < _minimum.doubleValue())
-            {
-                Object[] args = {_minimum,uiComponent.getId()};
-                throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, MINIMUM_MESSAGE_ID, args));
-            }
-        }
-        else if (_maximum != null)
-        {
-            if (dvalue > _maximum.doubleValue())
-            {
-                Object[] args = {_maximum,uiComponent.getId()};
-                throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, MAXIMUM_MESSAGE_ID, args));
-            }
-        }
-    }
-
-    private double parseDoubleValue(FacesContext facesContext, UIComponent uiComponent, Object value)
-        throws ValidatorException
-    {
-        if (value instanceof Number)
-        {
-            return ((Number)value).doubleValue();
-        }
-        else
-        {
-            try
-            {
-                return Double.parseDouble(value.toString());
-            }
-            catch (NumberFormatException e)
-            {
-				Object[] args = {uiComponent.getId()};
-               throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, TYPE_MESSAGE_ID, args));
-            }
-        }
-    }
-
-
-    // GETTER & SETTER
-    public double getMaximum()
-    {
-        return _maximum != null ? _maximum.doubleValue() : Double.MAX_VALUE;
-    }
-
-    public void setMaximum(double maximum)
-    {
-        _maximum = new Double(maximum);
-    }
-
-    public double getMinimum()
-    {
-        return _minimum != null ? _minimum.doubleValue() : Double.MIN_VALUE;
-    }
-
-    public void setMinimum(double minimum)
-    {
-        _minimum = new Double(minimum);
-    }
-
-
-    // RESTORE/SAVE STATE
-    public Object saveState(FacesContext context)
-    {
-        Object values[] = new Object[2];
-        values[0] = _maximum;
-        values[1] = _minimum;
-        return values;
-    }
-
-    public void restoreState(FacesContext context,
-                             Object state)
-    {
-        Object values[] = (Object[])state;
-        _maximum = (Double)values[0];
-        _minimum = (Double)values[1];
-    }
-
-    public boolean isTransient()
-    {
-        return _transient;
-    }
-
-    public void setTransient(boolean transientValue)
-    {
-        _transient = transientValue;
-    }
-
-    // MISC
-    public boolean equals(Object o)
-    {
-        if (this == o) return true;
-        if (!(o instanceof DoubleRangeValidator)) return false;
-
-        final DoubleRangeValidator doubleRangeValidator = (DoubleRangeValidator)o;
-
-        if (_maximum != null ? !_maximum.equals(doubleRangeValidator._maximum) : doubleRangeValidator._maximum != null) return false;
-        if (_minimum != null ? !_minimum.equals(doubleRangeValidator._minimum) : doubleRangeValidator._minimum != null) return false;
-
-        return true;
-    }
-
+public class DoubleRangeValidator extends NumberRangeValidator {
+	// FIELDS
+	public static final String VALIDATOR_ID = "javax.faces.DoubleRange";
+	public static final String MAXIMUM_MESSAGE_ID = "javax.faces.validator.DoubleRangeValidator.MAXIMUM";
+	public static final String MINIMUM_MESSAGE_ID = "javax.faces.validator.DoubleRangeValidator.MINIMUM";
+	public static final String TYPE_MESSAGE_ID = "javax.faces.validator.DoubleRangeValidator.TYPE";
+
+	// CONSTRUCTORS
+	public DoubleRangeValidator() {
+		super(null, null);
+	}
+
+	public DoubleRangeValidator(double maximum) {
+		super(null, new Double(maximum));
+	}
+
+	public DoubleRangeValidator(double maximum, double minimum) {
+		super(new Double(minimum), new Double(maximum));
+	}
+
+	// Abstract methods implementation
+	protected Comparable getValue(Number number) {
+		if(number instanceof Double) {
+			return (Double) number;
+		}
+		return new Double(number.longValue());
+	}
+
+	protected Comparable getValue(String str) throws NumberFormatException {
+		return new Double(str);
+	}
+	
+	protected String getMaximumMessageId() {
+		return MAXIMUM_MESSAGE_ID;
+	}
+
+	protected String getMinimumMessageId() {
+		return MINIMUM_MESSAGE_ID;
+	}
+
+	protected String getTypeMessageId() {
+		return TYPE_MESSAGE_ID;
+	}
+	
+	// GETTER & SETTER
+	public double getMaximum() {
+		return _maximum != null ? _maximum.doubleValue() : Double.MAX_VALUE;
+	}
+
+	public void setMaximum(double maximum) {
+		_maximum = new Double(maximum);
+	}
+
+	public double getMinimum() {
+		return _minimum != null ? _minimum.doubleValue() : Double.MIN_VALUE;
+	}
+
+	public void setMinimum(double minimum) {
+		_minimum = new Double(minimum);
+	}
+
+	// MISC
+	public boolean equals(Object o) {
+		if (!(o instanceof DoubleRangeValidator)) {
+			return false;
+		}
+		return super.equals(o);
+	}
 }

Modified: myfaces/core/trunk/api/src/main/java/javax/faces/validator/LengthValidator.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/validator/LengthValidator.java?view=diff&rev=448511&r1=448510&r2=448511
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/validator/LengthValidator.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/validator/LengthValidator.java Thu Sep 21 04:07:59 2006
@@ -15,142 +15,75 @@
  */
 package javax.faces.validator;
 
-import javax.faces.component.StateHolder;
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-
 /**
  * see Javadoc of <a href="http://java.sun.com/j2ee/javaserverfaces/1.1_01/docs/api/index.html">JSF Specification</a>
- *
+ * 
  * @author Manfred Geiler (latest modification by $Author$)
  * @author Thomas Spiegl
  * @version $Revision$ $Date$
  */
-public class LengthValidator
-        implements Validator, StateHolder
-{
-    // FIELDS
-    public static final String 	MAXIMUM_MESSAGE_ID = "javax.faces.validator.LengthValidator.MAXIMUM";
-    public static final String 	MINIMUM_MESSAGE_ID = "javax.faces.validator.LengthValidator.MINIMUM";
-    public static final String 	VALIDATOR_ID 	   = "javax.faces.Length";
-
-    private Integer _minimum = null;
-    private Integer _maximum = null;
-    private boolean _transient = false;
-
-    // CONSTRUCTORS
-    public LengthValidator()
-    {
-    }
-
-    public LengthValidator(int maximum)
-    {
-        _maximum = new Integer(maximum);
-    }
-
-    public LengthValidator(int maximum,
-                           int minimum)
-    {
-        _maximum = new Integer(maximum);
-        _minimum = new Integer(minimum);
-    }
-
-    // VALIDATE
-    public void validate(FacesContext facesContext,
-                         UIComponent uiComponent,
-                         Object value)
-            throws ValidatorException
-    {
-        if (facesContext == null) throw new NullPointerException("facesContext");
-        if (uiComponent == null) throw new NullPointerException("uiComponent");
-
-        if (value == null)
-        {
-            return;
-        }
-
-        int length = value instanceof String ?
-            ((String)value).length() : value.toString().length();
-
-        if (_minimum != null)
-        {
-            if (length < _minimum.intValue())
-            {
-                Object[] args = {_minimum,uiComponent.getId()};
-                throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, MINIMUM_MESSAGE_ID, args));
-            }
-        }
-
-        if (_maximum != null)
-        {
-            if (length > _maximum.intValue())
-            {
-                Object[] args = {_maximum,uiComponent.getId()};
-                throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, MAXIMUM_MESSAGE_ID, args));
-            }
-        }
-    }
-
-    // SETTER & GETTER
-    public int getMaximum()
-    {
-        return _maximum != null ? _maximum.intValue() : Integer.MAX_VALUE;
-    }
-
-    public void setMaximum(int maximum)
-    {
-        _maximum = new Integer(maximum);
-    }
-
-    public int getMinimum()
-    {
-        return _minimum != null ? _minimum.intValue() : 0;
-    }
-
-    public void setMinimum(int minimum)
-    {
-        _minimum = new Integer(minimum);
-    }
-
-    public boolean isTransient()
-    {
-        return _transient;
-    }
-
-    public void setTransient(boolean transientValue)
-    {
-        _transient = transientValue;
-    }
-
-    // RESTORE & SAVE STATE
-    public Object saveState(FacesContext context)
-    {
-        Object values[] = new Object[2];
-        values[0] = _maximum;
-        values[1] = _minimum;
-        return values;
-    }
-
-    public void restoreState(FacesContext context,
-                             Object state)
-    {
-        Object values[] = (Object[])state;
-        _maximum = (Integer)values[0];
-        _minimum = (Integer)values[1];
-    }
-
-    // MISC
-    public boolean equals(Object o)
-    {
-        if (this == o) return true;
-        if (!(o instanceof LengthValidator)) return false;
-
-        final LengthValidator lengthValidator = (LengthValidator)o;
-
-        if (_maximum != null ? !_maximum.equals(lengthValidator._maximum) : lengthValidator._maximum != null) return false;
-        if (_minimum != null ? !_minimum.equals(lengthValidator._minimum) : lengthValidator._minimum != null) return false;
-
-        return true;
-    }
-
+public class LengthValidator extends NumberRangeValidator {
+	// FIELDS
+	public static final String MAXIMUM_MESSAGE_ID = "javax.faces.validator.LengthValidator.MAXIMUM";
+	public static final String MINIMUM_MESSAGE_ID = "javax.faces.validator.LengthValidator.MINIMUM";
+	public static final String VALIDATOR_ID = "javax.faces.Length";
+
+	// CONSTRUCTORS
+	public LengthValidator() {
+		super(null, null, false);
+	}
+
+	public LengthValidator(int maximum) {
+		super(null, new Integer(maximum), false);
+	}
+
+	public LengthValidator(int maximum, int minimum) {
+		super(new Integer(minimum), new Integer(maximum), false);
+	}
+
+	// Abstract methods implementation
+	protected Comparable getValue(Number number) {
+		return null;
+	}
+
+	protected Comparable getValue(String str) throws NumberFormatException {
+		return new Integer(str.length());
+	}
+
+	protected String getMaximumMessageId() {
+		return MAXIMUM_MESSAGE_ID;
+	}
+
+	protected String getMinimumMessageId() {
+		return MINIMUM_MESSAGE_ID;
+	}
+
+	protected String getTypeMessageId() {
+		return null;
+	}
+	
+	// SETTER & GETTER
+	public int getMaximum() {
+		return _maximum != null ? _maximum.intValue() : Integer.MAX_VALUE;
+	}
+
+	public void setMaximum(int maximum) {
+		_maximum = new Integer(maximum);
+	}
+
+	public int getMinimum() {
+		return _minimum != null ? _minimum.intValue() : 0;
+	}
+
+	public void setMinimum(int minimum) {
+		_minimum = new Integer(minimum);
+	}
+
+	// MISC
+	public boolean equals(Object o) {
+		if (!(o instanceof LengthValidator)) {
+			return false;
+		}
+		return super.equals(o);
+	}
 }

Modified: myfaces/core/trunk/api/src/main/java/javax/faces/validator/LongRangeValidator.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/validator/LongRangeValidator.java?view=diff&rev=448511&r1=448510&r2=448511
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/validator/LongRangeValidator.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/validator/LongRangeValidator.java Thu Sep 21 04:07:59 2006
@@ -15,171 +15,79 @@
  */
 package javax.faces.validator;
 
-import javax.faces.component.StateHolder;
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-
 /**
  * see Javadoc of <a href="http://java.sun.com/j2ee/javaserverfaces/1.1_01/docs/api/index.html">JSF Specification</a>
- *
+ * 
  * @author Manfred Geiler (latest modification by $Author$)
  * @author Thomas Spiegl
  * @version $Revision$ $Date$
  */
-public class LongRangeValidator
-        implements Validator, StateHolder
-{
-    // FIELDS
-    public static final String MAXIMUM_MESSAGE_ID = "javax.faces.validator.LongRangeValidator.MAXIMUM";
-    public static final String MINIMUM_MESSAGE_ID =	"javax.faces.validator.LongRangeValidator.MINIMUM";
-    public static final String TYPE_MESSAGE_ID 	  = "javax.faces.validator.LongRangeValidator.TYPE";
-    public static final String VALIDATOR_ID 	  = "javax.faces.LongRange";
-
-    private Long _minimum = null;
-    private Long _maximum = null;
-    private boolean _transient = false;
-
-    // CONSTRUCTORS
-    public LongRangeValidator()
-    {
-    }
-
-    public LongRangeValidator(long maximum)
-    {
-        _maximum = new Long(maximum);
-    }
-
-    public LongRangeValidator(long maximum,
-                              long minimum)
-    {
-        _maximum = new Long(maximum);
-        _minimum = new Long(minimum);
-    }
-
-    // VALIDATE
-    public void validate(FacesContext facesContext,
-                         UIComponent uiComponent,
-                         Object value)
-            throws ValidatorException
-    {
-        if (facesContext == null) throw new NullPointerException("facesContext");
-        if (uiComponent == null) throw new NullPointerException("uiComponent");
-
-        if (value == null)
-        {
-            return;
-        }
-
-        double dvalue = parseLongValue(facesContext, uiComponent,value);
-        if (_minimum != null && _maximum != null)
-        {
-            if (dvalue < _minimum.longValue() ||
-                dvalue > _maximum.longValue())
-            {
-                Object[] args = {_minimum, _maximum,uiComponent.getId()};
-                throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, NOT_IN_RANGE_MESSAGE_ID, args));
-            }
-        }
-        else if (_minimum != null)
-        {
-            if (dvalue < _minimum.longValue())
-            {
-                Object[] args = {_minimum,uiComponent.getId()};
-                throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, MINIMUM_MESSAGE_ID, args));
-            }
-        }
-        else if (_maximum != null)
-        {
-            if (dvalue > _maximum.longValue())
-            {
-                Object[] args = {_maximum,uiComponent.getId()};
-                throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, MAXIMUM_MESSAGE_ID, args));
-            }
-        }
-    }
-
-    private long parseLongValue(FacesContext facesContext, UIComponent uiComponent, Object value)
-        throws ValidatorException
-    {
-        if (value instanceof Number)
-        {
-            return ((Number)value).longValue();
-        }
-        else
-        {
-            try
-            {
-                return Long.parseLong(value.toString());
-            }
-            catch (NumberFormatException e)
-            {
-				Object[] args = {uiComponent.getId()};
-                throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, TYPE_MESSAGE_ID, args));
-            }
-        }
-    }
-
-
-     // GETTER & SETTER
-    public long getMaximum()
-    {
-        return _maximum != null ? _maximum.longValue() : Long.MAX_VALUE;
-    }
-
-    public void setMaximum(long maximum)
-    {
-        _maximum = new Long(maximum);
-    }
-
-    public long getMinimum()
-    {
-        return _minimum != null ? _minimum.longValue() : Long.MIN_VALUE;
-    }
-
-    public void setMinimum(long minimum)
-    {
-        _minimum = new Long(minimum);
-    }
-
-    public boolean isTransient()
-    {
-        return _transient;
-    }
-
-    public void setTransient(boolean transientValue)
-    {
-        _transient = transientValue;
-    }
-
-    // RESTORE & SAVE STATE
-    public Object saveState(FacesContext context)
-    {
-        Object values[] = new Object[2];
-        values[0] = _maximum;
-        values[1] = _minimum;
-        return values;
-    }
-
-    public void restoreState(FacesContext context,
-                             Object state)
-    {
-        Object values[] = (Object[])state;
-        _maximum = (Long)values[0];
-        _minimum = (Long)values[1];
-    }
-
-    // MISC
-    public boolean equals(Object o)
-    {
-        if (this == o) return true;
-        if (!(o instanceof LongRangeValidator)) return false;
-
-        final LongRangeValidator longRangeValidator = (LongRangeValidator)o;
-
-        if (_maximum != null ? !_maximum.equals(longRangeValidator._maximum) : longRangeValidator._maximum != null) return false;
-        if (_minimum != null ? !_minimum.equals(longRangeValidator._minimum) : longRangeValidator._minimum != null) return false;
-
-        return true;
-    }
-
+public class LongRangeValidator extends NumberRangeValidator {
+	// FIELDS
+	public static final String MAXIMUM_MESSAGE_ID = "javax.faces.validator.LongRangeValidator.MAXIMUM";
+	public static final String MINIMUM_MESSAGE_ID = "javax.faces.validator.LongRangeValidator.MINIMUM";
+	public static final String TYPE_MESSAGE_ID = "javax.faces.validator.LongRangeValidator.TYPE";
+	public static final String VALIDATOR_ID = "javax.faces.LongRange";
+
+	// CONSTRUCTORS
+	public LongRangeValidator() {
+		super(null, null);
+	}
+
+	public LongRangeValidator(long maximum) {
+		super(null, new Long(maximum));
+	}
+
+	public LongRangeValidator(long maximum, long minimum) {
+		super(new Long(minimum), new Long(maximum));
+	}
+
+	protected Comparable getValue(Number number) {
+		if(number instanceof Long) {
+			return (Long) number;
+		}
+		return new Long(number.longValue());
+	}
+
+	// Abstract methods implementation
+	protected Comparable getValue(String str) throws NumberFormatException {
+		return new Long(str);
+	}
+
+	protected String getMaximumMessageId() {
+		return MAXIMUM_MESSAGE_ID;
+	}
+
+	protected String getMinimumMessageId() {
+		return MINIMUM_MESSAGE_ID;
+	}
+
+	protected String getTypeMessageId() {
+		return TYPE_MESSAGE_ID;
+	}
+
+	// GETTER & SETTER
+	public long getMaximum() {
+		return _maximum != null ? _maximum.longValue() : Long.MAX_VALUE;
+	}
+
+	public void setMaximum(long maximum) {
+		_maximum = new Long(maximum);
+	}
+
+	public long getMinimum() {
+		return _minimum != null ? _minimum.longValue() : Long.MIN_VALUE;
+	}
+
+	public void setMinimum(long minimum) {
+		_minimum = new Long(minimum);
+	}
+
+	// MISC
+	public boolean equals(Object o) {
+		if (!(o instanceof LongRangeValidator)) {
+			return false;
+		}
+		return super.equals(o);
+	}
 }

Added: myfaces/core/trunk/api/src/main/java/javax/faces/validator/NumberRangeValidator.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/validator/NumberRangeValidator.java?view=auto&rev=448511
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/validator/NumberRangeValidator.java (added)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/validator/NumberRangeValidator.java Thu Sep 21 04:07:59 2006
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2004 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 javax.faces.validator;
+
+import javax.faces.component.StateHolder;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+
+/**
+ * An abstract base class for all number range validators including LengthValidator
+ * 
+ * @author Nikolay Petrov
+ * @version $Revision$ $Date$
+ */
+abstract class NumberRangeValidator implements Validator, StateHolder {
+
+	protected Number _minimum;
+	protected Number _maximum;
+	private boolean _transient = false;
+	
+	private boolean _checkRange;
+
+	public NumberRangeValidator(Number minimum, Number maximum) {
+		this(minimum, maximum, true);
+	}
+
+	public NumberRangeValidator(Number minimum, Number maximum, boolean checkRange) {
+		this._minimum = minimum;
+		this._maximum = maximum;
+		this._checkRange = checkRange;
+	}
+	
+	public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
+		if (context == null) {
+			throw new NullPointerException("facesContext");
+		}
+		if (component == null) {
+			throw new NullPointerException("uiComponent");
+		}
+
+		if (value == null) {
+			return;
+		}
+		
+		Comparable compValue = parseValue(context, component, value);
+		if (_checkRange && _minimum != null && _maximum != null && isNotInRange(compValue, _minimum, _maximum)) {
+			Object[] args = { _minimum, _maximum, component.getId()};
+			throw new ValidatorException(_MessageUtils.getErrorMessage(context, NOT_IN_RANGE_MESSAGE_ID, args));
+		} else if (_minimum != null && isSmaller(compValue, _minimum)) {
+			Object[] args = { _minimum, component.getId() };
+			throw new ValidatorException(_MessageUtils.getErrorMessage(context, getMinimumMessageId(), args));
+		} else if (_maximum != null && isBigger(compValue, _maximum)) {
+			Object[] args = { _minimum, component.getId() };
+			throw new ValidatorException(_MessageUtils.getErrorMessage(context, getMaximumMessageId(), args));
+		}
+	}
+
+	protected Comparable parseValue(FacesContext context, UIComponent component, Object value)
+			throws ValidatorException {
+		if (value instanceof Number) {
+			return getValue((Number) value);
+		}
+		
+		try {
+			return getValue(value.toString());
+		} catch (NumberFormatException e) {
+			Object[] args = { component.getId() };
+			throw new ValidatorException(_MessageUtils.getErrorMessage(context, getTypeMessageId(), args));
+		}
+	}
+	
+	protected abstract Comparable getValue(Number number);
+	
+	protected abstract Comparable getValue(String str) throws NumberFormatException;
+	
+	protected abstract String getMinimumMessageId();
+	
+	protected abstract String getMaximumMessageId();
+	
+	protected abstract String getTypeMessageId();
+	
+	public boolean isTransient() {
+		return _transient;
+	}
+
+	public void setTransient(boolean newTransientValue) {
+		this._transient = newTransientValue;
+	}
+
+	public Object saveState(FacesContext context) {
+		Object values[] = new Object[2];
+		values[0] = _maximum;
+		values[1] = _minimum;
+		return values;
+	}
+
+	public void restoreState(FacesContext context, Object state) {
+		Object values[] = (Object[]) state;
+		_maximum = (Number) values[0];
+		_minimum = (Number) values[1];
+	}
+
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+
+		if (!(obj instanceof NumberRangeValidator)) {
+			return false;
+		}
+
+		NumberRangeValidator other = (NumberRangeValidator) obj;
+		if (_maximum != null ? !_maximum.equals(other._maximum) : other._maximum != null) {
+			return false;
+		}
+		if (_minimum != null ? !_minimum.equals(other._minimum) : other._minimum != null) {
+			return false;
+		}
+
+		return true;
+	}
+
+	private boolean isNotInRange(Comparable compValue, Number minValue, Number maxValue) {
+		return isSmaller(compValue, minValue) || isBigger(compValue, maxValue);
+	}
+	
+	private boolean isSmaller(Comparable compValue, Number other) {
+		return compValue.compareTo(other) < 0;
+	}
+	
+	private boolean isBigger(Comparable compValue, Number other) {
+		return compValue.compareTo(other) > 0;
+	}	
+}