GrammarWalker.java 6.12 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  org.kohsuke.rngom.rngparser.digested.DAttributePattern
 *  org.kohsuke.rngom.rngparser.digested.DChoicePattern
 *  org.kohsuke.rngom.rngparser.digested.DContainerPattern
 *  org.kohsuke.rngom.rngparser.digested.DDataPattern
 *  org.kohsuke.rngom.rngparser.digested.DElementPattern
 *  org.kohsuke.rngom.rngparser.digested.DEmptyPattern
 *  org.kohsuke.rngom.rngparser.digested.DGrammarPattern
 *  org.kohsuke.rngom.rngparser.digested.DInterleavePattern
 *  org.kohsuke.rngom.rngparser.digested.DListPattern
 *  org.kohsuke.rngom.rngparser.digested.DMixedPattern
 *  org.kohsuke.rngom.rngparser.digested.DNotAllowedPattern
 *  org.kohsuke.rngom.rngparser.digested.DOneOrMorePattern
 *  org.kohsuke.rngom.rngparser.digested.DOptionalPattern
 *  org.kohsuke.rngom.rngparser.digested.DPattern
 *  org.kohsuke.rngom.rngparser.digested.DPatternVisitor
 *  org.kohsuke.rngom.rngparser.digested.DRefPattern
 *  org.kohsuke.rngom.rngparser.digested.DTextPattern
 *  org.kohsuke.rngom.rngparser.digested.DUnaryPattern
 *  org.kohsuke.rngom.rngparser.digested.DValuePattern
 *  org.kohsuke.rngom.rngparser.digested.DXmlTokenPattern
 *  org.kohsuke.rngom.rngparser.digested.DZeroOrMorePattern
 */
package com.adobe.xmp.schema.rng.parser.traverser;

import com.adobe.xmp.schema.rng.model.Context;
import com.adobe.xmp.schema.rng.model.PropertyInfo;
import com.adobe.xmp.schema.rng.parser.SchemaGenerationHandler;
import com.adobe.xmp.schema.rng.parser.exceptions.RNGParseException;
import com.adobe.xmp.schema.rng.parser.exceptions.RNGUnexpectedElementFoundException;
import com.adobe.xmp.schema.rng.parser.traverser.BasePatternWalker;
import com.adobe.xmp.schema.rng.parser.traverser.PropertyListWalker;
import com.adobe.xmp.schema.rng.parser.utils.RNGUtils;
import java.util.ArrayList;
import javax.xml.namespace.QName;
import org.kohsuke.rngom.rngparser.digested.DAttributePattern;
import org.kohsuke.rngom.rngparser.digested.DChoicePattern;
import org.kohsuke.rngom.rngparser.digested.DContainerPattern;
import org.kohsuke.rngom.rngparser.digested.DDataPattern;
import org.kohsuke.rngom.rngparser.digested.DElementPattern;
import org.kohsuke.rngom.rngparser.digested.DEmptyPattern;
import org.kohsuke.rngom.rngparser.digested.DGrammarPattern;
import org.kohsuke.rngom.rngparser.digested.DInterleavePattern;
import org.kohsuke.rngom.rngparser.digested.DListPattern;
import org.kohsuke.rngom.rngparser.digested.DMixedPattern;
import org.kohsuke.rngom.rngparser.digested.DNotAllowedPattern;
import org.kohsuke.rngom.rngparser.digested.DOneOrMorePattern;
import org.kohsuke.rngom.rngparser.digested.DOptionalPattern;
import org.kohsuke.rngom.rngparser.digested.DPattern;
import org.kohsuke.rngom.rngparser.digested.DPatternVisitor;
import org.kohsuke.rngom.rngparser.digested.DRefPattern;
import org.kohsuke.rngom.rngparser.digested.DTextPattern;
import org.kohsuke.rngom.rngparser.digested.DUnaryPattern;
import org.kohsuke.rngom.rngparser.digested.DValuePattern;
import org.kohsuke.rngom.rngparser.digested.DXmlTokenPattern;
import org.kohsuke.rngom.rngparser.digested.DZeroOrMorePattern;

/*
 * This class specifies class file version 49.0 but uses Java 6 signatures.  Assumed Java 6.
 */
public class GrammarWalker
extends BasePatternWalker {
    private ArrayList<PropertyInfo> propInfoList;
    private boolean multipleSchema;

    public GrammarWalker(DGrammarPattern grammar) {
        this.relativeDepth = -1;
        this.propInfoList = new ArrayList();
        this.context = new Context();
        this.multipleSchema = false;
    }

    @Override
    public Void onGrammar(DGrammarPattern p) {
        return (Void)p.getStart().accept((DPatternVisitor)this);
    }

    public Void onAttribute(DAttributePattern p) {
        super.handleAnnotation((DPattern)p, this.context, null);
        return this.onXmlToken((DXmlTokenPattern)p);
    }

    protected Void onXmlToken(DXmlTokenPattern p) {
        super.handleAnnotation((DPattern)p, this.context, null);
        return this.onUnary((DUnaryPattern)p);
    }

    @Override
    protected Void onContainer(DContainerPattern p) {
        if (this.multipleSchema) {
            for (DPattern c = p.firstChild(); c != null; c = c.getNext()) {
                PropertyListWalker pw = new PropertyListWalker(this.propInfoList, this.context);
                c.accept((DPatternVisitor)pw);
                if (pw.isRdfAboutFound()) continue;
                throw new RNGParseException("Could not find rdf:about attribute with rdf:description element");
            }
        }
        return null;
    }

    @Override
    public Void onElement(DElementPattern p) {
        super.handleAnnotation((DPattern)p, this.context, null);
        QName qName = RNGUtils.getSimpleName(p);
        Integer n = this.relativeDepth;
        Integer n2 = this.relativeDepth = Integer.valueOf(this.relativeDepth + 1);
        if (this.relativeDepth == 0) {
            if (!RNGUtils.isElementRDFRDF(qName)) {
                throw new RNGUnexpectedElementFoundException("Expected rdf:rdf");
            }
        } else if (this.relativeDepth == 1) {
            if (RNGUtils.isElementRDFDesc(qName)) {
                PropertyListWalker pw = new PropertyListWalker(this.propInfoList, this.context);
                p.accept((DPatternVisitor)pw);
                if (!pw.isRdfAboutFound()) {
                    throw new RNGParseException("Could not find rdf:about attribute with rdf:description element");
                }
                return null;
            }
            throw new RNGUnexpectedElementFoundException("Expected rdf:Description");
        }
        return this.onXmlToken((DXmlTokenPattern)p);
    }

    @Override
    public Void onInterleave(DInterleavePattern p) {
        super.handleAnnotation((DPattern)p, this.context, null);
        if (this.relativeDepth == 0) {
            this.multipleSchema = true;
        }
        return this.onContainer((DContainerPattern)p);
    }

    public ArrayList<PropertyInfo> getPropInfoList() {
        return this.propInfoList;
    }

    public void setSchemaGenerationHandler(SchemaGenerationHandler handler) {
        this.context.setSchemaGenerationHandler(handler);
    }
}