package io.cattle.platform.process.progress;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
public class ProcessProgressState {
boolean inCorrectCheckPoint = false;
int[] checkpointWeights;
String currentCheckpoint;
String subMessage = null;
List<String> checkPoints = new ArrayList<String>();
Integer progress = null;
Integer intermediateProgress = null;
public ProcessProgressState() {
super();
}
public ProcessProgressState(int[] weights) {
super();
this.checkpointWeights = weights;
}
public void setCheckpointWeights(int... weights) {
this.checkpointWeights = weights;
}
public String getMessage() {
String prefix = checkPoints.size() > 0 ? checkPoints.get(checkPoints.size() - 1) : null;
if (prefix == null) {
return null;
}
if (StringUtils.isBlank(subMessage)) {
return prefix;
} else {
return String.format("%s : %s", prefix, subMessage);
}
}
public boolean checkPoint(String name) {
currentCheckpoint = name;
if (!checkPoints.contains(name)) {
checkPoints.add(name);
intermediateProgress = null;
subMessage = null;
inCorrectCheckPoint = true;
calculatePercentage();
return true;
} else if (name != null && checkPoints.size() > 0 && name.equals(checkPoints.get(checkPoints.size() - 1))) {
inCorrectCheckPoint = true;
}
return false;
}
public boolean setMessage(String message) {
if (!ObjectUtils.equals(this.subMessage, message)) {
this.subMessage = message;
return true;
}
return false;
}
public boolean setIntermediateProgress(Integer progress) {
this.intermediateProgress = progress;
if (inCorrectCheckPoint) {
calculatePercentage();
return true;
}
return false;
}
protected void calculatePercentage() {
if (checkpointWeights == null || checkpointWeights.length == 0) {
progress = null;
return;
}
int percentage = 0;
int last = 0;
for (int i = 0; i < checkPoints.size(); i++) {
percentage += last;
if (checkpointWeights.length > i) {
last = checkpointWeights[i];
} else {
last = 0;
}
}
if (intermediateProgress != null && intermediateProgress > 0) {
percentage += ((last * Math.min(intermediateProgress, 100)) / 100);
}
if (percentage > 100) {
progress = null;
} else {
progress = percentage;
}
}
public String getCurrentCheckpoint() {
return currentCheckpoint;
}
public List<String> getCheckPoints() {
return checkPoints;
}
public void setCheckPoints(List<String> checkPoints) {
this.checkPoints = checkPoints;
}
public Integer getProgress() {
return progress;
}
public void setProgress(Integer progress) {
this.progress = progress;
}
public int[] getCheckpointWeights() {
return checkpointWeights;
}
public Integer getIntermediateProgress() {
return intermediateProgress;
}
public String getSubMessage() {
return subMessage;
}
public void setSubMessage(String subMessage) {
this.subMessage = subMessage;
}
}