001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 /* 019 * $Id: TransletOutputHandlerFactory.java 475979 2006-11-16 23:32:48Z minchau $ 020 */ 021 022 package org.apache.xalan.xsltc.runtime.output; 023 024 import java.io.IOException; 025 import java.io.OutputStream; 026 import java.io.Writer; 027 028 import javax.xml.parsers.ParserConfigurationException; 029 030 import org.apache.xalan.xsltc.trax.SAX2DOM; 031 import org.apache.xml.serializer.ToHTMLStream; 032 import org.apache.xml.serializer.ToTextStream; 033 import org.apache.xml.serializer.ToUnknownStream; 034 import org.apache.xml.serializer.ToXMLSAXHandler; 035 import org.apache.xml.serializer.ToXMLStream; 036 import org.apache.xml.serializer.SerializationHandler; 037 import org.w3c.dom.Node; 038 039 import org.xml.sax.ContentHandler; 040 import org.xml.sax.ext.LexicalHandler; 041 042 /** 043 * @author Santiago Pericas-Geertsen 044 */ 045 public class TransletOutputHandlerFactory { 046 047 public static final int STREAM = 0; 048 public static final int SAX = 1; 049 public static final int DOM = 2; 050 051 private String _encoding = "utf-8"; 052 private String _method = null; 053 private int _outputType = STREAM; 054 private OutputStream _ostream = System.out; 055 private Writer _writer = null; 056 private Node _node = null; 057 private Node _nextSibling = null; 058 private int _indentNumber = -1; 059 private ContentHandler _handler = null; 060 private LexicalHandler _lexHandler = null; 061 062 static public TransletOutputHandlerFactory newInstance() { 063 return new TransletOutputHandlerFactory(); 064 } 065 066 public void setOutputType(int outputType) { 067 _outputType = outputType; 068 } 069 070 public void setEncoding(String encoding) { 071 if (encoding != null) { 072 _encoding = encoding; 073 } 074 } 075 076 public void setOutputMethod(String method) { 077 _method = method; 078 } 079 080 public void setOutputStream(OutputStream ostream) { 081 _ostream = ostream; 082 } 083 084 public void setWriter(Writer writer) { 085 _writer = writer; 086 } 087 088 public void setHandler(ContentHandler handler) { 089 _handler = handler; 090 } 091 092 public void setLexicalHandler(LexicalHandler lex) { 093 _lexHandler = lex; 094 } 095 096 public void setNode(Node node) { 097 _node = node; 098 } 099 100 public Node getNode() { 101 return (_handler instanceof SAX2DOM) ? ((SAX2DOM)_handler).getDOM() 102 : null; 103 } 104 105 public void setNextSibling(Node nextSibling) { 106 _nextSibling = nextSibling; 107 } 108 109 public void setIndentNumber(int value) { 110 _indentNumber = value; 111 } 112 113 public SerializationHandler getSerializationHandler() 114 throws IOException, ParserConfigurationException 115 { 116 SerializationHandler result = null; 117 switch (_outputType) 118 { 119 case STREAM : 120 121 if (_method == null) 122 { 123 result = new ToUnknownStream(); 124 } 125 else if (_method.equalsIgnoreCase("xml")) 126 { 127 128 result = new ToXMLStream(); 129 130 } 131 else if (_method.equalsIgnoreCase("html")) 132 { 133 134 result = new ToHTMLStream(); 135 136 } 137 else if (_method.equalsIgnoreCase("text")) 138 { 139 140 result = new ToTextStream(); 141 142 } 143 144 if (result != null && _indentNumber >= 0) 145 { 146 result.setIndentAmount(_indentNumber); 147 } 148 149 result.setEncoding(_encoding); 150 151 if (_writer != null) 152 { 153 result.setWriter(_writer); 154 } 155 else 156 { 157 result.setOutputStream(_ostream); 158 } 159 return result; 160 161 case DOM : 162 _handler = (_node != null) ? new SAX2DOM(_node, _nextSibling) : new SAX2DOM(); 163 _lexHandler = (LexicalHandler) _handler; 164 // falls through 165 case SAX : 166 if (_method == null) 167 { 168 _method = "xml"; // default case 169 } 170 171 if (_lexHandler == null) 172 { 173 result = new ToXMLSAXHandler(_handler, _encoding); 174 } 175 else 176 { 177 result = 178 new ToXMLSAXHandler( 179 _handler, 180 _lexHandler, 181 _encoding); 182 } 183 184 return result; 185 } 186 return null; 187 } 188 189 }