1 /*
2  * Copyright (c) 2011, 2019, 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 package com.sun.org.apache.xalan.internal.xsltc.runtime.output;
22 
23 import java.io.IOException;
24 import java.io.OutputStream;
25 import java.io.Writer;
26 
27 import javax.xml.parsers.ParserConfigurationException;
28 import javax.xml.stream.XMLEventWriter;
29 import javax.xml.stream.util.XMLEventConsumer;
30 import javax.xml.stream.XMLStreamWriter;
31 
32 import com.sun.org.apache.xalan.internal.xsltc.trax.SAX2DOM;
33 import com.sun.org.apache.xalan.internal.xsltc.trax.SAX2StAXEventWriter;
34 import com.sun.org.apache.xalan.internal.xsltc.trax.SAX2StAXStreamWriter;
35 
36 import com.sun.org.apache.xml.internal.serializer.ToHTMLSAXHandler;
37 import com.sun.org.apache.xml.internal.serializer.ToHTMLStream;
38 import com.sun.org.apache.xml.internal.serializer.ToTextSAXHandler;
39 import com.sun.org.apache.xml.internal.serializer.ToTextStream;
40 import com.sun.org.apache.xml.internal.serializer.ToUnknownStream;
41 import com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler;
42 import com.sun.org.apache.xml.internal.serializer.ToXMLStream;
43 import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
44 import javax.xml.transform.ErrorListener;
45 import org.w3c.dom.Node;
46 
47 import org.xml.sax.ContentHandler;
48 import org.xml.sax.ext.LexicalHandler;
49 
50 /**
51  * @author Santiago Pericas-Geertsen
52  * @LastModified: Aug 2019
53  */
54 public class TransletOutputHandlerFactory {
55 
56     public static final int STREAM = 0;
57     public static final int SAX    = 1;
58     public static final int DOM    = 2;
59     public static final int STAX   = 3;
60 
61     private String _encoding                        = "utf-8";
62     private String _method                          = null;
63     private int    _outputType                      = STREAM;
64     private OutputStream _ostream                   = System.out;
65     private Writer _writer                          = null;
66     private Node _node                              = null;
67     private Node   _nextSibling                     = null;
68     private XMLEventWriter _xmlStAXEventWriter      = null;
69     private XMLStreamWriter _xmlStAXStreamWriter    = null;
70     private int _indentNumber                       = -1;
71     private ContentHandler _handler                 = null;
72     private LexicalHandler _lexHandler              = null;
73 
74     private boolean _overrideDefaultParser;
75     private ErrorListener _errListener;
76 
newInstance(boolean overrideDefaultParser, ErrorListener errListener)77     static public TransletOutputHandlerFactory newInstance(boolean overrideDefaultParser,
78             ErrorListener errListener) {
79         return new TransletOutputHandlerFactory(overrideDefaultParser, errListener);
80     }
81 
TransletOutputHandlerFactory(boolean overrideDefaultParser, ErrorListener errListener)82     public TransletOutputHandlerFactory(boolean overrideDefaultParser,
83             ErrorListener errListener) {
84         _overrideDefaultParser = overrideDefaultParser;
85         _errListener = errListener;
86     }
setOutputType(int outputType)87     public void setOutputType(int outputType) {
88         _outputType = outputType;
89     }
90 
setEncoding(String encoding)91     public void setEncoding(String encoding) {
92         if (encoding != null) {
93             _encoding = encoding;
94         }
95     }
96 
setOutputMethod(String method)97     public void setOutputMethod(String method) {
98         _method = method;
99     }
100 
setOutputStream(OutputStream ostream)101     public void setOutputStream(OutputStream ostream) {
102         _ostream = ostream;
103     }
104 
setWriter(Writer writer)105     public void setWriter(Writer writer) {
106         _writer = writer;
107     }
108 
setHandler(ContentHandler handler)109     public void setHandler(ContentHandler handler) {
110         _handler = handler;
111     }
112 
setLexicalHandler(LexicalHandler lex)113     public void setLexicalHandler(LexicalHandler lex) {
114         _lexHandler = lex;
115     }
116 
setNode(Node node)117     public void setNode(Node node) {
118         _node = node;
119     }
120 
getNode()121     public Node getNode() {
122         return (_handler instanceof SAX2DOM) ? ((SAX2DOM)_handler).getDOM()
123            : null;
124     }
125 
setNextSibling(Node nextSibling)126     public void setNextSibling(Node nextSibling) {
127         _nextSibling = nextSibling;
128     }
129 
getXMLEventWriter()130     public XMLEventWriter getXMLEventWriter() {
131         return (_handler instanceof SAX2StAXEventWriter) ? ((SAX2StAXEventWriter) _handler).getEventWriter() : null;
132     }
133 
setXMLEventWriter(XMLEventWriter eventWriter)134     public void setXMLEventWriter(XMLEventWriter eventWriter) {
135         _xmlStAXEventWriter = eventWriter;
136     }
137 
getXMLStreamWriter()138     public XMLStreamWriter getXMLStreamWriter() {
139         return (_handler instanceof SAX2StAXStreamWriter) ? ((SAX2StAXStreamWriter) _handler).getStreamWriter() : null;
140     }
141 
setXMLStreamWriter(XMLStreamWriter streamWriter)142     public void setXMLStreamWriter(XMLStreamWriter streamWriter) {
143         _xmlStAXStreamWriter = streamWriter;
144     }
145 
setIndentNumber(int value)146     public void setIndentNumber(int value) {
147         _indentNumber = value;
148     }
149 
150     @SuppressWarnings("fallthrough")  // intentional at case STAX, SAX
getSerializationHandler()151     public SerializationHandler getSerializationHandler()
152         throws IOException, ParserConfigurationException
153     {
154         SerializationHandler result = null;
155         switch (_outputType)
156         {
157             case STREAM :
158 
159                 if (_method == null)
160                 {
161                     result = new ToUnknownStream(_errListener);
162                 }
163                 else if (_method.equalsIgnoreCase("xml"))
164                 {
165 
166                     result = new ToXMLStream(_errListener);
167 
168                 }
169                 else if (_method.equalsIgnoreCase("html"))
170                 {
171 
172                     result = new ToHTMLStream(_errListener);
173 
174                 }
175                 else if (_method.equalsIgnoreCase("text"))
176                 {
177 
178                     result = new ToTextStream(_errListener);
179 
180                 }
181 
182                 if (result != null && _indentNumber >= 0)
183                 {
184                     result.setIndentAmount(_indentNumber);
185                 }
186 
187                 result.setEncoding(_encoding);
188 
189                 if (_writer != null)
190                 {
191                     result.setWriter(_writer);
192                 }
193                 else
194                 {
195                     result.setOutputStream(_ostream);
196                 }
197                 return result;
198 
199             case DOM :
200                 _handler = (_node != null) ?
201                         new SAX2DOM(_node, _nextSibling, _overrideDefaultParser) :
202                         new SAX2DOM(_overrideDefaultParser);
203                 _lexHandler = (LexicalHandler) _handler;
204                 // falls through
205             case STAX :
206                 if (_xmlStAXEventWriter != null) {
207                     _handler =  new SAX2StAXEventWriter(_xmlStAXEventWriter);
208                 } else if (_xmlStAXStreamWriter != null) {
209                     _handler =  new SAX2StAXStreamWriter(_xmlStAXStreamWriter);
210                 }
211                 _lexHandler = (LexicalHandler) _handler;
212                 // again falls through - Padmaja Vedula
213             case SAX :
214                 if (_method == null)
215                 {
216                     _method = "xml"; // default case
217                 }
218 
219                 if (_method.equalsIgnoreCase("xml"))
220                 {
221 
222                     if (_lexHandler == null)
223                     {
224                         result = new ToXMLSAXHandler(_handler, _encoding);
225                     }
226                     else
227                     {
228                         result =
229                             new ToXMLSAXHandler(
230                                 _handler,
231                                 _lexHandler,
232                                 _encoding);
233                     }
234 
235                 }
236                 else if (_method.equalsIgnoreCase("html"))
237                 {
238 
239                     if (_lexHandler == null)
240                     {
241                         result = new ToHTMLSAXHandler(_handler, _encoding);
242                     }
243                     else
244                     {
245                         result =
246                             new ToHTMLSAXHandler(
247                                 _handler,
248                                 _lexHandler,
249                                 _encoding);
250                     }
251 
252                 }
253                 else if (_method.equalsIgnoreCase("text"))
254                 {
255 
256                     if (_lexHandler == null)
257                     {
258                         result = new ToTextSAXHandler(_handler, _encoding);
259                     }
260                     else
261                     {
262                         result =
263                             new ToTextSAXHandler(
264                                 _handler,
265                                 _lexHandler,
266                                 _encoding);
267                     }
268 
269                 }
270                 return result;
271         }
272         return null;
273     }
274 
275 }
276