/* MP5ExecutorManager.java created 2008-02-08 * */ package org.signalml.app.method.mp5; import java.util.List; import java.util.Arrays; import java.util.ArrayList; import java.util.HashMap; import javax.swing.event.EventListenerList; import org.signalml.app.config.AbstractXMLConfiguration; import org.signalml.app.util.XMLUtils; import org.signalml.exception.SanityCheckException; import org.signalml.method.mp5.MP5Executor; import org.signalml.method.mp5.MP5ExecutorLocator; import org.signalml.method.mp5.MP5LocalProcessExecutor; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.annotations.Annotations; import com.thoughtworks.xstream.annotations.XStreamAlias; /** MP5ExecutorManager * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ @XStreamAlias("mp5executors") public class MP5ExecutorManager extends AbstractXMLConfiguration implements MP5ExecutorLocator { private ArrayList<MP5Executor> executors; private MP5Executor defaultExecutor; private transient HashMap<String, MP5Executor> executorMap = null; private transient EventListenerList listenerList = new EventListenerList(); public MP5ExecutorManager() { defaultExecutor = MP5LocalProcessExecutor.pathExecutor(); executors = new ArrayList<MP5Executor>(); executors.add(defaultExecutor); } @Override public XStream getStreamer() { if (streamer == null) { streamer = createExecutorStreamer(); } return streamer; } private XStream createExecutorStreamer() { XStream streamer = XMLUtils.getDefaultStreamer(); Annotations.configureAliases( streamer, MP5ExecutorManager.class, MP5LocalProcessExecutor.class //MP5RemoteExecutor.class, //MP5RemotePasswordExecutor.class ); streamer.setMode(XStream.ID_REFERENCES); return streamer; } private HashMap<String, MP5Executor> getExecutorMap() { if (executorMap == null) { executorMap = new HashMap<String, MP5Executor>(); for (MP5Executor e : executors) { executorMap.put(e.getUID(), e); } } return executorMap; } public int getExecutorCount() { return executors.size(); } public MP5Executor getExecutorAt(int index) { return executors.get(index); } @Override public MP5Executor findExecutor(String uid) { return getExecutorMap().get(uid); } public boolean addExecutor(MP5Executor executor) { String uid = executor.getUID(); if (getExecutorMap().get(uid) != null) { throw new SanityCheckException("Executor already added"); } boolean added = executors.add(executor); if (added) { int index = executors.indexOf(executor); getExecutorMap().put(uid, executor); fireExecutorAdded(index); if (defaultExecutor == null) { setDefaultExecutor(executor); } } return added; } public void setExecutorAt(int index, MP5Executor executor) { MP5Executor existingExecutor = executors.get(index); if (executor != existingExecutor) { String uid = executor.getUID(); if (getExecutorMap().get(uid) != null) { throw new SanityCheckException("Executor already added"); } getExecutorMap().remove(existingExecutor.getUID()); executors.set(index, executor); getExecutorMap().put(uid, executor); } fireExecutorChanged(index); if (executor != existingExecutor) { if (existingExecutor == defaultExecutor) { setDefaultExecutor(executor); } } } public MP5Executor removeExecutor(int index) { MP5Executor removed = executors.remove(index); getExecutorMap().remove(removed.getUID()); fireExecutorRemoved(index); if (removed == defaultExecutor) { if (executors.size() > 0) { setDefaultExecutor(executors.get(0)); } else { setDefaultExecutor(null); } } return removed; } public boolean removeExecutor(MP5Executor executor) { int index = executors.indexOf(executor); boolean removed = executors.remove(executor); if (removed) { getExecutorMap().remove(executor.getUID()); fireExecutorRemoved(index); if (executor == defaultExecutor) { if (executors.size() > 0) { setDefaultExecutor(executors.get(0)); } else { setDefaultExecutor(null); } } } return removed; } public MP5Executor getDefaultExecutor() { return defaultExecutor; } public void setDefaultExecutor(MP5Executor defaultExecutor) { if (this.defaultExecutor != defaultExecutor) { if (defaultExecutor != null && !executors.contains(defaultExecutor)) { throw new IllegalArgumentException("Executor not in list"); } this.defaultExecutor = defaultExecutor; fireDefaultExecutorChanged(); } } @Override public String getStandardFilename() { return "mp5-executor.xml"; } protected void fireExecutorAdded(int index) { Object[] listeners = listenerList.getListenerList(); MP5ExecutorManagerEvent e = null; for (int i = listeners.length-2; i>=0; i-=2) { if (listeners[i]==MP5ExecutorManagerListener.class) { if (e == null) { e = new MP5ExecutorManagerEvent(this,index); } ((MP5ExecutorManagerListener)listeners[i+1]).executorAdded(e); } } } protected void fireExecutorChanged(int index) { Object[] listeners = listenerList.getListenerList(); MP5ExecutorManagerEvent e = null; for (int i = listeners.length-2; i>=0; i-=2) { if (listeners[i]==MP5ExecutorManagerListener.class) { if (e == null) { e = new MP5ExecutorManagerEvent(this, index); } ((MP5ExecutorManagerListener)listeners[i+1]).executorChanged(e); } } } protected void fireExecutorRemoved(int index) { Object[] listeners = listenerList.getListenerList(); MP5ExecutorManagerEvent e = null; for (int i = listeners.length-2; i>=0; i-=2) { if (listeners[i]==MP5ExecutorManagerListener.class) { if (e == null) { e = new MP5ExecutorManagerEvent(this,index); } ((MP5ExecutorManagerListener)listeners[i+1]).executorRemoved(e); } } } protected void fireDefaultExecutorChanged() { Object[] listeners = listenerList.getListenerList(); MP5ExecutorManagerEvent e = null; for (int i = listeners.length-2; i>=0; i-=2) { if (listeners[i]==MP5ExecutorManagerListener.class) { if (e == null) { e = new MP5ExecutorManagerEvent(this); } ((MP5ExecutorManagerListener)listeners[i+1]).defaultExecutorChanged(e); } } } public void addMP5ExecutorManagerListener(MP5ExecutorManagerListener listener) { listenerList.add(MP5ExecutorManagerListener.class, listener); } public void removeMP5ExecutorManagerListener(MP5ExecutorManagerListener listener) { listenerList.remove(MP5ExecutorManagerListener.class, listener); } }