1 23 24 package org.continuent.sequoia.controller.cache.result.schema; 25 26 import java.sql.SQLException ; 27 import java.util.ArrayList ; 28 import java.util.HashMap ; 29 import java.util.Iterator ; 30 31 import org.continuent.sequoia.controller.cache.result.entries.AbstractResultCacheEntry; 32 import org.continuent.sequoia.controller.requests.RequestType; 33 import org.continuent.sequoia.controller.sql.schema.DatabaseColumn; 34 import org.continuent.sequoia.controller.sql.schema.DatabaseTable; 35 36 48 public class CacheDatabaseTable 49 { 50 private String name; 51 private ArrayList columns; 52 private ArrayList cacheEntries; private HashMap pkCacheEntries; 55 60 public CacheDatabaseTable(DatabaseTable databaseTable) 61 { 62 name = databaseTable.getName(); 64 ArrayList origColumns = databaseTable.getColumns(); 65 int size = origColumns.size(); 66 columns = new ArrayList (size); 67 for (int i = 0; i < size; i++) 68 columns.add(new CacheDatabaseColumn(((DatabaseColumn) origColumns.get(i)) 69 .getName())); 70 71 cacheEntries = new ArrayList (); 73 pkCacheEntries = new HashMap (); 74 } 75 76 81 public String getName() 82 { 83 return name; 84 } 85 86 93 public void addColumn(CacheDatabaseColumn column) 94 { 95 columns.add(column); 96 } 97 98 106 public void mergeColumns(CacheDatabaseTable t) throws SQLException 107 { 108 if (t == null) 109 return; 110 111 ArrayList otherColumns = t.getColumns(); 112 if (otherColumns == null) 113 return; 114 115 int size = otherColumns.size(); 116 for (int i = 0; i < size; i++) 117 { 118 CacheDatabaseColumn c = (CacheDatabaseColumn) otherColumns.get(i); 119 CacheDatabaseColumn original = getColumn(c.getName()); 120 if (original == null) 121 addColumn(c); 122 else 123 { 124 if (!original.equals(c)) 125 throw new SQLException ("Column " + c.getName() 126 + " definition mismatch."); 127 } 128 } 129 } 130 131 139 public ArrayList getColumns() 140 { 141 return columns; 142 } 143 144 151 public CacheDatabaseColumn getColumn(String columnName) 152 { 153 for (Iterator i = columns.iterator(); i.hasNext();) 154 { 155 CacheDatabaseColumn c = (CacheDatabaseColumn) i.next(); 156 if (columnName.compareToIgnoreCase(c.getName()) == 0) 157 return c; 158 } 159 return null; 160 } 161 162 169 public boolean equals(Object other) 170 { 171 if (!(other instanceof CacheDatabaseTable)) 172 return false; 173 174 CacheDatabaseTable t = (CacheDatabaseTable) other; 175 return t.getName().equals(name) && t.getColumns().equals(columns); 176 } 177 178 184 public synchronized void addCacheEntry(AbstractResultCacheEntry ce) 185 { 186 cacheEntries.add(ce); 187 } 188 189 196 public void addPkCacheEntry(String pk, AbstractResultCacheEntry ce) 197 { 198 synchronized (pkCacheEntries) 199 { 200 pkCacheEntries.put(pk, ce); 201 } 202 } 203 204 210 public AbstractResultCacheEntry getPkResultCacheEntry(String pk) 211 { 212 if (pk == null) 213 return null; 214 synchronized (pkCacheEntries) 215 { 216 return (AbstractResultCacheEntry) pkCacheEntries.get(pk); 217 } 218 } 219 220 225 public void removePkResultCacheEntry(Object pk) 226 { 227 synchronized (pkCacheEntries) 228 { 229 AbstractResultCacheEntry rce = (AbstractResultCacheEntry) pkCacheEntries 230 .remove(pk); 231 rce.invalidate(); 232 } 233 } 234 235 239 public void invalidateAll() 240 { 241 synchronized (this) 242 { 243 for (Iterator i = cacheEntries.iterator(); i.hasNext();) 244 ((AbstractResultCacheEntry) i.next()).invalidate(); 245 cacheEntries.clear(); 246 247 for (int i = 0; i < columns.size(); i++) 248 ((CacheDatabaseColumn) columns.get(i)).invalidateAll(); 249 } 250 synchronized (pkCacheEntries) 251 { pkCacheEntries.clear(); 254 } 255 } 256 257 261 public synchronized void invalidateAllExceptPk() 262 { 263 for (Iterator i = cacheEntries.iterator(); i.hasNext();) 264 { 265 AbstractResultCacheEntry qce = (AbstractResultCacheEntry) i.next(); 266 if (qce.getRequest().getCacheAbility() != RequestType.UNIQUE_CACHEABLE) 267 qce.invalidate(); 268 } 269 cacheEntries.clear(); 270 } 271 272 278 public String getInformation(boolean longFormat) 279 { 280 String result = "Table " + name + ": "; 281 int size = columns.size(); 282 for (int i = 0; i < size; i++) 283 { 284 CacheDatabaseColumn c = (CacheDatabaseColumn) columns.get(i); 285 if (longFormat) 286 result += "\n"; 287 result += c.getInformation(); 288 if (!longFormat && (i < size - 1)) 289 result += ","; 290 } 291 return result; 292 } 293 } | Popular Tags |