1 package org.jacorb.notification; 2 3 23 24 import java.util.ArrayList ; 25 import java.util.Collections ; 26 import java.util.HashMap ; 27 import java.util.List ; 28 import java.util.Map ; 29 30 import org.apache.avalon.framework.logger.Logger; 31 import org.jacorb.notification.util.LogUtil; 32 import org.omg.CosNotifyFilter.Filter; 33 import org.omg.CosNotifyFilter.FilterAdminOperations; 34 import org.omg.CosNotifyFilter.FilterNotFound; 35 36 import EDU.oswego.cs.dl.util.concurrent.SynchronizedInt; 37 38 42 43 public class FilterManager implements FilterAdminOperations 44 { 45 public static final FilterManager EMPTY_FILTER_MANAGER = new FilterManager(Collections.EMPTY_MAP); 46 47 private static final Integer [] INTEGER_ARRAY_TEMPLATE = new Integer [0]; 48 49 51 private final Map filters_; 52 53 private final Object filtersLock_ = new Object (); 54 55 private boolean filtersModified_; 56 57 private final List filterList_ = new ArrayList (); 58 59 private final List filtersReadOnlyView_ = Collections.unmodifiableList(filterList_); 60 61 private final SynchronizedInt filterIdPool_ = new SynchronizedInt(0); 62 63 private final Logger logger_; 64 65 67 protected FilterManager(Map filters) 68 { 69 filters_ = filters; 70 71 filtersModified_ = true; 72 73 logger_ = LogUtil.getLogger(getClass().getName()); 74 } 75 76 public FilterManager() 77 { 78 this(new HashMap ()); 79 } 80 81 83 private Integer getFilterId() 84 { 85 return new Integer (filterIdPool_.increment()); 86 } 87 88 public int add_filter(Filter filter) 89 { 90 Integer _key = getFilterId(); 91 92 if (logger_.isWarnEnabled()) 93 { 94 try 95 { 96 if (!((org.omg.CORBA.portable.ObjectImpl ) filter)._is_local()) 97 { 98 logger_.warn("filter is not local!"); 99 } 100 } catch (Exception e) 101 { 102 } 104 } 105 106 synchronized (filtersLock_) 107 { 108 filters_.put(_key, filter); 109 110 filtersModified_ = true; 111 } 112 113 return _key.intValue(); 114 } 115 116 public void remove_filter(int filterId) throws FilterNotFound 117 { 118 Integer _key = new Integer (filterId); 119 120 synchronized (filtersLock_) 121 { 122 if (filters_.containsKey(_key)) 123 { 124 filters_.remove(_key); 125 filtersModified_ = true; 126 } 127 else 128 { 129 throwFilterNotFound(_key); 130 } 131 } 132 } 133 134 public Filter get_filter(int filterId) throws FilterNotFound 135 { 136 Integer _key = new Integer (filterId); 137 138 final Filter _filter; 139 140 synchronized (filtersLock_) 141 { 142 _filter = (Filter) filters_.get(_key); 143 } 144 145 if (_filter == null) 146 { 147 throwFilterNotFound(_key); 148 } 149 150 return _filter; 151 } 152 153 private void throwFilterNotFound(Integer filterId) throws FilterNotFound 154 { 155 throw new FilterNotFound("Filter with ID=" + filterId + " does not exist"); 156 } 157 158 public int[] get_all_filters() 159 { 160 final Integer [] _keys; 161 162 synchronized (filtersLock_) 163 { 164 _keys = (Integer []) filters_.keySet().toArray(INTEGER_ARRAY_TEMPLATE); 165 } 166 167 final int[] _intKeys = new int[_keys.length]; 168 169 for (int x = 0; x < _keys.length; ++x) 170 { 171 _intKeys[x] = _keys[x].intValue(); 172 } 173 174 return _intKeys; 175 } 176 177 public void remove_all_filters() 178 { 179 synchronized (filtersLock_) 180 { 181 filters_.clear(); 182 filtersModified_ = true; 183 } 184 } 185 186 public List getFilters() 187 { 188 synchronized (filtersLock_) 189 { 190 if (filtersModified_) 191 { 192 filterList_.clear(); 193 194 filterList_.addAll(filters_.values()); 195 196 filtersModified_ = false; 197 } 198 } 199 return filtersReadOnlyView_; 200 } 201 } 202 | Popular Tags |