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: StringToIntTable.java 468654 2006-10-28 07:09:23Z minchau $
020 */
021 package org.apache.xml.serializer.utils;
022
023 /**
024 * A very simple lookup table that stores a list of strings, the even
025 * number strings being keys, and the odd number strings being values.
026 *
027 * This class is a copy of the one in org.apache.xml.utils.
028 * It exists to cut the serializers dependancy on that package.
029 *
030 * This class is not a public API, it is only public so it can be used
031 * in org.apache.xml.serializer.
032 *
033 * @xsl.usage internal
034 */
035 public final class StringToIntTable
036 {
037
038 public static final int INVALID_KEY = -10000;
039
040 /** Block size to allocate */
041 private int m_blocksize;
042
043 /** Array of strings this table points to. Associated with ints
044 * in m_values */
045 private String m_map[];
046
047 /** Array of ints this table points. Associated with strings from
048 * m_map. */
049 private int m_values[];
050
051 /** Number of ints in the table */
052 private int m_firstFree = 0;
053
054 /** Size of this table */
055 private int m_mapSize;
056
057 /**
058 * Default constructor. Note that the default
059 * block size is very small, for small lists.
060 */
061 public StringToIntTable()
062 {
063
064 m_blocksize = 8;
065 m_mapSize = m_blocksize;
066 m_map = new String[m_blocksize];
067 m_values = new int[m_blocksize];
068 }
069
070 /**
071 * Construct a StringToIntTable, using the given block size.
072 *
073 * @param blocksize Size of block to allocate
074 */
075 public StringToIntTable(int blocksize)
076 {
077
078 m_blocksize = blocksize;
079 m_mapSize = blocksize;
080 m_map = new String[blocksize];
081 m_values = new int[m_blocksize];
082 }
083
084 /**
085 * Get the length of the list.
086 *
087 * @return the length of the list
088 */
089 public final int getLength()
090 {
091 return m_firstFree;
092 }
093
094 /**
095 * Append a string onto the vector.
096 *
097 * @param key String to append
098 * @param value The int value of the string
099 */
100 public final void put(String key, int value)
101 {
102
103 if ((m_firstFree + 1) >= m_mapSize)
104 {
105 m_mapSize += m_blocksize;
106
107 String newMap[] = new String[m_mapSize];
108
109 System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1);
110
111 m_map = newMap;
112
113 int newValues[] = new int[m_mapSize];
114
115 System.arraycopy(m_values, 0, newValues, 0, m_firstFree + 1);
116
117 m_values = newValues;
118 }
119
120 m_map[m_firstFree] = key;
121 m_values[m_firstFree] = value;
122
123 m_firstFree++;
124 }
125
126 /**
127 * Tell if the table contains the given string.
128 *
129 * @param key String to look for
130 *
131 * @return The String's int value
132 *
133 */
134 public final int get(String key)
135 {
136
137 for (int i = 0; i < m_firstFree; i++)
138 {
139 if (m_map[i].equals(key))
140 return m_values[i];
141 }
142
143 return INVALID_KEY;
144 }
145
146 /**
147 * Tell if the table contains the given string. Ignore case.
148 *
149 * @param key String to look for
150 *
151 * @return The string's int value
152 */
153 public final int getIgnoreCase(String key)
154 {
155
156 if (null == key)
157 return INVALID_KEY;
158
159 for (int i = 0; i < m_firstFree; i++)
160 {
161 if (m_map[i].equalsIgnoreCase(key))
162 return m_values[i];
163 }
164
165 return INVALID_KEY;
166 }
167
168 /**
169 * Tell if the table contains the given string.
170 *
171 * @param key String to look for
172 *
173 * @return True if the string is in the table
174 */
175 public final boolean contains(String key)
176 {
177
178 for (int i = 0; i < m_firstFree; i++)
179 {
180 if (m_map[i].equals(key))
181 return true;
182 }
183
184 return false;
185 }
186
187 /**
188 * Return array of keys in the table.
189 *
190 * @return Array of strings
191 */
192 public final String[] keys()
193 {
194 String [] keysArr = new String[m_firstFree];
195
196 for (int i = 0; i < m_firstFree; i++)
197 {
198 keysArr[i] = m_map[i];
199 }
200
201 return keysArr;
202 }
203 }