package org.batfish.common; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.batfish.common.BfConsts.TaskStatus; import org.batfish.common.util.BatfishObjectMapper; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; public class Task { public static class Batch { private static final String COMPLETED_VAR = "completed"; private static final String DESCRIPTION_VAR = "description"; private static final String SIZE_VAR = "size"; private static final String START_DATE_VAR = "startDate"; private AtomicInteger _completed; private String _description; private int _size; private Date _startDate; @JsonCreator private Batch() { _completed = new AtomicInteger(); } @JsonProperty(COMPLETED_VAR) public AtomicInteger getCompleted() { return _completed; } @JsonProperty(DESCRIPTION_VAR) public String getDescription() { return _description; } @JsonProperty(SIZE_VAR) public int getSize() { return _size; } @JsonProperty(START_DATE_VAR) public Date getStartDate() { return _startDate; } @JsonProperty(COMPLETED_VAR) private void setCompleted(AtomicInteger completed) { _completed = completed; } @JsonProperty(DESCRIPTION_VAR) public void setDescription(String description) { _description = description; } @JsonProperty(SIZE_VAR) public void setSize(int size) { _size = size; } @JsonProperty(START_DATE_VAR) public void setStartDate(Date startDate) { _startDate = startDate; } @Override public String toString() { if (_size > 0) { return String.format("%s: %s: %s/%d", _startDate.toString(), _description, _completed.toString(), _size); } else { return String.format("%s: %s", _startDate.toString(), _description); } } } private static final String ARGS_VAR = "args"; private static final String OBTAINED_VAR = "obtained"; private static final String STATUS_VAR = "status"; private static final String TERMINATED_VAR = "terminated"; private String[] _args; private List<Batch> _batches; private Date _obtained; private TaskStatus _status; private Date _terminated; private volatile boolean _terminationRequested; @JsonCreator public Task() { } public Task(String[] args) { this._args = args; _batches = new ArrayList<>(); _obtained = new Date(); _terminated = null; _status = TaskStatus.Unscheduled; } @JsonProperty(ARGS_VAR) public String[] getArgs() { return _args; } public List<Batch> getBatches() { return _batches; } @JsonProperty(OBTAINED_VAR) public Date getObtained() { return _obtained; } @JsonProperty(STATUS_VAR) public TaskStatus getStatus() { return _status; } @JsonProperty(TERMINATED_VAR) public Date getTerminated() { return _terminated; } @JsonIgnore public boolean getTerminationRequested() { return _terminationRequested; } public Batch newBatch(String description) { Batch batch = new Batch(); batch.setDescription(description); Date date = new Date(); batch.setStartDate(date); _batches.add(batch); return batch; } @JsonIgnore public void requestTermination() { _terminationRequested = true; } @JsonProperty(ARGS_VAR) public void setArgs(String[] args) { _args = args; } public void setBatches(List<Batch> batches) { _batches = batches; } @JsonProperty(OBTAINED_VAR) private void setObtained(Date obtained) { _obtained = obtained; } @JsonProperty(STATUS_VAR) public void setStatus(TaskStatus status) { _status = status; } public void setTerminated() { _terminated = new Date(); } @JsonProperty(TERMINATED_VAR) public void setTerminated(Date terminated) { _terminated = terminated; } public synchronized String updateAndWrite() throws JsonProcessingException { _obtained = new Date(); BatfishObjectMapper mapper = new BatfishObjectMapper(); return mapper.writeValueAsString(this); } }