/*******************************************************************************
 * Copyright (c) 2008, 2010 IBM Corporation and others.
 * All rights reserved. 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
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.osgi.tests.appadmin;

import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;

public class ExitValueApp implements IApplication, Runnable {
	public static final String returnNullResult = "return.null"; //$NON-NLS-1$
	public static final String returnAsyncResult = "return.async";
	public static final String setAsyncEarly = "set.async.early";
	public static final String setAsyncWrongApp = "set.async.wrongApp";
	public static final String exitValue = "Exit Value"; //$NON-NLS-1$

	private boolean active = true;
	private boolean stopped = false;
	private boolean useAsync = false;
	private boolean returnNull = false;
	private boolean setWrongApp = false;
	private IApplicationContext appContext;
	final Object guardObj = new Object();

	public synchronized Object start(IApplicationContext context) {
		appContext = context;
		context.applicationRunning();
		Boolean nullValue = (Boolean) context.getArguments().get(returnNullResult);
		returnNull = nullValue == null ? false : nullValue.booleanValue();
		Boolean asyncValue = (Boolean) context.getArguments().get(returnAsyncResult);
		useAsync = asyncValue == null ? false : asyncValue.booleanValue();

		Boolean asyncEarlyValue = (Boolean) context.getArguments().get(setAsyncEarly);
		boolean setEarly = asyncEarlyValue == null ? false : asyncEarlyValue.booleanValue();
		Boolean wrongAppValue = (Boolean) context.getArguments().get(setAsyncWrongApp);
		setWrongApp = wrongAppValue == null ? false : wrongAppValue.booleanValue();
		if (setEarly) {
			try {
				context.setResult("failed", this);
				// failed
			} catch (IllegalStateException e) {
				// passed
				return exitValue;
			}
		}
		if (useAsync) {
			System.out.println("async result");
			new Thread(this, "ExitValueApp Test").start();
			return IApplicationContext.EXIT_ASYNC_RESULT;
		}
		run();
		return returnNull ? null : exitValue;
	}

	public synchronized void stop() {
		active = false;
		notifyAll();
		while (!stopped)
			try {
				wait(100);
			} catch (InterruptedException e) {
				// do nothing
			}
	}

	public synchronized void run() {
		if (active) {
			try {
				wait(5000); // only run for 5 seconds at most
			} catch (InterruptedException e) {
				// do nothing
			}
		}
		stopped = true;
		if (useAsync) {
			IApplication app = this;
			Object result = returnNull ? null : exitValue;
			if (setWrongApp) {
				result = "failed";
				app = new IApplication() {

					public void stop() {
						// nothing
					}

					public Object start(IApplicationContext context) throws Exception {
						return null;
					}
				};
			}
			try {
				appContext.setResult(result, app);
				// failed
			} catch (IllegalArgumentException e) {
				// passed
				appContext.setResult(returnNull ? null : exitValue, this);
			}
		}
		notifyAll();
	}

}
