You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jk...@apache.org on 2003/10/21 19:45:24 UTC
cvs commit: jakarta-commons-sandbox/cli/src/java/org/apache/commons/cli2/validation DateValidator.java
jkeyes 2003/10/21 10:45:24
Modified: cli/src/java/org/apache/commons/cli2/validation
DateValidator.java
Log:
- added javadoc
- refactored bounds checking
- prevent against NPE by moving date check above
bound check
Revision Changes Path
1.3 +129 -20 jakarta-commons-sandbox/cli/src/java/org/apache/commons/cli2/validation/DateValidator.java
Index: DateValidator.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/cli/src/java/org/apache/commons/cli2/validation/DateValidator.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DateValidator.java 20 Oct 2003 21:40:44 -0000 1.2
+++ DateValidator.java 21 Oct 2003 17:45:24 -0000 1.3
@@ -68,94 +68,203 @@
/**
* @author Rob Oxspring
+ * @author John Keyes
+ *
+ * @see java.text.DateFormat
*/
public class DateValidator implements Validator {
+ /** an array of permitted DateFormats */
+ private final DateFormat[] formats;
+
+ /** minimum Date allowed i.e. a valid date occurs later than this date */
+ private Date minimum;
+
+ /** maximum Date allowed i.e. a valid date occurs earlier than this date */
+ private Date maximum;
+
+ /**
+ * Creates a Validator for dates.
+ *
+ * @return DateValidator
+ * a Validator for dates
+ */
public static DateValidator getDateInstance() {
return new DateValidator(DateFormat.getDateInstance());
}
+ /**
+ * Creates a Validator for times.
+ *
+ * @return DateValidator
+ * a Validator for times
+ */
public static DateValidator getTimeInstance() {
return new DateValidator(DateFormat.getTimeInstance());
}
+ /**
+ * Creates a Validator for date/times
+ *
+ * @return DateValidator
+ * a Validator for date/times
+ */
public static DateValidator getDateTimeInstance() {
return new DateValidator(DateFormat.getDateTimeInstance());
}
- public final DateFormat[] formats;
-
- private Date minimum;
- private Date maximum;
-
+ /**
+ * Creates a Validator for the default date/time format
+ */
public DateValidator() {
this(DateFormat.getInstance());
}
+ /**
+ * Creates a Validator for the specified DateFormat.
+ *
+ * @param format
+ * a DateFormat which dates must conform to
+ */
public DateValidator(final DateFormat format) {
this.formats = new DateFormat[] { format };
}
+ /**
+ * Creates a Validator for the List of specified DateFormats.
+ *
+ * @param formats
+ * a List of DateFormats which dates must conform to
+ */
public DateValidator(final List formats) {
this.formats =
(DateFormat[]) formats.toArray(new DateFormat[formats.size()]);
}
- /* (non-Javadoc)
+ /**
+ * Validate each String value in the specified List against
+ * this instances permitted DateFormats.
+ *
+ * If a value is valid then it's <code>String</code> value
+ * in the list is replaced with it's <code>Date</code>
+ * value.
+ *
* @see org.apache.commons.cli2.validation.Validator#validate(java.util.List)
*/
public void validate(final List values) throws InvalidArgumentException {
+
+ // for each value
for (final ListIterator i = values.listIterator(); i.hasNext();) {
+
final String value = (String) i.next();
Date date = null;
- for (int f = 0; f < formats.length && date == null; ++f) {
- final ParsePosition pp = new ParsePosition(0);
- date = formats[f].parse(value, pp);
+
+ // create a resuable ParsePosition instance
+ final ParsePosition pp = new ParsePosition(0);
+
+ // for each permitted DateFormat
+ for (int f = 0; f < this.formats.length && date == null; ++f) {
+
+ // reset the parse position
+ pp.setIndex(0);
+
+ // TODO: should we call setLenient(false) on
+ // each DateFormat or allow the user
+ // to specify the parsing used
+ date = this.formats[f].parse(value, pp);
+
+ // if the wrong number of characters have been parsed
if (pp.getIndex() < value.length()) {
date = null;
}
}
-
- if ((minimum != null && date.getTime() < minimum.getTime())
- || (maximum != null && date.getTime() > maximum.getTime())) {
- throw new InvalidArgumentException("Out of range: " + value);
- }
-
+
+ // if date has not been set throw an InvalidArgumentException
if (date == null) {
throw new InvalidArgumentException(value);
}
+ // if the date is outside the bounds
+ if (isDateEarlier(date) || isDateLater(date)) {
+ throw new InvalidArgumentException("Out of range: " + value);
+ }
+
+ // replace the value in the list with the actual Date
i.set(date);
}
}
/**
- * @return
+ * Returns the maximum date permitted.
+ *
+ * @return Date
+ * the maximum date permitted. If no maximum date
+ * has been specified then return <code>null</code>.
*/
public Date getMaximum() {
return maximum;
}
/**
+ * Sets the maximum Date to the specified value.
+ *
* @param maximum
+ * the maximum Date permitted
*/
- public void setMaximum(Date maximum) {
+ public void setMaximum(final Date maximum) {
this.maximum = maximum;
}
/**
- * @return
+ * Returns the minimum date permitted.
+ *
+ * @return Date
+ * the minimum date permitted. If no minimum date
+ * has been specified then return <code>null</code>.
*/
public Date getMinimum() {
return minimum;
}
/**
+ * Sets the minimum Date to the specified value.
+ *
* @param minimum
+ * the minimum Date permitted
*/
public void setMinimum(Date minimum) {
this.minimum = minimum;
+ }
+
+ /**
+ * Returns whether the specified Date is later than
+ * the maximum date.
+ *
+ * @param date
+ * the Date to evaluate
+ *
+ * @return boolean
+ * whether <code>date</code> is earlier than the
+ * maximum date
+ */
+ private boolean isDateLater(Date date) {
+ return maximum != null && date.getTime() > maximum.getTime();
+ }
+
+ /**
+ * Returns whether the specified Date is earlier than
+ * the minimum date.
+ *
+ * @param date
+ * the Date to evaluate
+ *
+ * @return boolean
+ * whether <code>date</code> is earlier than the
+ * minimum date
+ */
+ private boolean isDateEarlier(Date date) {
+ return minimum != null && date.getTime() < minimum.getTime();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org