in src/xercesc/validators/schema/SchemaValidator.cpp [1149:1344]
void SchemaValidator::checkParticleDerivationOk(SchemaGrammar* const aGrammar,
ContentSpecNode* const curNode,
const int derivedScope,
ContentSpecNode* const baseNode,
const int baseScope,
const ComplexTypeInfo* const baseInfo,
const bool toCheckOccurence) {
// Check for pointless occurrences of all, choice, sequence. The result is
// the contentspec which is not pointless. If the result is a non-pointless
// group, Vector is filled in with the children of interest
if (curNode && !baseNode)
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_EmptyBase, fMemoryManager);
if (!curNode)
return;
ContentSpecNode* curSpecNode = getNonUnaryGroup(curNode);
ContentSpecNode* baseSpecNode = getNonUnaryGroup(baseNode);
ValueVectorOf<ContentSpecNode*> curVector(8, fMemoryManager);
ValueVectorOf<ContentSpecNode*> baseVector(8, fMemoryManager);
ContentSpecNode::NodeTypes curNodeType = curSpecNode->getType();
ContentSpecNode::NodeTypes baseNodeType = baseSpecNode->getType();
if ((curNodeType & 0x0f) == ContentSpecNode::Sequence ||
(curNodeType & 0x0f) == ContentSpecNode::Choice ||
curNodeType == ContentSpecNode::All) {
curSpecNode = checkForPointlessOccurrences(curSpecNode, curNodeType, &curVector);
}
if ((baseNodeType & 0x0f) == ContentSpecNode::Sequence ||
(baseNodeType & 0x0f) == ContentSpecNode::Choice ||
baseNodeType == ContentSpecNode::All) {
baseSpecNode = checkForPointlessOccurrences(baseSpecNode, baseNodeType, &baseVector);
}
curNodeType = curSpecNode->getType();
baseNodeType = baseSpecNode->getType();
switch (curNodeType & 0x0f) {
case ContentSpecNode::Leaf:
{
switch (baseNodeType & 0x0f) {
case ContentSpecNode::Leaf:
{
checkNameAndTypeOK(aGrammar, curSpecNode, derivedScope, baseSpecNode, baseScope, baseInfo);
return;
}
case ContentSpecNode::Any:
case ContentSpecNode::Any_Other:
case ContentSpecNode::Any_NS:
{
checkNSCompat(curSpecNode, baseSpecNode, toCheckOccurence);
return;
}
case ContentSpecNode::Choice:
case ContentSpecNode::Sequence:
case ContentSpecNode::All:
{
checkRecurseAsIfGroup(aGrammar, curSpecNode, derivedScope,
baseSpecNode, baseScope, &baseVector, baseInfo);
return;
}
default:
{
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_InvalidContentType, fMemoryManager);
}
}
}
case ContentSpecNode::Any:
case ContentSpecNode::Any_Other:
case ContentSpecNode::Any_NS:
{
switch (baseNodeType & 0x0f) {
case ContentSpecNode::Any:
case ContentSpecNode::Any_Other:
case ContentSpecNode::Any_NS:
{
checkNSSubset(curSpecNode, baseSpecNode);
return;
}
case ContentSpecNode::Choice:
case ContentSpecNode::Sequence:
case ContentSpecNode::All:
case ContentSpecNode::Leaf:
{
if (baseNodeType == ContentSpecNode::Any_NS_Choice) {
if (checkNSSubsetChoiceRoot(curSpecNode, baseSpecNode)) {
return;
}
}
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_ForbiddenRes1, fMemoryManager);
}
default:
{
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_InvalidContentType, fMemoryManager);
}
}
}
case ContentSpecNode::All:
{
switch (baseNodeType & 0x0f) {
case ContentSpecNode::Any:
case ContentSpecNode::Any_Other:
case ContentSpecNode::Any_NS:
{
checkNSRecurseCheckCardinality(aGrammar, curSpecNode, &curVector, derivedScope, baseSpecNode, toCheckOccurence);
return;
}
case ContentSpecNode::All:
{
checkRecurse(aGrammar, curSpecNode, derivedScope, &curVector,
baseSpecNode, baseScope, &baseVector, baseInfo);
return;
}
case ContentSpecNode::Choice:
case ContentSpecNode::Sequence:
case ContentSpecNode::Leaf:
{
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_ForbiddenRes2, fMemoryManager);
}
default:
{
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_InvalidContentType, fMemoryManager);
}
}
}
case ContentSpecNode::Choice:
{
switch (baseNodeType & 0x0f) {
case ContentSpecNode::Any:
case ContentSpecNode::Any_Other:
case ContentSpecNode::Any_NS:
{
checkNSRecurseCheckCardinality(aGrammar, curSpecNode, &curVector, derivedScope, baseSpecNode, toCheckOccurence);
return;
}
case ContentSpecNode::Choice:
{
checkRecurse(aGrammar, curSpecNode, derivedScope, &curVector,
baseSpecNode, baseScope, &baseVector, baseInfo, true);
return;
}
case ContentSpecNode::All:
case ContentSpecNode::Sequence:
case ContentSpecNode::Leaf:
{
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_ForbiddenRes3, fMemoryManager);
}
default:
{
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_InvalidContentType, fMemoryManager);
}
}
}
case ContentSpecNode::Sequence:
{
switch (baseNodeType & 0x0f) {
case ContentSpecNode::Any:
case ContentSpecNode::Any_Other:
case ContentSpecNode::Any_NS:
{
checkNSRecurseCheckCardinality(aGrammar, curSpecNode, &curVector, derivedScope, baseSpecNode, toCheckOccurence);
return;
}
case ContentSpecNode::All:
{
checkRecurseUnordered(aGrammar, curSpecNode, &curVector, derivedScope,
baseSpecNode, &baseVector, baseScope, baseInfo);
return;
}
case ContentSpecNode::Sequence:
{
checkRecurse(aGrammar, curSpecNode, derivedScope, &curVector,
baseSpecNode, baseScope, &baseVector, baseInfo);
return;
}
case ContentSpecNode::Choice:
{
checkMapAndSum(aGrammar, curSpecNode, &curVector, derivedScope,
baseSpecNode, &baseVector, baseScope, baseInfo);
return;
}
case ContentSpecNode::Leaf:
{
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_ForbiddenRes4, fMemoryManager);
}
default:
{
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_InvalidContentType, fMemoryManager);
}
}
}
}
}