package org.ovirt.engine.core.bll.job;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import org.ovirt.engine.core.common.job.Job;
import org.ovirt.engine.core.common.job.Step;
import org.ovirt.engine.core.common.job.StepEnum;
import org.ovirt.engine.core.common.utils.ExecutionMethod;
/**
* Determines the behavior of the Step/Job execution.
* Class should be used when provided to internal command invocation to determine monitoring of Job/Step.
* If isMonitored is null, the default behavior will be applied:
* <ul>
* <li>Internal commands are not monitored, except Steps which describe Tasks creation.</li>
* <li>If isMonitored set explicitly - it determines the entirely monitoring level of Job/Step.</li>
* <li>stepsList will contain a selective list of Steps to be printed. Should be used with isMonitored = null.</li>
* </ul>
*/
public class ExecutionContext implements Serializable{
/**
* Automatic generated serial version ID
*/
private static final long serialVersionUID = -2712230330731851853L;
/**
* A default list of steps
*/
static final List<StepEnum> DEFAULT_STEPS_LIST = Arrays.asList(StepEnum.VALIDATING, StepEnum.EXECUTING);
/**
* The Job which the internal command participate in. If set, emphasis the control of the Job is passed to the
* internal command.
*/
private Job job = null;
/**
* A step which represents the internal command
*/
private Step step = null;
/**
* A list of steps to be monitored as part of the internal command execution
*/
private List<StepEnum> stepsList;
/**
* Indicates if the executed command should be monitored
*/
private boolean isMonitored;
/**
* Defines how the executed command should be treated
*/
private ExecutionMethod executionMethod = ExecutionMethod.AsStep;
/**
* Determines if current context should end the Job. Should be used moderately.
*/
private boolean shouldEndJob;
/**
* The step which the VDSM tasks should be added under. The default step will be the {@code StepEnum.EXECUTING}.
*/
private Step parentTasksStep = null;
/**
* VSDM tasks are being monitored even if the internal command isn't being monitored for other steps.
* By overriding the value of {@code isTasksMonitored} to false, the VDSM tasks will not be monitored as steps.
*/
private boolean isTasksMonitored = true;
/**
* A flag used to identified completed Job or Step. Is turned on by {@code IVdsAsyncCommand.RunningSucceded} or by
* any asynchronous step of the command.
*/
private boolean isCompleted;
/**
* Specifies if a Job should be created for a context with {@code ExecutionMethod.AsJob}
*/
private boolean isJobRequired;
/**
* Default constructor which defines the default monitored steps of the internal command
*/
public ExecutionContext() {
stepsList = DEFAULT_STEPS_LIST;
}
public ExecutionContext(ExecutionContext otherContext) {
job = otherContext.job; // shallow clone, might need to change.
step = otherContext.step; // shallow clone, might need to change.
parentTasksStep = otherContext.parentTasksStep; // shallow clone, might need to change.
isCompleted = otherContext.isCompleted;
executionMethod = otherContext.executionMethod;
isMonitored = otherContext.isMonitored;
shouldEndJob = otherContext.shouldEndJob;
stepsList = otherContext.stepsList;
isTasksMonitored = otherContext.isTasksMonitored;
isJobRequired = otherContext.isJobRequired;
}
public void setJob(Job job) {
this.job = job;
}
public Job getJob() {
return job;
}
public void setStep(Step step) {
this.step = step;
}
public Step getStep() {
return step;
}
public void setStepsList(List<StepEnum> stepsList) {
this.stepsList = stepsList;
}
public List<StepEnum> getStepsList() {
return stepsList;
}
public void setMonitored(boolean isMonitored) {
this.isMonitored = isMonitored;
}
public boolean isMonitored() {
return isMonitored;
}
public boolean shouldEndJob() {
return shouldEndJob;
}
public void setShouldEndJob(boolean shouldEndJob) {
this.shouldEndJob = shouldEndJob;
}
public void setExecutionMethod(ExecutionMethod executionMethod) {
this.executionMethod = executionMethod;
}
public ExecutionMethod getExecutionMethod() {
return executionMethod;
}
/**
* Returns the parent step for the steps which represents VDSM tasks.<br>
* If no step is set, the {@code StepEnum.EXECUTING} will be selected.
*
* @return The parent step for the VDSM tasks
*/
public Step getParentTasksStep() {
if (parentTasksStep == null) {
if (job != null) {
parentTasksStep = job.getStep(StepEnum.EXECUTING);
} else if (step != null) {
parentTasksStep = step.getStep(StepEnum.EXECUTING);
}
}
return parentTasksStep;
}
public void setParentTasksStep(Step parentTasksStep) {
this.parentTasksStep = parentTasksStep;
}
public boolean isTasksMonitored() {
return isTasksMonitored;
}
public void setTasksMonitored(boolean isTasksMonitored) {
this.isTasksMonitored = isTasksMonitored;
}
public boolean isCompleted() {
return isCompleted;
}
public void setCompleted(boolean isCompleted) {
this.isCompleted = isCompleted;
}
public void setJobRequired(boolean isJobRequired) {
this.isJobRequired = isJobRequired;
}
public boolean isJobRequired() {
return isJobRequired;
}
}