blob: 9330ff5cf829ea02a30647c530ce7d21a62f203b [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: AbstractNumericFacetValidator.cpp 568078 2007-08-21 11:43:25Z amassari $
*/
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
#include <xercesc/validators/datatype/AbstractNumericFacetValidator.hpp>
#include <xercesc/validators/datatype/InvalidDatatypeFacetException.hpp>
#include <xercesc/util/NumberFormatException.hpp>
//since we need to dynamically created each and every derivatives
//during deserialization by XSerializeEngine>>Derivative, we got
//to include all hpp
#include <xercesc/util/XMLFloat.hpp>
#include <xercesc/util/XMLDouble.hpp>
#include <xercesc/util/XMLBigDecimal.hpp>
#include <xercesc/util/XMLDateTime.hpp>
#include <xercesc/internal/XTemplateSerializer.hpp>
XERCES_CPP_NAMESPACE_BEGIN
const int AbstractNumericFacetValidator::INDETERMINATE = 2;
#define REPORT_FACET_ERROR(val1, val2, except_code, manager) \
ThrowXMLwithMemMgr2(InvalidDatatypeFacetException \
, except_code \
, val1->getFormattedString() \
, val2->getFormattedString() \
, manager);
#define FROM_BASE_VALUE_SPACE(val, facetFlag, except_code, manager) \
if ((thisFacetsDefined & facetFlag) != 0) \
{ \
try \
{ \
numBase->checkContent(val->getRawData(), (ValidationContext*)0, false, manager); \
} \
catch ( XMLException& ) \
{ \
ThrowXMLwithMemMgr1(InvalidDatatypeFacetException \
, except_code \
, val->getRawData() \
, manager); \
} \
}
// ---------------------------------------------------------------------------
// Constructors and Destructor
// ---------------------------------------------------------------------------
AbstractNumericFacetValidator::~AbstractNumericFacetValidator()
{
if (!fMaxInclusiveInherited && fMaxInclusive)
delete fMaxInclusive;
if (!fMaxExclusiveInherited && fMaxExclusive)
delete fMaxExclusive;
if (!fMinInclusiveInherited && fMinInclusive)
delete fMinInclusive;
if (!fMinExclusiveInherited && fMinExclusive)
delete fMinExclusive;
//~RefVectorOf will delete all adopted elements
if (!fEnumerationInherited && fEnumeration)
delete fEnumeration;
if (!fEnumerationInherited && fStrEnumeration)
delete fStrEnumeration;
}
AbstractNumericFacetValidator::AbstractNumericFacetValidator(
DatatypeValidator* const baseValidator
, RefHashTableOf<KVStringPair>* const facets
, const int finalSet
, const ValidatorType type
, MemoryManager* const manager)
:DatatypeValidator(baseValidator, facets, finalSet, type, manager)
, fMaxInclusiveInherited(false)
, fMaxExclusiveInherited(false)
, fMinInclusiveInherited(false)
, fMinExclusiveInherited(false)
, fEnumerationInherited(false)
, fMaxInclusive(0)
, fMaxExclusive(0)
, fMinInclusive(0)
, fMinExclusive(0)
, fEnumeration(0)
, fStrEnumeration(0)
{
//do not invoke init() here !!!
}
//
// P1. Enumeration
//
void AbstractNumericFacetValidator::init(RefArrayVectorOf<XMLCh>* const enums
, MemoryManager* const manager)
{
fStrEnumeration = enums; // save the literal value
// which is needed for getEnumString()
if (enums)
{
setFacetsDefined(DatatypeValidator::FACET_ENUMERATION);
}
assignFacet(manager);
inspectFacet(manager);
inspectFacetBase(manager);
inheritFacet();
}
//
// Assign facets
// assign common facets
// assign additional facet
//
void AbstractNumericFacetValidator::assignFacet(MemoryManager* const manager)
{
RefHashTableOf<KVStringPair>* facets = getFacets();
if (!facets) // no facets defined
return;
XMLCh* key;
RefHashTableOfEnumerator<KVStringPair> e(facets, false, manager);
while (e.hasMoreElements())
{
KVStringPair pair = e.nextElement();
key = pair.getKey();
XMLCh* value = pair.getValue();
if (XMLString::equals(key, SchemaSymbols::fgELT_PATTERN))
{
setPattern(value);
if (getPattern())
setFacetsDefined(DatatypeValidator::FACET_PATTERN);
// do not construct regex until needed
}
else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXINCLUSIVE))
{
try
{
setMaxInclusive(value);
}
catch (NumberFormatException&)
{
ThrowXMLwithMemMgr1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_MaxIncl, value, manager);
}
setFacetsDefined(DatatypeValidator::FACET_MAXINCLUSIVE);
}
else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXEXCLUSIVE))
{
try
{
setMaxExclusive(value);
}
catch (NumberFormatException&)
{
ThrowXMLwithMemMgr1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_MaxExcl, value, manager);
}
setFacetsDefined(DatatypeValidator::FACET_MAXEXCLUSIVE);
}
else if (XMLString::equals(key, SchemaSymbols::fgELT_MININCLUSIVE))
{
try
{
setMinInclusive(value);
}
catch (NumberFormatException&)
{
ThrowXMLwithMemMgr1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_MinIncl, value, manager);
}
setFacetsDefined(DatatypeValidator::FACET_MININCLUSIVE);
}
else if (XMLString::equals(key, SchemaSymbols::fgELT_MINEXCLUSIVE))
{
try
{
setMinExclusive(value);
}
catch (NumberFormatException&)
{
ThrowXMLwithMemMgr1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_MinExcl, value, manager);
}
setFacetsDefined(DatatypeValidator::FACET_MINEXCLUSIVE);
}
else if (XMLString::equals(key, SchemaSymbols::fgATT_FIXED))
{
unsigned int val;
bool retStatus;
try
{
retStatus = XMLString::textToBin(value, val, fMemoryManager);
}
catch (RuntimeException&)
{
ThrowXMLwithMemMgr(InvalidDatatypeFacetException, XMLExcepts::FACET_internalError_fixed, manager);
}
if (!retStatus)
{
ThrowXMLwithMemMgr(InvalidDatatypeFacetException, XMLExcepts::FACET_internalError_fixed, manager);
}
setFixed(val);
//no setFacetsDefined here
}
else
{
assignAdditionalFacet(key, value, manager);
}
}//while
}// end of assigneFacet()
//
// Check facet among self
// check common facets
// check Additional Facet Constraint
//
void AbstractNumericFacetValidator::inspectFacet(MemoryManager* const manager)
{
int thisFacetsDefined = getFacetsDefined();
XMLNumber *thisMaxInclusive = getMaxInclusive();
XMLNumber *thisMaxExclusive = getMaxExclusive();
XMLNumber *thisMinInclusive = getMinInclusive();
XMLNumber *thisMinExclusive = getMinExclusive();
if (!thisFacetsDefined)
return;
// non co-existence checking
// check 4.3.8.c1 error: maxInclusive + maxExclusive
if (((thisFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
((thisFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) )
ThrowXMLwithMemMgr(InvalidDatatypeFacetException, XMLExcepts::FACET_max_Incl_Excl, manager);
// non co-existence checking
// check 4.3.9.c1 error: minInclusive + minExclusive
if (((thisFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) &&
((thisFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) != 0) )
ThrowXMLwithMemMgr(InvalidDatatypeFacetException, XMLExcepts::FACET_min_Incl_Excl, manager);
//
// minExclusive < minInclusive <= maxInclusive < maxExclusive
//
// check 4.3.7.c1 must: minInclusive <= maxInclusive
if (((thisFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
((thisFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) != 0) )
{
int result = compareValues(thisMinInclusive, thisMaxInclusive);
if ( result == 1 || result == INDETERMINATE )
{
REPORT_FACET_ERROR(thisMinInclusive
, thisMaxInclusive
, XMLExcepts::FACET_maxIncl_minIncl
, manager)
}
}
// check 4.3.8.c2 must: minExclusive <= maxExclusive
if ( ((thisFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
((thisFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) )
{
int result = compareValues(getMinExclusive(), getMaxExclusive());
if ( result == 1 || result == INDETERMINATE )
{
REPORT_FACET_ERROR(thisMinExclusive
, thisMaxExclusive
, XMLExcepts::FACET_maxExcl_minExcl
, manager)
}
}
// check 4.3.9.c2 must: minExclusive < maxInclusive
if ( ((thisFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
((thisFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) )
{
int result = compareValues(getMinExclusive(), getMaxInclusive());
if ( result != -1 )
{
REPORT_FACET_ERROR(thisMinExclusive
, thisMaxInclusive
, XMLExcepts::FACET_maxIncl_minExcl
, manager)
}
}
// check 4.3.10.c1 must: minInclusive < maxExclusive
if ( ((thisFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
((thisFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) != 0) )
{
int result = compareValues(getMinInclusive(), getMaxExclusive());
if ( result != -1)
{
REPORT_FACET_ERROR(thisMinInclusive
, thisMaxExclusive
, XMLExcepts::FACET_maxExcl_minIncl
, manager)
}
}
checkAdditionalFacetConstraints(manager);
}// end of inspectFacet()
//
// Check vs base
// check common facets
// check enumeration
// check Additional Facet Constraint
//
void AbstractNumericFacetValidator::inspectFacetBase(MemoryManager* const manager)
{
AbstractNumericFacetValidator* numBase = (AbstractNumericFacetValidator*) getBaseValidator();
int thisFacetsDefined = getFacetsDefined();
if ( (!thisFacetsDefined && !fEnumeration) ||
!numBase )
return;
int baseFacetsDefined = numBase->getFacetsDefined();
XMLNumber *thisMaxInclusive = getMaxInclusive();
XMLNumber *thisMaxExclusive = getMaxExclusive();
XMLNumber *thisMinInclusive = getMinInclusive();
XMLNumber *thisMinExclusive = getMinExclusive();
XMLNumber *baseMaxInclusive = numBase->getMaxInclusive();
XMLNumber *baseMaxExclusive = numBase->getMaxExclusive();
XMLNumber *baseMinInclusive = numBase->getMinInclusive();
XMLNumber *baseMinExclusive = numBase->getMinExclusive();
int baseFixed = numBase->getFixed();
// this
// minExclusive maxExclusive
// minInclusive maxInclusive
//
// base
// minExclusive maxExclusive
// minInclusive maxInclusive
//
// check 4.3.7.c2 error:
// maxInclusive > base.maxInclusive && maxInclusive != base.maxInclusive if (base.fixed)
// maxInclusive >= base.maxExclusive
// maxInclusive < base.minInclusive
// maxInclusive <= base.minExclusive
if ((thisFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) != 0)
{
if ((baseFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) != 0)
{
int result = compareValues(thisMaxInclusive, baseMaxInclusive);
if (((baseFixed & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
(result != 0 ))
{
REPORT_FACET_ERROR(thisMaxInclusive
, baseMaxInclusive
, XMLExcepts::FACET_maxIncl_base_fixed
, manager)
}
if (result == 1 || result == INDETERMINATE)
{
REPORT_FACET_ERROR(thisMaxInclusive
, baseMaxInclusive
, XMLExcepts::FACET_maxIncl_base_maxIncl
, manager)
}
}
if ((baseFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0)
{
int result = compareValues(thisMaxInclusive, baseMaxExclusive);
if (result != -1 )
{
REPORT_FACET_ERROR(thisMaxInclusive
, baseMaxExclusive
, XMLExcepts::FACET_maxIncl_base_maxExcl
, manager)
}
}
if ((baseFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) != 0)
{
int result = compareValues(thisMaxInclusive, baseMinInclusive);
if (result == -1 || result == INDETERMINATE)
{
REPORT_FACET_ERROR(thisMaxInclusive
, baseMinInclusive
, XMLExcepts::FACET_maxIncl_base_minIncl
, manager)
}
}
if ((baseFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) != 0)
{
int result = compareValues(thisMaxInclusive, baseMinExclusive);
if (result != 1 )
{
REPORT_FACET_ERROR(thisMaxInclusive
, baseMinExclusive
, XMLExcepts::FACET_maxIncl_base_minExcl
, manager)
}
}
}
// check 4.3.8.c3 error:
// maxExclusive > base.maxExclusive && maxExclusive != base.maxExclusive if (base.fixed)
// maxExclusive > base.maxInclusive
// maxExclusive <= base.minInclusive
// maxExclusive <= base.minExclusive
if ((thisFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0)
{
if (( baseFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0)
{
int result = compareValues(thisMaxExclusive, baseMaxExclusive);
if (((baseFixed & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
(result != 0 ))
{
REPORT_FACET_ERROR(thisMaxExclusive
, baseMaxExclusive
, XMLExcepts::FACET_maxExcl_base_fixed
, manager)
}
if (result == 1 || result == INDETERMINATE)
{
REPORT_FACET_ERROR(thisMaxExclusive
, baseMaxExclusive
, XMLExcepts::FACET_maxExcl_base_maxExcl
, manager)
}
/**
* Schema Errata
* E2-16 maxExclusive
*
* derived type's maxExclusive must either be
* 1) equal to base' maxExclusive or
* 2) from the base type value space
*
*/
if (result != 0)
{
FROM_BASE_VALUE_SPACE(thisMaxExclusive
, DatatypeValidator::FACET_MAXEXCLUSIVE
, XMLExcepts::FACET_maxExcl_notFromBase
, manager)
}
}
else // base has no maxExclusive
{
FROM_BASE_VALUE_SPACE(thisMaxExclusive
, DatatypeValidator::FACET_MAXEXCLUSIVE
, XMLExcepts::FACET_maxExcl_notFromBase
, manager)
}
if (( baseFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) != 0)
{
int result = compareValues(thisMaxExclusive, baseMaxInclusive);
if (result == 1 || result == INDETERMINATE)
{
REPORT_FACET_ERROR(thisMaxExclusive
, baseMaxInclusive
, XMLExcepts::FACET_maxExcl_base_maxIncl
, manager)
}
}
if (( baseFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) != 0)
{
int result = compareValues(thisMaxExclusive, baseMinExclusive);
if (result != 1)
{
REPORT_FACET_ERROR(thisMaxExclusive
, baseMinExclusive
, XMLExcepts::FACET_maxExcl_base_minExcl
, manager)
}
}
if (( baseFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) != 0)
{
int result = compareValues(thisMaxExclusive, baseMinInclusive);
if (result != 1)
{
REPORT_FACET_ERROR(thisMaxExclusive
, baseMinInclusive
, XMLExcepts::FACET_maxExcl_base_minIncl
, manager)
}
}
}
// check 4.3.9.c3 error:
// minExclusive < base.minExclusive minExclusive != base.minExclusive if (base.fixed)
// minExclusive > base.maxInclusive ??? minExclusive >= base.maxInclusive
// minExclusive < base.minInclusive
// minExclusive >= base.maxExclusive
if ((thisFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) != 0)
{
if (( baseFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) != 0)
{
int result = compareValues(thisMinExclusive, baseMinExclusive);
if (((baseFixed & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) &&
(result != 0 ))
{
REPORT_FACET_ERROR(thisMinExclusive
, baseMinExclusive
, XMLExcepts::FACET_minExcl_base_fixed
, manager)
}
if (result == -1 || result == INDETERMINATE)
{
REPORT_FACET_ERROR(thisMinExclusive
, baseMinExclusive
, XMLExcepts::FACET_minExcl_base_minExcl
, manager)
}
/**
* Schema Errata
* E2-16 maxExclusive
*
* derived type's minExclusive must either be
* 1) equal to base' minxExclusive or
* 2) from the base type value space
*
* Note: deduced from, not explicitly expressed in the Errata
*/
if (result != 0)
{
FROM_BASE_VALUE_SPACE(thisMinExclusive
, DatatypeValidator::FACET_MINEXCLUSIVE
, XMLExcepts::FACET_minExcl_notFromBase
, manager)
}
}
else // base has no minExclusive
{
FROM_BASE_VALUE_SPACE(thisMinExclusive
, DatatypeValidator::FACET_MINEXCLUSIVE
, XMLExcepts::FACET_minExcl_notFromBase
, manager)
}
if (( baseFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) != 0)
{
int result = compareValues(thisMinExclusive, baseMaxInclusive);
if (result == 1 || result == INDETERMINATE)
{
REPORT_FACET_ERROR(thisMinExclusive
, baseMaxInclusive
, XMLExcepts::FACET_minExcl_base_maxIncl
, manager)
}
}
if (( baseFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) != 0)
{
int result = compareValues(thisMinExclusive, baseMinInclusive);
if (result == -1 || result == INDETERMINATE)
{
REPORT_FACET_ERROR(thisMinExclusive
, baseMinInclusive
, XMLExcepts::FACET_minExcl_base_minIncl
, manager)
}
}
if (( baseFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0)
{
int result = compareValues(thisMinExclusive, baseMaxExclusive);
if (result != -1)
{
REPORT_FACET_ERROR(thisMinExclusive
, baseMaxExclusive
, XMLExcepts::FACET_minExcl_base_maxExcl
, manager)
}
}
}
// check 4.3.10.c2 error:
// minInclusive < base.minInclusive minInclusive != base.minInclusive if (base.fixed)
// minInclusive > base.maxInclusive
// minInclusive <= base.minExclusive
// minInclusive >= base.maxExclusive
if ((thisFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) != 0)
{
if ((baseFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) != 0)
{
int result = compareValues(thisMinInclusive, baseMinInclusive);
if (((baseFixed & DatatypeValidator::FACET_MININCLUSIVE) != 0) &&
(result != 0 ))
{
REPORT_FACET_ERROR(thisMinInclusive
, baseMinInclusive
, XMLExcepts::FACET_minIncl_base_fixed
, manager)
}
if (result == -1 || result == INDETERMINATE)
{
REPORT_FACET_ERROR(thisMinInclusive
, baseMinInclusive
, XMLExcepts::FACET_minIncl_base_minIncl
, manager)
}
}
if (( baseFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) != 0)
{
int result = compareValues(thisMinInclusive, baseMaxInclusive);
if (result == 1 || result == INDETERMINATE)
{
REPORT_FACET_ERROR(thisMinInclusive
, baseMaxInclusive
, XMLExcepts::FACET_minIncl_base_maxIncl
, manager)
}
}
if (( baseFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) != 0)
{
int result = compareValues(thisMinInclusive, baseMinExclusive);
if (result != 1)
{
REPORT_FACET_ERROR(thisMinInclusive
, baseMinExclusive
, XMLExcepts::FACET_minIncl_base_minExcl
, manager)
}
}
if (( baseFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0)
{
int result = compareValues(thisMinInclusive, baseMaxExclusive);
if (result != -1)
{
REPORT_FACET_ERROR(thisMinInclusive
, baseMaxExclusive
, XMLExcepts::FACET_minIncl_base_maxExcl
, manager)
}
}
}
checkAdditionalFacetConstraintsBase(manager);
// check 4.3.5.c0 must: enumeration values from the value space of base
//
// In fact, the values in the enumeration shall go through validation
// of this class as well.
// this->checkContent(value, false);
//
if ( ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0) &&
( fStrEnumeration ))
{
setEnumeration(manager);
}
//
// maxInclusive, maxExclusive, minInclusive and minExclusive
// shall come from the base's value space as well
//
FROM_BASE_VALUE_SPACE(thisMaxInclusive
, DatatypeValidator::FACET_MAXINCLUSIVE
, XMLExcepts::FACET_maxIncl_notFromBase
, manager)
FROM_BASE_VALUE_SPACE(thisMinInclusive
, DatatypeValidator::FACET_MININCLUSIVE
, XMLExcepts::FACET_minIncl_notFromBase
, manager)
} //end of inspectFacetBase
//
// Inherit facet from base
// a. inherit common facets
// b. inherit additional facet
//
void AbstractNumericFacetValidator::inheritFacet()
{
AbstractNumericFacetValidator* numBase = (AbstractNumericFacetValidator*) getBaseValidator();
if (!numBase)
return;
int thisFacetsDefined = getFacetsDefined();
int baseFacetsDefined = numBase->getFacetsDefined();
// inherit enumeration
if ((( baseFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0) &&
(( thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) == 0))
{
fEnumeration = numBase->fEnumeration;
fEnumerationInherited = true;
setFacetsDefined(DatatypeValidator::FACET_ENUMERATION);
}
// inherit maxInclusive
if ((( baseFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
(( thisFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) == 0) &&
(( thisFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) == 0) )
{
fMaxInclusive = numBase->getMaxInclusive();
fMaxInclusiveInherited = true;
setFacetsDefined(DatatypeValidator::FACET_MAXINCLUSIVE);
}
// inherit maxExclusive
if ((( baseFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
(( thisFacetsDefined & DatatypeValidator::FACET_MAXEXCLUSIVE) == 0) &&
(( thisFacetsDefined & DatatypeValidator::FACET_MAXINCLUSIVE) == 0) )
{
fMaxExclusive = numBase->getMaxExclusive();
fMaxExclusiveInherited = true;
setFacetsDefined(DatatypeValidator::FACET_MAXEXCLUSIVE);
}
// inherit minExclusive
if ((( baseFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) != 0) &&
(( thisFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) == 0) &&
(( thisFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) == 0) )
{
fMinInclusive = numBase->getMinInclusive();
fMinInclusiveInherited = true;
setFacetsDefined(DatatypeValidator::FACET_MININCLUSIVE);
}
// inherit minExclusive
if ((( baseFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) &&
(( thisFacetsDefined & DatatypeValidator::FACET_MINEXCLUSIVE) == 0) &&
(( thisFacetsDefined & DatatypeValidator::FACET_MININCLUSIVE) == 0) )
{
fMinExclusive = numBase->getMinExclusive();
fMinExclusiveInherited = true;
setFacetsDefined(DatatypeValidator::FACET_MINEXCLUSIVE);
}
inheritAdditionalFacet();
// inherit "fixed" option
setFixed(getFixed() | numBase->getFixed());
}
const RefArrayVectorOf<XMLCh>* AbstractNumericFacetValidator::getEnumString() const
{
return (fEnumerationInherited? getBaseValidator()->getEnumString() : fStrEnumeration );
}
void AbstractNumericFacetValidator::checkAdditionalFacetConstraints(MemoryManager* const) const
{
return;
}
void AbstractNumericFacetValidator::checkAdditionalFacetConstraintsBase(MemoryManager* const) const
{
return;
}
void AbstractNumericFacetValidator::inheritAdditionalFacet()
{
return;
}
void AbstractNumericFacetValidator::assignAdditionalFacet( const XMLCh* const key
, const XMLCh* const
, MemoryManager* const manager)
{
ThrowXMLwithMemMgr1(InvalidDatatypeFacetException
, XMLExcepts::FACET_Invalid_Tag
, key
, manager);
}
/***
* Support for Serialization/De-serialization
***/
IMPL_XSERIALIZABLE_NOCREATE(AbstractNumericFacetValidator)
/***
* This dv needs to serialize/deserialize four boundary data members
* which are derivatives of XMLlNumber.
* The derivatives of this class, namely, Deciamldv, Doubledv, Floatdv and
* DateTimedv needs to write a typeEnum into the binary data stream, so
* during loading, this method reads the typeEnum first, and then instantiate
* the right type of objects, say XMLDouble, XMLFloat, XMLBigDecimal and
* XMLDateTime.
*
*
***/
void AbstractNumericFacetValidator::serialize(XSerializeEngine& serEng)
{
if (serEng.isStoring())
{
/***
* don't move this line out of the if statement,
* it is done purposely to allow AbstractNumericFacetValidator
* read the number type information before DatatypeValidator
* during loading
***/
DatatypeValidator::serialize(serEng);
// need not write type info for the XMLNumber since
// the derivative class has done that
storeClusive(serEng, fMaxInclusiveInherited, fMaxInclusive);
storeClusive(serEng, fMaxExclusiveInherited, fMaxExclusive);
storeClusive(serEng, fMinInclusiveInherited, fMinInclusive);
storeClusive(serEng, fMinExclusiveInherited, fMinExclusive);
serEng<<fEnumerationInherited;
/***
* Serialize RefArrayVectorOf<XMLCh>
* Serialize RefVectorOf<XMLNumber>
***/
XTemplateSerializer::storeObject(fStrEnumeration, serEng);
XTemplateSerializer::storeObject(fEnumeration, serEng);
}
else
{
// Read the number type info for the XMLNumber FIRST!!!
int nType;
XMLNumber::NumberType numType;
serEng>>nType;
numType = (XMLNumber::NumberType) nType;
DatatypeValidator::serialize(serEng);
loadClusive(serEng, fMaxInclusiveInherited, fMaxInclusive, numType, 1);
loadClusive(serEng, fMaxExclusiveInherited, fMaxExclusive, numType, 2);
loadClusive(serEng, fMinInclusiveInherited, fMinInclusive, numType, 3);
loadClusive(serEng, fMinExclusiveInherited, fMinExclusive, numType, 4);
serEng>>fEnumerationInherited;
/***
* Deserialize RefArrayVectorOf<XMLCh>
* Deserialize RefVectorOf<XMLNumber>
***/
XTemplateSerializer::loadObject(&fStrEnumeration, 8, true, serEng);
XTemplateSerializer::loadObject(&fEnumeration, 8, true, numType, serEng);
}
}
//
// A user defined dv may inherit any of the Max/Min/Inc/Exc from a
// built dv, which will create its own Max/Min/Inc/Exc during the
// loading. Therefore if the user defined store and load this
// facet, and does not own it, that will cause leakage.
//
// To avoid checking if the facet belongs to a builtIn dv or not, we
// do this way, for any inherited *clusive, we will not store it, and later
// on during loading, we get it from the base dv.
//
void AbstractNumericFacetValidator::storeClusive(XSerializeEngine& serEng
, bool inherited
, XMLNumber* data)
{
serEng<<inherited;
//store only if own it
if (!inherited)
serEng<<data;
}
// it is guranteed that the base dv is loaded before this dv
//
void AbstractNumericFacetValidator::loadClusive(XSerializeEngine& serEng
, bool& inherited
, XMLNumber*& data
, XMLNumber::NumberType numType
, int flag)
{
serEng>>inherited;
if (!inherited)
data = XMLNumber::loadNumber(numType, serEng);
else
{
AbstractNumericFacetValidator* basedv = (AbstractNumericFacetValidator*) getBaseValidator();
switch(flag)
{
case 1:
data = basedv->getMaxInclusive();
break;
case 2:
data = basedv->getMaxExclusive();
break;
case 3:
data = basedv->getMinInclusive();
break;
case 4:
data = basedv->getMinExclusive();
break;
default:
break;
}
}
}
XERCES_CPP_NAMESPACE_END
/**
* End of file AbstractNumericFacetValidator::cpp
*/