blob: c625e1d3e72642a00eb17ea594b05df2f9bfdf40 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache\@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation, and was
* originally based on software copyright (c) 2001, International
* Business Machines, Inc., http://www.ibm.com . For more information
* on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* $Id$
*/
#if !defined(DATATYPEVALIDATOR_HPP)
#define DATATYPEVALIDATOR_HPP
#include <xercesc/util/RefHashTableOf.hpp>
#include <xercesc/util/KVStringPair.hpp>
#include <xercesc/dom/DOMString.hpp>
#include <xercesc/util/regx/RegularExpression.hpp>
/**
* DataTypeValidator defines the interface that data type validators must
* obey. These validators can be supplied by the application writer and may
* be useful as standalone code as well as plugins to the validator
* architecture.
*
* Notice:
* The datatype validator will own the facets hashtable passed to it during
* construction, which means that the datatype validator will be responsible
* for the deletion. The facets hashtable will be created during parsing and
* passed to the appropriate datatype validator which in turn will delete it
* upon its destruction.
*
*/
class VALIDATORS_EXPORT DatatypeValidator
{
public:
// -----------------------------------------------------------------------
// Constant data
// -----------------------------------------------------------------------
//facets
enum {
FACET_LENGTH = 1,
FACET_MINLENGTH = 1<<1,
FACET_MAXLENGTH = 1<<2,
FACET_PATTERN = 1<<3,
FACET_ENUMERATION = 1<<4,
FACET_MAXINCLUSIVE = 1<<5,
FACET_MAXEXCLUSIVE = 1<<6,
FACET_MININCLUSIVE = 1<<7,
FACET_MINEXCLUSIVE = 1<<8,
FACET_TOTALDIGITS = 1<<9,
FACET_FRACTIONDIGITS = 1<<10,
FACET_ENCODING = 1<<11,
FACET_DURATION = 1<<12,
FACET_PERIOD = 1<<13,
FACET_WHITESPACE = 1<<14
};
//2.4.2.6 whiteSpace - Datatypes
enum {
PRESERVE = 0,
REPLACE = 1,
COLLAPSE = 2
};
enum ValidatorType {
String,
AnyURI,
QName,
Name,
NCName,
Boolean,
Float,
Double,
Decimal,
HexBinary,
Base64Binary,
Duration,
DateTime,
Date,
Time,
MonthDay,
YearMonth,
Year,
Month,
Day,
ID,
IDREF,
ENTITY,
NOTATION,
List,
Union,
AnySimpleType
};
// -----------------------------------------------------------------------
// Public Destructor
// -----------------------------------------------------------------------
/** @name Destructor. */
//@{
virtual ~DatatypeValidator();
//@}
// -----------------------------------------------------------------------
// Getter methods
// -----------------------------------------------------------------------
/** @name Getter Functions */
//@{
/**
* Returns the final values of the simpleType
*/
int getFinalSet() const;
/**
* Returns the datatype facet if any is set.
*/
RefHashTableOf<KVStringPair>* getFacets() const;
/**
* Returns default value (collapse) for whiteSpace facet.
* This function is overwritten in StringDatatypeValidator.
*/
virtual short getWSFacet () const;
/**
* Returns the base datatype validator if set.
*/
DatatypeValidator* getBaseValidator() const;
/**
* Returns the 'class' type of datatype validator
*/
ValidatorType getType() const;
/**
* Returns whether the type is atomic or not
*
* To be redefined in List/Union validators
*/
virtual bool isAtomic() const;
/**
* Returns the datatype enumeration if any is set.
* Derived class shall provide their own copy.
*/
virtual const RefVectorOf<XMLCh>* getEnumString() const = 0;
//@}
// -----------------------------------------------------------------------
// Validation methods
// -----------------------------------------------------------------------
/** @name Validation Function */
//@{
/**
* Checks that the "content" string is valid datatype.
* If invalid, a Datatype validation exception is thrown.
*
* @param content A string containing the content to be validated
*
*/
virtual void validate(const XMLCh* const content) = 0;
/**
* Checks whether a given type can be used as a substitute
*
* @param toCheck A datatype validator of the type to be used as a
* substitute
*
* To be redefined in UnionDatatypeValidator
*/
virtual bool isSubstitutableBy(const DatatypeValidator* const toCheck);
//@}
// -----------------------------------------------------------------------
// Compare methods
// -----------------------------------------------------------------------
/** @name Compare Function */
//@{
/**
* Compares content in the Domain value vs. lexical value.
*
* e.g. If type is a float then 1.0 may be equivalent to 1 even though
* both are lexically different.
*
* @param value1 string to compare
*
* @param value2 string to compare
*
* We will provide a default behavior that should be redefined at the
* children level, if necessary (i.e. boolean case).
*/
virtual int compare(const XMLCh* const value1, const XMLCh* const value2);
//@}
/**
* Returns an instance of the base datatype validator class
* Used by the DatatypeValidatorFactory.
*/
virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const,
RefVectorOf<XMLCh>* const enums,
const int finalSet) = 0;
protected:
// -----------------------------------------------------------------------
// Protected Constructors
// -----------------------------------------------------------------------
/** @name Constructors */
//@{
/**
*
* @param baseValidator The base datatype validator for derived
* validators. Null if native validator.
*
* @param facets A hashtable of datatype facets (except enum).
*
* @param finalSet 'final' value of the simpleType
*/
DatatypeValidator(DatatypeValidator* const baseValidator,
RefHashTableOf<KVStringPair>* const facets,
const int finalSet,
const ValidatorType type);
//@}
friend class DatatypeValidatorFactory;
/**
* facetDefined
*/
int getFacetsDefined() const;
void setFacetsDefined(int);
/**
* fixed
*/
int getFixed() const;
void setFixed(int);
/**
* fPattern
*/
const XMLCh* getPattern() const;
void setPattern(const XMLCh* );
/**
* fRegex
*/
RegularExpression* getRegex() const;
void setRegex(RegularExpression* const);
/**
* set fType
*/
void setType(ValidatorType);
/**
* get WSString
*/
const XMLCh* getWSstring(const short WSType) const;
private:
// -----------------------------------------------------------------------
// CleanUp methods
// -----------------------------------------------------------------------
void cleanUp();
// -----------------------------------------------------------------------
// Private data members
//
// fFinalSet
// stores "final" values of simpleTypes
//
// fBaseValidator
// This is a pointer to a base datatype validator. If value is null,
// it means we have a native datatype validator not a derived one.
//
// fFacets
// This is a hashtable of dataype facets.
//
// fType
// Stores the class type of datatype validator
//
// fFacetsDefined
// Stores the constaiting facets flag
//
// fPattern
// the pointer to the String of the pattern. The actual data is
// in the Facets.
//
// fRegex
// pointer to the RegularExpress object
//
//
// fFixed
// if {fixed} is true, then types for which this type is the
// {base type definition} cannot specify a value for a specific
// facet.
//
// -----------------------------------------------------------------------
int fFinalSet;
int fFacetsDefined;
int fFixed;
ValidatorType fType;
DatatypeValidator* fBaseValidator;
RefHashTableOf<KVStringPair>* fFacets;
XMLCh* fPattern;
RegularExpression* fRegex;
};
// ---------------------------------------------------------------------------
// DatatypeValidator: Getters
// ---------------------------------------------------------------------------
inline int DatatypeValidator::getFinalSet() const {
return fFinalSet;
}
inline RefHashTableOf<KVStringPair>* DatatypeValidator::getFacets() const {
return fFacets;
}
inline DatatypeValidator* DatatypeValidator::getBaseValidator() const {
return fBaseValidator;
}
inline short DatatypeValidator::getWSFacet() const {
return COLLAPSE;
}
inline DatatypeValidator::ValidatorType DatatypeValidator::getType() const
{
return fType;
}
inline void DatatypeValidator::setType(ValidatorType theType)
{
fType = theType;
}
// ---------------------------------------------------------------------------
// DatatypeValidator: CleanUp methods
// ---------------------------------------------------------------------------
inline void DatatypeValidator::cleanUp() {
delete fFacets;
delete [] fPattern;
delete fRegex;
}
// ---------------------------------------------------------------------------
// DatatypeValidators: Compare methods
// ---------------------------------------------------------------------------
inline int DatatypeValidator::compare(const XMLCh* const lValue,
const XMLCh* const rValue)
{
return XMLString::compareString(lValue, rValue);
}
// ---------------------------------------------------------------------------
// DatatypeValidators: Validation methods
// ---------------------------------------------------------------------------
inline bool
DatatypeValidator::isSubstitutableBy(const DatatypeValidator* const toCheck)
{
const DatatypeValidator* dv = toCheck;
while (dv != 0) {
if (dv == this) {
return true;
}
dv = dv->getBaseValidator();
}
return false;
}
inline int DatatypeValidator::getFacetsDefined() const
{
return fFacetsDefined;
}
inline void DatatypeValidator::setFacetsDefined(int facets)
{
fFacetsDefined |= facets;
}
inline int DatatypeValidator::getFixed() const
{
return fFixed;
}
inline void DatatypeValidator::setFixed(int fixed)
{
fFixed |= fixed;
}
inline const XMLCh* DatatypeValidator::getPattern() const
{
return fPattern;
}
inline void DatatypeValidator::setPattern(const XMLCh* pattern)
{
delete [] fPattern;
fPattern = XMLString::replicate(pattern);
}
inline RegularExpression* DatatypeValidator::getRegex() const
{
return fRegex;
}
inline void DatatypeValidator::setRegex(RegularExpression* const regex)
{
fRegex = regex;
}
inline bool DatatypeValidator::isAtomic() const {
return true;
}
#endif
/**
* End of file DatatypeValidator.hpp
*/