001 package org.cumulus4j.store.model;
002
003 import java.util.LinkedList;
004 import java.util.List;
005
006 public abstract class RunnableManager {
007 private int scopeCounter = 0;
008 private List<Runnable> runnables = new LinkedList<Runnable>();
009
010 protected RunnableManager() { }
011
012 public void enterScope() {
013 ++scopeCounter;
014 }
015
016 public void exitScope() {
017 if (--scopeCounter == 0) {
018 runRunnables();
019 }
020
021 if (scopeCounter < 0)
022 throw new IllegalStateException("scopeCounter < 0");
023 }
024
025 protected void assertInScope() {
026 if (scopeCounter < 1)
027 throw new IllegalStateException("scopeCounter < 1");
028 }
029
030 public void addRunnable(Runnable runnable) {
031 if (runnable == null)
032 throw new IllegalArgumentException("runnable == null");
033
034 runnables.add(runnable);
035 }
036
037 protected void runRunnables() {
038 // for (Iterator<Runnable> it = runnables.iterator(); it.hasNext(); ) {
039 // Runnable runnable = it.next();
040 // it.remove();
041 // runnable.run();
042 // }
043
044 // runnables might add other runnables => continue fetching until empty.
045 while (!runnables.isEmpty()) {
046 Runnable runnable = runnables.remove(0);
047 runnable.run();
048 }
049 }
050 }