You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@xerces.apache.org by ki...@prusec.com on 2000/02/26 00:30:11 UTC
[PATCH] StringValidator
I made a couple of bug fixes and enhancements for the StringValidator
(comments below). Even though it's not 100% clear in the
spec, I assumed that the "length" facet means that the length is
_required_. Please let me know if I submitted this incorrectly,
or if I should refrain from the verbose comments in the header...
--- original_src\org\apache\xerces\validators\datatype\StringValidator.java
Tue Feb 22 14:54:34 2000
+++ src\org\apache\xerces\validators\datatype\StringValidator.java Fri
Feb 25 18:01:46 2000
@@ -68,6 +68,13 @@
* StringValidator validates that XML content is a W3C string type.
*
* @author Ted Leung
+ * @author Kito D. Mann, Virtua Communications Corp.
+ * - 2/25/00
+ * - changed setFacets() to use the error framework when throwing an
IllegalFacetException
+ * - added validation for MinLength, MaxLength, and Length
+ * - fixed problem with setFacets() using facetData before it was
initialized
+ * (this caused setFacets() to fail unconditionally)
+ * - added check to prevent use of length and maxlength or minlength
facets at the same time
* @version
*/
@@ -78,6 +85,11 @@
StringValidator fBaseValidator = null;
int fMaxLength = 0;
boolean fIsMaxLength = false;
+ int fMinLength = 0;
+ boolean fIsMinLength = false;
+ int fLength = 0;
+ boolean fIsLength = false;
+ private DatatypeMessageProvider fMessageProvider = new
DatatypeMessageProvider();
/**
* validate that a string is a W3C string type
@@ -108,6 +120,14 @@
if (fIsMaxLength && content.length() > fMaxLength)
throw new InvalidDatatypeValueException("Value
'"+content+"' with length '"+content.length()+"' exceeds maximum length of
"+fMaxLength+".");
}
+ else if (key.equals(DatatypeValidator.MINLENGTH)) {
+ if (fIsMinLength && content.length() < fMinLength)
+ throw new InvalidDatatypeValueException("Value
'"+content+"' with length '"+content.length()+"' is less than the minimum
length of "+fMinLength+".");
+ }
+ else if (key.equals(DatatypeValidator.LENGTH)) {
+ if (fIsLength && content.length() != fLength)
+ throw new InvalidDatatypeValueException("Value
'"+content+"' with length '"+content.length()+"' is not equal to required
length of "+fLength+".");
+ }
}
}
@@ -115,33 +135,62 @@
}
public void setFacets(Hashtable facets) throws UnknownFacetException,
IllegalFacetException, IllegalFacetValueException {
- facetData = new Hashtable(); // reset old facets
+
for (Enumeration e = facets.keys(); e.hasMoreElements();) {
String key = (String) e.nextElement();
- if (key.equals(DatatypeValidator.LENGTH)) {
- } else if (key.equals(DatatypeValidator.MINLENGTH)) {
- } else if (key.equals(DatatypeValidator.MAXLENGTH)) {
- int vvv;
- String value = (String)facetData.get(key);
- try {
+ if (key.equals(DatatypeValidator.LENGTH) ||
+ key.equals(DatatypeValidator.MINLENGTH) ||
+ key.equals(DatatypeValidator.MAXLENGTH)) {
+ int vvv;
+ String value = (String)facets.get(key);
+ try {
vvv = Integer.parseInt(value);
- } catch(NumberFormatException nfe) {
- throw new IllegalFacetValueException("maxLength value
'"+value+"' is invalid.");
+ if (vvv < 0) throw new NumberFormatException();
+ } catch(NumberFormatException nfe) {
+ if (value == null)
+ value = "'null'";
+ throw new IllegalFacetValueException(
+
getErrorString(DatatypeMessageProvider.IllegalFacetValue,
+ DatatypeMessageProvider.MSG_NONE,
+ new Object [] { value, key }
));
+ }
+
+ if (key.equals(DatatypeValidator.LENGTH))
+ {
+ if (fIsMaxLength || fIsMinLength)
+ throw new IllegalFacetException("Length facet is not
allowed when maxLength or minLength has been defined.");
+ fLength = vvv;
+ fIsLength = true;
}
- fMaxLength = vvv;
- fIsMaxLength = true;
- } else if (key.equals(DatatypeValidator.MAXINCLUSIVE)) {
+ else
+ if (key.equals(DatatypeValidator.MINLENGTH))
+ {
+ if (fIsLength)
+ throw new IllegalFacetException("MinLength facet is
not allowed when length has been defined.");
+ fMinLength = vvv;
+ fIsMinLength = true;
+ }
+ else
+ if (key.equals(DatatypeValidator.MAXLENGTH))
+ {
+ if (fIsLength)
+ throw new IllegalFacetException("MaxLength facet is
not allowed when length has been defined.");
+ fMaxLength = vvv;
+ fIsMaxLength = true;
+ }
+ }
+ else if (key.equals(DatatypeValidator.MAXINCLUSIVE)) {
} else if (key.equals(DatatypeValidator.MAXEXCLUSIVE)) {
} else if (key.equals(DatatypeValidator.MININCLUSIVE)) {
} else if (key.equals(DatatypeValidator.MINEXCLUSIVE)) {
} else if (key.equals(DatatypeValidator.PATTERN)) {
} else if (key.equals(DatatypeValidator.ENUMERATION)) {
- facetData.put(key,facets.get(key));
} else {
- throw new IllegalFacetException();
+ throw new IllegalFacetException("Invalid facet (" + key +
")");
}
}
- }
+ facetData = facets;
+ }
public void setFacets(int facets[]) throws UnknownFacetException,
IllegalFacetException, IllegalFacetValueException {
}
@@ -156,4 +205,12 @@
public void setLocale(Locale locale) {
fLocale = locale;
}
+
+ private String getErrorString(int major, int minor, Object args[]) {
+ try {
+ return fMessageProvider.createMessage(fLocale, major, minor,
args);
+ } catch (Exception e) {
+ return "Illegal Errorcode "+minor;
+ }
+ }
}
Kito D. Mann
Virtua Communications Corp.