00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00019 package cast.architecture;
00020
00021 import java.util.Collections;
00022 import java.util.List;
00023 import java.util.Queue;
00024 import java.util.Set;
00025 import java.util.SortedMap;
00026 import java.util.TreeMap;
00027 import java.util.Vector;
00028
00029 import cast.cdl.FilterRestriction;
00030 import cast.cdl.WorkingMemoryChange;
00031 import cast.cdl.WorkingMemoryChangeFilter;
00032 import cast.core.Pair;
00033
00040 public class WorkingMemoryChangeFilterMap<T> {
00041
00046 private class PriorityWrapper extends Pair<T, Integer> implements
00047 Comparable<PriorityWrapper> {
00048
00049 private Class<? extends Object> m_storedClass;
00050
00051 public PriorityWrapper(T _a, Integer _b) {
00052 super(_a, _b);
00053 m_storedClass = _a.getClass();
00054 }
00055
00056 public int compareTo(PriorityWrapper _o) {
00057 if (m_second == _o.m_second) {
00058 return 0;
00059 } else if (m_second < _o.m_second) {
00060 return 1;
00061 } else {
00062 return -1;
00063 }
00064 }
00065
00066 @Override
00067 public boolean equals(Object _obj) {
00068
00069 if (_obj == this) {
00070 return true;
00071 } else if (_obj instanceof WorkingMemoryChangeFilterMap.PriorityWrapper) {
00072 PriorityWrapper p = (PriorityWrapper) _obj;
00073
00074 return p.m_first.equals(m_first);
00075 } else if (_obj.getClass().equals(m_storedClass)) {
00076 return _obj.equals(m_first);
00077 } else {
00078 return false;
00079 }
00080 }
00081
00082 }
00083
00087 private final SortedMap<WorkingMemoryChangeFilter, Vector<PriorityWrapper>> m_map;
00088
00092 private boolean m_localOnly;
00093
00097 public WorkingMemoryChangeFilterMap() {
00098
00099
00100
00101 m_map = new TreeMap<WorkingMemoryChangeFilter, Vector<PriorityWrapper>>(
00102 WorkingMemoryChangeFilterComparator.getComparator());
00103 m_localOnly = true;
00104 }
00105
00109 private final void updateFilters() {
00110 m_localOnly = true;
00111 for (WorkingMemoryChangeFilter filter : m_map.keySet()) {
00112 if (filter.restriction != FilterRestriction.LOCALSA) {
00113 m_localOnly = false;
00114 return;
00115 }
00116 }
00117 }
00118
00119 public synchronized boolean allowsChange(WorkingMemoryChange _wmc) {
00120 for (WorkingMemoryChangeFilter filter : m_map.keySet()) {
00121 if (WorkingMemoryChangeFilterComparator.allowsChange(filter, _wmc)) {
00122 return true;
00123 }
00124 }
00125 return false;
00126 }
00127
00134 public boolean localFiltersOnly() {
00135 return m_localOnly;
00136 }
00137
00142 public synchronized Set<WorkingMemoryChangeFilter> filterSet() {
00143 return m_map.keySet();
00144 }
00145
00146 private final void extractReceivers(Vector<PriorityWrapper> _wrappers,
00147 Queue<T> _receivers) {
00148 for (PriorityWrapper wrapper : _wrappers) {
00149 _receivers.add(wrapper.m_first);
00150 }
00151 }
00152
00159 public synchronized void get(WorkingMemoryChange _wmc, Queue<T> _receivers) {
00160
00161
00162
00163 for (WorkingMemoryChangeFilter filter : m_map.keySet()) {
00164 if (WorkingMemoryChangeFilterComparator.allowsChange(filter, _wmc)) {
00165 Vector<PriorityWrapper> receiverList = m_map.get(filter);
00166 if (receiverList == null) {
00167
00168
00169
00170
00171 } else if (receiverList.isEmpty()) {
00172
00173
00174
00175
00176 } else {
00177 extractReceivers(receiverList, _receivers);
00178 }
00179 }
00180
00181 }
00182 }
00183
00184 private synchronized Vector<PriorityWrapper> get(
00185 WorkingMemoryChangeFilter _key) {
00186 return m_map.get(_key);
00187 }
00188
00196 public synchronized void put(WorkingMemoryChangeFilter _key, T _value,
00197 int _priority) {
00198
00199
00200 Vector<PriorityWrapper> existingList = get(_key);
00201
00202
00203 if (existingList == null) {
00204 existingList = new Vector<PriorityWrapper>(1);
00205 }
00206
00207
00208 existingList.add(new PriorityWrapper(_value, _priority));
00209
00210 Collections.sort(existingList);
00211
00212
00213 m_localOnly = m_localOnly
00214 && (_key.restriction == FilterRestriction.LOCALSA);
00215
00216
00217 m_map.put(_key, existingList);
00218 }
00219
00220 public synchronized void remove(WorkingMemoryChangeFilter _key) {
00221 m_map.remove(_key);
00222 updateFilters();
00223 }
00224
00232 public synchronized void remove(T _receiver,
00233 List<WorkingMemoryChangeFilter> _removed) {
00234
00235 for (WorkingMemoryChangeFilter key : m_map.keySet()) {
00236
00237 Vector<PriorityWrapper> receivers = m_map.get(key);
00238
00239 removeAll(_receiver, receivers);
00240
00241 if (receivers.isEmpty()) {
00242 _removed.add(key);
00243 }
00244
00245 }
00246
00247
00248 if (!_removed.isEmpty()) {
00249
00250 for (WorkingMemoryChangeFilter filter : _removed) {
00251 m_map.remove(filter);
00252 }
00253
00254 updateFilters();
00255 }
00256
00257
00258
00259 }
00260
00268 private void removeAll(T _receiver, Vector<PriorityWrapper> _receivers) {
00269 int i = 0;
00270 while (i < _receivers.size()) {
00271 if (_receivers.get(i).m_first == _receiver) {
00272 _receivers.remove(i);
00273 }
00274 else {
00275 i++;
00276 }
00277 }
00278 }
00279
00280 public synchronized int size() {
00281 int size = 0;
00282 for (WorkingMemoryChangeFilter key : m_map.keySet()) {
00283 size += m_map.get(key).size();
00284 }
00285 return size;
00286 }
00287
00288 }