XSIDCDefinition* XSObjectFactory::addOrFind(IdentityConstraint* const ic, XSModel* const xsModel) { XSIDCDefinition* xsObj = (XSIDCDefinition*) xsModel->getXSObject(ic); if (!xsObj) { XSIDCDefinition* keyIC = 0; StringList* stringList = 0; XMLSize_t fieldCount = ic->getFieldCount(); if (fieldCount) { stringList = new (fMemoryManager) RefArrayVectorOf<XMLCh>( fieldCount, true, fMemoryManager); for(XMLSize_t i=0; i<fieldCount; i++) { XMLCh* expr = XMLString::replicate ( ic->getFieldAt(i)->getXPath()->getExpression() , fMemoryManager ); stringList->addElement(expr); } } if (ic->getType() == IdentityConstraint::ICType_KEYREF) keyIC = addOrFind(((IC_KeyRef*) ic)->getKey(), xsModel); xsObj= new (fMemoryManager) XSIDCDefinition ( ic , keyIC , getAnnotationFromModel(xsModel, ic) , stringList , xsModel , fMemoryManager ); putObjectInMap(ic, xsObj); } return xsObj; }
void XSObjectFactory::processFacets(DatatypeValidator* const dv, XSModel* const xsModel, XSSimpleTypeDefinition* const xsST) { // NOTE: XSMultiValueFacetList is not owned by XSModel! // NOTE: XSFacetList is not owned by XSModel! bool isFixed = false; int dvFacetsDefined = dv->getFacetsDefined(); int dvFixedFacets = dv->getFixed(); int definedFacets = 0; int fixedFacets = 0; XSMultiValueFacetList* xsMultiFacetList = 0; StringList* patternList = 0; XSFacetList* xsFacetList = new (fMemoryManager) RefVectorOf<XSFacet>(4, false, fMemoryManager); if (isMultiValueFacetDefined(dv)) xsMultiFacetList = new (fMemoryManager) RefVectorOf<XSMultiValueFacet>(2, false, fMemoryManager); if (dvFacetsDefined & DatatypeValidator::FACET_ENUMERATION) { RefArrayVectorOf<XMLCh>* enumList = (RefArrayVectorOf<XMLCh>*) dv->getEnumString(); if (dvFixedFacets & DatatypeValidator::FACET_ENUMERATION) { isFixed = true; fixedFacets |= XSSimpleTypeDefinition::FACET_ENUMERATION; } XSMultiValueFacet* mvFacet = new (fMemoryManager) XSMultiValueFacet( XSSimpleTypeDefinition::FACET_ENUMERATION , enumList, isFixed , getAnnotationFromModel(xsModel, enumList), xsModel, fMemoryManager ); fDeleteVector->addElement(mvFacet); xsMultiFacetList->addElement(mvFacet); definedFacets |= XSSimpleTypeDefinition::FACET_ENUMERATION; } if (dv->getFacets()) { RefHashTableOfEnumerator<KVStringPair> e(dv->getFacets(), false, fMemoryManager); while (e.hasMoreElements()) { KVStringPair& pair = e.nextElement(); XMLCh* key = pair.getKey(); XSSimpleTypeDefinition::FACET facetType; XSAnnotation* annot = getAnnotationFromModel(xsModel, &pair); if (XMLString::equals(key, SchemaSymbols::fgELT_MAXINCLUSIVE)) { facetType = XSSimpleTypeDefinition::FACET_MAXINCLUSIVE; isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MAXINCLUSIVE) != 0); } else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXEXCLUSIVE)) { facetType = XSSimpleTypeDefinition::FACET_MAXEXCLUSIVE; isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MAXEXCLUSIVE) !=0); } else if (XMLString::equals(key, SchemaSymbols::fgELT_MININCLUSIVE)) { facetType = XSSimpleTypeDefinition::FACET_MININCLUSIVE; isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MININCLUSIVE) !=0); } else if (XMLString::equals(key, SchemaSymbols::fgELT_MINEXCLUSIVE)) { facetType = XSSimpleTypeDefinition::FACET_MINEXCLUSIVE; isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MINEXCLUSIVE) != 0); } else if (XMLString::equals(key, SchemaSymbols::fgELT_LENGTH)) { facetType = XSSimpleTypeDefinition::FACET_LENGTH; isFixed = ((dvFixedFacets & DatatypeValidator::FACET_LENGTH) != 0); } else if (XMLString::equals(key, SchemaSymbols::fgELT_MINLENGTH)) { facetType = XSSimpleTypeDefinition::FACET_MINLENGTH; isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MINLENGTH) != 0); } else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXLENGTH)) { facetType = XSSimpleTypeDefinition::FACET_MAXLENGTH; isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MAXLENGTH) != 0); } else if (XMLString::equals(key, SchemaSymbols::fgELT_TOTALDIGITS)) { facetType = XSSimpleTypeDefinition::FACET_TOTALDIGITS; isFixed = ((dvFixedFacets & DatatypeValidator::FACET_TOTALDIGITS) != 0); } else if (XMLString::equals(key, SchemaSymbols::fgELT_FRACTIONDIGITS)) { facetType = XSSimpleTypeDefinition::FACET_FRACTIONDIGITS; isFixed = ((dvFixedFacets & DatatypeValidator::FACET_FRACTIONDIGITS) != 0); } else if (XMLString::equals(key, SchemaSymbols::fgELT_WHITESPACE)) { facetType = XSSimpleTypeDefinition::FACET_WHITESPACE; isFixed = ((dvFixedFacets & DatatypeValidator::FACET_WHITESPACE) != 0); } else if (XMLString::equals(key, SchemaSymbols::fgELT_PATTERN)) { XMLStringTokenizer tokenizer(dv->getPattern(), regexSeparator, fMemoryManager); patternList = new (fMemoryManager) RefArrayVectorOf<XMLCh>( tokenizer.countTokens(), true, fMemoryManager ); while (tokenizer.hasMoreTokens()) patternList->addElement(XMLString::replicate(tokenizer.nextToken(), fMemoryManager)); if (dvFixedFacets & DatatypeValidator::FACET_PATTERN) { isFixed = true; fixedFacets |= XSSimpleTypeDefinition::FACET_PATTERN; } XSMultiValueFacet* mvFacet = new (fMemoryManager) XSMultiValueFacet( XSSimpleTypeDefinition::FACET_PATTERN, patternList , isFixed, annot, xsModel, fMemoryManager ); fDeleteVector->addElement(mvFacet); xsMultiFacetList->addElement(mvFacet); definedFacets |= XSSimpleTypeDefinition::FACET_PATTERN; continue; } else { // REVISIT: hmm... what about XSSimpleTypeDefinition::FACET_NONE // don't think I need to create an empty Facet? continue; } XSFacet* xsFacet = new (fMemoryManager) XSFacet( facetType, pair.getValue(), isFixed, annot, xsModel, fMemoryManager); fDeleteVector->addElement(xsFacet); xsFacetList->addElement(xsFacet); definedFacets |= facetType; if (isFixed) fixedFacets |= facetType; } } // add whistespace facet if missing if ((definedFacets & XSSimpleTypeDefinition::FACET_WHITESPACE) == 0) { XSFacet* xsFacet = new (fMemoryManager) XSFacet( XSSimpleTypeDefinition::FACET_WHITESPACE , dv->getWSstring(dv->getWSFacet()) , false, 0, xsModel, fMemoryManager); fDeleteVector->addElement(xsFacet); xsFacetList->addElement(xsFacet); definedFacets |= XSSimpleTypeDefinition::FACET_WHITESPACE; } // inherit facets from base if (xsST->getBaseType() && xsST->getBaseType()->getTypeCategory() == XSTypeDefinition::SIMPLE_TYPE) { XSSimpleTypeDefinition* baseST = (XSSimpleTypeDefinition*) xsST->getBaseType(); XSFacetList* baseFacets = baseST->getFacets(); for (unsigned int i=0; i<baseFacets->size(); i++) { XSFacet* bFacet = baseFacets->elementAt(i); if ((definedFacets & bFacet->getFacetKind()) == 0) { definedFacets |= bFacet->getFacetKind(); xsFacetList->addElement(bFacet); if (bFacet->isFixed()) fixedFacets |= bFacet->getFacetKind(); } } if (baseST->getMultiValueFacets()) { XSMultiValueFacetList* baseMVFacets = baseST->getMultiValueFacets(); for (unsigned int j=0; j<baseMVFacets->size(); j++) { XSMultiValueFacet* bFacet = baseMVFacets->elementAt(j); if ((definedFacets & bFacet->getFacetKind()) == 0) { definedFacets |= bFacet->getFacetKind(); xsMultiFacetList->addElement(bFacet); if (bFacet->isFixed()) fixedFacets |= bFacet->getFacetKind(); } } } } xsST->setFacetInfo(definedFacets, fixedFacets, xsFacetList, xsMultiFacetList, patternList); }