00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 package org.objectweb.cjdbc.controller.cache.result.schema;
00026
00027 import java.io.Serializable;
00028 import java.sql.SQLException;
00029 import java.util.ArrayList;
00030 import java.util.HashMap;
00031 import java.util.Iterator;
00032
00033 import org.objectweb.cjdbc.common.sql.RequestType;
00034 import org.objectweb.cjdbc.common.sql.schema.DatabaseColumn;
00035 import org.objectweb.cjdbc.common.sql.schema.DatabaseTable;
00036 import org.objectweb.cjdbc.controller.cache.result.entries.CacheEntry;
00037 import org.objectweb.cjdbc.controller.cache.result.entries.ResultCacheEntry;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 public class CacheDatabaseTable implements Serializable
00052 {
00053 private String name;
00054 private ArrayList columns;
00055 private ArrayList cacheEntries;
00056 private HashMap pkCacheEntries;
00057
00058
00059
00060
00061
00062
00063 public CacheDatabaseTable(DatabaseTable databaseTable)
00064 {
00065
00066 name = databaseTable.getName();
00067 ArrayList origColumns = databaseTable.getColumns();
00068 int size = origColumns.size();
00069 columns = new ArrayList(size);
00070 for (int i = 0; i < size; i++)
00071 columns.add(new CacheDatabaseColumn(((DatabaseColumn) origColumns.get(i))
00072 .getName()));
00073
00074
00075 cacheEntries = new ArrayList();
00076 pkCacheEntries = new HashMap();
00077 }
00078
00079
00080
00081
00082
00083
00084 public String getName()
00085 {
00086 return name;
00087 }
00088
00089
00090
00091
00092
00093
00094
00095
00096 public void addColumn(CacheDatabaseColumn column)
00097 {
00098 columns.add(column);
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 public void mergeColumns(CacheDatabaseTable t) throws SQLException
00110 {
00111 if (t == null)
00112 return;
00113
00114 ArrayList otherColumns = t.getColumns();
00115 if (otherColumns == null)
00116 return;
00117
00118 int size = otherColumns.size();
00119 for (int i = 0; i < size; i++)
00120 {
00121 CacheDatabaseColumn c = (CacheDatabaseColumn) otherColumns.get(i);
00122 CacheDatabaseColumn original = getColumn(c.getName());
00123 if (original == null)
00124 addColumn(c);
00125 else
00126 {
00127 if (!original.equals(c))
00128 throw new SQLException("Column " + c.getName()
00129 + " definition mismatch.");
00130 }
00131 }
00132 }
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 public ArrayList getColumns()
00143 {
00144 return columns;
00145 }
00146
00147
00148
00149
00150
00151
00152
00153
00154 public CacheDatabaseColumn getColumn(String columnName)
00155 {
00156 for (Iterator i = columns.iterator(); i.hasNext();)
00157 {
00158 CacheDatabaseColumn c = (CacheDatabaseColumn) i.next();
00159 if (columnName.compareToIgnoreCase(c.getName()) == 0)
00160 return c;
00161 }
00162 return null;
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172 public boolean equals(Object other)
00173 {
00174 if (!(other instanceof CacheDatabaseTable))
00175 return false;
00176
00177 CacheDatabaseTable t = (CacheDatabaseTable) other;
00178 return t.getName().equals(name) && t.getColumns().equals(columns);
00179 }
00180
00181
00182
00183
00184
00185
00186
00187 public synchronized void addCacheEntry(CacheEntry ce)
00188 {
00189 cacheEntries.add(ce);
00190 }
00191
00192
00193
00194
00195
00196
00197
00198 public void addPkCacheEntry(String pk, CacheEntry ce)
00199 {
00200 synchronized (pkCacheEntries)
00201 {
00202 pkCacheEntries.put(pk, ce);
00203 }
00204 }
00205
00206
00207
00208
00209
00210
00211
00212 public ResultCacheEntry getPkResultCacheEntry(String pk)
00213 {
00214 if (pk == null)
00215 return null;
00216 synchronized (pkCacheEntries)
00217 {
00218 return (ResultCacheEntry) pkCacheEntries.get(pk);
00219 }
00220 }
00221
00222
00223
00224
00225
00226
00227 public void removePkResultCacheEntry(Object pk)
00228 {
00229 synchronized (pkCacheEntries)
00230 {
00231 ResultCacheEntry rce = (ResultCacheEntry) pkCacheEntries.remove(pk);
00232 rce.invalidate();
00233 }
00234 }
00235
00236
00237
00238
00239
00240 public void invalidateAll()
00241 {
00242 synchronized (this)
00243 {
00244 for (Iterator i = cacheEntries.iterator(); i.hasNext();)
00245 ((ResultCacheEntry) i.next()).invalidate();
00246 cacheEntries.clear();
00247
00248 for (int i = 0; i < columns.size(); i++)
00249 ((CacheDatabaseColumn) columns.get(i)).invalidateAll();
00250 }
00251 synchronized (pkCacheEntries)
00252 {
00253
00254 pkCacheEntries.clear();
00255 }
00256 }
00257
00258
00259
00260
00261
00262 public synchronized void invalidateAllExceptPk()
00263 {
00264 for (Iterator i = cacheEntries.iterator(); i.hasNext();)
00265 {
00266 ResultCacheEntry qce = (ResultCacheEntry) i.next();
00267 if (qce.getRequest().getCacheAbility() != RequestType.UNIQUE_CACHEABLE)
00268 qce.invalidate();
00269 }
00270 cacheEntries.clear();
00271 }
00272
00273
00274
00275
00276
00277
00278
00279 public String getInformation(boolean longFormat)
00280 {
00281 String result = "Table " + name + ": ";
00282 int size = columns.size();
00283 for (int i = 0; i < size; i++)
00284 {
00285 CacheDatabaseColumn c = (CacheDatabaseColumn) columns.get(i);
00286 if (longFormat)
00287 result += "\n";
00288 result += c.getInformation();
00289 if (!longFormat && (i < size - 1))
00290 result += ",";
00291 }
00292 return result;
00293 }
00294 }