1 /*
2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
3  */
4 /*
5  * Copyright 2001-2004 The Apache Software Foundation.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 /*
20  * $Id: TransletOutputHandlerFactory.java,v 1.2.4.2 2005/09/15 19:12:05 jeffsuttor Exp $
21  */
22 
23 package com.sun.org.apache.xalan.internal.xsltc.runtime.output;
24 
25 import java.io.IOException;
26 import java.io.OutputStream;
27 import java.io.Writer;
28 
29 import javax.xml.parsers.ParserConfigurationException;
30 import javax.xml.stream.XMLEventWriter;
31 import javax.xml.stream.util.XMLEventConsumer;
32 import javax.xml.stream.XMLStreamWriter;
33 
34 import com.sun.org.apache.xalan.internal.xsltc.trax.SAX2DOM;
35 import com.sun.org.apache.xalan.internal.xsltc.trax.SAX2StAXEventWriter;
36 import com.sun.org.apache.xalan.internal.xsltc.trax.SAX2StAXStreamWriter;
37 
38 import com.sun.org.apache.xml.internal.serializer.ToHTMLSAXHandler;
39 import com.sun.org.apache.xml.internal.serializer.ToHTMLStream;
40 import com.sun.org.apache.xml.internal.serializer.ToTextSAXHandler;
41 import com.sun.org.apache.xml.internal.serializer.ToTextStream;
42 import com.sun.org.apache.xml.internal.serializer.ToUnknownStream;
43 import com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler;
44 import com.sun.org.apache.xml.internal.serializer.ToXMLStream;
45 import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
46 import org.w3c.dom.Node;
47 
48 import org.xml.sax.ContentHandler;
49 import org.xml.sax.ext.LexicalHandler;
50 
51 /**
52  * @author Santiago Pericas-Geertsen
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 
newInstance()76     static public TransletOutputHandlerFactory newInstance() {
77         return new TransletOutputHandlerFactory(true);
78     }
newInstance(boolean overrideDefaultParser)79     static public TransletOutputHandlerFactory newInstance(boolean overrideDefaultParser) {
80         return new TransletOutputHandlerFactory(overrideDefaultParser);
81     }
82 
TransletOutputHandlerFactory(boolean overrideDefaultParser)83     public TransletOutputHandlerFactory(boolean overrideDefaultParser) {
84         _overrideDefaultParser = overrideDefaultParser;
85     }
setOutputType(int outputType)86     public void setOutputType(int outputType) {
87         _outputType = outputType;
88     }
89 
setEncoding(String encoding)90     public void setEncoding(String encoding) {
91         if (encoding != null) {
92             _encoding = encoding;
93         }
94     }
95 
setOutputMethod(String method)96     public void setOutputMethod(String method) {
97         _method = method;
98     }
99 
setOutputStream(OutputStream ostream)100     public void setOutputStream(OutputStream ostream) {
101         _ostream = ostream;
102     }
103 
setWriter(Writer writer)104     public void setWriter(Writer writer) {
105         _writer = writer;
106     }
107 
setHandler(ContentHandler handler)108     public void setHandler(ContentHandler handler) {
109         _handler = handler;
110     }
111 
setLexicalHandler(LexicalHandler lex)112     public void setLexicalHandler(LexicalHandler lex) {
113         _lexHandler = lex;
114     }
115 
setNode(Node node)116     public void setNode(Node node) {
117         _node = node;
118     }
119 
getNode()120     public Node getNode() {
121         return (_handler instanceof SAX2DOM) ? ((SAX2DOM)_handler).getDOM()
122            : null;
123     }
124 
setNextSibling(Node nextSibling)125     public void setNextSibling(Node nextSibling) {
126         _nextSibling = nextSibling;
127     }
128 
getXMLEventWriter()129     public XMLEventWriter getXMLEventWriter() {
130         return (_handler instanceof SAX2StAXEventWriter) ? ((SAX2StAXEventWriter) _handler).getEventWriter() : null;
131     }
132 
setXMLEventWriter(XMLEventWriter eventWriter)133     public void setXMLEventWriter(XMLEventWriter eventWriter) {
134         _xmlStAXEventWriter = eventWriter;
135     }
136 
getXMLStreamWriter()137     public XMLStreamWriter getXMLStreamWriter() {
138         return (_handler instanceof SAX2StAXStreamWriter) ? ((SAX2StAXStreamWriter) _handler).getStreamWriter() : null;
139     }
140 
setXMLStreamWriter(XMLStreamWriter streamWriter)141     public void setXMLStreamWriter(XMLStreamWriter streamWriter) {
142         _xmlStAXStreamWriter = streamWriter;
143     }
144 
setIndentNumber(int value)145     public void setIndentNumber(int value) {
146         _indentNumber = value;
147     }
148 
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