001:
002:/*
003: * The Apache Software License, Version 1.1
004: *
005: *
006: * Copyright (c) 1999, 2000, 2001 The Apache Software Foundation. All rights
007: * reserved.
008: *
009: * Redistribution and use in source and binary forms, with or without
010: * modification, are permitted provided that the following conditions
011: * are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution,
022: * if any, must include the following acknowledgment:
023: * "This product includes software developed by the
024: * Apache Software Foundation (http://www.apache.org/)."
025: * Alternately, this acknowledgment may appear in the software itself,
026: * if and wherever such third-party acknowledgments normally appear.
027: *
028: * 4. The names "Xerces" and "Apache Software Foundation" must
029: * not be used to endorse or promote products derived from this
030: * software without prior written permission. For written
031: * permission, please contact apache@apache.org.
032: *
033: * 5. Products derived from this software may not be called "Apache",
034: * nor may "Apache" appear in their name, without prior written
035: * permission of the Apache Software Foundation.
036: *
037: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
038: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
039: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
040: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
041: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
042: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
043: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
044: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
045: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
046: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
047: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
048: * SUCH DAMAGE.
049: * ====================================================================
050: *
051: * This software consists of voluntary contributions made by many
052: * individuals on behalf of the Apache Software Foundation and was
053: * originally based on software copyright (c) 2001, International
054: * Business Machines, Inc., http://www.apache.org. For more
055: * information on the Apache Software Foundation, please see
056: * <http://www.apache.org/>.
057: */
058:
059:package org.apache.xerces.validators.datatype;
060:
061:
062:import java.util.Enumeration;
063:import java.util.Hashtable;
064:import java.util.Vector;
065:import java.io.IOException;
066:import org.apache.xerces.validators.schema.SchemaSymbols;
067:import org.apache.xerces.utils.regex.RegularExpression;
068:
069:/**
070: * AbstractNumericValidator is a base class of decimal, double, and float
071: * schema datatypes
072: *
073: * @author Elena Litani
074: * @version $Id: AbstractNumericValidator.java,v 1.1 2001/04/25 20:41:52 elena Exp $
075: */
076:
077:public abstract class AbstractNumericValidator extends AbstractNumericFacetValidator {
078:
079: public AbstractNumericValidator () throws InvalidDatatypeFacetException {
080: super ( null, null, false ); // Native, No Facets defined, Restriction
081: }
082:
083: public AbstractNumericValidator ( DatatypeValidator base,
084: Hashtable facets,
085: boolean derivedByList) throws InvalidDatatypeFacetException {
086: super (base, facets, derivedByList);
087: }
088:
089:
090: /**
091: * Validate string against lexical space of datatype
092: *
093: * @param content A string containing the content to be validated
094: * @param state
095: * @return
096: * @exception throws InvalidDatatypeException if the content is
097: * is not a W3C decimal type
098: * @exception InvalidDatatypeValueException
099: */
100: public Object validate(String content, Object state) throws InvalidDatatypeValueException {
101: //REVISIT: should we pass state?
102: checkContent(content, state, null, false);
103: return null;
104: }
105:
106: public Object clone() throws CloneNotSupportedException {
107: throw new CloneNotSupportedException("clone() is not supported in "+this .getClass().getName());
108: }
109:
110: /**
111: * validate if the content is valid against base datatype and facets (if any)
112: * this function might be called directly from UnionDatatype or ListDatatype
113: *
114: * @param content A string containing the content to be validated
115: * @param enumeration A vector with enumeration strings
116: * @exception throws InvalidDatatypeException if the content is
117: * is not a W3C decimal type;
118: * @exception throws InvalidDatatypeFacetException if enumeration is not BigDecimal
119: */
120: protected void checkContentEnum(String content, Object state, Vector enumeration)
121: throws InvalidDatatypeValueException {
122: checkContent(content, state, enumeration, false);
123: }
124:
125:
126: //
127: // content - string value to be evaluated
128: //
129: abstract protected void checkContent( String content, Object State, Vector enum, boolean asBase)
130: throws InvalidDatatypeValueException;
131:
132:
133: /*
134: * check that a facet is in range, assumes that facets are compatible -- compatibility ensured by setFacets
135: */
136: protected void boundsCheck(Object d) throws InvalidDatatypeValueException {
137:
138: boolean minOk = true;
139: boolean maxOk = true;
140: String upperBound="";
141:
142: String lowerBound="";
143: String lowerBoundIndicator = "";
144: String upperBoundIndicator = "";
145: int compare;
146: if ( (fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0 ) {
147: compare = compareValues(d, fMaxInclusive);
148: maxOk=(compare==1)?false:true;
149: upperBound = getMaxInclusive(false);
150: if ( upperBound != null ) {
151: upperBoundIndicator = "<=";
152: }
153: else {
154: upperBound="";
155: }
156: }
157: if ( (fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0 ) {
158: compare = compareValues(d, fMaxExclusive );
159: maxOk = (compare==-1)?true:false;
160: upperBound = getMaxExclusive (false);
161: if ( upperBound != null ) {
162: upperBoundIndicator = "<";
163: }
164: else {
165: upperBound = "";
166: }
167: }
168:
169: if ( (fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0 ) {
170: compare = compareValues(d, fMinInclusive);
171: minOk = (compare==-1)?false:true;
172: lowerBound = getMinInclusive (false);
173: if ( lowerBound != null ) {
174: lowerBoundIndicator = "<=";
175: }
176: else {
177: lowerBound = "";
178: }
179: }
180: if ( (fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0 ) {
181: compare = compareValues(d, fMinExclusive);
182: minOk = (compare==1)?true:false;
183: lowerBound = getMinExclusive (false );
184: if ( lowerBound != null ) {
185: lowerBoundIndicator = "<";
186: }
187: else {
188: lowerBound = "";
189: }
190: }
191:
192: if ( !(minOk && maxOk) )
193: throw new InvalidDatatypeValueException (
194: getErrorString(DatatypeMessageProvider.OUT_OF_BOUNDS,
195: DatatypeMessageProvider.MSG_NONE,
196: new Object [] { d.toString() , lowerBound ,
197: upperBound, lowerBoundIndicator, upperBoundIndicator}));
198:
199:
200: }
201:
202:
203:
204:}
|