/*
 * Copyright (C) 2004-2011
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package com.sun.tools.rngom.dump;

import com.sun.tools.rngom.ast.builder.Annotations;
import com.sun.tools.rngom.ast.builder.CommentList;
import com.sun.tools.rngom.ast.builder.Grammar;
import com.sun.tools.rngom.ast.builder.NameClassBuilder;
import com.sun.tools.rngom.ast.builder.Scope;
import com.sun.tools.rngom.ast.om.Location;
import com.sun.tools.rngom.ast.om.ParsedElementAnnotation;
import com.sun.tools.rngom.ast.om.ParsedPattern;
import com.sun.tools.rngom.parse.Context;
import com.sun.tools.rngom.parse.IllegalSchemaException;
import com.sun.tools.rngom.parse.Parseable;
import com.sun.tools.rngom.ast.builder.BuildException;
import com.sun.tools.rngom.ast.builder.DataPatternBuilder;
import com.sun.tools.rngom.ast.builder.ElementAnnotationBuilder;
import com.sun.tools.rngom.ast.builder.SchemaBuilder;
import com.sun.tools.rngom.ast.om.ParsedNameClass;

import java.util.List;
import java.io.OutputStream;

/**
 * Dumps the callback invocations to an {@link OutputStream}.
 * 
 * @author
 *      Kohsuke Kawaguchi (kk@kohsuke.org)
 */
public class Dumper implements SchemaBuilder {
    
    private final Factory factory;
    private final Printer printer;
    private NameClassBuilder ncb;
    
    public Dumper() {
        this(new Factory(),new Printer(System.out));
    }
    
    public Dumper(Factory f,Printer p) {
        factory = f;
        printer = p;
    }
    
    public NameClassBuilder getNameClassBuilder() throws BuildException {
        if(ncb==null)
            ncb = factory.createNameClassBuilder(printer);
        return ncb;
    }

    public ParsedPattern makeChoice(List patterns, Location loc, Annotations anno) throws BuildException {
        printer.name("makeChoice");
        return makeNode(patterns, loc, anno);
    }

    public ParsedPattern makeInterleave(List patterns, Location loc, Annotations anno) throws BuildException {
        printer.name("makeInterleave");
        return makeNode(patterns, loc, anno);
    }

    public ParsedPattern makeGroup(List patterns, Location loc, Annotations anno) throws BuildException {
        printer.name("makeGroup");
        return makeNode(patterns, loc, anno);
    }

    private ParsedPattern makeNode(List patterns, Location loc, Annotations anno) {
        for( int i=0; i<patterns.size(); i++ )
            printer.param(patterns.get(i));
        printer.param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeOneOrMore(ParsedPattern p, Location loc, Annotations anno) throws BuildException {
        printer.name("makeOneOrMore").param(p).param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeZeroOrMore(ParsedPattern p, Location loc, Annotations anno) throws BuildException {
        printer.name("makeZeroOrMore").param(p).param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeOptional(ParsedPattern p, Location loc, Annotations anno) throws BuildException {
        printer.name("makeOptional").param(p).param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeList(ParsedPattern p, Location loc, Annotations anno) throws BuildException {
        printer.name("makeList").param(p).param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeMixed(ParsedPattern p, Location loc, Annotations anno) throws BuildException {
        printer.name("makeMixed").param(p).param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeEmpty(Location loc, Annotations anno) {
        printer.name("makeEmpty").param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeNotAllowed(Location loc, Annotations anno) {
        printer.name("makeNotAllowed").param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeText(Location loc, Annotations anno) {
        printer.name("makeText").param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeAttribute(ParsedNameClass nc, ParsedPattern p, Location loc, Annotations anno) throws BuildException {
        printer.name("makeAttribute").param(nc).param(p).param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeElement(ParsedNameClass nc, ParsedPattern p, Location loc, Annotations anno) throws BuildException {
        printer.name("makeElement").param(nc).param(p).param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public DataPatternBuilder makeDataPatternBuilder(String datatypeLibrary, String type, Location loc) throws BuildException {
        printer.name("makeDataPatternBuilder")
            .param(datatypeLibrary).param(type).param(loc);
        return printer.result(factory.createDataPatternBuilder(printer));
    }

    public ParsedPattern makeValue(String datatypeLibrary, String type, String value, Context c, String ns, Location loc, Annotations anno) throws BuildException {
        printer.name("makeValue").param(datatypeLibrary).param(type).param(value).param(ns).param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public Grammar makeGrammar(Scope parent) {
        printer.name("makeGrammar").param(parent);
        return printer.result(factory.createGrammar(printer));
    }

    public ParsedPattern annotate(ParsedPattern p, Annotations anno) throws BuildException {
        printer.name("annotate").param(p).param(anno);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern annotateAfter(ParsedPattern p, ParsedElementAnnotation e) throws BuildException {
        printer.name("annotateAfter").param(p).param(e);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern commentAfter(ParsedPattern p, CommentList comments) throws BuildException {
        printer.name("commentAfter").param(p).param(comments);
        return printer.result(factory.createPattern());
    }

    public ParsedPattern makeExternalRef(Parseable current, String uri, String ns, Scope scope, Location loc, Annotations anno) throws BuildException, IllegalSchemaException {
        printer.name("makeExternalRef").param(uri).param(ns).param(scope).param(loc).param(anno);
        return printer.result(factory.createPattern());
    }

    public Location makeLocation(String systemId, int lineNumber, int columnNumber) {
        printer.name("makeLocation").param(systemId).param(lineNumber).param(columnNumber);
        return printer.result(factory.createLocation());
    }

    public Annotations makeAnnotations(CommentList comments, Context context) {
        printer.name("makeAnnotations").param(comments);
        return printer.result(factory.createAnnotations(printer));
    }

    public ElementAnnotationBuilder makeElementAnnotationBuilder(
        String ns, String localName, String prefix, Location loc, CommentList comments, Context context) {
        
        printer.name("makeElementAnnotationBuilder")
            .param(ns).param(localName).param(prefix).param(loc).param(comments);
        return printer.result(factory.createElementAnnotationBuilder(printer));
    }

    public CommentList makeCommentList() {
        printer.name("makeCommentList");
        return printer.result(factory.createCommentList(printer));
    }

    public ParsedPattern makeErrorPattern() {
        printer.name("makeErrorPattern");
        return printer.result(factory.createPattern());
    }

    public boolean usesComments() {
        return true;
    }

    public ParsedPattern expandPattern(ParsedPattern p) throws BuildException, IllegalSchemaException {
        printer.name("expandPattern").param(p);
        return printer.result(factory.createPattern());
    }
}
