knoaman 2004/01/06 18:33:56
Modified: c/src/xercesc/internal XSObjectFactory.hpp
XSObjectFactory.cpp
Log:
PSVI: inherit facets from base type
Revision Changes Path
1.8 +5 -0 xml-xerces/c/src/xercesc/internal/XSObjectFactory.hpp
Index: XSObjectFactory.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSObjectFactory.hpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- XSObjectFactory.hpp 29 Dec 2003 16:15:41 -0000 1.7
+++ XSObjectFactory.hpp 7 Jan 2004 02:33:56 -0000 1.8
@@ -56,6 +56,9 @@
/*
* $Log$
+ * Revision 1.8 2004/01/07 02:33:56 knoaman
+ * PSVI: inherit facets from base type
+ *
* Revision 1.7 2003/12/29 16:15:41 knoaman
* More PSVI updates
*
@@ -269,6 +272,8 @@
SchemaAttDef* const attDef
, XSAttributeUse* const xsAttUse
);
+
+ bool isMultiValueFacetDefined(DatatypeValidator* const dv);
// make XSModel our friend
friend class XSModel;
1.19 +104 -48 xml-xerces/c/src/xercesc/internal/XSObjectFactory.cpp
Index: XSObjectFactory.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSObjectFactory.cpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- XSObjectFactory.cpp 6 Jan 2004 15:24:42 -0000 1.18
+++ XSObjectFactory.cpp 7 Jan 2004 02:33:56 -0000 1.19
@@ -56,6 +56,9 @@
/*
* $Log$
+ * Revision 1.19 2004/01/07 02:33:56 knoaman
+ * PSVI: inherit facets from base type
+ *
* Revision 1.18 2004/01/06 15:24:42 neilg
* make sure locally-declared attributes have declarations in the PSVI
*
@@ -151,6 +154,7 @@
static XMLCh regexSeparator[] = {chPipe, chNull};
+
// ---------------------------------------------------------------------------
// XSObjectFactory: Constructors and Destructor
// ---------------------------------------------------------------------------
@@ -481,8 +485,7 @@
xsObj->setPrimitiveType(xsObj);
// process facets
- if (validator->getFacetsDefined())
- processFacets(validator, xsModel, xsObj);
+ processFacets(validator, xsModel, xsObj);
}
return xsObj;
@@ -903,53 +906,52 @@
fDeleteVector->addElement(object);
}
-
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;
- XSFacetList* xsFacetList = new (fMemoryManager) RefVectorOf<XSFacet>(4, true,
fMemoryManager);
XSMultiValueFacetList* xsMultiFacetList = 0;
StringList* patternList = 0;
- bool isFixed = false;
- int dvFacetsDefined = dv->getFacetsDefined();
- int dvFixedFacets = dv->getFixed();
+ XSFacetList* xsFacetList = new (fMemoryManager) RefVectorOf<XSFacet>(4, false,
fMemoryManager);
- if ((dvFacetsDefined & DatatypeValidator::FACET_PATTERN)
- || (dvFacetsDefined & DatatypeValidator::FACET_ENUMERATION))
- xsMultiFacetList = new (fMemoryManager) RefVectorOf<XSMultiValueFacet>(2,
true, fMemoryManager);
+ if (isMultiValueFacetDefined(dv))
+ xsMultiFacetList = new (fMemoryManager) RefVectorOf<XSMultiValueFacet>(2,
false, fMemoryManager);
if (dvFacetsDefined & DatatypeValidator::FACET_ENUMERATION)
{
RefArrayVectorOf<XMLCh>* enumList = (RefArrayVectorOf<XMLCh>*)
dv->getEnumString();
- isFixed = ((dvFixedFacets & DatatypeValidator::FACET_ENUMERATION) != 0);
- // NOTE: Don't need to add multivaluefacet to "ObjectMap ->
getObjectFromMap/putObjectInMap);
- xsMultiFacetList->addElement(
- new (fMemoryManager) XSMultiValueFacet(
- XSSimpleTypeDefinition::FACET_ENUMERATION , enumList, isFixed
- , getAnnotationFromModel(xsModel, enumList)
- , xsModel, fMemoryManager)
+ 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 (isFixed)
- fixedFacets |= XSSimpleTypeDefinition::FACET_ENUMERATION;
}
- RefHashTableOf<KVStringPair>* facets = dv->getFacets();
- if (facets)
+ if (dv->getFacets())
{
- // NOTE: Don't need to add facet to "ObjectMap ->
getObjectFromMap/putObjectInMap);
- RefHashTableOfEnumerator<KVStringPair> e(facets, false, fMemoryManager);
+ RefHashTableOfEnumerator<KVStringPair> e(dv->getFacets(), false,
fMemoryManager);
while (e.hasMoreElements())
{
KVStringPair& pair = e.nextElement();
XMLCh* key = pair.getKey();
- XSSimpleTypeDefinition::FACET facetType =
XSSimpleTypeDefinition::FACET_NONE;
+ XSSimpleTypeDefinition::FACET facetType;
XSAnnotation* annot = getAnnotationFromModel(xsModel, &pair);
if (XMLString::equals(key, SchemaSymbols::fgELT_MAXINCLUSIVE))
@@ -1005,21 +1007,26 @@
else if (XMLString::equals(key, SchemaSymbols::fgELT_PATTERN))
{
XMLStringTokenizer tokenizer(dv->getPattern(), regexSeparator,
fMemoryManager);
- patternList = new (fMemoryManager)
RefArrayVectorOf<XMLCh>(tokenizer.countTokens(), true, fMemoryManager);
+ patternList = new (fMemoryManager) RefArrayVectorOf<XMLCh>(
+ tokenizer.countTokens(), true, fMemoryManager
+ );
while (tokenizer.hasMoreTokens())
patternList->addElement(XMLString::replicate(tokenizer.nextToken(), fMemoryManager));
- isFixed = ((dvFixedFacets & DatatypeValidator::FACET_PATTERN) != 0);
- // NOTE: Don't need to add multivaluefacet to "ObjectMap ->
getObjectFromMap/putObjectInMap);
- xsMultiFacetList->addElement(
- new (fMemoryManager) XSMultiValueFacet(
- XSSimpleTypeDefinition::FACET_PATTERN, patternList
- , isFixed, annot, xsModel, fMemoryManager)
- );
- definedFacets |= XSSimpleTypeDefinition::FACET_PATTERN;
- if (isFixed)
+ 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
@@ -1029,11 +1036,11 @@
continue;
}
- xsFacetList->addElement(
- new (fMemoryManager) XSFacet(
- facetType, pair.getValue(), isFixed, annot, xsModel,
fMemoryManager)
- );
+ XSFacet* xsFacet = new (fMemoryManager) XSFacet(
+ facetType, pair.getValue(), isFixed, annot, xsModel,
fMemoryManager);
+ fDeleteVector->addElement(xsFacet);
+ xsFacetList->addElement(xsFacet);
definedFacets |= facetType;
if (isFixed)
fixedFacets |= facetType;
@@ -1041,20 +1048,53 @@
}
// add whistespace facet if missing
- if (!(definedFacets & XSSimpleTypeDefinition::FACET_WHITESPACE))
+ if ((definedFacets & XSSimpleTypeDefinition::FACET_WHITESPACE) == 0)
{
- xsFacetList->addElement
- (
- new (fMemoryManager) XSFacet
- (
- XSSimpleTypeDefinition::FACET_WHITESPACE
- , dv->getWSstring(dv->getWSFacet())
- , false, 0, xsModel, fMemoryManager
- )
- );
+ 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())
+ {
+ 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);
}
@@ -1079,6 +1119,22 @@
isRequired = true;
xsAttUse->set(isRequired, constraintType, attDef->getValue());
+}
+
+bool XSObjectFactory::isMultiValueFacetDefined(DatatypeValidator* const dv)
+{
+ DatatypeValidator* tmpDV = dv;
+
+ while (tmpDV)
+ {
+ if ((tmpDV->getFacetsDefined() & DatatypeValidator::FACET_PATTERN)
+ || (tmpDV->getFacetsDefined() & DatatypeValidator::FACET_ENUMERATION))
+ return true;
+
+ tmpDV = tmpDV->getBaseValidator();
+ }
+
+ return false;
}
XERCES_CPP_NAMESPACE_END
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]