/*
 *   Copyright 2004 The Apache Software Foundation
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package misc.common;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.io.StringReader;

import static org.junit.Assert.fail;


public class ParsersBase {

    private static final String outputEncoding = "UTF-8";

    // for reference  - the values for System Properties to switch between different parser implementaion for JAXP
    // ----------------------------------------------------------------------------------------------------------
    // System Property                               Parser                        Value
    // ----------------------------------------------------------------------------------------------------------
    // javax.xml.parsers.DocumentBuilderFactory     Xerces              org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
    //
    // org.xml.sax.driver                           Xerces              org.apache.xerces.parsers.SAXParser
    //
    // javax.xml.parsers.SAXParserFactory           Xerces              org.apache.xerces.jaxp.SAXParserFactoryImpl
    // ----------------------------------------------------------------------------------------------------------



    // This method parsers the input xml string using the DOM API with the parser specified using the 
    // "javax.xml.parsers.DocumentBuilderFactory" system property
    public void parseXmlWithDOMAPI(String xmlInput, String parserName, String docbuilderfactory) {

        System.setProperty("javax.xml.parsers.DocumentBuilderFactory", docbuilderfactory);
        try {
            // Step 1: create a DocumentBuilderFactory and configure it
            DocumentBuilderFactory dbf =
                    DocumentBuilderFactory.newInstance();

            dbf.setNamespaceAware(true);

            // Set the validation mode to either: no validation, DTD
            // validation, or XSD validation
            dbf.setValidating(false);

            // Step 2: create a DocumentBuilder that satisfies the constraints
            // specified by the DocumentBuilBderFactory
            DocumentBuilder db = dbf.newDocumentBuilder();

            // Step 3: parse the input string
            Document doc = db.parse(new InputSource(new StringReader(xmlInput)));
        }
        catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        }
        catch (SAXParseException spe) {
            System.out.println("parsing error with " + parserName + " (DOM) for xml input string :'" + xmlInput + "''");
            spe.printStackTrace();
            fail("parsing error with " + parserName + " (DOM) for xml input string :'" + xmlInput + "''");
        }
        catch (SAXException se) {
            se.printStackTrace();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    // This method parsers the input xml string using the SAX API with the parser specified using the 
    // "javax.xml.parsers.SAXParserFactory" and "org.xml.sax.driver" system properties
    public void parseXmlWithSAXAPI(String xmlInput, String parserName, String saxdriverprop, String saxparserfactoryprop) {
        try {

            // Set the system props to pick the appropriate parser implementation
            System.setProperty("org.xml.sax.driver", saxdriverprop);
            System.setProperty("javax.xml.parsers.SAXParserFactory", saxparserfactoryprop);

            SAXParserFactory saxparserfactory = SAXParserFactory.newInstance();
            saxparserfactory.setNamespaceAware(false);

            XMLReader xmlreader = saxparserfactory.newSAXParser().getXMLReader();
            xmlreader.parse(new InputSource(new StringReader(xmlInput)));
        }
        catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        }
        catch (SAXParseException spe) {
            System.out.println("parsing error with " + parserName + " (SAX) for xml input string :'" + xmlInput + "'");
            spe.printStackTrace();
            fail("parsing error with " + parserName + " for xml input string :'" + xmlInput + "'");
        }
        catch (SAXException se) {
            se.printStackTrace();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }


}

