package org.ovirt.engine.core.common.job;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.BusinessEntity;
import org.ovirt.engine.core.common.businessentities.IVdcQueryable;
import org.ovirt.engine.core.compat.Guid;
/**
* Represents the Job entity which encapsulates a client action in the system. The Job contains a collection
* of steps which describe portions of the entire Job. The Job entity is capable to produce a descriptive tree of
* steps, reflecting the action parts.
*/
public class Job implements IVdcQueryable, BusinessEntity<Guid> {
/**
* Automatic generated serial version ID
*/
private static final long serialVersionUID = 9003809286645635497L;
/**
* The Job ID uniquely identifies a disk in the system.
*/
private Guid id;
/**
* The action type which the Job describes
*/
private VdcActionType actionType;
/**
* The description of the job
*/
private String description;
/**
* The status of the job
*/
private JobExecutionStatus status;
/**
* The user id which invoked the job
*/
private Guid ownerId;
/**
* The engine session seq id of the user which invoked the job
*/
private long engineSessionSeqId;
/**
* Determines whether the Job should be presented
*/
private boolean isVisible;
/**
* The start time of the Job
*/
private Date startTime;
/**
* The end time of the Job
*/
private Date endTime;
/**
* Describes when the Job was last updated
*/
private Date lastUpdateTime;
/**
* A pass-thru string to identify one or more Jobs cross-layer
*/
private String correlationId;
/**
* A flag defining if this Job were invoked from external plug-in
*/
private boolean external;
/**
* A flag indicating if the Job is auto cleared from the table after the configured time for succeeded/failed jobs
*/
private boolean autoCleared;
/**
* A collection which holds the entities associated with the Job
*/
private Map<Guid, VdcObjectType> jobSubjectEntities;
/**
* A collection which stores the steps of the Job
*/
private List<Step> steps;
/**
* Define if the Job should be ended when the {@code CommandBase.executeAction()} ends
*/
private transient boolean isAsyncJob;
/**
* Maximum job weight
*/
public static final int MAX_WEIGHT = 100;
public Job() {
status = JobExecutionStatus.STARTED;
autoCleared = true;
isVisible = true;
steps = new ArrayList<>();
}
public List<Step> getSteps() {
return steps;
}
public void setSteps(List<Step> list) {
this.steps = list;
}
public void setActionType(VdcActionType actionType) {
this.actionType = actionType;
}
public VdcActionType getActionType() {
return actionType;
}
public void setDescription(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
public JobExecutionStatus getStatus() {
return status;
}
public void setStatus(JobExecutionStatus status) {
this.status = status;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
setLastUpdateTime(startTime);
}
public Date getStartTime() {
return startTime;
}
public void setCorrelationId(String correlationId) {
this.correlationId = correlationId;
}
public String getCorrelationId() {
return correlationId;
}
public void setIsAsyncJob(boolean isAsyncJob) {
this.isAsyncJob = isAsyncJob;
}
public boolean isExternal() {
return external;
}
public void setExternal(boolean isExternal) {
this.external = isExternal;
}
public boolean isAutoCleared() {
return autoCleared;
}
public void setAutoCleared(boolean isAutoCleared) {
this.autoCleared = isAutoCleared;
}
public boolean isAsyncJob() {
return isAsyncJob;
}
public void setJobSubjectEntities(Map<Guid, VdcObjectType> jobEntities) {
this.jobSubjectEntities = jobEntities;
}
public Map<Guid, VdcObjectType> getJobSubjectEntities() {
return jobSubjectEntities;
}
public void setOwnerId(Guid ownerId) {
this.ownerId = ownerId;
}
public Guid getOwnerId() {
return ownerId;
}
public void setVisible(boolean isVisible) {
this.isVisible = isVisible;
}
public boolean isVisible() {
return isVisible;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
setLastUpdateTime(endTime);
}
public Date getEndTime() {
return endTime;
}
public void setLastUpdateTime(Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
}
public Date getLastUpdateTime() {
return lastUpdateTime;
}
public long getEngineSessionSeqId() {
return engineSessionSeqId;
}
public void setEngineSessionSeqId(long engineSessionSeqId) {
this.engineSessionSeqId = engineSessionSeqId;
}
@Override
public Object getQueryableId() {
return id;
}
public Step addStep(Step step) {
lastUpdateTime = new Date();
step.setJobId(id);
step.setStepNumber(steps.size());
step.setCorrelationId(correlationId);
steps.add(step);
return step;
}
public Step addStep(StepEnum stepType, String description) {
return addStep(new Step(stepType, description));
}
public Step getStep(StepEnum stepType) {
Step stepByType = null;
for (Step step : steps) {
if (step.getStepType() == stepType) {
stepByType = step;
break;
}
}
return stepByType;
}
public Step getDirectStep(StepEnum stepType) {
Step stepByType = null;
for (Step step : steps) {
// A direct step is a step that has no parent step
if (step.getStepType() == stepType && step.getParentStepId() == null) {
stepByType = step;
break;
}
}
return stepByType;
}
public void markJobEnded(boolean result) {
if (status == JobExecutionStatus.STARTED) {
endTime = lastUpdateTime = new Date();
if (result) {
status = JobExecutionStatus.FINISHED;
} else {
status = JobExecutionStatus.FAILED;
}
}
}
@Override
public Guid getId() {
return id;
}
@Override
public void setId(Guid id) {
this.id = id;
}
@Override
public int hashCode() {
return Objects.hash(
actionType,
engineSessionSeqId,
correlationId,
endTime,
id,
isVisible,
jobSubjectEntities,
lastUpdateTime,
ownerId,
startTime,
status,
steps,
external,
autoCleared
);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Job)) {
return false;
}
Job other = (Job) obj;
return actionType == other.actionType
&& engineSessionSeqId == other.engineSessionSeqId
&& Objects.equals(correlationId, other.correlationId)
&& Objects.equals(endTime, other.endTime)
&& Objects.equals(id, other.id)
&& isVisible == other.isVisible
&& Objects.equals(jobSubjectEntities, other.jobSubjectEntities)
&& Objects.equals(lastUpdateTime, other.lastUpdateTime)
&& Objects.equals(ownerId, other.ownerId)
&& Objects.equals(startTime, other.startTime)
&& status == other.status
&& Objects.equals(steps, other.steps)
&& external == other.external
&& autoCleared == other.autoCleared;
}
}