1 /*
2  * reserved comment block
3  * DO NOT REMOVE OR ALTER!
4  */
5 /*
6  * Licensed to the Apache Software Foundation (ASF) under one or more
7  * contributor license agreements.  See the NOTICE file distributed with
8  * this work for additional information regarding copyright ownership.
9  * The ASF licenses this file to You under the Apache License, Version 2.0
10  * (the "License"); you may not use this file except in compliance with
11  * the License.  You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 
22 package com.sun.org.apache.xpath.internal.objects;
23 
24 import com.sun.org.apache.xalan.internal.res.XSLMessages;
25 import com.sun.org.apache.xml.internal.utils.FastStringBuffer;
26 import com.sun.org.apache.xpath.internal.res.XPATHErrorResources;
27 
28 
29 /**
30  * This class will wrap a FastStringBuffer and allow for
31  */
32 public class XStringForChars extends XString
33 {
34     static final long serialVersionUID = -2235248887220850467L;
35   /** The start position in the fsb. */
36   int m_start;
37 
38   /** The length of the string. */
39   int m_length;
40 
41   protected String m_strCache = null;
42 
43   /**
44    * Construct a XNodeSet object.
45    *
46    * @param val FastStringBuffer object this will wrap, must be non-null.
47    * @param start The start position in the array.
48    * @param length The number of characters to read from the array.
49    */
XStringForChars(char[] val, int start, int length)50   public XStringForChars(char[] val, int start, int length)
51   {
52     super(val);
53     m_start = start;
54     m_length = length;
55     if(null == val)
56       throw new IllegalArgumentException(
57                           XSLMessages.createXPATHMessage(XPATHErrorResources.ER_FASTSTRINGBUFFER_CANNOT_BE_NULL, null)); //"The FastStringBuffer argument can not be null!!");
58   }
59 
60 
61   /**
62    * Construct a XNodeSet object.
63    *
64    * @param val String object this will wrap.
65    */
XStringForChars(String val)66   private XStringForChars(String val)
67   {
68     super(val);
69     throw new IllegalArgumentException(
70                       XSLMessages.createXPATHMessage(XPATHErrorResources.ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING, null)); //"XStringForChars can not take a string for an argument!");
71   }
72 
73   /**
74    * Cast result object to a string.
75    *
76    * @return The string this wraps or the empty string if null
77    */
fsb()78   public FastStringBuffer fsb()
79   {
80     throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS, null)); //"fsb() not supported for XStringForChars!");
81   }
82 
83   /**
84    * Cast result object to a string.
85    *
86    * @return The string this wraps or the empty string if null
87    */
appendToFsb(com.sun.org.apache.xml.internal.utils.FastStringBuffer fsb)88   public void appendToFsb(com.sun.org.apache.xml.internal.utils.FastStringBuffer fsb)
89   {
90     fsb.append((char[])m_obj, m_start, m_length);
91   }
92 
93 
94   /**
95    * Tell if this object contains a java String object.
96    *
97    * @return true if this XMLString can return a string without creating one.
98    */
hasString()99   public boolean hasString()
100   {
101     return (null != m_strCache);
102   }
103 
104 
105   /**
106    * Cast result object to a string.
107    *
108    * @return The string this wraps or the empty string if null
109    */
str()110   public String str()
111   {
112     if(null == m_strCache)
113       m_strCache = new String((char[])m_obj, m_start, m_length);
114 
115     return m_strCache;
116   }
117 
118 
119   /**
120    * Since this object is incomplete without the length and the offset, we
121    * have to convert to a string when this function is called.
122    *
123    * @return The java String representation of this object.
124    */
object()125   public Object object()
126   {
127     return str();
128   }
129 
130   /**
131    * Directly call the
132    * characters method on the passed ContentHandler for the
133    * string-value. Multiple calls to the
134    * ContentHandler's characters methods may well occur for a single call to
135    * this method.
136    *
137    * @param ch A non-null reference to a ContentHandler.
138    *
139    * @throws org.xml.sax.SAXException
140    */
dispatchCharactersEvents(org.xml.sax.ContentHandler ch)141   public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)
142       throws org.xml.sax.SAXException
143   {
144     ch.characters((char[])m_obj, m_start, m_length);
145   }
146 
147   /**
148    * Directly call the
149    * comment method on the passed LexicalHandler for the
150    * string-value.
151    *
152    * @param lh A non-null reference to a LexicalHandler.
153    *
154    * @throws org.xml.sax.SAXException
155    */
dispatchAsComment(org.xml.sax.ext.LexicalHandler lh)156   public void dispatchAsComment(org.xml.sax.ext.LexicalHandler lh)
157       throws org.xml.sax.SAXException
158   {
159     lh.comment((char[])m_obj, m_start, m_length);
160   }
161 
162   /**
163    * Returns the length of this string.
164    *
165    * @return  the length of the sequence of characters represented by this
166    *          object.
167    */
length()168   public int length()
169   {
170     return m_length;
171   }
172 
173   /**
174    * Returns the character at the specified index. An index ranges
175    * from <code>0</code> to <code>length() - 1</code>. The first character
176    * of the sequence is at index <code>0</code>, the next at index
177    * <code>1</code>, and so on, as for array indexing.
178    *
179    * @param      index   the index of the character.
180    * @return     the character at the specified index of this string.
181    *             The first character is at index <code>0</code>.
182    * @exception  IndexOutOfBoundsException  if the <code>index</code>
183    *             argument is negative or not less than the length of this
184    *             string.
185    */
charAt(int index)186   public char charAt(int index)
187   {
188     return ((char[])m_obj)[index+m_start];
189   }
190 
191   /**
192    * Copies characters from this string into the destination character
193    * array.
194    *
195    * @param      srcBegin   index of the first character in the string
196    *                        to copy.
197    * @param      srcEnd     index after the last character in the string
198    *                        to copy.
199    * @param      dst        the destination array.
200    * @param      dstBegin   the start offset in the destination array.
201    * @exception IndexOutOfBoundsException If any of the following
202    *            is true:
203    *            <ul><li><code>srcBegin</code> is negative.
204    *            <li><code>srcBegin</code> is greater than <code>srcEnd</code>
205    *            <li><code>srcEnd</code> is greater than the length of this
206    *                string
207    *            <li><code>dstBegin</code> is negative
208    *            <li><code>dstBegin+(srcEnd-srcBegin)</code> is larger than
209    *                <code>dst.length</code></ul>
210    * @exception NullPointerException if <code>dst</code> is <code>null</code>
211    */
getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)212   public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)
213   {
214     System.arraycopy((char[])m_obj, m_start+srcBegin, dst, dstBegin, srcEnd);
215   }
216 
217 }
218