package net.i2p.client.streaming.impl; import java.util.ArrayList; import java.util.List; import net.i2p.I2PAppContext; import net.i2p.util.Log; /** * Examine a connection's state and pick the right scheduler for it. * */ class SchedulerChooser { private final I2PAppContext _context; private final Log _log; private final TaskScheduler _nullScheduler; /** list of TaskScheduler objects */ private final List<TaskScheduler> _schedulers; public SchedulerChooser(I2PAppContext context) { _context = context; _log = context.logManager().getLog(SchedulerChooser.class); _schedulers = createSchedulers(); _nullScheduler = new NullScheduler(); } public TaskScheduler getScheduler(Connection con) { for (int i = 0; i < _schedulers.size(); i++) { TaskScheduler scheduler = _schedulers.get(i); if (scheduler.accept(con)) { //if (_log.shouldLog(Log.DEBUG)) // _log.debug("Scheduling for " + con + " with " + scheduler.getClass().getSimpleName()); return scheduler; } } return _nullScheduler; } private List<TaskScheduler> createSchedulers() { List<TaskScheduler> rv = new ArrayList<TaskScheduler>(8); rv.add(new SchedulerHardDisconnected(_context)); rv.add(new SchedulerPreconnect(_context)); rv.add(new SchedulerConnecting(_context)); rv.add(new SchedulerReceived(_context)); rv.add(new SchedulerConnectedBulk(_context)); rv.add(new SchedulerClosing(_context)); rv.add(new SchedulerClosed(_context)); rv.add(new SchedulerDead(_context)); return rv; } private class NullScheduler implements TaskScheduler { public void eventOccurred(Connection con) { if (_log.shouldLog(Log.WARN)) _log.warn("Yell at jrandom: Event occurred on " + con, new Exception("source")); } public boolean accept(Connection con) { return true; } }; }