package org.cowboycoders.turbotrainers; import java.util.Arrays; import java.util.Collections; import java.util.Set; import java.util.WeakHashMap; public abstract class GenericTurboTrainer implements TurboTrainerInterface { private Mode[] supportedModes; private Mode currentMode; protected void setSupportedModes(Mode... modes) { if (modes == null) { supportedModes = new Mode[0]; } else { supportedModes = modes; } Arrays.sort(supportedModes); } protected GenericTurboTrainer() { setSupportedModes(new Mode[0]); } @Override public Mode[] modesSupported() { return supportedModes; } @Override public void setMode(Mode mode) throws IllegalArgumentException { if (Arrays.binarySearch(supportedModes, mode) < 0) { throw new IllegalArgumentException("Unsupported mode: " + mode + " supported modes: " + supportedModes.toString()); } currentMode = mode; } public Mode getCurrentMode() { return this.currentMode; } /** * Weak set */ protected final Set<TurboTrainerDataListener> dataChangeListeners = Collections .newSetFromMap(new WeakHashMap<TurboTrainerDataListener, Boolean>()); protected Set<TurboTrainerDataListener> getDataChangeListeners() { return dataChangeListeners; } @Override public void unregisterDataListener(TurboTrainerDataListener listener) { synchronized (dataChangeListeners) { dataChangeListeners.remove(listener); } } /** * Stored in weak set, so keep a reference : no anonymous classes */ public void registerDataListener(TurboTrainerDataListener listener) { synchronized (dataChangeListeners) { dataChangeListeners.add(listener); } } }