blob: 057caa9bee9a81cf64cba930fd98a416cab30eed [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Christian Pontesegger 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-2.0/
*
* Contributors:
* Christian Pontesegger - initial API and implementation
*******************************************************************************/
package org.eclipse.ease;
/**
* A ScriptResult is a container for a script execution. As execution often occurs detached from the System thread, the result object contains an indicator for
* pending and finished results. Results itself may contain an object or an exception.
*/
public class ScriptResult {
/** Special void object for script methods not returning a result. */
public static final Object VOID = new Object() {
@Override
public final String toString() {
return "<void>";
}
};
/** script execution result. */
private Object fResult = null;
/** script execution exception. */
private Throwable fException = null;
private boolean fIsDone = false;
/**
* Constructor of a pending execution.
*/
public ScriptResult() {
}
/**
* Constructor for a finished execution.
*
* @param result
* result of execution
*/
public ScriptResult(final Object result) {
setResult(result);
}
/**
* Verify that this ScriptResult is processed. If the result is ready, execution of the underlying script is done.
*
* @return true when processing is done
*/
public final synchronized boolean isReady() {
return fIsDone;
}
/**
* Blocks execution until the execution result is ready.
*/
public final synchronized void waitForResult() {
while (!isReady()) {
try {
this.wait();
} catch (final InterruptedException e) {
}
}
}
/**
* Blocks execution until the execution result is ready or the timeout is reached. Once this method returns you still need to query {@link #isReady()} as
* the timeout might have depleted.
*
* @param timeout
* the maximum time to wait in milliseconds.
*/
public final synchronized void waitForResult(long timeout) {
final long stopTimestamp = System.currentTimeMillis() + timeout;
while ((!isReady()) && (System.currentTimeMillis() < stopTimestamp)) {
try {
this.wait(Math.max(0, System.currentTimeMillis() - stopTimestamp));
} catch (final InterruptedException e) {
}
}
}
/**
* Get the result value stored.
*
* @return result value
*/
public final synchronized Object getResult() {
return fResult;
}
/**
* Set the result to be stored.
*
* @param result
* object to be stored
*/
public final synchronized void setResult(final Object result) {
fResult = result;
fIsDone = true;
notifyAll();
}
/**
* Set an exception to be stored for this result.
*
* @param e
* exception to be stored
*/
public final synchronized void setException(final Throwable e) {
fException = e;
fIsDone = true;
notifyAll();
}
/**
* Get the exception stored within this result.
*
* @return stored exception or null
*/
public final synchronized Throwable getException() {
return fException;
}
@Override
public final String toString() {
if (fException != null)
return "Exception: " + fException.getLocalizedMessage();
return ((fResult != null) ? fResult.toString() : "[null]");
}
/**
* Checks whether this result contains an exception.
*
* @return true when this result contains an exception
*/
public final synchronized boolean hasException() {
return (fException != null);
}
}