in jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/xml/core/ExtensibleXmlParser.java [461:531]
private void validate(final String uri,
final String localName,
final Handler handler) throws SAXParseException {
boolean validParent = false;
boolean validPeer = false;
boolean invalidNesting = false;
final Set validParents = handler.getValidParents();
final Set validPeers = handler.getValidPeers();
boolean allowNesting = handler.allowNesting();
if (validParents == null || validPeers == null) {
return;
}
// check valid parents
// null parent means localname is rule-set
// dont process if elements are the same
// instead check for allowed nesting
final Class nodeClass = getHandler(uri,
localName).generateNodeFor();
if (nodeClass != null && !nodeClass.isInstance(getParent())) {
Object allowedParent;
final Iterator it = validParents.iterator();
while (!validParent && it.hasNext()) {
allowedParent = it.next();
if (getParent() == null && allowedParent == null) {
validParent = true;
} else if (allowedParent != null && ((Class) allowedParent).isInstance(getParent())) {
validParent = true;
}
}
if (!validParent) {
throw new SAXParseException("<" + localName + "> has an invalid parent element [" + getParent() + "]",
getLocator());
}
}
// check valid peers
// null peer means localname is rule-set
final Object peer = this.peer;
Object allowedPeer;
Iterator it = validPeers.iterator();
while (!validPeer && it.hasNext()) {
allowedPeer = it.next();
if (peer == null && allowedPeer == null) {
validPeer = true;
} else if (allowedPeer != null && ((Class) allowedPeer).isInstance(peer)) {
validPeer = true;
}
}
if (!validPeer) {
throw new SAXParseException("<" + localName + "> is after an invalid element: " + Handler.class.getName(),
getLocator());
}
if (nodeClass != null && !allowNesting) {
it = this.parents.iterator();
while (!invalidNesting && it.hasNext()) {
if (nodeClass.isInstance(it.next())) {
invalidNesting = true;
}
}
}
if (invalidNesting) {
throw new SAXParseException("<" + localName + "> may not be nested",
getLocator());
}
}