/* XMLEventFactory.java -- 
   Copyright (C) 2005,2006  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package javax.xml.stream;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.Properties;
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.Comment;
import javax.xml.stream.events.DTD;
import javax.xml.stream.events.EndDocument;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.EntityDeclaration;
import javax.xml.stream.events.EntityReference;
import javax.xml.stream.events.Namespace;
import javax.xml.stream.events.ProcessingInstruction;
import javax.xml.stream.events.StartDocument;
import javax.xml.stream.events.StartElement;

/**
 * Factory for XML events.
 */
public abstract class XMLEventFactory
{

  protected XMLEventFactory()
  {
  }

  /**
   * Create a new factory instance.
   * @see #newInstance(String,ClassLoader)
   */
  public static XMLEventFactory newInstance()
    throws FactoryConfigurationError
  {
    return newInstance(null, null);
  }

  /**
   * Create a new factory instance.
   * The implementation class to load is the first found in the following
   * locations:
   * <ol>
   * <li>the <code>javax.xml.stream.XMLEventFactory</code> system
   * property</li>
   * <li>the above named property value in the
   * <code><i>$JAVA_HOME</i>/lib/stax.properties</code> file</li>
   * <li>the class name specified in the
   * <code>META-INF/services/javax.xml.stream.XMLEventFactory</code>
   * system resource</li>
   * <li>the default factory class</li>
   * </ol>
   */
  static XMLEventFactory newInstance(String factoryId, ClassLoader classLoader)
    throws FactoryConfigurationError
  {
    ClassLoader loader = classLoader;
    if (loader == null)
      {
        loader = Thread.currentThread().getContextClassLoader();
      }
    if (loader == null)
      {
        loader = XMLEventFactory.class.getClassLoader();
      }
    String className = null;
    int count = 0;
    do
      {
        className = getFactoryClassName(loader, count++);
        if (className != null)
          {
            try
              {
                Class<?> t = (loader != null) ? loader.loadClass(className) :
                  Class.forName(className);
                return (XMLEventFactory) t.newInstance();
              }
            catch (ClassNotFoundException e)
              {
                className = null;
              }
            catch (Exception e)
              {
                throw new FactoryConfigurationError(e,
                     "error instantiating class " + className);
              }
          }
      }
    while (className == null && count < 3);
    return new gnu.xml.stream.XMLEventFactoryImpl();
  }

  private static String getFactoryClassName(ClassLoader loader, int attempt)
  {
    final String propertyName = "javax.xml.stream.XMLEventFactory";
    switch (attempt)
      {
        case 0:
          return System.getProperty(propertyName);
        case 1:
          try
            {
              File file = new File(System.getProperty("java.home"));
              file = new File(file, "lib");
              file = new File(file, "stax.properties");
              InputStream in = new FileInputStream(file);
              Properties props = new Properties();
              props.load(in);
              in.close();
              return props.getProperty(propertyName);
            }
          catch (IOException e)
            {
              return null;
            }
        case 2:
          try
            {
              String serviceKey = "/META-INF/services/" + propertyName;
              InputStream in = (loader != null) ?
                 loader.getResourceAsStream(serviceKey) :
                XMLEventFactory.class.getResourceAsStream(serviceKey);
              if (in != null)
                {
                  BufferedReader r =
                     new BufferedReader(new InputStreamReader(in));
                  String ret = r.readLine();
                  r.close();
                  return ret;
                }
            }
          catch (IOException e)
            {
            }
          return null;
        default:
          return null;
      }
  }

  /**
   * Sets the location for each event created by this factory.
   */
  public abstract void setLocation(Location location);

  /**
   * Create an attribute event.
   */
  public abstract Attribute createAttribute(String prefix, String namespaceURI,
                                            String localName, String value);
  
  /**
   * Create an attribute event.
   */
  public abstract Attribute createAttribute(String localName, String value);

  /**
   * Create an attribute event.
   */
  public abstract Attribute createAttribute(QName name, String value);

  /**
   * Create a namespace declaration event.
   */
  public abstract Namespace createNamespace(String namespaceURI);

  /**
   * Create a namespace declaration event.
   */
  public abstract Namespace createNamespace(String prefix, String namespaceUri);

  /**
   * Create a start-element event.
   */
  @SuppressWarnings("unchecked")
  public abstract StartElement createStartElement(QName name,
                                                  Iterator attributes,
                                                  Iterator namespaces);

  /**
   * Create a start-element event.
   */
  public abstract StartElement createStartElement(String prefix,
                                                  String namespaceUri,
                                                  String localName);

  /**
   * Create a start-element event.
   */
  @SuppressWarnings("unchecked")
  public abstract StartElement createStartElement(String prefix,
                                                  String namespaceUri,
                                                  String localName,
                                                  Iterator attributes,
                                                  Iterator namespaces);

  /**
   * Create a start-element event.
   */
  @SuppressWarnings("unchecked")
  public abstract StartElement createStartElement(String prefix,
                                                  String namespaceUri,
                                                  String localName,
                                                  Iterator attributes,
                                                  Iterator namespaces,
                                                  NamespaceContext context);
  
  /**
   * Create an end-element event.
   */
  @SuppressWarnings("unchecked")
  public abstract EndElement createEndElement(QName name,
                                              Iterator namespaces);

  /**
   * Create an end-element event.
   */
  public abstract EndElement createEndElement(String prefix,
                                              String namespaceUri,
                                              String localName);

  /**
   * Create an end-element event.
   */
  @SuppressWarnings("unchecked")
  public abstract EndElement createEndElement(String prefix,
                                              String namespaceUri,
                                              String localName,
                                              Iterator namespaces);

  /**
   * Create a text event.
   */
  public abstract Characters createCharacters(String content);

  /**
   * Create a text event of type CDATA section.
   */
  public abstract Characters createCData(String content);

  /**
   * Create a text event of type whitespace.
   */
  public abstract Characters createSpace(String content);

  /**
   * Create a text event of type ignorable whitespace.
   */
  public abstract Characters createIgnorableSpace(String content);

  /**
   * Create a start-document event.
   */
  public abstract StartDocument createStartDocument();

  /**
   * Create a start-document event.
   */
  public abstract StartDocument createStartDocument(String encoding,
                                                    String version,
                                                    boolean standalone);

  /**
   * Create a start-document event.
   */
  public abstract StartDocument createStartDocument(String encoding,
                                                    String version);

  /**
   * Create a start-document event.
   */
  public abstract StartDocument createStartDocument(String encoding);

  /**
   * Create an end-document event.
   */
  public abstract EndDocument createEndDocument();

  /**
   * Create an entity reference event.
   */
  public abstract EntityReference createEntityReference(String name,
                                                        EntityDeclaration declaration);

  /**
   * Create a comment event.
   */
  public abstract Comment createComment(String text);

  /**
   * Create a processing instruction event.
   */
  public abstract ProcessingInstruction createProcessingInstruction(String target,
                                                                    String data);

  /**
   * Create a DOCTYPE declaration event.
   */
  public abstract DTD createDTD(String dtd);
  
}

