package de.skuzzle.polly.tools.io; import java.io.OutputStream; import de.skuzzle.jeve.EventProvider; public class BandwidthManager { private final ChainedAllocationStrategy outputStrategy; private final EventProvider outputEvents; public BandwidthManager() { this.outputStrategy = new ChainedAllocationStrategy(null); this.outputEvents = EventProvider.newDefaultEventProvider(); } public BandwidthOutputStream newManagedOutput(OutputStream out, AllocationStrategy subStrategy) { final BandwidthOutputStream r = new BandwidthOutputStream(out, this.outputStrategy); this.setSubStrategy(r, subStrategy); this.outputEvents.addListener(StrategyChangedListener.class, r); return r; } public BandwidthOutputStream newManagedOutput(OutputStream out) { final BandwidthOutputStream r = new BandwidthOutputStream(out, this.outputStrategy); this.outputEvents.addListener(StrategyChangedListener.class, r); return r; } public void setSubStrategy(BandwidthOutputStream child, AllocationStrategy strategy) { this.outputStrategy.setStrategy(child, strategy); } public void setOutputRootStrategy(AllocationStrategy strategy) { if (strategy == null) { throw new NullPointerException(); } this.outputStrategy.setRootStrategy(strategy); this.fireOutputStrategyChanged(strategy); } void removeOutputStrategyChangedListener(StrategyChangedListener listener) { this.outputEvents.removeListener(StrategyChangedListener.class, listener); } private void fireOutputStrategyChanged(AllocationStrategy newStrategy) { final StrategyChangedEvent e = new StrategyChangedEvent(this, newStrategy); this.outputEvents.dispatch(StrategyChangedListener.class, e, StrategyChangedListener::strategyChanged); } }