listdatatypevalidator.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 486 行 · 第 1/2 页

CPP
486
字号
    }    int thisFacetsDefined = getFacetsDefined();    // we check pattern first    if ( (thisFacetsDefined & DatatypeValidator::FACET_PATTERN ) != 0 )    {        // lazy construction        if (getRegex() == 0)        {            try {                setRegex(new (fMemoryManager) RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption, fMemoryManager));            	            }            catch (XMLException &e)            {                ThrowXMLwithMemMgr1(InvalidDatatypeValueException, XMLExcepts::RethrowError, e.getMessage(), manager);            }        }        //check every item in the list as a whole        if (getRegex()->matches(content, manager) == false)        {            ThrowXMLwithMemMgr2(InvalidDatatypeValueException                    , XMLExcepts::VALUE_NotMatch_Pattern                    , content                    , getPattern()                    , manager);        }    }    // if this is a base validator, we only need to check pattern facet    // all other facet were inherited by the derived type    if (asBase)        return;    unsigned int tokenNumber = tokenVector->size();    if (((thisFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) != 0) &&        (tokenNumber > getMaxLength()))    {        XMLCh value1[BUF_LEN+1];        XMLCh value2[BUF_LEN+1];        XMLString::binToText(tokenNumber, value1, BUF_LEN, 10, manager);        XMLString::binToText(getMaxLength(), value2, BUF_LEN, 10, manager);        ThrowXMLwithMemMgr3(InvalidDatatypeValueException                , XMLExcepts::VALUE_GT_maxLen                , getContent()                , value1                , value2                , manager);    }    if (((thisFacetsDefined & DatatypeValidator::FACET_MINLENGTH) != 0) &&        (tokenNumber < getMinLength()))    {        XMLCh value1[BUF_LEN+1];        XMLCh value2[BUF_LEN+1];        XMLString::binToText(tokenNumber, value1, BUF_LEN, 10, manager);        XMLString::binToText(getMinLength(), value2, BUF_LEN, 10, manager);        ThrowXMLwithMemMgr3(InvalidDatatypeValueException                , XMLExcepts::VALUE_LT_minLen                , getContent()                , value1                , value2                , manager);    }    if (((thisFacetsDefined & DatatypeValidator::FACET_LENGTH) != 0) &&        (tokenNumber != AbstractStringValidator::getLength()))    {        XMLCh value1[BUF_LEN+1];        XMLCh value2[BUF_LEN+1];        XMLString::binToText(tokenNumber, value1, BUF_LEN, 10, manager);        XMLString::binToText(AbstractStringValidator::getLength(), value2, BUF_LEN, 10, manager);        ThrowXMLwithMemMgr3(InvalidDatatypeValueException                , XMLExcepts::VALUE_NE_Len                , getContent()                , value1                , value2                , manager);    }    if ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0 &&        (getEnumeration() != 0))    {        int i;        int enumLength = getEnumeration()->size();        for ( i = 0; i < enumLength; i++)        {            //optimization: we do a lexical comparision first            // this may be faster for string and its derived            if (XMLString::equals(getEnumeration()->elementAt(i), getContent()))                break; // a match found            // do a value space check            // this is needed for decimal (and probably other types            // such as datetime related)            // eg.            // tokenVector = "1 2 3.0 4" vs enumeration = "1 2 3 4.0"            //            if (valueSpaceCheck(tokenVector, getEnumeration()->elementAt(i), manager))                break;        }        if (i == enumLength)            ThrowXMLwithMemMgr1(InvalidDatatypeValueException, XMLExcepts::VALUE_NotIn_Enumeration, getContent(), manager);    } // enumeration}bool ListDatatypeValidator::valueSpaceCheck(BaseRefVectorOf<XMLCh>* tokenVector                                          , const XMLCh*    const  enumStr                                          , MemoryManager*  const  manager) const{    DatatypeValidator* theItemTypeDTV = getItemTypeDTV();    BaseRefVectorOf<XMLCh>* enumVector = XMLString::tokenizeString(enumStr, manager);    Janitor<BaseRefVectorOf<XMLCh> > janName(enumVector);    if (tokenVector->size() != enumVector->size())        return false;    for ( unsigned int j = 0; j < tokenVector->size(); j++ )    {        if (theItemTypeDTV->compare(tokenVector->elementAt(j), enumVector->elementAt(j), manager) != 0)            return false;    }    return true;}DatatypeValidator* ListDatatypeValidator::getItemTypeDTV() const{    DatatypeValidator* bdv = this->getBaseValidator();    while (bdv->getType() == DatatypeValidator::List)        bdv = bdv->getBaseValidator();    return bdv;}// ---------------------------------------------------------------------------//  Utilities// ---------------------------------------------------------------------------void ListDatatypeValidator::checkValueSpace(const XMLCh* const                                            , MemoryManager* const){}int ListDatatypeValidator::getLength(const XMLCh* const content                                     , MemoryManager* const manager) const{    BaseRefVectorOf<XMLCh>* tokenVector = XMLString::tokenizeString(content, manager);    Janitor<BaseRefVectorOf<XMLCh> > janName(tokenVector);    return tokenVector->size();}void ListDatatypeValidator::inspectFacetBase(MemoryManager* const manager){    //    // we are pretty sure baseValidator is not null    //    if (getBaseValidator()->getType() == DatatypeValidator::List)    {        AbstractStringValidator::inspectFacetBase(manager);    }    else    {        // the first level ListDTV        // check 4.3.5.c0 must: enumeration values from the value space of base        if ( ((getFacetsDefined() & DatatypeValidator::FACET_ENUMERATION) != 0) &&             (getEnumeration() !=0)                                              )        {            int i;            int enumLength = getEnumeration()->size();            try            {                for ( i = 0; i < enumLength; i++)                {                    // ask the itemType for a complete check                    BaseRefVectorOf<XMLCh>* tempList = XMLString::tokenizeString(getEnumeration()->elementAt(i), manager);                    int tokenNumber = tempList->size();                    try                    {                        for ( int j = 0; j < tokenNumber; j++)                            getBaseValidator()->validate(tempList->elementAt(j), (ValidationContext*)0, manager);                    }                    catch(const OutOfMemoryException&)                    {                        throw;                    }                    catch (...)                    {                        delete tempList;                        throw;                    }                    delete tempList;                    // enum shall pass this->checkContent() as well.                    checkContent(getEnumeration()->elementAt(i), (ValidationContext*)0, false, manager);                }            }            catch ( XMLException& )            {                ThrowXMLwithMemMgr1(InvalidDatatypeFacetException                        , XMLExcepts::FACET_enum_base                        , getEnumeration()->elementAt(i)                        , manager);            }        }    }}// End of inspectFacetBase()void ListDatatypeValidator::inheritFacet(){    //iff the base validator is List, then we inherit    //    if (getBaseValidator()->getType() == DatatypeValidator::List)    {        AbstractStringValidator::inheritFacet();    }}/*** * 2.5.1.2 List datatypes    *    * The canonical-lexical-representation for the 穕ist

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?