// Path: moshas/src/main/java/net/unit8/moshas/helper/Validate.java
// public class Validate {
//     
//     private Validate() {}
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      */
//     public static void notNull(Object obj) {
//         if (obj == null)
//             throw new IllegalArgumentException("Object must not be null");
//     }
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      * @param msg message to output if validation fails
//      */
//     public static void notNull(Object obj, String msg) {
//         if (obj == null)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      */
//     public static void isTrue(boolean val) {
//         if (!val)
//             throw new IllegalArgumentException("Must be true");
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isTrue(boolean val, String msg) {
//         if (!val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      */
//     public static void isFalse(boolean val) {
//         if (val)
//             throw new IllegalArgumentException("Must be false");
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isFalse(boolean val, String msg) {
//         if (val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      */
//     public static void noNullElements(Object[] objects) {
//         noNullElements(objects, "Array must not contain any null objects");
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      * @param msg message to output if validation fails
//      */
//     public static void noNullElements(Object[] objects, String msg) {
//         for (Object obj : objects)
//             if (obj == null)
//                 throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the string is not empty
//      * @param string the string to test
//      */
//     public static void notEmpty(String string) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException("String must not be empty");
//     }
// 
//     /**
//      * Validates that the string is not empty
//      * @param string the string to test
//      * @param msg message to output if validation fails
//      */
//     public static void notEmpty(String string, String msg) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      Cause a failure.
//      @param msg message to output.
//      */
//     public static void fail(String msg) {
//         throw new IllegalArgumentException(msg);
//     }    
// }


import net.unit8.moshas.dom.*;
import net.unit8.moshas.helper.Validate;
import java.util.List;
package net.unit8.moshas.parser;



/**
 *
 * @author kawasima
 */
public class XmlTreeBuilder extends TreeBuilder {
    @Override
    protected void initialiseParse(String input, String baseUri, ParseErrorList errors) {
        super.initialiseParse(input, baseUri, errors);
        stack.add(doc); // place the document onto the stack. differs from HtmlTreeBuilder (not on stack)
        doc.outputSettings().syntax(Document.OutputSettings.Syntax.xml);
    }

    @Override
    protected boolean process(Token token) {
        // start tag, end tag, doctype, comment, character, eof
        switch (token.type) {
            case StartTag:
                insert(token.asStartTag());
                break;
            case EndTag:
                popStackToClose(token.asEndTag());
                break;
            case Comment:
                insert(token.asComment());
                break;
            case Character:
                insert(token.asCharacter());
                break;
            case Doctype:
                insert(token.asDoctype());
                break;
            case EOF: // could put some normalisation here if desired
                break;
            default:
// Path: moshas/src/main/java/net/unit8/moshas/helper/Validate.java
// public class Validate {
//     
//     private Validate() {}
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      */
//     public static void notNull(Object obj) {
//         if (obj == null)
//             throw new IllegalArgumentException("Object must not be null");
//     }
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      * @param msg message to output if validation fails
//      */
//     public static void notNull(Object obj, String msg) {
//         if (obj == null)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      */
//     public static void isTrue(boolean val) {
//         if (!val)
//             throw new IllegalArgumentException("Must be true");
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isTrue(boolean val, String msg) {
//         if (!val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      */
//     public static void isFalse(boolean val) {
//         if (val)
//             throw new IllegalArgumentException("Must be false");
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isFalse(boolean val, String msg) {
//         if (val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      */
//     public static void noNullElements(Object[] objects) {
//         noNullElements(objects, "Array must not contain any null objects");
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      * @param msg message to output if validation fails
//      */
//     public static void noNullElements(Object[] objects, String msg) {
//         for (Object obj : objects)
//             if (obj == null)
//                 throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the string is not empty
//      * @param string the string to test
//      */
//     public static void notEmpty(String string) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException("String must not be empty");
//     }
// 
//     /**
//      * Validates that the string is not empty
//      * @param string the string to test
//      * @param msg message to output if validation fails
//      */
//     public static void notEmpty(String string, String msg) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      Cause a failure.
//      @param msg message to output.
//      */
//     public static void fail(String msg) {
//         throw new IllegalArgumentException(msg);
//     }    
// }


// Path: moshas/src/main/java/net/unit8/moshas/parser/XmlTreeBuilder.java
import net.unit8.moshas.dom.*;
import net.unit8.moshas.helper.Validate;
import java.util.List;

package net.unit8.moshas.parser;



/**
 *
 * @author kawasima
 */
public class XmlTreeBuilder extends TreeBuilder {
    @Override
    protected void initialiseParse(String input, String baseUri, ParseErrorList errors) {
        super.initialiseParse(input, baseUri, errors);
        stack.add(doc); // place the document onto the stack. differs from HtmlTreeBuilder (not on stack)
        doc.outputSettings().syntax(Document.OutputSettings.Syntax.xml);
    }

    @Override
    protected boolean process(Token token) {
        // start tag, end tag, doctype, comment, character, eof
        switch (token.type) {
            case StartTag:
                insert(token.asStartTag());
                break;
            case EndTag:
                popStackToClose(token.asEndTag());
                break;
            case Comment:
                insert(token.asComment());
                break;
            case Character:
                insert(token.asCharacter());
                break;
            case Doctype:
                insert(token.asDoctype());
                break;
            case EOF: // could put some normalisation here if desired
                break;
            default:
                Validate.fail("Unexpected token type: " + token.type);