1/*
2 * Copyright (c) 2015, 2017 Oracle and/or its affiliates. All rights reserved.
3 */
4/*
5 * Licensed to the Apache Software Foundation (ASF) under one or more
6 * contributor license agreements.  See the NOTICE file distributed with
7 * this work for additional information regarding copyright ownership.
8 * The ASF licenses this file to You under the Apache License, Version 2.0
9 * (the "License"); you may not use this file except in compliance with
10 * the License.  You may obtain a copy of the License at
11 *
12 *      http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20
21
22package com.sun.org.apache.xml.internal.serialize;
23
24import com.sun.org.apache.xerces.internal.utils.ObjectFactory;
25import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
26import java.io.OutputStream;
27import java.io.UnsupportedEncodingException;
28import java.io.Writer;
29import java.util.Collections;
30import java.util.HashMap;
31import java.util.Map;
32import java.util.StringTokenizer;
33
34/**
35 *
36 *
37 * @author <a href="mailto:Scott_Boag/CAM/Lotus@lotus.com">Scott Boag</a>
38 * @author <a href="mailto:arkin@intalio.com">Assaf Arkin</a>
39 *
40 * @deprecated As of JDK 9, Xerces 2.9.0, Xerces DOM L3 Serializer implementation
41 * is replaced by that of Xalan. Main class
42 * {@link com.sun.org.apache.xml.internal.serialize.DOMSerializerImpl} is replaced
43 * by {@link com.sun.org.apache.xml.internal.serializer.dom3.LSSerializerImpl}.
44 */
45@Deprecated
46public abstract class SerializerFactory
47{
48
49
50    public static final String FactoriesProperty = "com.sun.org.apache.xml.internal.serialize.factories";
51
52
53    private static final Map<String, SerializerFactory>  _factories = Collections.synchronizedMap(new HashMap());
54
55
56    static
57    {
58        SerializerFactory factory;
59        String            list;
60        StringTokenizer   token;
61        String            className;
62
63        // The default factories are always registered first,
64        // any factory specified in the properties file and supporting
65        // the same method will override the default factory.
66        factory =  new SerializerFactoryImpl( Method.XML );
67        registerSerializerFactory( factory );
68        factory =  new SerializerFactoryImpl( Method.HTML );
69        registerSerializerFactory( factory );
70        factory =  new SerializerFactoryImpl( Method.XHTML );
71        registerSerializerFactory( factory );
72        factory =  new SerializerFactoryImpl( Method.TEXT );
73        registerSerializerFactory( factory );
74
75        list = SecuritySupport.getSystemProperty( FactoriesProperty );
76        if ( list != null ) {
77            token = new StringTokenizer( list, " ;,:" );
78            while ( token.hasMoreTokens() ) {
79                className = token.nextToken();
80                try {
81                    factory = (SerializerFactory) ObjectFactory.newInstance( className, true);
82                    if ( _factories.containsKey( factory.getSupportedMethod() ) )
83                        _factories.put( factory.getSupportedMethod(), factory );
84                } catch ( Exception except ) { }
85            }
86        }
87    }
88
89
90    /**
91     * Register a serializer factory, keyed by the given
92     * method string.
93     */
94    public static void registerSerializerFactory( SerializerFactory factory )
95    {
96        String method;
97
98        synchronized ( _factories ) {
99        method = factory.getSupportedMethod();
100        _factories.put( method, factory );
101    }
102    }
103
104
105    /**
106     * Register a serializer factory, keyed by the given
107     * method string.
108     */
109    public static SerializerFactory getSerializerFactory( String method )
110    {
111        return _factories.get( method );
112    }
113
114
115    /**
116     * Returns the method supported by this factory and used to register
117     * the factory. This call is required so factories can be added from
118     * a properties file by knowing only the class name. This method is
119     * protected, it is only required by this class but must be implemented
120     * in derived classes.
121     */
122    protected abstract String getSupportedMethod();
123
124
125    /**
126     * Create a new serializer based on the {@link OutputFormat}.
127     * If this method is used to create the serializer, the {@link
128     * Serializer#setOutputByteStream} or {@link Serializer#setOutputCharStream}
129     * methods must be called before serializing a document.
130     */
131    public abstract Serializer makeSerializer(OutputFormat format);
132
133
134    /**
135     * Create a new serializer, based on the {@link OutputFormat} and
136     * using the writer as the output character stream.  If this
137     * method is used, the encoding property will be ignored.
138     */
139    public abstract Serializer makeSerializer( Writer writer,
140                                               OutputFormat format );
141
142
143    /**
144     * Create a new serializer, based on the {@link OutputFormat} and
145     * using the output byte stream and the encoding specified in the
146     * output format.
147     *
148     * @throws UnsupportedEncodingException The specified encoding is
149     *   not supported
150     */
151    public abstract Serializer makeSerializer( OutputStream output,
152                                               OutputFormat format )
153        throws UnsupportedEncodingException;
154
155
156}
157