/*
 **
 ** 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 java.util.Iterator;

import javax.xml.namespace.NamespaceContext;
import javax.xml.stream.events.ProcessingInstruction;
import javax.xml.namespace.QName;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.Comment;
import javax.xml.stream.events.DTD;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.EntityDeclaration;
import javax.xml.stream.events.Namespace;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndDocument;
import javax.xml.stream.events.EntityReference;
import javax.xml.stream.events.StartDocument;
import javax.xml.stream.events.StartElement;

public abstract class XMLEventFactory {

	protected XMLEventFactory() {
	}

	public static XMLEventFactory newInstance()
			throws FactoryConfigurationError {
            return (XMLEventFactory)FactoryLocator.locate("javax.xml.stream.XMLEventFactory",
                    new String[] { "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl" });
	}

	public static XMLEventFactory newInstance(String factoryId,
			ClassLoader classLoader) throws FactoryConfigurationError {
            return (XMLEventFactory)FactoryLocator.locate(factoryId,
                    new String[] { "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl" },
                    classLoader);
	}

	public abstract void setLocation(Location location);

	public abstract Attribute createAttribute(QName name, String value);

	public abstract Attribute createAttribute(String localName, String value);

	public abstract Attribute createAttribute(String prefix,
			String namespaceURI, String localName, String value);

	public abstract Namespace createNamespace(String namespaceUri);

	public abstract Namespace createNamespace(String prefix, String namespaceUri);

	public abstract StartElement createStartElement(QName name,
			Iterator attributes, Iterator namespaces);

	public abstract StartElement createStartElement(String prefix,
			String namespaceUri, String localName);

	public abstract StartElement createStartElement(String prefix,
			String namespaceUri, String localName, Iterator attributes,
			Iterator namespaces);

	public abstract StartElement createStartElement(String prefix,
			String namespaceUri, String localName, Iterator attributes,
			Iterator namespaces, NamespaceContext context);

	public abstract EndElement createEndElement(QName name, Iterator namespaces);

	public abstract EndElement createEndElement(String prefix,
			String namespaceUri, String localName);

	public abstract EndElement createEndElement(String prefix,
			String namespaceUri, String localName, Iterator namespaces);

	public abstract Characters createCharacters(String content);

	public abstract Characters createCData(String content);

	public abstract Characters createSpace(String content);

	public abstract Characters createIgnorableSpace(String content);

	public abstract StartDocument createStartDocument();

	public abstract StartDocument createStartDocument(String encoding);

	public abstract StartDocument createStartDocument(String encoding,
			String version);

	public abstract StartDocument createStartDocument(String encoding,
			String version, boolean standalone);

	public abstract EndDocument createEndDocument();

	public abstract EntityReference createEntityReference(String name,
			EntityDeclaration declaration);

	public abstract Comment createComment(String text);

	public abstract ProcessingInstruction createProcessingInstruction(
			String target, String data);

	public abstract DTD createDTD(String dtd);
}
