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