1 /*
   2  * reserved comment block
   3  * DO NOT REMOVE OR ALTER!
   4  */
   5 /*
   6  * The Apache Software License, Version 1.1
   7  *
   8  *
   9  * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
  10  * reserved.
  11  *
  12  * Redistribution and use in source and binary forms, with or without
  13  * modification, are permitted provided that the following conditions
  14  * are met:
  15  *
  16  * 1. Redistributions of source code must retain the above copyright
  17  *    notice, this list of conditions and the following disclaimer.
  18  *
  19  * 2. Redistributions in binary form must reproduce the above copyright
  20  *    notice, this list of conditions and the following disclaimer in
  21  *    the documentation and/or other materials provided with the
  22  *    distribution.
  23  *
  24  * 3. The end-user documentation included with the redistribution,
  25  *    if any, must include the following acknowledgment:
  26  *       "This product includes software developed by the
  27  *        Apache Software Foundation (http://www.apache.org/)."
  28  *    Alternately, this acknowledgment may appear in the software itself,
  29  *    if and wherever such third-party acknowledgments normally appear.
  30  *
  31  * 4. The names "Xerces" and "Apache Software Foundation" must
  32  *    not be used to endorse or promote products derived from this
  33  *    software without prior written permission. For written
  34  *    permission, please contact apache@apache.org.
  35  *
  36  * 5. Products derived from this software may not be called "Apache",
  37  *    nor may "Apache" appear in their name, without prior written
  38  *    permission of the Apache Software Foundation.
  39  *
  40  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  41  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  42  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  43  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  44  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  45  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  46  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  47  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  48  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  49  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  50  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  51  * SUCH DAMAGE.
  52  * ====================================================================
  53  *
  54  * This software consists of voluntary contributions made by many
  55  * individuals on behalf of the Apache Software Foundation and was
  56  * originally based on software copyright (c) 1999, International
  57  * Business Machines, Inc., http://www.apache.org.  For more
  58  * information on the Apache Software Foundation, please see
  59  * <http://www.apache.org/>.
  60  */
  61 
  62 package com.sun.org.apache.xerces.internal.util;
  63 
  64 import com.sun.org.apache.xerces.internal.xni.XMLString;
  65 
  66 /**
  67  * XMLString is a structure used to pass character arrays. However,
  68  * XMLStringBuffer is a buffer in which characters can be appended
  69  * and extends XMLString so that it can be passed to methods
  70  * expecting an XMLString object. This is a safe operation because
  71  * it is assumed that any callee will <strong>not</strong> modify
  72  * the contents of the XMLString structure.
  73  * <p>
  74  * The contents of the string are managed by the string buffer. As
  75  * characters are appended, the string buffer will grow as needed.
  76  * <p>
  77  * <strong>Note:</strong> Never set the <code>ch</code>,
  78  * <code>offset</code>, and <code>length</code> fields directly.
  79  * These fields are managed by the string buffer. In order to reset
  80  * the buffer, call <code>clear()</code>.
  81  *
  82  * @author Andy Clark, IBM
  83  * @author Eric Ye, IBM
  84  *
  85  */
  86 public class XMLStringBuffer
  87 extends XMLString {
  88 
  89     //
  90     // Constants
  91     //
  92 
  93 
  94     /** Default buffer size (32). */
  95     public static final int DEFAULT_SIZE = 32;
  96 
  97     //
  98     // Data
  99     //
 100 
 101     //
 102     // Constructors
 103     //
 104 
 105     /**
 106      *
 107      */
 108     public XMLStringBuffer() {
 109         this(DEFAULT_SIZE);
 110     } // <init>()
 111 
 112     /**
 113      *
 114      *
 115      * @param size
 116      */
 117     public XMLStringBuffer(int size) {
 118         ch = new char[size];
 119     } // <init>(int)
 120 
 121     /** Constructs a string buffer from a char. */
 122     public XMLStringBuffer(char c) {
 123         this(1);
 124         append(c);
 125     } // <init>(char)
 126 
 127     /** Constructs a string buffer from a String. */
 128     public XMLStringBuffer(String s) {
 129         this(s.length());
 130         append(s);
 131     } // <init>(String)
 132 
 133     /** Constructs a string buffer from the specified character array. */
 134     public XMLStringBuffer(char[] ch, int offset, int length) {
 135         this(length);
 136         append(ch, offset, length);
 137     } // <init>(char[],int,int)
 138 
 139     /** Constructs a string buffer from the specified XMLString. */
 140     public XMLStringBuffer(XMLString s) {
 141         this(s.length);
 142         append(s);
 143     } // <init>(XMLString)
 144 
 145     //
 146     // Public methods
 147     //
 148 
 149     /** Clears the string buffer. */
 150     public void clear() {
 151         offset = 0;
 152         length = 0;
 153     }
 154 
 155     /**
 156      * append
 157      *
 158      * @param c
 159      */
 160     public void append(char c) {
 161         if(this.length + 1 > this.ch.length){
 162             int newLength = this.ch.length * 2 ;
 163             if(newLength < this.ch.length + DEFAULT_SIZE){
 164                 newLength = this.ch.length + DEFAULT_SIZE;
 165             }
 166             char [] tmp = new char[newLength];
 167             System.arraycopy(this.ch, 0, tmp, 0, this.length);
 168             this.ch = tmp;
 169         }
 170         this.ch[this.length] = c ;
 171         this.length++;
 172     } // append(char)
 173 
 174     /**
 175      * append
 176      *
 177      * @param s
 178      */
 179     public void append(String s) {
 180         int length = s.length();
 181         if (this.length + length > this.ch.length) {
 182             int newLength = this.ch.length * 2 ;
 183             if(newLength < this.ch.length + length + DEFAULT_SIZE){
 184                 newLength = this.ch.length + length+ DEFAULT_SIZE;
 185             }
 186 
 187             char[] newch = new char[newLength];
 188             System.arraycopy(this.ch, 0, newch, 0, this.length);
 189             this.ch = newch;
 190         }
 191         s.getChars(0, length, this.ch, this.length);
 192         this.length += length;
 193     } // append(String)
 194 
 195     /**
 196      * append
 197      *
 198      * @param ch
 199      * @param offset
 200      * @param length
 201      */
 202     public void append(char[] ch, int offset, int length) {
 203         if (this.length + length > this.ch.length) {
 204             int newLength = this.ch.length * 2 ;
 205             if(newLength < this.ch.length + length + DEFAULT_SIZE){
 206                 newLength = this.ch.length + length + DEFAULT_SIZE;
 207             }
 208             char[] newch = new char[newLength];
 209             System.arraycopy(this.ch, 0, newch, 0, this.length);
 210             this.ch = newch;
 211         }
 212         //making the code more robust as it would handle null or 0 length data,
 213         //add the data only when it contains some thing
 214         if(ch != null && length > 0){
 215             System.arraycopy(ch, offset, this.ch, this.length, length);
 216             this.length += length;
 217         }
 218     } // append(char[],int,int)
 219 
 220     /**
 221      * append
 222      *
 223      * @param s
 224      */
 225     public void append(XMLString s) {
 226         append(s.ch, s.offset, s.length);
 227     } // append(XMLString)
 228 
 229 
 230 } // class XMLStringBuffer