knoaman 2003/11/23 08:32:21
Modified: c/src/xercesc/validators/schema TraverseSchema.hpp
TraverseSchema.cpp
Log:
PSVI: differentiate between local elements declared in complex types from the
ones declared in groups.
Revision Changes Path
1.30 +5 -1 xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.hpp
Index: TraverseSchema.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.hpp,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- TraverseSchema.hpp 20 Nov 2003 18:00:12 -0000 1.29
+++ TraverseSchema.hpp 23 Nov 2003 16:32:21 -0000 1.30
@@ -576,6 +576,10 @@
ComplexTypeInfo* const baseTypeInfo,
ComplexTypeInfo* const newTypeInfo);
+ void processElements(const DOMElement* const elem,
+ XercesGroupInfo* const fromGroup,
+ ComplexTypeInfo* const typeInfo);
+
void copyGroupElements(const DOMElement* const elem,
XercesGroupInfo* const fromGroup,
XercesGroupInfo* const toGroup,
1.98 +54 -7 xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp
Index: TraverseSchema.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp,v
retrieving revision 1.97
retrieving revision 1.98
diff -u -r1.97 -r1.98
--- TraverseSchema.cpp 21 Nov 2003 22:34:46 -0000 1.97
+++ TraverseSchema.cpp 23 Nov 2003 16:32:21 -0000 1.98
@@ -1461,10 +1461,7 @@
fCurrentGroupStack->addElement(nameIndex);
fCurrentGroupInfo = groupInfo;
- if (fCurrentScope == Grammar::TOP_LEVEL_SCOPE) {
- fCurrentScope = fScopeCount++;
- }
-
+ fCurrentScope = fScopeCount++;
fCurrentGroupInfo->setScope(fCurrentScope);
if (content == 0) {
@@ -1496,6 +1493,10 @@
if (illegalChild || XUtil::getNextSiblingElement(content) != 0) {
reportSchemaError(content, XMLUni::fgXMLErrDomain,
XMLErrs::GroupContentError, name);
}
+
+ // copy local elements to complex type if it exists
+ if (fCurrentComplexType)
+ processElements(elem, fCurrentGroupInfo, fCurrentComplexType);
}
// ------------------------------------------------------------------
@@ -1525,11 +1526,17 @@
0, ((XSDElementNSImpl*) elem)->getLineNo(),
((XSDElementNSImpl*) elem)->getColumnNo());
- if (fRedefineComponents &&
fRedefineComponents->get(SchemaSymbols::fgELT_GROUP, nameIndex)) {
+ if (fRedefineComponents &&
fRedefineComponents->get(SchemaSymbols::fgELT_GROUP, nameIndex))
+ {
fBuffer.set(fullName);
fBuffer.append(SchemaSymbols::fgRedefIdentifier);
- groupInfo->setBaseGroup(fGroupRegistry->get(fBuffer.getRawBuffer()));
+ unsigned int rdfNameIndex =
fStringPool->addOrFind(fBuffer.getRawBuffer());
+
+ if (fCurrentGroupStack->containsElement(rdfNameIndex))
+ reportSchemaError(elem, XMLUni::fgXMLErrDomain,
XMLErrs::NoCircularDefinition, name);
+ else
+
groupInfo->setBaseGroup(fGroupRegistry->get(fBuffer.getRawBuffer()));
}
}
@@ -6822,6 +6829,46 @@
}
newTypeInfo->addElement(elemDecl);
+ }
+ }
+}
+
+void TraverseSchema::processElements(const DOMElement* const elem,
+ XercesGroupInfo* const fromGroup,
+ ComplexTypeInfo* const typeInfo)
+{
+ unsigned int elemCount = fromGroup->elementCount();
+ int newScope = typeInfo->getScopeDefined();
+
+ for (unsigned int i = 0; i < elemCount; i++) {
+
+ SchemaElementDecl* elemDecl = fromGroup->elementAt(i);
+ int elemScope = elemDecl->getEnclosingScope();
+
+ if (elemScope != Grammar::TOP_LEVEL_SCOPE)
+ {
+ int elemURI = elemDecl->getURI();
+ const XMLCh* localPart = elemDecl->getBaseName();
+ const SchemaElementDecl* other = (SchemaElementDecl*)
+ fSchemaGrammar->getElemDecl(elemURI, localPart, 0, newScope);
+
+ if (other)
+ {
+ if (elemDecl->getComplexTypeInfo() != other->getComplexTypeInfo()
+ || elemDecl->getDatatypeValidator() !=
other->getDatatypeValidator())
+ {
+ reportSchemaError(
+ elem, XMLUni::fgXMLErrDomain
+ , XMLErrs::DuplicateElementDeclaration, localPart);
+ }
+
+ continue;
+ }
+
+ elemDecl->setEnclosingScope(newScope);
+ fSchemaGrammar->putGroupElemDecl(elemDecl);
+ elemDecl->setEnclosingScope(elemScope);
+ typeInfo->addElement(elemDecl);
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]