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: StringToStringTableVector.java 468655 2006-10-28 07:12:06Z minchau $ 020 */ 021 package org.apache.xml.utils; 022 023 /** 024 * A very simple table that stores a list of StringToStringTables, optimized 025 * for small lists. 026 * @xsl.usage internal 027 */ 028 public class StringToStringTableVector 029 { 030 031 /** Size of blocks to allocate */ 032 private int m_blocksize; 033 034 /** Array of StringToStringTable objects */ 035 private StringToStringTable m_map[]; 036 037 /** Number of StringToStringTable objects in this array */ 038 private int m_firstFree = 0; 039 040 /** Size of this array */ 041 private int m_mapSize; 042 043 /** 044 * Default constructor. Note that the default 045 * block size is very small, for small lists. 046 */ 047 public StringToStringTableVector() 048 { 049 050 m_blocksize = 8; 051 m_mapSize = m_blocksize; 052 m_map = new StringToStringTable[m_blocksize]; 053 } 054 055 /** 056 * Construct a StringToStringTableVector, using the given block size. 057 * 058 * @param blocksize Size of blocks to allocate 059 */ 060 public StringToStringTableVector(int blocksize) 061 { 062 063 m_blocksize = blocksize; 064 m_mapSize = blocksize; 065 m_map = new StringToStringTable[blocksize]; 066 } 067 068 /** 069 * Get the length of the list. 070 * 071 * @return Number of StringToStringTable objects in the list 072 */ 073 public final int getLength() 074 { 075 return m_firstFree; 076 } 077 078 /** 079 * Get the length of the list. 080 * 081 * @return Number of StringToStringTable objects in the list 082 */ 083 public final int size() 084 { 085 return m_firstFree; 086 } 087 088 /** 089 * Append a StringToStringTable object onto the vector. 090 * 091 * @param value StringToStringTable object to add 092 */ 093 public final void addElement(StringToStringTable value) 094 { 095 096 if ((m_firstFree + 1) >= m_mapSize) 097 { 098 m_mapSize += m_blocksize; 099 100 StringToStringTable newMap[] = new StringToStringTable[m_mapSize]; 101 102 System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1); 103 104 m_map = newMap; 105 } 106 107 m_map[m_firstFree] = value; 108 109 m_firstFree++; 110 } 111 112 /** 113 * Given a string, find the last added occurance value 114 * that matches the key. 115 * 116 * @param key String to look up 117 * 118 * @return the last added occurance value that matches the key 119 * or null if not found. 120 */ 121 public final String get(String key) 122 { 123 124 for (int i = m_firstFree - 1; i >= 0; --i) 125 { 126 String nsuri = m_map[i].get(key); 127 128 if (nsuri != null) 129 return nsuri; 130 } 131 132 return null; 133 } 134 135 /** 136 * Given a string, find out if there is a value in this table 137 * that matches the key. 138 * 139 * @param key String to look for 140 * 141 * @return True if the string was found in table, null if not 142 */ 143 public final boolean containsKey(String key) 144 { 145 146 for (int i = m_firstFree - 1; i >= 0; --i) 147 { 148 if (m_map[i].get(key) != null) 149 return true; 150 } 151 152 return false; 153 } 154 155 /** 156 * Remove the last element. 157 */ 158 public final void removeLastElem() 159 { 160 161 if (m_firstFree > 0) 162 { 163 m_map[m_firstFree] = null; 164 165 m_firstFree--; 166 } 167 } 168 169 /** 170 * Get the nth element. 171 * 172 * @param i Index of element to find 173 * 174 * @return The StringToStringTable object at the given index 175 */ 176 public final StringToStringTable elementAt(int i) 177 { 178 return m_map[i]; 179 } 180 181 /** 182 * Tell if the table contains the given StringToStringTable. 183 * 184 * @param s The StringToStringTable to find 185 * 186 * @return True if the StringToStringTable is found 187 */ 188 public final boolean contains(StringToStringTable s) 189 { 190 191 for (int i = 0; i < m_firstFree; i++) 192 { 193 if (m_map[i].equals(s)) 194 return true; 195 } 196 197 return false; 198 } 199 }