package org.jrobin.core; import java.util.HashMap; import java.util.Map; import java.util.Timer; import java.util.TimerTask; public final class SyncManager { private int m_syncPeriod = RrdNioBackendFactory.DEFAULT_SYNC_PERIOD; private Timer m_timer = null; private Map<RrdNioBackend,TimerTask> m_tasks = new HashMap<RrdNioBackend,TimerTask>(); public SyncManager(final int syncPeriod) { m_syncPeriod = syncPeriod; } public int getSyncPeriod() { return m_syncPeriod; } public void setSyncPeriod(final int syncPeriod) { m_syncPeriod = syncPeriod; synchronized(m_tasks) { final Timer oldTimer = m_timer; m_timer = new SyncTimer(); for (final RrdNioBackend backend : m_tasks.keySet()) { m_tasks.get(backend).cancel(); scheduleTask(backend); } cancelTimer(oldTimer); } } public void add(final RrdNioBackend rrdNioBackend) { synchronized(m_tasks) { if (m_tasks.size() == 0) { m_timer = new SyncTimer(); } scheduleTask(rrdNioBackend); } } public void remove(final RrdNioBackend rrdNioBackend) { synchronized (m_tasks) { final TimerTask oldTask = m_tasks.remove(rrdNioBackend); if (oldTask != null) oldTask.cancel(); if (m_tasks.size() == 0) { cancelTimer(m_timer); m_timer = null; } } } public void shutdown() { synchronized(m_tasks) { for (final Map.Entry<RrdNioBackend, TimerTask> entry : m_tasks.entrySet()) { entry.getValue().cancel(); } cancelTimer(m_timer); } } private void cancelTimer(final Timer timer) { if (timer == null) return; timer.cancel(); timer.purge(); } private void scheduleTask(final RrdNioBackend rrdNioBackend) { final TimerTask task = new SyncTimerTask(rrdNioBackend); if (m_tasks.containsKey(rrdNioBackend)) { m_tasks.get(rrdNioBackend).cancel(); } m_tasks.put(rrdNioBackend, task); m_timer.schedule(task, getSyncPeriod() * 1000L, getSyncPeriod() * 1000L); } Timer getTimer() { return m_timer; } }