00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 package cast.core;
00027
00028 import java.util.ArrayList;
00029 import java.util.Collection;
00030 import java.util.HashMap;
00031 import java.util.LinkedHashMap;
00032 import java.util.Set;
00033
00034 import cast.cdl.WorkingMemoryEntry;
00035
00042 public class CASTWorkingMemory implements CASTWorkingMemoryInterface {
00043
00044
00045
00046
00047
00048
00049 private final LinkedHashMap<String, WorkingMemoryEntry> m_storage;
00050
00051 private final HashMap<String,Integer> m_lastVersions;
00052
00056 public CASTWorkingMemory() {
00057 m_storage = new LinkedHashMap<String, WorkingMemoryEntry>(20);
00058 m_lastVersions = new HashMap<String, Integer>(20);
00059 }
00060
00071 public WorkingMemoryEntry[] getArrayByType(String _type, int _count) {
00072 Collection<WorkingMemoryEntry> temp = getByType(_type, _count);
00073 WorkingMemoryEntry[] wmel = new WorkingMemoryEntry[temp.size()];
00074 temp.toArray(wmel);
00075 return wmel;
00076 }
00077
00078
00079
00080
00081
00082
00083
00084 public Collection<WorkingMemoryEntry> getByType(String _type, int _count) {
00085
00086 Collection<WorkingMemoryEntry> temp = new ArrayList<WorkingMemoryEntry>();
00087 int count = 0;
00088
00089
00090 Set<String> keys = m_storage.keySet();
00091 String[] keyArray = new String[keys.size()];
00092 keys.toArray(keyArray);
00093
00094 WorkingMemoryEntry item;
00095
00096 for (int i = keyArray.length - 1; i >= 0; i--) {
00097 item = m_storage.get(keyArray[i]);
00098 if (item.type.equals(_type)) {
00099 temp.add(item);
00100 count++;
00101 }
00102 if (count == _count) {
00103 break;
00104 }
00105 }
00106 return temp;
00107 }
00108
00109
00110
00111
00112
00113
00114 public Collection<WorkingMemoryEntry> getByType(String _type) {
00115 return getByType(_type, m_storage.size());
00116 }
00117
00124 @Override
00125 public String toString() {
00126 String out = "[\n";
00127
00128 Set<String> keys = m_storage.keySet();
00129 WorkingMemoryEntry item;
00130
00131 for (String id : keys) {
00132 item = m_storage.get(id);
00133
00134
00135 out += id + ": [" + item.type + " ["
00136 + "<set ontology for printing>" + "]]\n";
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 out += "\n]";
00163
00164 return out;
00165 }
00166
00167
00168
00169
00170
00171
00172
00173 public boolean add(String _id, WorkingMemoryEntry _data) {
00174
00175 assert _data.version == 0 : " verion not 0: " + _data.version;
00176
00177 if (!m_storage.containsKey(_id)) {
00178
00179
00180 if(m_lastVersions.containsKey(_id)) {
00181
00182 _data.version = m_lastVersions.get(_id) + 1;
00183 m_lastVersions.remove(_id);
00184 }
00185
00186 m_storage.put(_id, _data);
00187 return true;
00188 } else {
00189 return false;
00190 }
00191 }
00192
00193
00194
00195
00196
00197
00198
00199 public boolean overwrite(String _id, WorkingMemoryEntry _data) {
00200 if (m_storage.containsKey(_id)) {
00201
00202 _data.version = m_storage.get(_id).version + 1;
00203 m_storage.put(_id, _data);
00204 return true;
00205 } else {
00206 System.err.println("data NOT overwritten");
00207 return false;
00208 }
00209 }
00210
00211
00212
00213
00214
00215
00216 public WorkingMemoryEntry remove(String _id) {
00217
00218
00219 WorkingMemoryEntry item = m_storage.remove(_id);
00220 if (item == null) {
00221 return null;
00222 } else {
00223
00224 m_lastVersions.put(_id, item.version);
00225 return item;
00226 }
00227 }
00228
00229
00230
00231
00232
00233
00234 public WorkingMemoryEntry get(String _id) {
00235 return m_storage.get(_id);
00236 }
00237
00238
00239
00240
00241
00242
00243
00244 public ArrayList<String> getIDsByType(String _type, int _count) {
00245
00246 if (_count == 0) {
00247 _count = m_storage.size();
00248 }
00249
00250 ArrayList<String> ids = new ArrayList<String>();
00251 Set<String> keys = m_storage.keySet();
00252 String[] keyArray = new String[keys.size()];
00253 keys.toArray(keyArray);
00254
00255 WorkingMemoryEntry item;
00256
00257 int count = 0;
00258
00259 for (int i = keyArray.length - 1; i >= 0; i--) {
00260 item = m_storage.get(keyArray[i]);
00261 if (item.type.equals(_type)) {
00262 ids.add(keyArray[i]);
00263 count++;
00264 }
00265 if (count == _count) {
00266 break;
00267 }
00268 }
00269 return ids;
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297 public int size() {
00298 return m_storage.size();
00299 }
00300
00301
00302
00303
00304
00305
00306 public boolean contains(String _queryID) {
00307 return m_storage.containsKey(_queryID);
00308 }
00309
00316 public boolean hasContained(String _queryID) {
00317 if(contains(_queryID)) {
00318 return true;
00319 }
00320 return m_lastVersions.containsKey(_queryID);
00321 }
00322
00323
00324
00325
00326
00327
00328 public int getOverwriteCount(String _queryID) {
00329 WorkingMemoryEntry item = m_storage.get(_queryID);
00330 if(item != null) {
00331 return item.version;
00332 }
00333
00334 Integer lastCount = m_lastVersions.get(_queryID);
00335 if(lastCount != null) {
00336 return lastCount;
00337 }
00338
00339 return -1;
00340
00341
00342 }
00343 }