/*
 * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.enterprise.universal.xml;

import java.io.*;
import javax.xml.stream.*;

/**
 * A place to put all the ugly boiler plate for parsing an XML file.
 * @author Byron Nevins
 */
public final class XmlParserHelper {

    public XmlParserHelper(final File f) throws FileNotFoundException, XMLStreamException {
        reader = new InputStreamReader(new FileInputStream(f));
        parser = XMLInputFactory.newInstance().createXMLStreamReader(
                f.toURI().toString(), reader);
    }

    public final XMLStreamReader get() {
        return parser;
    }

    /**
     * Don't forget to call this method when finished!
     * Closes the parser and the stream
     */
    public final void stop() {
        // yes -- you **do** need to close BOTH of them!
        try {
            if (parser != null) {
                parser.close();
            }
        }
        catch (Exception e) {
            // ignore
        }
        try {
            if (reader != null) {
                reader.close();
            }
        }
        catch (Exception e) {
            // ignore
        }
    }

    private final XMLStreamReader parser;
    private final InputStreamReader reader;
}
