package org.orbeon.oxf.xml.xerces;

import org.orbeon.oxf.xml.XMLParsing;

/*
* An improvement over orbeon.apache.xerces.parsers.SAXParser.  Every time
* orbeon.apache.xerces.parsers.SAXParser is constructed it looks in
* META-INF/services/orbeon.apache.xerces.xni.parser.XMLParserConfiguration to figure out what
* config to use.  Pbms with this are
*
* o We only want our config to be used. While we have changed the above file, any work done
*   to read the file is really just a waste.
*
* o The contents of the file do not change at runtime so there is little point in repeatedly
*   reading it.
*
* o About 16.4K of garbage gets create with each read of the above file. At the frequency with
*   which OPS creates SAX parsers this accumulates quickly and consequently we start losing processor time to the
*   garbage collector.
*/
class XercesSAXParser extends orbeon.apache.xerces.parsers.SAXParser {

    static final String[] RECOGNIZED_FEATURES = { NOTIFY_BUILTIN_REFS };
    static final String[] RECOGNIZED_PROPERTIES = { SYMBOL_TABLE, XMLGRAMMAR_POOL };

    public static OrbeonParserConfiguration makeConfig(XMLParsing.ParserConfiguration parserConfiguration) {
        final OrbeonParserConfiguration result = new OrbeonParserConfiguration(parserConfiguration);

        result.addRecognizedFeatures(RECOGNIZED_FEATURES);
        result.setFeature(NOTIFY_BUILTIN_REFS, true);
        result.addRecognizedProperties(RECOGNIZED_PROPERTIES);

        return result;
    }

    public XercesSAXParser(XMLParsing.ParserConfiguration parserConfiguration) {
        super(makeConfig(parserConfiguration));
    }
}