package com.framsticks.util.dispatching; import org.apache.log4j.Logger; // import edu.umd.cs.findbugs.annotations.SuppressWarnings; import com.framsticks.util.dispatching.Dispatching; public class JoinableMonitor implements JoinableParent { private static final Logger log = Logger.getLogger(JoinableMonitor.class); protected final Joinable joinable; /** * @param joinable */ public JoinableMonitor(Joinable joinable) { this.joinable = joinable; } public JoinableMonitor waitFor() { log.debug(this + " is waiting"); synchronized (this) { while (joinable.getState().ordinal() < JoinableState.FINISHING.ordinal()) { Dispatching.wait(this, 100); } } log.debug(this + " ended waiting"); return this; } public JoinableMonitor use() { log.debug(this + " is using"); Dispatching.use(joinable, this); return this; } public JoinableMonitor drop() { log.debug(this + " is droping"); Dispatching.drop(joinable, this); return this; } public JoinableMonitor join() { log.debug(this + " is joining"); Dispatching.joinAbsolutely(joinable); log.debug(this + " is joined"); return this; } @Override // @SuppressWarnings("NN_NAKED_NOTIFY") public void childChangedState(Joinable joinable, JoinableState state) { synchronized (this) { this.notify(); } log.debug(this + " received notification about transition to " + state); } @Override public String toString() { return "monitor for " + joinable; } }