- Timestamp:
- 07/14/13 23:20:04 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
java/main/src/main/java/com/framsticks/core/AbstractTree.java
r100 r101 1 1 package com.framsticks.core; 2 2 3 import java.util.Comparator; 4 import java.util.Iterator; 3 5 import java.util.Map; 6 import java.util.PriorityQueue; 4 7 5 8 import javax.annotation.Nonnull; … … 9 12 import org.apache.logging.log4j.LogManager; 10 13 14 import com.framsticks.communication.queries.NeedFile; 15 import com.framsticks.communication.queries.NeedFileAcceptor; 11 16 import com.framsticks.params.Access; 12 17 import com.framsticks.params.CompositeParam; 13 18 import com.framsticks.params.FramsClass; 19 import com.framsticks.params.ParamFlags; 14 20 import com.framsticks.params.ParamsPackage; 15 21 import com.framsticks.params.Registry; … … 20 26 import com.framsticks.util.Misc; 21 27 import com.framsticks.util.dispatching.AbstractJoinable; 28 import com.framsticks.util.dispatching.BufferedDispatcher; 22 29 import com.framsticks.util.dispatching.Dispatcher; 23 30 import com.framsticks.util.dispatching.Dispatching; 24 31 import com.framsticks.util.dispatching.ExceptionResultHandler; 25 32 import com.framsticks.util.dispatching.Joinable; 26 import com.framsticks.util.dispatching.JoinableDispatcher;27 33 import com.framsticks.util.dispatching.JoinableParent; 28 34 import com.framsticks.util.dispatching.JoinableState; … … 30 36 import com.framsticks.util.dispatching.Thread; 31 37 import com.framsticks.util.dispatching.ThrowExceptionHandler; 32 import com.framsticks.util.lang. Casting;38 import com.framsticks.util.lang.Pair; 33 39 34 40 /** … … 36 42 */ 37 43 @FramsClassAnnotation 38 public abstract class AbstractTree extends AbstractJoinable implements Dispatcher<Tree>, Tree, JoinableParent {44 public abstract class AbstractTree extends AbstractJoinable implements Dispatcher<Tree>, Tree, JoinableParent, NeedFileAcceptor { 39 45 40 46 private static final Logger log = LogManager.getLogger(AbstractTree.class); … … 43 49 private ExceptionResultHandler handler = ThrowExceptionHandler.getInstance(); 44 50 45 private JoinableDispatcher<Tree> dispatcher; 51 protected final BufferedDispatcher<Tree> bufferedDispatcher = new BufferedDispatcher<>(); 52 53 protected final PriorityQueue<Pair<Integer, NeedFileAcceptor>> needFileAcceptors = new PriorityQueue<>(32, new Comparator<Pair<Integer, NeedFileAcceptor>>() { 54 55 @Override 56 public int compare(Pair<Integer, NeedFileAcceptor> arg0, Pair<Integer, NeedFileAcceptor> arg1) { 57 if (arg0.first < arg1.first) { 58 return -1; 59 } 60 if (arg0.first > arg1.first) { 61 return 1; 62 } 63 return 0; 64 } 65 }); 46 66 47 67 @Override … … 152 172 */ 153 173 @Override 154 public JoinableDispatcher<Tree> getDispatcher() {155 return dispatcher;174 public Dispatcher<Tree> getDispatcher() { 175 return bufferedDispatcher.getTargetDispatcher(); 156 176 } 157 177 … … 160 180 */ 161 181 @Override 162 public void setDispatcher( JoinableDispatcher<Tree> dispatcher) {163 if ( this.dispatcher!= null) {164 throw new FramsticksException().msg("dispatcher is already set").arg("tree", this).arg("dispatcher", dispatcher);165 } 166 this.dispatcher = dispatcher;182 public void setDispatcher(Dispatcher<Tree> dispatcher) { 183 if (bufferedDispatcher.getTargetDispatcher() != null) { 184 throw new FramsticksException().msg("dispatcher is already set").arg("tree", this).arg("dispatcher", bufferedDispatcher.getTargetDispatcher()); 185 } 186 bufferedDispatcher.setTargetDispatcher(dispatcher); 167 187 } 168 188 … … 170 190 * @return the name 171 191 */ 172 @ParamAnnotation 192 @ParamAnnotation(flags = ParamFlags.USERREADONLY) 173 193 public String getName() { 174 194 return name; … … 193 213 @Override 194 214 protected void joinableStart() { 195 if ( dispatcher== null) {196 dispatcher = new Thread<Tree>();197 } 198 Dispatching.use( dispatcher, this);215 if (bufferedDispatcher.getTargetDispatcher() == null) { 216 bufferedDispatcher.setTargetDispatcher(new Thread<Tree>()); 217 } 218 Dispatching.use(bufferedDispatcher.getTargetDispatcher(), this); 199 219 } 200 220 201 221 @Override 202 222 protected void joinableInterrupt() { 203 Dispatching.drop( dispatcher, this);223 Dispatching.drop(bufferedDispatcher.getTargetDispatcher(), this); 204 224 } 205 225 … … 211 231 @Override 212 232 protected void joinableJoin() throws InterruptedException { 213 Dispatching.join( dispatcher);233 Dispatching.join(bufferedDispatcher.getTargetDispatcher()); 214 234 } 215 235 216 236 @Override 217 237 public void childChangedState(Joinable joinable, JoinableState state) { 218 if (joinable == dispatcher) {238 if (joinable == bufferedDispatcher.getTargetDispatcher()) { 219 239 proceedToState(state); 220 240 } … … 223 243 @Override 224 244 public boolean isActive() { 225 if (dispatcher == null) { 226 throw new FramsticksException().msg("no dispatcher is set for tree yet").arg("tree", this); 227 } 228 return dispatcher.isActive(); 245 return bufferedDispatcher.isActive(); 229 246 } 230 247 231 248 @Override 232 249 public void dispatch(RunAt<? extends Tree> runnable) { 233 if (dispatcher == null) { 234 throw new FramsticksException().msg("no dispatcher is set for tree yet").arg("tree", this); 235 } 236 dispatcher.dispatch(runnable); 250 bufferedDispatcher.dispatch(runnable); 237 251 } 238 252 … … 242 256 243 257 @Override 244 public void putSideNote(Object object, Object key, Objectvalue) {258 public <T> void putSideNote(Object object, SideNoteKey<T> key, T value) { 245 259 assert isActive(); 246 260 Misc.throwIfNull(object); … … 253 267 } 254 268 @SuppressWarnings("unchecked") 255 Map< Object, Object> sideNotesMap = (Map<Object, Object>) sideNote;269 Map<SideNoteKey<?>, Object> sideNotesMap = (Map<SideNoteKey<?>, Object>) sideNote; 256 270 sideNotesMap.put(key, value); 257 271 } 258 272 259 @Override 260 public <T> T getSideNote(Object object, Object key, Class<T> valueType) { 273 @SuppressWarnings("unchecked") 274 @Override 275 public <T> T getSideNote(Object object, SideNoteKey<T> key) { 261 276 assert isActive(); 262 277 Misc.throwIfNull(object); … … 266 281 return null; 267 282 } 268 return Casting.nullOrThrowCast(valueType, ((Map<?, ?>) sideNote).get(key)); 269 } 270 271 @Override 272 public boolean removeSideNote(Object object, Object key) { 283 Object value = ((Map<SideNoteKey<?>, Object>) sideNote).get(key); 284 if (value == null) { 285 return null; 286 } 287 return (T) value; 288 } 289 290 @Override 291 public boolean removeSideNote(Object object, SideNoteKey<?> key) { 292 assert isActive(); 273 293 Object sideNote = sideNotes.get(object); 274 294 if (sideNote == null) { … … 276 296 } 277 297 @SuppressWarnings("unchecked") 278 Map< Object, Object> sideNotesMap = (Map<Object, Object>) sideNote;298 Map<SideNoteKey<?>, Object> sideNotesMap = (Map<SideNoteKey<?>, Object>) sideNote; 279 299 boolean result = (sideNotesMap.remove(key) != null); 280 300 if (sideNotesMap.isEmpty()) { … … 284 304 } 285 305 306 @Override 307 public void addNeedFileAcceptor(int priority, NeedFileAcceptor acceptor) { 308 assert isActive(); 309 needFileAcceptors.add(Pair.make(priority, acceptor)); 310 } 311 312 @Override 313 public void removeNeedFileAcceptor(NeedFileAcceptor acceptor) { 314 assert isActive(); 315 Iterator<Pair<Integer, NeedFileAcceptor>> i = needFileAcceptors.iterator(); 316 while (i.hasNext()) { 317 if (i.next().second == acceptor) { 318 i.remove(); 319 break; 320 } 321 } 322 } 323 324 @Override 325 public boolean acceptNeed(final NeedFile needFile) { 326 Dispatching.dispatchIfNotActive(this, new RunAt<AbstractTree>(needFile.getFuture()) { 327 328 @Override 329 protected void runAt() { 330 for (Pair<Integer, NeedFileAcceptor> acceptor : needFileAcceptors) { 331 if (acceptor.second.acceptNeed(needFile)) { 332 return; 333 } 334 } 335 throw new FramsticksException().msg("failed to find need file acceptor in tree").arg("tree", AbstractTree.this); 336 } 337 }); 338 return true; 339 } 340 286 341 } 287 342
Note: See TracChangeset
for help on using the changeset viewer.