private void validate()

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());
        }

    }