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