/******************************************************************************* * 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(); } }