blob: d11db91c408c9b40310b8ba29e963605f30aa13c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
/*
* $Id: DatatypeValidator.hpp 568078 2007-08-21 11:43:25Z amassari $
*/
#if !defined(DATATYPEVALIDATOR_HPP)
#define DATATYPEVALIDATOR_HPP
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/RefHashTableOf.hpp>
#include <xercesc/util/KVStringPair.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/regx/RegularExpression.hpp>
#include <xercesc/validators/schema/SchemaSymbols.hpp>
#include <xercesc/internal/XSerializable.hpp>
#include <xercesc/framework/psvi/XSSimpleTypeDefinition.hpp>
#include <xercesc/framework/ValidationContext.hpp>
XERCES_CPP_NAMESPACE_BEGIN
class MemoryManager;
/**
* 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 XSerializable, public XMemory
{
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,
UnKnown
};
// -----------------------------------------------------------------------
// 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.
*/
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 RefArrayVectorOf<XMLCh>* getEnumString() const = 0;
/**
* returns true if this type is anonymous
**/
bool getAnonymous() const;
/**
* sets this type to be anonymous
**/
void setAnonymous();
/**
* Fundamental Facet: ordered
*/
XSSimpleTypeDefinition::ORDERING getOrdered() const;
/**
* Fundamental Facet: cardinality.
*/
bool getFinite() const;
/**
* Fundamental Facet: bounded.
*/
bool getBounded() const;
/**
* Fundamental Facet: numeric.
*/
bool getNumeric() const;
/**
* Canonical Representation
*
* Derivative datatype may overwrite this method once
* it has its own canonical representation other than
* the default one.
*
* @param rawData: data in raw string
* @param memMgr: memory manager
* @param toValiate: to validate the raw string or not
*
* @return: canonical representation of the data
*
* Note:
*
* 1. the return value is kept in memory allocated
* by the memory manager passed in or by dv's
* if no memory manager is provided.
*
* 2. client application is responsible for the
* proper deallcation of the memory allocated
* for the returned value.
*
* 3. In the case where the rawData is not valid
* with regards to the fundamental datatype,
* a null string is returned.
*
*/
virtual const XMLCh* getCanonicalRepresentation
(
const XMLCh* const rawData
, MemoryManager* const memMgr = 0
, bool toValidate = false
) const;
//@}
// -----------------------------------------------------------------------
// 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
, ValidationContext* const context = 0
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
) = 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
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
//@}
/**
* Returns an instance of the base datatype validator class
* Used by the DatatypeValidatorFactory.
*/
virtual DatatypeValidator* newInstance
(
RefHashTableOf<KVStringPair>* const facets
, RefArrayVectorOf<XMLCh>* const enums
, const int finalSet
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
) = 0;
/**
* Returns the uri,name of the type this validator is for
*/
const XMLCh* getTypeName() const;
/**
* sets the uri,name that this validator is for - typeName is uri,name string.
* due to the internals of xerces this will set the uri to be the schema uri if
* there is no comma in typeName
*/
void setTypeName(const XMLCh* const typeName);
/**
* sets the uri,name that this validator is for
*/
void setTypeName(const XMLCh* const name, const XMLCh* const uri);
/**
* Returns the uri of the type this validator is for
*/
const XMLCh* getTypeUri() const;
/**
* Returns the name of the type this validator is for
*/
const XMLCh* getTypeLocalName() const;
/**
* Returns the plugged-in memory manager
*/
MemoryManager* getMemoryManager() const;
/***
* Support for Serialization/De-serialization
***/
DECL_XSERIALIZABLE(DatatypeValidator)
/***
*
* Serialzie DatatypeValidator derivative
*
* Param
* serEng: serialize engine
* dv: DatatypeValidator derivative
*
* Return:
*
***/
static void storeDV(XSerializeEngine& serEng
, DatatypeValidator* const dv);
/***
*
* Create a DatatypeValidator derivative from the binary
* stream.
*
* Param
* serEng: serialize engine
*
* Return:
* DatatypeValidator derivative
*
***/
static DatatypeValidator* loadDV(XSerializeEngine& serEng);
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,
MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
//@}
friend class DatatypeValidatorFactory;
friend class XSObjectFactory;
/**
* 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);
/**
* set fWhiteSpace
*/
void setWhiteSpace(short);
/**
* get WSString
*/
const XMLCh* getWSstring(const short WSType) const;
/**
* Fundamental Facet: ordered
*/
void setOrdered(XSSimpleTypeDefinition::ORDERING ordered);
/**
* Fundamental Facet: cardinality.
*/
void setFinite(bool finite);
/**
* Fundamental Facet: bounded.
*/
void setBounded(bool bounded);
/**
* Fundamental Facet: numeric.
*/
void setNumeric(bool numeric);
private:
// -----------------------------------------------------------------------
// CleanUp methods
// -----------------------------------------------------------------------
void cleanUp();
// -----------------------------------------------------------------------
// Unimplemented constructors and operators
// -----------------------------------------------------------------------
DatatypeValidator(const DatatypeValidator&);
DatatypeValidator& operator=(const DatatypeValidator&);
// -----------------------------------------------------------------------
// 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.
//
// fTypeName
// the uri,name of the type this validator will validate
//
// fTypeLocalName
// the name of the type this validator will validate
//
// fTypeUri
// the uri of the type this validator will validate
// fAnonymous
// true if this type is anonynous
//
// -----------------------------------------------------------------------
bool fAnonymous;
bool fFinite;
bool fBounded;
bool fNumeric;
short fWhiteSpace;
int fFinalSet;
int fFacetsDefined;
int fFixed;
ValidatorType fType;
XSSimpleTypeDefinition::ORDERING fOrdered;
DatatypeValidator* fBaseValidator;
RefHashTableOf<KVStringPair>* fFacets;
XMLCh* fPattern;
RegularExpression* fRegex;
XMLCh* fTypeName;
const XMLCh* fTypeLocalName;
const XMLCh* fTypeUri;
protected:
// -----------------------------------------------------------------------
// Protected data members
//
// fMemoryManager
// Pluggable memory manager for dynamic allocation/deallocation.
// -----------------------------------------------------------------------
MemoryManager* fMemoryManager;
};
// ---------------------------------------------------------------------------
// 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 fWhiteSpace;
}
inline DatatypeValidator::ValidatorType DatatypeValidator::getType() const
{
return fType;
}
inline int DatatypeValidator::getFacetsDefined() const
{
return fFacetsDefined;
}
inline int DatatypeValidator::getFixed() const
{
return fFixed;
}
inline const XMLCh* DatatypeValidator::getPattern() const
{
return fPattern;
}
inline RegularExpression* DatatypeValidator::getRegex() const
{
return fRegex;
}
inline const XMLCh* DatatypeValidator::getTypeName() const
{
return fTypeName;
}
inline bool DatatypeValidator::getAnonymous() const
{
return fAnonymous;
}
inline const XMLCh* DatatypeValidator::getTypeLocalName() const
{
return fTypeLocalName;
}
inline const XMLCh* DatatypeValidator::getTypeUri() const
{
return fTypeUri;
}
inline MemoryManager* DatatypeValidator::getMemoryManager() const
{
return fMemoryManager;
}
inline XSSimpleTypeDefinition::ORDERING DatatypeValidator::getOrdered() const
{
return fOrdered;
}
inline bool DatatypeValidator::getFinite() const
{
return fFinite;
}
inline bool DatatypeValidator::getBounded() const
{
return fBounded;
}
inline bool DatatypeValidator::getNumeric() const
{
return fNumeric;
}
// ---------------------------------------------------------------------------
// DatatypeValidator: Setters
// ---------------------------------------------------------------------------
inline void DatatypeValidator::setType(ValidatorType theType)
{
fType = theType;
}
inline void DatatypeValidator::setWhiteSpace(short newValue)
{
fWhiteSpace = newValue;
}
inline void DatatypeValidator::setFacetsDefined(int facets)
{
fFacetsDefined |= facets;
}
inline void DatatypeValidator::setFixed(int fixed)
{
fFixed |= fixed;
}
inline void DatatypeValidator::setPattern(const XMLCh* pattern)
{
if (fPattern) {
fMemoryManager->deallocate(fPattern);//delete [] fPattern;
delete fRegex;
}
fPattern = XMLString::replicate(pattern, fMemoryManager);
fRegex = new (fMemoryManager) RegularExpression(fPattern, SchemaSymbols::fgRegEx_XOption, fMemoryManager);
}
inline void DatatypeValidator::setRegex(RegularExpression* const regex)
{
fRegex = regex;
}
inline bool DatatypeValidator::isAtomic() const {
return true;
}
inline void DatatypeValidator::setAnonymous() {
fAnonymous = true;
}
inline void DatatypeValidator::setOrdered(XSSimpleTypeDefinition::ORDERING ordered)
{
fOrdered = ordered;
}
inline void DatatypeValidator::setFinite(bool finite)
{
fFinite = finite;
}
inline void DatatypeValidator::setBounded(bool bounded)
{
fBounded = bounded;
}
inline void DatatypeValidator::setNumeric(bool numeric)
{
fNumeric = numeric;
}
// ---------------------------------------------------------------------------
// DatatypeValidators: Compare methods
// ---------------------------------------------------------------------------
inline int DatatypeValidator::compare(const XMLCh* const lValue,
const XMLCh* const rValue
, MemoryManager* const)
{
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;
}
XERCES_CPP_NAMESPACE_END
#endif
/**
* End of file DatatypeValidator.hpp
*/