package org.signalml.plugin.method.helper; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.signalml.app.config.preset.Preset; import org.signalml.app.config.preset.PresetManager; import org.signalml.app.config.preset.PresetManagerEvent; import org.signalml.app.config.preset.PresetManagerListener; public class PluginPresetManagerFilter implements PresetManager { private class _Listener implements PresetManagerListener { private PluginPresetManagerFilter filterPresetManager; public _Listener(PluginPresetManagerFilter filterPresetManager) { this.filterPresetManager = filterPresetManager; } @Override public void presetAdded(PresetManagerEvent ev) { this.filterPresetManager.resetState(); } @Override public void presetRemoved(PresetManagerEvent ev) { this.filterPresetManager.resetState(); } @Override public void presetReplaced(PresetManagerEvent ev) { this.filterPresetManager.resetState(); } @Override public void defaultPresetChanged(PresetManagerEvent ev) { this.filterPresetManager.resetState(); } } private PresetManager delegate; private Collection<Class<? extends Preset>> allowedPresetClassCollection; private boolean needsRefreshFlag; private Map<Preset, Integer> filteredPresetToPositionMap; private List<Preset> filteredPresets; public PluginPresetManagerFilter(PresetManager delegate, Collection<Class<? extends Preset>> allowedPresetClassCollection) { this.delegate = delegate; this.allowedPresetClassCollection = allowedPresetClassCollection; this.filteredPresetToPositionMap = new HashMap<Preset, Integer>(this.delegate.getPresetCount()); this.filteredPresets = new ArrayList<Preset>(); this.needsRefreshFlag = true; this.delegate.addPresetManagerListener(new _Listener(this)); } @Override public Class<?> getPresetClass() { return this.delegate.getPresetClass(); } @Override public int getPresetCount() { this.refreshStateIfNeeded(); return this.filteredPresets.size(); } @Override public Preset[] getPresets() { this.refreshStateIfNeeded(); return this.filteredPresets.toArray(new Preset[0]); } @Override public Preset getPresetAt(int index) { this.refreshStateIfNeeded(); if (index < 0 || index >= this.filteredPresets.size()) { return null; } return this.filteredPresets.get(index); } @Override public Preset getPresetByName(String name) { this.refreshStateIfNeeded(); Preset preset = this.delegate.getPresetByName(name); if (preset == null || !this.filteredPresetToPositionMap.containsKey(preset)) { return null; } return preset; } @Override public int setPreset(Preset preset) { if (this.checkClass(preset)) { this.resetState(); this.delegate.setPreset(preset); this.refreshStateIfNeeded(); return this.filteredPresets.indexOf(preset); } return -1; } @Override public void removePresetAt(int index) { this.refreshStateIfNeeded(); if (index < 0 || index >= this.filteredPresets.size()) { return; } Preset preset = this.filteredPresets.get(index); int position = this.filteredPresetToPositionMap.get(preset); this.resetState(); this.delegate.removePresetAt(position); } @Override public boolean removePresetByName(String name) { Preset preset = this.delegate.getPresetByName(name); if (preset == null) { return false; } this.resetState(); return this.delegate.removePresetByName(name); } @Override public void writeToFile(File file, Preset preset) throws IOException { this.delegate.writeToFile(file, preset); } @Override public Preset readFromFile(File file) throws IOException { return this.delegate.readFromFile(file); } @Override public void writeToPersistence(File file) throws IOException { this.delegate.writeToPersistence(file); } @Override public void readFromPersistence(File file) throws IOException { this.delegate.readFromPersistence(file); } @Override public Preset getDefaultPreset() { return this.delegate.getDefaultPreset(); } @Override public void setDefaultPreset(Preset defaultPreset) { this.delegate.setDefaultPreset(defaultPreset); } @Override public void addPresetManagerListener(PresetManagerListener l) { this.delegate.addPresetManagerListener(l); } @Override public void removePresetManagerListener(PresetManagerListener l) { this.delegate.removePresetManagerListener(l); } private void resetState() { this.needsRefreshFlag = true; } private void refreshStateIfNeeded() { if (this.needsRefreshFlag) { this.refreshState(); } } private void refreshState() { Preset presets[] = this.delegate.getPresets(); this.filteredPresetToPositionMap.clear(); this.filteredPresets.clear(); for (int i = 0; i < presets.length; ++i) { Preset preset = presets[i]; if (this.checkClass(preset)) { this.filteredPresetToPositionMap.put(preset, i); this.filteredPresets.add(preset); } } this.needsRefreshFlag = false; } private boolean checkClass(Preset preset) { for (Class<? extends Preset> klass : this.allowedPresetClassCollection) { if (klass.isInstance(preset)) { return true; } } return false; } }