/*******************************************************************************
 * Copyright (c) 2009, 2019 Xored Software Inc and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     Xored Software Inc - initial API and implementation and/or initial documentation
 *******************************************************************************/

package org.eclipse.rcptt.ecl.internal.core;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.rcptt.ecl.runtime.IPipe;
import org.eclipse.rcptt.ecl.runtime.IProcess;
import org.eclipse.rcptt.ecl.runtime.ISession;

public class Process implements IProcess {

	private final IPipe in;
	private final IPipe out;
	private IStatus status;
	private final ISession session;

	public Process(ISession session, IPipe in, IPipe out) {
		this.session = session;
		this.in = in;
		this.out = out;
	}

	public IPipe getInput() {
		return in;
	}

	public IPipe getOutput() {
		return out;
	}

	public synchronized void setStatus(IStatus status) throws CoreException {
		this.status = status;
		out.close(status);
		notifyAll();
	}

	public synchronized IStatus waitFor() throws InterruptedException {
		while (status == null) {
			wait(100);
		}
		return status;
	}

	public synchronized IStatus waitFor(long timeout, IProgressMonitor monitor) throws InterruptedException {
		long start = System.currentTimeMillis();
		while (status == null) {
			long cur = System.currentTimeMillis();
			if (timeout != 0 && (cur - start) > timeout) {
				return status = new Status(IStatus.ERROR, CorePlugin.PLUGIN_ID, TIMEOUT_CODE,
						"Execution has timed out after " + (timeout / 1000.) + " seconds", null);
			}
			if (monitor.isCanceled()) {
				return status = new Status(IStatus.CANCEL, CorePlugin.PLUGIN_ID,
						"Execution is canceled.", null);
			}
			wait(100);
		}
		return status;
	}

	public synchronized boolean isAlive() {
		return status == null;
	}

	public ISession getSession() {
		return session;
	}

}
