content: /*
   *  This file is part of AndroidIDE.
   *
   *  AndroidIDE 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 3 of the License, or
   *  (at your option) any later version.
   *
   *  AndroidIDE 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 AndroidIDE.  If not, see <https://www.gnu.org/licenses/>.
   */
  
  /*
   * reserved comment block
   * DO NOT REMOVE OR ALTER!
   */
  /*
   * Copyright 1999-2002,2004 The Apache Software Foundation.
   *
   * 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 jaxp.sun.org.apache.xml.internal.serialize;
  
  import jaxp.sun.org.apache.xerces.internal.utils.ObjectFactory;
  import jaxp.sun.org.apache.xerces.internal.utils.SecuritySupport;
  import java.io.OutputStream;
  import java.io.Writer;
  import java.io.UnsupportedEncodingException;
  import java.util.Hashtable;
  import java.util.StringTokenizer;
  
  /**
   *
   *
   * @version $Revision: 1.6 $ $Date: 2010-11-01 04:40:36 $
   * @author <a href="mailto:Scott_Boag/CAM/Lotus@lotus.com">Scott Boag</a>
   * @author <a href="mailto:arkin@intalio.com">Assaf Arkin</a>
   */
  public abstract class SerializerFactory
  {
  
  
      public static final String FactoriesProperty = "jaxp.sun.org.apache.xml.internalserialize.factories";
  
  
      private static Hashtable  _factories = new Hashtable();
  
  
      static
      {
          SerializerFactory factory;
          String            list;
          StringTokenizer   token;
          String            className;
  
          // The default factories are always registered first,
          // any factory specified in the properties file and supporting
          // the same method will override the default factory.
          factory =  new SerializerFactoryImpl( Method.XML );
          registerSerializerFactory( factory );
          factory =  new SerializerFactoryImpl( Method.HTML );
          registerSerializerFactory( factory );
          factory =  new SerializerFactoryImpl( Method.XHTML );
          registerSerializerFactory( factory );
          factory =  new SerializerFactoryImpl( Method.TEXT );
          registerSerializerFactory( factory );
  
          list = SecuritySupport.getSystemProperty( FactoriesProperty );
          if ( list != null ) {
              token = new StringTokenizer( list, " ;,:" );
              while ( token.hasMoreTokens() ) {
                  className = token.nextToken();
                  try {
                      factory = (SerializerFactory) ObjectFactory.newInstance( className, true);
                      if ( _factories.containsKey( factory.getSupportedMethod() ) )
                          _factories.put( factory.getSupportedMethod(), factory );
                  } catch ( Exception except ) { }
              }
          }
      }
  
  
      /**
       * Register a serializer factory, keyed by the given
       * method string.
       */
      public static void registerSerializerFactory( SerializerFactory factory )
      {
          String method;
  
          synchronized ( _factories ) {
              method = factory.getSupportedMethod();
              _factories.put( method, factory );
          }
      }
  
  
      /**
       * Register a serializer factory, keyed by the given
       * method string.
       */
      public static SerializerFactory getSerializerFactory( String method )
      {
          return (SerializerFactory) _factories.get( method );
      }
  
  
      /**
       * Returns the method supported by this factory and used to register
       * the factory. This call is required so factories can be added from
       * a properties file by knowing only the class name. This method is
       * protected, it is only required by this class but must be implemented
       * in derived classes.
       */
      protected abstract String getSupportedMethod();
  
  
      /**
       * Create a new serializer based on the {@link OutputFormat}.
       * If this method is used to create the serializer, the {@link
       * Serializer#setOutputByteStream} or {@link Serializer#setOutputCharStream}
       * methods must be called before serializing a document.
       */
      public abstract Serializer makeSerializer(OutputFormat format);
  
  
      /**
       * Create a new serializer, based on the {@link OutputFormat} and
       * using the writer as the output character stream.  If this
       * method is used, the encoding property will be ignored.
       */
      public abstract Serializer makeSerializer( Writer writer,
                                                 OutputFormat format );
  
  
      /**
       * Create a new serializer, based on the {@link OutputFormat} and
       * using the output byte stream and the encoding specified in the
       * output format.
       *
       * @throws UnsupportedEncodingException The specified encoding is
       *   not supported
       */
      public abstract Serializer makeSerializer( OutputStream output,
                                                 OutputFormat format )
          throws UnsupportedEncodingException;
  
  
  }
  