/** * */ package org.incha.core; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import org.incha.core.jswingripples.eig.JSwingRipplesEIG; import org.incha.core.jswingripples.eig.StatisticsChangeListener; /** * Manages listeners, a Map with Stadistics and actions over it. */ public class StatisticsManager { /** * ID prefix is the launch time of application and number of instance in scope * of current application session. */ private static final String ID_PREFIX = System.currentTimeMillis() + "-"; private final AtomicInteger localId = new AtomicInteger(); private final int ADDED = 0; private final int REMOVED = 1; private final int RELOAD = 2; protected static StatisticsManager MODEL = new StatisticsManager(); private final List<StatisticsChangeListener> listeners = new LinkedList<StatisticsChangeListener>(); private final Map<String, Statistics> eigMap = new HashMap<String, Statistics>(); /** * Default constructor. */ protected StatisticsManager() { super(); } public static StatisticsManager getInstance() { return MODEL; } /** * @param l the EIG model change listener. */ public void addStatisticsChangeListener(final StatisticsChangeListener l) { synchronized (listeners) { listeners.add(l); } } /** * @param l the EIG model change listener. */ public void removeStatisticsChangeListener(final StatisticsChangeListener l) { synchronized (listeners) { listeners.remove(l); } } /** * @param projectName project name. * @param eig EIG for given project. * @return statistics ID. */ public String addStatistics(final ModuleConfiguration config, final JSwingRipplesEIG eig) { final Statistics stats = new Statistics(eig, config); stats.id = generateId(); notifyModelListeners(stats.id, null, stats, ADDED); return stats.id; } /** * @param id statistics ID.. * @return EIG for given project. */ public Statistics getStatistics(final String id) { synchronized (eigMap ) { return eigMap.get(id); } } /** * @param id project name. */ public void removeStatitics(final String id) { Statistics stats; synchronized (eigMap) { stats = eigMap.remove(id); } if (stats != null) { notifyModelListeners(id, null, stats, REMOVED); } } /** * @param oldStats only for changed event. * @param newStats the ADDED added/removed/changed * @param type */ protected void notifyModelListeners( final String projectName, final Statistics oldStats, final Statistics newStats, final int type) { List<StatisticsChangeListener> list; synchronized (listeners) { list = new LinkedList<StatisticsChangeListener>(listeners); } for (final StatisticsChangeListener l : list) { switch(type) { case ADDED: l.statisticsAdded(projectName, newStats); break; case REMOVED: l.statisticsRemoved(projectName, newStats); break; case RELOAD: l.statisticsReload(projectName, oldStats, newStats); break; default: //ignore } } } /** * @return generates unique statistics ID. */ private String generateId() { return ID_PREFIX + localId.incrementAndGet(); } }