datatypevalidatorfactory.cpp

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

CPP
1,087
字号
                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_signed));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_LONG),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_signed));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_INT),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_signed));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_SHORT),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_signed));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_BYTE),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_signed));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_NONNEGATIVEINTEGER),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_signed));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_POSITIVEINTEGER),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_signed));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_NEGATIVEINTEGER),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_unsigned));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_ULONG),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_unsigned));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_UINT),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_unsigned));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_USHORT),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_unsigned));             fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_UBYTE),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_unsigned));     fCanRepRegistry->put((void*) getDatatypeValidator(SchemaSymbols::fgDT_NONPOSITIVEINTEGER),                        new  XMLCanRepGroup(XMLCanRepGroup::Decimal_Derivated_npi));}/*** * *   For any dv other than Decimaldv, return String only. *   Later on if support to dv other than Decimaldv arise, we may *   add them fCanRepRegistry during DatatypeValidatorFactory::initCanRepRegistory() * ***/XMLCanRepGroup::CanRepGroup DatatypeValidatorFactory::getCanRepGroup(const DatatypeValidator* const dv){    if (!dv)        return XMLCanRepGroup::String;    DatatypeValidator *curdv = (DatatypeValidator*) dv;    while (curdv)    {        if (fCanRepRegistry->containsKey(curdv))            return fCanRepRegistry->get(curdv)->getGroup();        else            curdv = curdv->getBaseValidator();    }    return XMLCanRepGroup::String;}DatatypeValidator* DatatypeValidatorFactory::getBuiltInBaseValidator(const DatatypeValidator* const dv){    DatatypeValidator *curdv = (DatatypeValidator*)dv;    while (curdv)    {        if (curdv == getBuiltInRegistry()->get(curdv->getTypeLocalName()))            return curdv;        else            curdv = curdv->getBaseValidator();     }     return 0;}// ---------------------------------------------------------------------------//  DatatypeValidatorFactory: factory methods// ---------------------------------------------------------------------------DatatypeValidator* DatatypeValidatorFactory::createDatatypeValidator(      const XMLCh* const                  typeName	, DatatypeValidator* const            baseValidator    , RefHashTableOf<KVStringPair>* const facets    , RefArrayVectorOf<XMLCh>* const      enums    , const bool                          isDerivedByList    , const int                           finalSet    , const bool                          isUserDefined    , MemoryManager* const                userManager){	if (baseValidator == 0) {        if (facets) {            Janitor<KVStringPairHashTable> janFacets(facets);        }        if (enums) {            Janitor<XMLChRefVector> janEnums(enums);        }        return 0;    }	DatatypeValidator* datatypeValidator = 0;    MemoryManager* const manager = (isUserDefined)        ? userManager : XMLPlatformUtils::fgMemoryManager;    if (isDerivedByList) {        datatypeValidator = new (manager) ListDatatypeValidator(baseValidator, facets, enums, finalSet, manager);        // Set PSVI information for Ordered, Numeric, Bounded & Finite        datatypeValidator->setOrdered(XSSimpleTypeDefinition::ORDERED_FALSE);        datatypeValidator->setNumeric(false);        if (facets &&             ((facets->get(SchemaSymbols::fgELT_LENGTH) ||               (facets->get(SchemaSymbols::fgELT_MINLENGTH) && facets->get(SchemaSymbols::fgELT_MAXLENGTH)))))        {            datatypeValidator->setBounded(true);            datatypeValidator->setFinite(true);        }        else        {            datatypeValidator->setBounded(false);            datatypeValidator->setFinite(false);        }    }    else {        if ((baseValidator->getType() != DatatypeValidator::String) && facets) {            KVStringPair* value = facets->get(SchemaSymbols::fgELT_WHITESPACE);            if (value != 0) {                facets->removeKey(SchemaSymbols::fgELT_WHITESPACE);            }        }        datatypeValidator = baseValidator->newInstance        (            facets            , enums            , finalSet            , manager        );        // Set PSVI information for Ordered, Numeric, Bounded & Finite        datatypeValidator->setOrdered(baseValidator->getOrdered());        datatypeValidator->setNumeric(baseValidator->getNumeric());        if (facets  &&             ((facets->get(SchemaSymbols::fgELT_MININCLUSIVE) || facets->get(SchemaSymbols::fgELT_MINEXCLUSIVE)) &&             (facets->get(SchemaSymbols::fgELT_MAXINCLUSIVE) || facets->get(SchemaSymbols::fgELT_MAXEXCLUSIVE))))        {            datatypeValidator->setBounded(true);        }        else        {            datatypeValidator->setBounded(false);        }        if (baseValidator->getFinite())        {            datatypeValidator->setFinite(true);        }        else if (!facets)        {            datatypeValidator->setFinite(false);        }        else if (facets->get(SchemaSymbols::fgELT_LENGTH) || facets->get(SchemaSymbols::fgELT_MAXLENGTH) ||                 facets->get(SchemaSymbols::fgELT_TOTALDIGITS))        {            datatypeValidator->setFinite(true);        }        //for efficiency use this instead of rechecking...        //else if ((facets->get(SchemaSymbols::fgELT_MININCLUSIVE) || facets->get(SchemaSymbols::fgELT_MINEXCLUSIVE)) &&        //         (facets->get(SchemaSymbols::fgELT_MAXINCLUSIVE) || facets->get(SchemaSymbols::fgELT_MAXEXCLUSIVE)))        else if (datatypeValidator->getBounded() ||                 datatypeValidator->getType() == DatatypeValidator::Date      ||                  datatypeValidator->getType() == DatatypeValidator::YearMonth ||                 datatypeValidator->getType() == DatatypeValidator::Year      ||                 datatypeValidator->getType() == DatatypeValidator::MonthDay  ||                 datatypeValidator->getType() == DatatypeValidator::Day       ||                 datatypeValidator->getType() == DatatypeValidator::Month)        {            if (facets->get(SchemaSymbols::fgELT_FRACTIONDIGITS))            {                datatypeValidator->setFinite(true);            }            else             {                datatypeValidator->setFinite(false);            }        }        else         {            datatypeValidator->setFinite(false);        }          }    if (datatypeValidator != 0) {        if (isUserDefined) {            if (!fUserDefinedRegistry) {                fUserDefinedRegistry = new (userManager) RefHashTableOf<DatatypeValidator>(29, userManager);            }            fUserDefinedRegistry->put((void *)typeName, datatypeValidator);        }        else {            fBuiltInRegistry->put((void *)typeName, datatypeValidator);        }        datatypeValidator->setTypeName(typeName);    }    return datatypeValidator;}static DatatypeValidator::ValidatorType getPrimitiveDV(DatatypeValidator::ValidatorType validationDV){    if (validationDV == DatatypeValidator::ID    ||         validationDV == DatatypeValidator::IDREF ||         validationDV == DatatypeValidator::ENTITY)    {        return DatatypeValidator::String;    }    return validationDV;}DatatypeValidator* DatatypeValidatorFactory::createDatatypeValidator(      const XMLCh* const                    typeName    , RefVectorOf<DatatypeValidator>* const validators    , const int                             finalSet    , const bool                            userDefined    , MemoryManager* const                  userManager){    if (validators == 0)        return 0;    DatatypeValidator* datatypeValidator = 0;    MemoryManager* const manager = (userDefined)        ? userManager : XMLPlatformUtils::fgMemoryManager;    datatypeValidator = new (manager) UnionDatatypeValidator(validators, finalSet, manager);    if (datatypeValidator != 0) {        if (userDefined) {            if (!fUserDefinedRegistry) {                fUserDefinedRegistry = new (userManager) RefHashTableOf<DatatypeValidator>(29, userManager);            }            fUserDefinedRegistry->put((void *)typeName, datatypeValidator);        }        else {            fBuiltInRegistry->put((void *)typeName, datatypeValidator);        }        datatypeValidator->setTypeName(typeName);        // Set PSVI information for Ordered, Numeric, Bounded & Finite        unsigned int valSize = validators->size();        if (valSize)         {            DatatypeValidator::ValidatorType ancestorId = getPrimitiveDV(validators->elementAt(0)->getType());            // For a union the ORDERED {value} is partial unless one of the following:            // 1. If every member of {member type definitions} is derived from a common ancestor other than the simple ur-type, then {value} is the same as that ancestor's ordered facet.            // 2. If every member of {member type definitions} has a {value} of false for the ordered facet, then {value} is false.            bool allOrderedFalse = true;            bool commonAnc = ancestorId != DatatypeValidator::AnySimpleType;            bool allNumeric = true;            bool allBounded = true;            bool allFinite  = true;                    for(unsigned int i = 0 ; (i < valSize) && (commonAnc || allOrderedFalse || allNumeric || allBounded || allFinite); i++)            {                // for the other member types, check whether the value is false                // and whether they have the same ancestor as the first one                if (commonAnc)                    commonAnc = ancestorId == getPrimitiveDV(validators->elementAt(i)->getType());                if (allOrderedFalse)                    allOrderedFalse = validators->elementAt(i)->getOrdered() == XSSimpleTypeDefinition::ORDERED_FALSE;                           if (allNumeric && !validators->elementAt(i)->getNumeric())                {                    allNumeric = false;                }                if (allBounded && (!validators->elementAt(i)->getBounded() ||                                   ancestorId != getPrimitiveDV(validators->elementAt(i)->getType())))                {                    allBounded = false;                }                if (allFinite && !validators->elementAt(i)->getFinite())                {                    allFinite = false;                }                    }            if (commonAnc)             {                datatypeValidator->setOrdered(validators->elementAt(0)->getOrdered());            }             else if (allOrderedFalse)             {                datatypeValidator->setOrdered(XSSimpleTypeDefinition::ORDERED_FALSE);            }             else             {                datatypeValidator->setOrdered(XSSimpleTypeDefinition::ORDERED_PARTIAL);            }            datatypeValidator->setNumeric(allNumeric);            datatypeValidator->setBounded(allBounded);            datatypeValidator->setFinite(allFinite);        }        else // size = 0        {            datatypeValidator->setOrdered(XSSimpleTypeDefinition::ORDERED_PARTIAL);            datatypeValidator->setNumeric(true);            datatypeValidator->setBounded(true);            datatypeValidator->setFinite(true);        }    }    return datatypeValidator;}/*** * Support for Serialization/De-serialization ***/IMPL_XSERIALIZABLE_TOCREATE(DatatypeValidatorFactory)void DatatypeValidatorFactory::serialize(XSerializeEngine& serEng){          // Need not to serialize static data member, fBuiltInRegistry    if (serEng.isStoring())    {        /***         * Serialize RefHashTableOf<DatatypeValidator>         ***/        XTemplateSerializer::storeObject(fUserDefinedRegistry, serEng);    }    else    {        /***         * DV in the UserDefinedRegistry rely on the fBuiltInRegistry         * to resolve their built-in baseValidator         ***/        expandRegistryToFullSchemaSet();        /***         * Deserialize RefHashTableOf<DatatypeValidator>         ***/        XTemplateSerializer::loadObject(&fUserDefinedRegistry, 29, true, serEng);    }}XERCES_CPP_NAMESPACE_END/**  * End of file DatatypeValidatorFactory.cpp  */

⌨️ 快捷键说明

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