/*******************************************************************************
 * 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.internal.core.elements;

import java.io.File;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.ptp.core.PTPCorePlugin;
import org.eclipse.ptp.core.PreferenceConstants;
import org.eclipse.ptp.core.attributes.AttributeManager;
import org.eclipse.ptp.core.attributes.EnumeratedAttribute;
import org.eclipse.ptp.core.attributes.IAttribute;
import org.eclipse.ptp.core.attributes.IllegalValueException;
import org.eclipse.ptp.core.attributes.IntegerAttribute;
import org.eclipse.ptp.core.attributes.StringAttribute;
import org.eclipse.ptp.core.attributes.StringAttributeDefinition;
import org.eclipse.ptp.core.elementcontrols.IPElementControl;
import org.eclipse.ptp.core.elementcontrols.IPJobControl;
import org.eclipse.ptp.core.elementcontrols.IPNodeControl;
import org.eclipse.ptp.core.elementcontrols.IPProcessControl;
import org.eclipse.ptp.core.elements.IPJob;
import org.eclipse.ptp.core.elements.IPNode;
import org.eclipse.ptp.core.elements.attributes.ProcessAttributes;
import org.eclipse.ptp.core.elements.attributes.ProcessAttributes.State;
import org.eclipse.ptp.core.elements.events.IProcessChangeEvent;
import org.eclipse.ptp.core.elements.listeners.IProcessListener;
import org.eclipse.ptp.core.util.OutputTextFile;
import org.eclipse.ptp.internal.core.elements.events.ProcessChangeEvent;

public class PProcess extends Parent implements IPProcessControl {

	private final ListenerList elementListeners = new ListenerList();
	private final OutputTextFile outputFile;
	private String outputDirPath = null;
	private int storeLines = 0;

	/*
	 * the node that this process is running on, or was scheduled on / will be, etc
	 */
	private IPNodeControl node;

	public PProcess(String id, IPJobControl job, IAttribute<?,?,?>[] attrs) {
		super(id, job, P_PROCESS, attrs);
		setOutputStore();
		
		/*
		 * Derive a unique name for the output file
		 */
		String name = job.getQueue().getResourceManager().getName()
						+ "_" + job.getQueue().getName()
						+ "_" + job.getName()
						+ "_" + getName();
	
		outputFile = new OutputTextFile(name, 
							ProcessAttributes.getStdoutAttributeDefinition().getId(), 
							outputDirPath, storeLines);
		
		/*
		 * Create required attributes.
		 */
		EnumeratedAttribute<State> procState = getAttribute(ProcessAttributes.getStateAttributeDefinition());
		if (procState == null) {
			procState = ProcessAttributes.getStateAttributeDefinition().create();
			addAttribute(procState);
		}
		IntegerAttribute exitCode = getAttribute(ProcessAttributes.getExitCodeAttributeDefinition());
		if (exitCode == null) {
			try {
				exitCode = ProcessAttributes.getExitCodeAttributeDefinition().create();
				addAttribute(exitCode);
			} catch (IllegalValueException e) {
			}
		}
		IntegerAttribute pid = getAttribute(ProcessAttributes.getPIDAttributeDefinition());
		if (pid == null) {
			try {
				pid = ProcessAttributes.getPIDAttributeDefinition().create();
				addAttribute(pid);
			} catch (IllegalValueException e) {
			}
		}
		IntegerAttribute index = getAttribute(ProcessAttributes.getIndexAttributeDefinition());
		if (index == null) {
			try {
				index = ProcessAttributes.getIndexAttributeDefinition().create();
				addAttribute(index);
			} catch (IllegalValueException e) {
			}
		}	
		StringAttribute signalName = getAttribute(ProcessAttributes.getSignalNameAttributeDefinition());
		if (signalName == null) {
			signalName = ProcessAttributes.getSignalNameAttributeDefinition().create();
			addAttribute(signalName);
		}	
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#addElementListener(org.eclipse.ptp.core.elements.listeners.IProcessListener)
	 */
	public void addElementListener(IProcessListener listener) {
		elementListeners.add(listener);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#addNode(org.eclipse.ptp.core.elements.IPNode)
	 */
	public synchronized void addNode(IPNode node) {
		this.node = (IPNodeControl) node;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#clearOutput()
	 */
	public void clearOutput() {
		outputFile.delete();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#getExitCode()
	 */
	public int getExitCode() {
		return getAttribute(ProcessAttributes.getExitCodeAttributeDefinition()).getValue();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#getJob()
	 */
	public IPJob getJob() {
		return getJobControl();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elementcontrols.IPProcessControl#getJobControl()
	 */
	public IPJobControl getJobControl() {
		IPElementControl current = this;
		do {
			if (current instanceof IPJobControl)
				return (IPJobControl) current;
		} while ((current = current.getParent()) != null);
		return null;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#getNode()
	 */
	public synchronized IPNode getNode() {
		return this.node;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#getPid()
	 */
	public int getPid() {
		return getAttribute(ProcessAttributes.getPIDAttributeDefinition()).getValue();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#getProcessIndex()
	 */
	public String getProcessIndex() {
		return getAttribute(ProcessAttributes.getIndexAttributeDefinition()).getValueAsString();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#getSavedOutput(org.eclipse.ptp.core.attributes.StringAttributeDefinition)
	 */
	public String getSavedOutput(StringAttributeDefinition attrDef) {
		if (attrDef.equals(ProcessAttributes.getStdoutAttributeDefinition())) {
			return outputFile.getContents();
		} else {
			return "";
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#getSignalName()
	 */
	public String getSignalName() {
		return getAttribute(ProcessAttributes.getSignalNameAttributeDefinition()).getValue();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#getState()
	 */
	public State getState() {
		return getAttribute(ProcessAttributes.getStateAttributeDefinition()).getValue();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#isTerminated()
	 */
	public boolean isTerminated() {
		State state = getState();
		if (state == State.ERROR || state == State.EXITED || state == State.EXITED_SIGNALLED) {
			return true;
		}
		return false;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#removeElementListener(org.eclipse.ptp.core.elements.listeners.IProcessListener)
	 */
	public void removeElementListener(IProcessListener listener) {
		elementListeners.remove(listener);
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#removeNode()
	 */
	public synchronized void removeNode() {
		node = null;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#setState(org.eclipse.ptp.core.elements.attributes.ProcessAttributes.State)
	 */
	public void setState(State state) {
		EnumeratedAttribute<State> procState = getAttribute(ProcessAttributes.getStateAttributeDefinition());
		procState.setValue(state);
		AttributeManager attrs = new AttributeManager();
		attrs.addAttribute(procState);
		fireChangedProcess(attrs);
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.IPProcess#setTerminated(boolean)
	 */
	public void setTerminated(boolean isTerminated) {
		setState(State.EXITED);
	}

	/**
	 * Cache output from process to local file.
	 * 
	 * @param output
	 */
	private void addOutput(String output) {
		outputFile.write(output + "\n");
	}

	/**
	 * Notify listeners of changed attributes.
	 * 
	 * @param attrs
	 */
	private void fireChangedProcess(AttributeManager attrs) {
		IProcessChangeEvent e = new ProcessChangeEvent(this, attrs);
		
		for (Object listener : elementListeners.getListeners()) {
			((IProcessListener)listener).handleEvent(e);
		}
	}

	/**
	 * Create a local cache for process output.
	 */
	private void setOutputStore() {
		Preferences preferences = PTPCorePlugin.getDefault().getPluginPreferences();
		outputDirPath = preferences.getString(PreferenceConstants.OUTPUT_DIR);
		storeLines = preferences.getInt(PreferenceConstants.STORE_LINE);
		if (outputDirPath == null || outputDirPath.length() == 0) {
			outputDirPath = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(PreferenceConstants.DEF_OUTPUT_DIR_NAME).toOSString();
		}
		if (storeLines == 0) {
			storeLines = PreferenceConstants.DEF_STORE_LINE;
		}
		File outputDirectory = new File(outputDirPath);
		if (!outputDirectory.exists()) {
			outputDirectory.mkdir();
		}
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.internal.core.elements.PElement#doAddAttributeHook(java.util.List)
	 */
	@Override
	protected void doAddAttributeHook(AttributeManager attrs) {
		StringAttribute attr = attrs.getAttribute(ProcessAttributes.getStdoutAttributeDefinition());
		if (attr != null) {
			addOutput(attr.getValue());
		}
		fireChangedProcess(attrs);
	}

}
