package org.greengin.sciencetoolkit.ui.base.events; import java.util.Vector; import java.util.concurrent.locks.ReentrantLock; import org.greengin.sciencetoolkit.model.ProfileManager; import org.greengin.sciencetoolkit.common.model.SettingsManager; import org.greengin.sciencetoolkit.common.model.events.ModelNotificationListener; import org.greengin.sciencetoolkit.common.ui.base.events.EventManager; import org.greengin.sciencetoolkit.logic.datalogging.DataLogger; import org.greengin.sciencetoolkit.logic.datalogging.DataLoggerDataListener; import org.greengin.sciencetoolkit.logic.datalogging.DataLoggerStatusListener; public class SenseItEventManager implements EventManager { SenseItEventManagerListener listener; boolean isPaused; boolean newEvents; Vector<String> settingListeners; boolean profileListener; boolean loggedDataListener; boolean loggerStatusListener; Vector<String> settings; Vector<String> profiles; Vector<String> data; Vector<String> dataStatus; ReentrantLock lock; SettingsListener settingsListener; ProfilesListener profilesListener; DataListener dataListener; DataStatusListener dataStatusListener; public SenseItEventManager() { this.isPaused = true; this.newEvents = false; this.listener = null; this.settingListeners = new Vector<String>(); this.profileListener = false; this.loggedDataListener = false; this.loggerStatusListener = false; this.settings = new Vector<String>(); this.profiles = new Vector<String>(); this.data = new Vector<String>(); this.dataStatus = new Vector<String>(); this.settingsListener = new SettingsListener(); this.profilesListener = new ProfilesListener(); this.dataListener = new DataListener(); this.dataStatusListener = new DataStatusListener(); this.lock = new ReentrantLock(); } public void setListener(SenseItEventManagerListener listener) { this.listener = listener; } public void listenToSettings(String settingsId) { if (!settingListeners.contains(settingsId)) { settingListeners.add(settingsId); SettingsManager.get().registerUIListener(settingsId, settingsListener); } } public void stopListeningToSettings(String settingsId) { SettingsManager.get().unregisterUIListener(settingsId, settingsListener); settingListeners.remove(settingsId); } public void listenToProfiles() { if (!profileListener) { ProfileManager.get().registerUIListener(profilesListener); profileListener = true; } } public void stopListeningToProfiles() { ProfileManager.get().unregisterUIListener(profilesListener); profileListener = false; } public void listenToLoggedData() { if (!loggedDataListener) { DataLogger.get().registerDataListener(dataListener); loggedDataListener = true; } } public void stopListeningToLoggedData() { DataLogger.get().unregisterDataListener(dataListener); loggedDataListener = false; } public void listenToLoggerStatus() { if (!loggerStatusListener) { DataLogger.get().registerStatusListener(dataStatusListener); loggerStatusListener = true; } } public void stopListeningToLoggerStatus() { DataLogger.get().unregisterStatusListener(dataStatusListener); loggerStatusListener = false; } @Override public void destroy() { for (String sid : settingListeners) { SettingsManager.get().unregisterUIListener(sid, settingsListener); } settingListeners.clear(); if (profileListener) { stopListeningToProfiles(); } if (loggedDataListener) { stopListeningToLoggedData(); } if (loggerStatusListener) { stopListeningToLoggerStatus(); } } private void addEvent(Vector<String> container, String event) { lock.lock(); if (!container.contains(event)) { container.add(event); if (isPaused) { newEvents = true; } else { notifyEvents(false); } } lock.unlock(); } @Override public void pause() { lock.lock(); this.isPaused = true; lock.unlock(); } @Override public void resume() { lock.lock(); this.isPaused = false; if (this.newEvents) { this.newEvents = false; notifyEvents(true); } lock.unlock(); } private void notifyEvents(boolean whilePaused) { if (listener != null) { listener.events(settings, profiles, data, dataStatus, whilePaused); } settings.clear(); profiles.clear(); data.clear(); dataStatus.clear(); } private class SettingsListener implements ModelNotificationListener { @Override public void modelNotificationReceived(String msg) { addEvent(settings, msg); } } private class ProfilesListener implements ModelNotificationListener { @Override public void modelNotificationReceived(String msg) { addEvent(profiles, msg); } } private class DataListener implements DataLoggerDataListener { @Override public void dataLoggerDataModified(String msg) { addEvent(data, msg); } } private class DataStatusListener implements DataLoggerStatusListener { @Override public void dataLoggerStatusModified(String msg) { addEvent(dataStatus, msg); } } }