//
// Check that the left value is not -1, since any content model
// with PCDATA should be MIXED, so we should not have gotten here.
//
if (contentSpec.value == -1 && contentSpec.otherValue == -1)
throw new CMException(ImplementationMessages.VAL_NPCD);
//
// It's a single leaf, so it's an 'a' type of content model, i.e.
// just one instance of one element. That one is definitely a
// simple content model.
//
fQName1.setValues(-1, contentSpec.value, contentSpec.value, contentSpec.otherValue);
return new SimpleContentModel(fQName1, null, contentSpec.type, isDTD());
}
else if ((contentSpec.type == XMLContentSpec.CONTENTSPECNODE_CHOICE)
|| (contentSpec.type == XMLContentSpec.CONTENTSPECNODE_SEQ)) {
//
// Lets see if both of the children are leafs. If so, then
// it has to be a simple content model
//
XMLContentSpec contentSpecLeft = new XMLContentSpec();
XMLContentSpec contentSpecRight = new XMLContentSpec();
getContentSpec(contentSpec.value, contentSpecLeft);
getContentSpec(contentSpec.otherValue, contentSpecRight);
if ((contentSpecLeft.type == XMLContentSpec.CONTENTSPECNODE_LEAF)
&& (contentSpecRight.type == XMLContentSpec.CONTENTSPECNODE_LEAF)) {
//
// It's a simple choice or sequence, so we can do a simple
// content model for it.
//
fQName1.setValues(-1, contentSpecLeft.value, contentSpecLeft.value, contentSpecLeft.otherValue);
fQName2.setValues(-1, contentSpecRight.value, contentSpecRight.value, contentSpecRight.otherValue);
return new SimpleContentModel(fQName1, fQName2, contentSpec.type, isDTD());
}
}
else if ((contentSpec.type == XMLContentSpec.CONTENTSPECNODE_ZERO_OR_ONE)
|| (contentSpec.type == XMLContentSpec.CONTENTSPECNODE_ZERO_OR_MORE)
|| (contentSpec.type == XMLContentSpec.CONTENTSPECNODE_ONE_OR_MORE)) {
//
// It's a repetition, so see if its one child is a leaf. If so
// it's a repetition of a single element, so we can do a simple
// content model for that.
//
XMLContentSpec contentSpecLeft = new XMLContentSpec();
getContentSpec(contentSpec.value, contentSpecLeft);
if (contentSpecLeft.type == XMLContentSpec.CONTENTSPECNODE_LEAF) {
//
// It is, so we can create a simple content model here that
// will check for this repetition. We pass -1 for the unused
// right node.
//
fQName1.setValues(-1, contentSpecLeft.value, contentSpecLeft.value, contentSpecLeft.otherValue);
return new SimpleContentModel(fQName1, null, contentSpec.type, isDTD());
}
else if (contentSpecLeft.type==XMLContentSpec.CONTENTSPECNODE_ALL) {
// An ALL can be optional. We must use the special
// AllContentModel for such an animal. Indicate the
// entire content is optional on the constructor.
AllContentModel allContent = new AllContentModel(true);
// All of the nodes under an ALL must be additional ALL nodes
// and ELEMENTs (or ELEMENTs under ZERO_OR_ONE nodes.)
// We collapse the ELEMENTs into a single vector.
gatherAllLeaves(contentSpec.value, contentSpecLeft, allContent);
return allContent;
}
}
else if (contentSpec.type == XMLContentSpec.CONTENTSPECNODE_ALL) {
// All of the nodes under an ALL must be additional ALL nodes and
// ELEMENTs (or ELEMENTs under ZERO_OR_ONE nodes.)
// We collapse the ELEMENTs into a single vector.
AllContentModel allContent = new AllContentModel(false);
gatherAllLeaves(contentSpecIndex, contentSpec, allContent);
return allContent;
}
else {
throw new CMException(ImplementationMessages.VAL_CST);
}
//
// It's not a simple content model, so here we have to create a DFA
// for this element. So we create a DFAContentModel object. He