14c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/* 24c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 34c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * or more contributor license agreements. See the NOTICE file 44c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed with this work for additional information 54c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * regarding copyright ownership. The ASF licenses this file 64c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 74c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * you may not use this file except in compliance with the License. 84c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * You may obtain a copy of the License at 94c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Unless required by applicable law or agreed to in writing, software 134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * See the License for the specific language governing permissions and 164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * limitations under the License. 174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/* 194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * $Id: WriterToASCI.java 468654 2006-10-28 07:09:23Z minchau $ 204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xml.serializer; 224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.io.IOException; 244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.io.OutputStream; 254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.io.Writer; 264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/** 304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This class writes ASCII to a byte stream as quickly as possible. For the 314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * moment it does not do buffering, though I reserve the right to do some 324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * buffering down the line if I can prove that it will be faster even if the 334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * output stream is buffered. 344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This class is only used internally within Xalan. 364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @xsl.usage internal 384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonclass WriterToASCI extends Writer implements WriterChain 404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{ 414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** The byte stream to write to. */ 434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson private final OutputStream m_os; 444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Create an unbuffered ASCII writer. 474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param os The byte stream to write to. 504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public WriterToASCI(OutputStream os) 524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_os = os; 544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Write a portion of an array of characters. 584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param chars Array of characters 604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param start Offset from which to start writing characters 614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param length Number of characters to write 624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @exception IOException If an I/O error occurs 644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @throws java.io.IOException 664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void write(char chars[], int start, int length) 684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throws java.io.IOException 694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int n = length+start; 724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson for (int i = start; i < n; i++) 744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_os.write(chars[i]); 764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Write a single character. The character to be written is contained in 814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * the 16 low-order bits of the given integer value; the 16 high-order bits 824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * are ignored. 834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * <p> Subclasses that intend to support efficient single-character output 854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * should override this method. 864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param c int specifying a character to be written. 884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @exception IOException If an I/O error occurs 894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void write(int c) throws IOException 914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_os.write(c); 934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Write a string. 974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param s String to be written 994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @exception IOException If an I/O error occurs 1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void write(String s) throws IOException 1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int n = s.length(); 1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson for (int i = 0; i < n; i++) 1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_os.write(s.charAt(i)); 1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Flush the stream. If the stream has saved any characters from the 1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * various write() methods in a buffer, write them immediately to their 1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * intended destination. Then, if that destination is another character or 1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * byte stream, flush it. Thus one flush() invocation will flush all the 1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * buffers in a chain of Writers and OutputStreams. 1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @exception IOException If an I/O error occurs 1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void flush() throws java.io.IOException 1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_os.flush(); 1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Close the stream, flushing it first. Once a stream has been closed, 1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * further write() or flush() invocations will cause an IOException to be 1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * thrown. Closing a previously-closed stream, however, has no effect. 1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @exception IOException If an I/O error occurs 1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void close() throws java.io.IOException 1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_os.close(); 1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Get the output stream where the events will be serialized to. 1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return reference to the result stream, or null of only a writer was 1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * set. 1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public OutputStream getOutputStream() 1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return m_os; 1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Get the writer that this writer directly chains to. 1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public Writer getWriter() 1524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return null; 1544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson} 156