/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * 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 org.apache.harmony.xml.parsers;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.SAXParser;
import org.apache.harmony.xml.ExpatReader;
import org.xml.sax.Parser;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderAdapter;

/**
 * A SAX parser based on Expat.
 */
final class SAXParserImpl extends SAXParser {

    private Map<String, Boolean> initialFeatures;
    private XMLReader reader;
    private Parser parser;

    SAXParserImpl(Map<String, Boolean> initialFeatures)
            throws SAXNotRecognizedException, SAXNotSupportedException {
        this.initialFeatures = initialFeatures.isEmpty()
                ? Collections.<String, Boolean>emptyMap()
                : new HashMap<String, Boolean>(initialFeatures);
        resetInternal();
    }

    private void resetInternal()
            throws SAXNotSupportedException, SAXNotRecognizedException {
        reader = new ExpatReader();
        for (Map.Entry<String,Boolean> entry : initialFeatures.entrySet()) {
            reader.setFeature(entry.getKey(), entry.getValue());
        }
    }

    @Override public void reset() {
        /*
         * The exceptions are impossible. If any features are unrecognized or
         * unsupported, construction of this instance would have failed.
         */
        try {
            resetInternal();
        } catch (SAXNotRecognizedException e) {
            throw new AssertionError();
        } catch (SAXNotSupportedException e) {
            throw new AssertionError();
        }
    }

    @Override
    public Parser getParser() {
        if (parser == null) {
            parser = new XMLReaderAdapter(reader);
        }

        return parser;
    }

    @Override
    public Object getProperty(String name) throws SAXNotRecognizedException,
            SAXNotSupportedException {
        return reader.getProperty(name);
    }

    @Override
    public XMLReader getXMLReader() {
        return reader;
    }

    @Override
    public boolean isNamespaceAware() {
        try {
            return reader.getFeature("http://xml.org/sax/features/namespaces");
        } catch (SAXException ex) {
            return false;
        }
    }

    @Override
    public boolean isValidating() {
        return false;
    }

    @Override
    public void setProperty(String name, Object value)
            throws SAXNotRecognizedException, SAXNotSupportedException {
        reader.setProperty(name, value);
    }
}
