/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.execution.api;
import de.rcenvironment.core.component.api.ComponentException;
import de.rcenvironment.core.component.registration.api.Registerable;
/**
* Interface for workflow components.
*
* @author Doreen Seider
*/
public interface Component extends Registerable {
/**
* The final states a component can have. Used to pass into {@link Component#tearDown(FinalComponentState)} method.
*
* @author Doreen Seider
*/
enum FinalComponentState {
FINISHED,
CANCELLED,
FAILED,
RESULTS_REJECTED,
}
/**
* Injects the {@link ComponentContext}.
*
* @param componentContext interface to the workflow engine. Used it to read component configuration, read inputs, write outputs, etc.
*/
void setComponentContext(ComponentContext componentContext);
/**
* Called at workflow start before {@link Component#start(ComponentContext)}. Used to indicate if
* {@link Component#start(ComponentContext)} must be handled as a component execution.
*
* @return <code>true</code> if {@link Component#start(ComponentContext)} will perform execution, otherwise <code>false</code>
*/
boolean treatStartAsComponentRun();
/**
* Called at workflow start. This method is called on all components of a workflow in parallel. Initialization stuff goes here as well
* as component execution if it doesn't require any input values.
*
* @throws ComponentException on component error
*/
void start() throws ComponentException;
/**
* Called if the workflow is cancelled and the component is currently or was recently in {@link #start(ComponentContext)}. It might be
* called in parallel {@link #start(ComponentContext)}. So, it need to be implemented thread-safe.
*
* @param executingThreadHandler allows to interrupt the thread of {@link #start(ComponentContext)}
*/
void onStartInterrupted(ThreadHandler executingThreadHandler);
/**
* Called if all required input values are available.
*
* @throws ComponentException on component error
*/
void processInputs() throws ComponentException;
/**
* Called if the workflow is cancelled and the component is currently or was recently in {@link #processInputs()}. It might be called in
* parallel {@link #processInputs()}. So, it need to be implemented thread-safe.
*
* @param executingThreadHandler allows to interrupt the thread of {@link #processInputs()}
*/
void onProcessInputsInterrupted(ThreadHandler executingThreadHandler);
/**
* Called if component is part of an nested loop and nested loop has been finished.
*
* @throws ComponentException on component error
*/
void reset() throws ComponentException;
/**
* Called if exception in {@link #start()} or {@link #processInputs()} was thrown. It is called immediately afterwards.
*
* @throws ComponentException on component error
*/
void completeStartOrProcessInputsAfterFailure() throws ComponentException;
/**
* Called if the component reached any of the final states. Valid ones are defined in {@link FinalComponentState}.
*
* @param state final state reached
*/
void tearDown(FinalComponentState state);
/**
* Called if the workflow is disposed.
*/
void dispose();
/**
* Is called periodically. Here, the component's history data can be updated. Useful for long running {@link #start(ComponentContext)}
* or {@link #processInputs()}.
*/
void onIntermediateHistoryDataUpdateTimer();
/**
* Injects the token generated that is used by a user to verify the latest {@link Component#start()} (if treated as run) or
* {@link Component#processInputs()}.
*
* @param verificationToken token used for verification
* @throws ComponentException on component error
*/
void handleVerificationToken(String verificationToken) throws ComponentException;
/**
* Called after {@link #start()} (if treated as run) or {@link #processInputs()} finished and verification is done (verification is done
* by the user).
*
* @throws ComponentException on component error
*/
void completeStartOrProcessInputsAfterVerificationDone() throws ComponentException;
}