BasePatternWalker.java 8.91 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  org.kohsuke.rngom.rngparser.digested.DAnnotation
 *  org.kohsuke.rngom.rngparser.digested.DChoicePattern
 *  org.kohsuke.rngom.rngparser.digested.DContainerPattern
 *  org.kohsuke.rngom.rngparser.digested.DDataPattern
 *  org.kohsuke.rngom.rngparser.digested.DDefine
 *  org.kohsuke.rngom.rngparser.digested.DElementPattern
 *  org.kohsuke.rngom.rngparser.digested.DEmptyPattern
 *  org.kohsuke.rngom.rngparser.digested.DGrammarPattern
 *  org.kohsuke.rngom.rngparser.digested.DGroupPattern
 *  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.DPatternWalker
 *  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.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.annotation.AnnotationsFactory;
import com.adobe.xmp.schema.rng.parser.annotation.RNGAnnotation;
import com.adobe.xmp.schema.rng.parser.exceptions.RNGUnexpectedElementFoundException;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.kohsuke.rngom.rngparser.digested.DAnnotation;
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.DDefine;
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.DGroupPattern;
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.DPatternWalker;
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.DZeroOrMorePattern;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

abstract class BasePatternWalker
extends DPatternWalker {
    protected Context context;
    protected PropertyInfo propertyInfo;
    protected Integer relativeDepth;

    BasePatternWalker() {
    }

    public Void onChoice(DChoicePattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - choice");
    }

    protected Void onContainer(DContainerPattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element representing container");
    }

    public Void onData(DDataPattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - data");
    }

    public Void onElement(DElementPattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - element");
    }

    public Void onEmpty(DEmptyPattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - empty");
    }

    public Void onGrammar(DGrammarPattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - grammar");
    }

    public Void onInterleave(DInterleavePattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - interleave");
    }

    public Void onList(DListPattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - list");
    }

    public Void onMixed(DMixedPattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - mixed");
    }

    public Void onNotAllowed(DNotAllowedPattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - notallowed");
    }

    public Void onOneOrMore(DOneOrMorePattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - oneormore");
    }

    public Void onOptional(DOptionalPattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - optional");
    }

    public Void onRef(DRefPattern p) {
        this.context.getSchemaGenerationHandler().startRefTraversal(p.getName());
        this.handleAnnotation(p.getTarget(), this.context, this.propertyInfo);
        Void x = (Void)p.getTarget().getPattern().accept((DPatternVisitor)this);
        this.context.getSchemaGenerationHandler().endRefTraversal(p.getName());
        return x;
    }

    public Void onText(DTextPattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - text");
    }

    public Void onValue(DValuePattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - value");
    }

    public Void onZeroOrMore(DZeroOrMorePattern p) {
        throw new RNGUnexpectedElementFoundException("Unexpected element - zerormore");
    }

    protected Void onUnary(DUnaryPattern p) {
        this.unwrapGroup(this.getChild(p));
        return null;
    }

    protected void on(DPattern p) {
        p.accept((DPatternVisitor)this);
    }

    protected void unwrapGroup(DPattern p) {
        if (p instanceof DGroupPattern && p.getAnnotation() == DAnnotation.EMPTY) {
            for (DPattern d : (DGroupPattern)p) {
                this.on(d);
            }
        } else {
            this.on(p);
        }
    }

    void handleAnnotation(DPattern pattern, Context context, PropertyInfo propInfo) {
        if (pattern == null) {
            return;
        }
        DAnnotation annot = pattern.getAnnotation();
        this.handleDecorators(annot, propInfo);
        this.handleAnnotation(annot, context, propInfo);
    }

    protected void handleAnnotation(DDefine define, Context context, PropertyInfo propInfo) {
        if (define == null) {
            return;
        }
        DAnnotation annot = define.getAnnotation();
        this.handleDecorators(annot, propInfo);
        this.handleAnnotation(annot, context, propInfo);
    }

    private void handleAnnotation(DAnnotation annot, Context context, PropertyInfo propInfo) {
        if (annot == null) {
            return;
        }
        RNGAnnotation[] rngAnnotations = AnnotationsFactory.createAnnotationArray(annot);
        if (rngAnnotations != null) {
            for (RNGAnnotation rAnnot : rngAnnotations) {
                if (rAnnot == null) continue;
                rAnnot.setAnnotationData(context, propInfo);
            }
        }
    }

    private void handleDecorators(DAnnotation annot, PropertyInfo propInfo) {
        if (annot == null || propInfo == null) {
            return;
        }
        List children = annot.getChildren();
        if (children == null || children.size() == 0) {
            return;
        }
        for (Element el : children) {
            if ("http://ns.adobe.com/xmp/schema/info/".equals(el.getNamespaceURI())) continue;
            QName qname = new QName(el.getNamespaceURI(), el.getLocalName());
            Map<String, String> decoratorValueMap = propInfo.getDecorator(qname);
            NamedNodeMap nameNodeMap = el.getAttributes();
            int length = nameNodeMap.getLength();
            for (int i = 0; i < length; ++i) {
                Node node = nameNodeMap.item(i);
                decoratorValueMap.put(node.getNodeName(), node.getNodeValue());
            }
        }
    }

    protected DPattern getChild(DUnaryPattern pattern) {
        DPattern child = pattern.getChild();
        this.handleAnnotation(child, this.context, this.propertyInfo);
        return child;
    }

    protected DPattern firstChild(DContainerPattern pattern) {
        DPattern child = pattern.firstChild();
        this.handleAnnotation(child, this.context, this.propertyInfo);
        return child;
    }

    protected DPattern getNext(DPattern pattern) {
        DPattern child = pattern.getNext();
        this.handleAnnotation(child, this.context, this.propertyInfo);
        return child;
    }
}