MixedContentModelpublic class MixedContentModel extends Object implements ContentModelValidator
Fields Summary |
---|
private int | fCountThe count of possible children that we have to deal with. | private QName[] | fChildrenThe list of possible children that we have to accept. | private int[] | fChildrenTypeThe type of the children to support ANY. | private boolean | fOrderedTrue if mixed content model is ordered. DTD mixed content models
are always unordered. |
Constructors Summary |
---|
public MixedContentModel(QName[] children, int[] type, int offset, int length, boolean ordered)Constructs a mixed content model.
// Make our own copy now, which is exactly the right size
fCount = length;
fChildren = new QName[fCount];
fChildrenType = new int[fCount];
for (int i = 0; i < fCount; i++) {
fChildren[i] = new QName(children[offset + i]);
fChildrenType[i] = type[offset + i];
}
fOrdered = ordered;
|
Methods Summary |
---|
public int | validate(com.sun.org.apache.xerces.internal.xni.QName[] children, int offset, int length)Check that the specified content is valid according to this
content model. This method can also be called to do 'what if'
testing of content models just to see if they would be valid.
A value of -1 in the children array indicates a PCDATA node. All other
indexes will be positive and represent child elements. The count can be
zero, since some elements have the EMPTY content model and that must be
confirmed.
// must match order
if (fOrdered) {
int inIndex = 0;
for (int outIndex = 0; outIndex < length; outIndex++) {
// ignore mixed text
final QName curChild = children[offset + outIndex];
if (curChild.localpart == null) {
continue;
}
// element must match
int type = fChildrenType[inIndex];
if (type == XMLContentSpec.CONTENTSPECNODE_LEAF) {
if (fChildren[inIndex].rawname != children[offset + outIndex].rawname) {
return outIndex;
}
}
else if (type == XMLContentSpec.CONTENTSPECNODE_ANY) {
String uri = fChildren[inIndex].uri;
if (uri != null && uri != children[outIndex].uri) {
return outIndex;
}
}
else if (type == XMLContentSpec.CONTENTSPECNODE_ANY_LOCAL) {
if (children[outIndex].uri != null) {
return outIndex;
}
}
else if (type == XMLContentSpec.CONTENTSPECNODE_ANY_OTHER) {
if (fChildren[inIndex].uri == children[outIndex].uri) {
return outIndex;
}
}
// advance index
inIndex++;
}
}
// can appear in any order
else {
for (int outIndex = 0; outIndex < length; outIndex++)
{
// Get the current child out of the source index
final QName curChild = children[offset + outIndex];
// If its PCDATA, then we just accept that
if (curChild.localpart == null)
continue;
// And try to find it in our list
int inIndex = 0;
for (; inIndex < fCount; inIndex++)
{
int type = fChildrenType[inIndex];
if (type == XMLContentSpec.CONTENTSPECNODE_LEAF) {
if (curChild.rawname == fChildren[inIndex].rawname) {
break;
}
}
else if (type == XMLContentSpec.CONTENTSPECNODE_ANY) {
String uri = fChildren[inIndex].uri;
if (uri == null || uri == children[outIndex].uri) {
break;
}
}
else if (type == XMLContentSpec.CONTENTSPECNODE_ANY_LOCAL) {
if (children[outIndex].uri == null) {
break;
}
}
else if (type == XMLContentSpec.CONTENTSPECNODE_ANY_OTHER) {
if (fChildren[inIndex].uri != children[outIndex].uri) {
break;
}
}
// REVISIT: What about checking for multiple ANY matches?
// The content model ambiguity *could* be checked
// by the caller before constructing the mixed
// content model.
}
// We did not find this one, so the validation failed
if (inIndex == fCount)
return outIndex;
}
}
// Everything seems to be in order, so return success
return -1;
|
|