/*******************************************************************************
 * Copyright (c) 2005 The Regents of the University of California. 
 * This material was produced under U.S. Government contract W-7405-ENG-36 
 * for Los Alamos National Laboratory, which is operated by the University 
 * of California for the U.S. Department of Energy. The U.S. Government has 
 * rights to use, reproduce, and distribute this software. NEITHER THE 
 * GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR 
 * ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified 
 * to produce derivative works, such modified software should be clearly marked, 
 * so as not to confuse it with the version available from LANL.
 * 
 * Additionally, this program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * LA-CC 04-115
 *******************************************************************************/
package org.eclipse.ptp.debug.internal.core;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.ptp.debug.core.IPSession;
import org.eclipse.ptp.debug.core.IPSignalManager;
import org.eclipse.ptp.debug.core.PDebugModel;
import org.eclipse.ptp.debug.core.TaskSet;
import org.eclipse.ptp.debug.core.model.IPSignal;
import org.eclipse.ptp.debug.core.pdi.IPDISession;
import org.eclipse.ptp.debug.core.pdi.PDIException;
import org.eclipse.ptp.debug.core.pdi.event.IPDIEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDIEventListener;
import org.eclipse.ptp.debug.core.pdi.model.IPDISignal;
import org.eclipse.ptp.debug.internal.core.model.PSignal;

/**
 * @author Clement chu
 */
public class PSignalManager implements IAdaptable, IPDIEventListener, IPSignalManager {
	private class PSignalSet {
		private final TaskSet sTasks;
		private IPSignal[] fSignals = null;
		private boolean fIsDisposed = false;

		public PSignalSet(TaskSet sTasks) {
			this.sTasks = sTasks;
		}

		/**
		 * 
		 */
		public synchronized void dispose() {
			if (fSignals != null) {
				for (int i = 0; i < fSignals.length; ++i) {
					((PSignal) fSignals[i]).dispose();
				}
			}
			fSignals = null;
			fIsDisposed = true;
		}

		/**
		 * @param pdiSignal
		 * @return
		 */
		public PSignal find(IPDISignal pdiSignal) {
			try {
				IPSignal[] signals = getSignals();
				for (int i = 0; i < signals.length; ++i) {
					if (signals[i].getName().equals(pdiSignal.getName())) {
						return (PSignal) signals[i];
					}
				}
			} catch (DebugException e) {
			}
			return null;
		}

		/**
		 * @return
		 * @throws DebugException
		 */
		public synchronized IPSignal[] getSignals() throws DebugException {
			if (!fIsDisposed && fSignals == null) {
				try {
					IPDISignal[] pdiSignals = session.getPDISession().getSignalManager().getSignals(sTasks);
					ArrayList<IPSignal> list = new ArrayList<IPSignal>(pdiSignals.length);
					for (int i = 0; i < pdiSignals.length; ++i) {
						list.add(new PSignal(session, sTasks, pdiSignals[i]));
					}
					fSignals = list.toArray(new IPSignal[list.size()]);
				} catch (PDIException e) {
					throwDebugException(e.getMessage(), DebugException.TARGET_REQUEST_FAILED, e);
				}
			}
			return (fSignals != null) ? fSignals : new IPSignal[0];
		}

		/**
		 * @param pdiSignal
		 */
		public void signalChanged(IPDISignal pdiSignal) {
			PSignal signal = find(pdiSignal);
			if (signal != null) {
				signal.fireChangeEvent(DebugEvent.STATE);
			}
		}
	}

	private final IPSession session;
	protected final Map<TaskSet, PSignalSet> fPSignalSetMap = new HashMap<TaskSet, PSignalSet>();

	public PSignalManager(IPSession session) {
		this.session = session;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.debug.internal.core.IPSignalManager#dispose(org.eclipse
	 * .ptp.core.util.TaskSet)
	 */
	public void dispose(TaskSet qTasks) {
		getSignalSet(qTasks).dispose();
	}

	/**
	 * @param monitor
	 */
	public void dispose(IProgressMonitor monitor) {
		DebugPlugin.getDefault().asyncExec(new Runnable() {
			/*
			 * (non-Javadoc)
			 * 
			 * @see java.lang.Runnable#run()
			 */
			public void run() {
				synchronized (fPSignalSetMap) {
					Iterator<PSignalSet> it = fPSignalSetMap.values().iterator();
					while (it.hasNext()) {
						(it.next()).dispose();
					}
					fPSignalSetMap.clear();
				}
			}
		});
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
	 */
	@SuppressWarnings("rawtypes")
	public Object getAdapter(Class adapter) {
		if (adapter.equals(IPDISession.class))
			return getSession();
		if (adapter.equals(PSignalManager.class))
			return this;
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.debug.internal.core.IPSignalManager#getSignals(org.eclipse
	 * .ptp.core.util.TaskSet)
	 */
	public IPSignal[] getSignals(TaskSet qTasks) throws DebugException {
		return getSignalSet(qTasks).getSignals();
	}

	/**
	 * @param qTasks
	 * @return
	 */
	public PSignalSet getSignalSet(TaskSet qTasks) {
		synchronized (fPSignalSetMap) {
			PSignalSet set = fPSignalSetMap.get(qTasks);
			if (set == null) {
				set = new PSignalSet(qTasks);
				fPSignalSetMap.put(qTasks, set);
			}
			return set;
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.debug.core.pdi.event.IPDIEventListener#handleDebugEvents
	 * (org.eclipse.ptp.debug.core.pdi.event.IPDIEvent[])
	 */
	public void handleDebugEvents(IPDIEvent[] events) {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.debug.internal.core.IPSignalManager#signalChanged(org
	 * .eclipse.ptp.core.util.TaskSet,
	 * org.eclipse.ptp.debug.core.pdi.model.IPDISignal)
	 */
	public void signalChanged(TaskSet qTasks, IPDISignal pdiSignal) {
		getSignalSet(qTasks).signalChanged(pdiSignal);
	}

	/**
	 * @return
	 */
	protected IPSession getSession() {
		return session;
	}

	/**
	 * @param message
	 * @param code
	 * @param exception
	 * @throws DebugException
	 */
	protected void throwDebugException(String message, int code, Throwable exception) throws DebugException {
		throw new DebugException(new Status(IStatus.ERROR, PDebugModel.getPluginIdentifier(), code, message, exception));
	}
}
