/*
 **
 ** Licensed to the Apache Software Foundation (ASF) under one
 ** or more contributor license agreements.  See the NOTICE file
 ** distributed with this work for additional information
 ** regarding copyright ownership.  The ASF licenses this file
 ** to you 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 javax.xml.stream;

import javax.xml.stream.util.XMLEventAllocator;

public abstract class XMLInputFactory {
	public static final java.lang.String ALLOCATOR = "javax.xml.stream.allocator";
	public static final java.lang.String IS_COALESCING = "javax.xml.stream.isCoalescing";
	public static final java.lang.String IS_NAMESPACE_AWARE = "javax.xml.stream.isNamespaceAware";
	public static final java.lang.String IS_REPLACING_ENTITY_REFERENCES = "javax.xml.stream.isReplacingEntityReferences";
	public static final java.lang.String IS_SUPPORTING_EXTERNAL_ENTITIES = "javax.xml.stream.isSupportingExternalEntities";
	public static final java.lang.String IS_VALIDATING = "javax.xml.stream.isValidating";
	public static final java.lang.String REPORTER = "javax.xml.stream.reporter";
	public static final java.lang.String RESOLVER = "javax.xml.stream.resolver";
	public static final java.lang.String SUPPORT_DTD = "javax.xml.stream.supportDTD";

	protected XMLInputFactory() {
	}

	public static XMLInputFactory newInstance()
			throws FactoryConfigurationError {
		// We'll assume the XMLInputFactory from the RI as a backup.
		return (XMLInputFactory)FactoryLocator.locate("javax.xml.stream.XMLInputFactory",
                new String[] { "com.sun.xml.internal.stream.XMLInputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl" });
	}

	public static XMLInputFactory newInstance(java.lang.String factoryId,
			java.lang.ClassLoader classLoader) throws FactoryConfigurationError {
		// We'll assume the XMLInputFactory from the RI as a backup.
		return (XMLInputFactory)FactoryLocator.locate(factoryId,
                new String[] { "com.sun.xml.internal.stream.XMLInputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl" },
                classLoader);
	}

	public abstract XMLStreamReader createXMLStreamReader(java.io.Reader reader)
			throws XMLStreamException;

	public abstract XMLStreamReader createXMLStreamReader(
			javax.xml.transform.Source source) throws XMLStreamException;

	public abstract XMLStreamReader createXMLStreamReader(
			java.io.InputStream stream) throws XMLStreamException;

	public abstract XMLStreamReader createXMLStreamReader(
			java.io.InputStream stream, java.lang.String encoding)
			throws XMLStreamException;

	public abstract XMLStreamReader createXMLStreamReader(
			java.lang.String systemId, java.io.InputStream stream)
			throws XMLStreamException;

	public abstract XMLStreamReader createXMLStreamReader(
			java.lang.String systemId, java.io.Reader reader)
			throws XMLStreamException;

	public abstract XMLEventReader createXMLEventReader(java.io.Reader reader)
			throws XMLStreamException;

	public abstract XMLEventReader createXMLEventReader(
			java.lang.String systemId, java.io.Reader reader)
			throws XMLStreamException;

	public abstract XMLEventReader createXMLEventReader(XMLStreamReader reader)
			throws XMLStreamException;

	public abstract XMLEventReader createXMLEventReader(
			javax.xml.transform.Source source) throws XMLStreamException;

	public abstract XMLEventReader createXMLEventReader(
			java.io.InputStream stream) throws XMLStreamException;

	public abstract XMLEventReader createXMLEventReader(
			java.io.InputStream stream, java.lang.String encoding)
			throws XMLStreamException;

	public abstract XMLEventReader createXMLEventReader(
			java.lang.String systemId, java.io.InputStream stream)
			throws XMLStreamException;

	public abstract XMLStreamReader createFilteredReader(
			XMLStreamReader reader, StreamFilter filter)
			throws XMLStreamException;

	public abstract XMLEventReader createFilteredReader(XMLEventReader reader,
			EventFilter filter) throws XMLStreamException;

	public abstract XMLResolver getXMLResolver();

	public abstract void setXMLResolver(XMLResolver resolver);

	public abstract XMLReporter getXMLReporter();

	public abstract void setXMLReporter(XMLReporter reporter);

	public abstract void setProperty(java.lang.String name,
			java.lang.Object value) throws java.lang.IllegalArgumentException;

	public abstract java.lang.Object getProperty(java.lang.String name)
			throws java.lang.IllegalArgumentException;

	public abstract boolean isPropertySupported(java.lang.String name);

	public abstract void setEventAllocator(XMLEventAllocator allocator);

	public abstract XMLEventAllocator getEventAllocator();
}
