FileDocCategorySizeDatePackage
SerializerFactory.javaAPI DocJava SE 5 API4964Fri Aug 26 14:56:02 BST 2005com.sun.org.apache.xml.internal.serializer

SerializerFactory

public abstract class SerializerFactory extends Object
Factory for creating serializers.

Fields Summary
private static Hashtable
m_formats
Associates output methods to default output formats.
Constructors Summary
Methods Summary
public static com.sun.org.apache.xml.internal.serializer.SerializergetSerializer(java.util.Properties format)
Returns a serializer for the specified output method. If no implementation exists that supports the specified output method an exception of some type will be thrown. For a list of the default output methods see {@link Method}.

param
format The output format, minimally the "method" property must be set.
return
A suitable serializer.
throws
IllegalArgumentException if method is null or an appropriate serializer can't be found
throws
Exception if the class for the serializer is found but does not implement ContentHandler.
throws
WrappedRuntimeException if an exception is thrown while trying to find serializer


                                                                                                   
      
  
      Serializer ser;

      try
      {
        String method = format.getProperty(OutputKeys.METHOD);

        if (method == null)
          throw new IllegalArgumentException(
            "The output format has a null method name");

        String className =
            format.getProperty(OutputPropertiesFactory.S_KEY_CONTENT_HANDLER);


        if (null == className)
        {
            // Missing Content Handler property, load default using OutputPropertiesFactory
            Properties methodDefaults =
                OutputPropertiesFactory.getDefaultMethodProperties(method);
            className = 
            methodDefaults.getProperty(OutputPropertiesFactory.S_KEY_CONTENT_HANDLER);
                if (null == className)
                throw new IllegalArgumentException(
                    "The output format must have a '"
                    + OutputPropertiesFactory.S_KEY_CONTENT_HANDLER + "' property!");
        }



        ClassLoader loader = ObjectFactory.findClassLoader();

        Class cls = ObjectFactory.findProviderClass(className, loader, true);

        // _serializers.put(method, cls);

        Object obj = cls.newInstance();

        if (obj instanceof SerializationHandler)
        {
              // this is one of the supplied serializers
            ser = (Serializer) cls.newInstance();
            ser.setOutputFormat(format);
        }
        else
        {
              /*
               *  This  must be a user defined Serializer.
               *  It had better implement ContentHandler.
               */
               if (obj instanceof ContentHandler)
               {

                  /*
                   * The user defined serializer defines ContentHandler,
                   * but we need to wrap it with ToXMLSAXHandler which
                   * will collect SAX-like events and emit true
                   * SAX ContentHandler events to the users handler.
                   */
                  className = SerializerConstants.DEFAULT_SAX_SERIALIZER;
                  cls = ObjectFactory.findProviderClass(className, loader, true);
                  SerializationHandler sh =
                      (SerializationHandler) cls.newInstance();
                  sh.setContentHandler( (ContentHandler) obj);
                  sh.setOutputFormat(format);

                  ser = sh;
               }
               else
               {
                  // user defined serializer does not implement
                  // ContentHandler, ... very bad
                   throw new Exception(
                       XMLMessages.createXMLMessage(
                           XMLErrorResources.ER_SERIALIZER_NOT_CONTENTHANDLER,
                               new Object[] { className}));
               }

        }
      }
      catch (Exception e)
      {
        throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(e);
      }

      // If we make it to here ser is not null.
      return ser;