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