package jetbrains.mps.internal.make.runtime.script; /*Generated by MPS */ import jetbrains.mps.make.script.IProgress; import java.util.List; import jetbrains.mps.internal.collections.runtime.IterableUtils; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; public abstract class AbstractProgressStrategy { private AbstractProgressStrategy.Work last; private IProgress current; public AbstractProgressStrategy(String total) { this.last = new AbstractProgressStrategy.Work(null, total, 1000, 1000); this.current = new AbstractProgressStrategy.CurrentProgress(); } protected AbstractProgressStrategy.Work pushProgress(String name, int estimate, int total) { return this.last = new AbstractProgressStrategy.Work(last, name, estimate, total); } protected AbstractProgressStrategy.Work popProgress(AbstractProgressStrategy.Work wrk) { return this.last = (wrk.prev != null ? wrk.prev : wrk); } protected AbstractProgressStrategy.Work lastProgress() { return last; } protected abstract void begunWork(AbstractProgressStrategy.Work wrk); protected abstract void advancedWork(AbstractProgressStrategy.Work wrk); protected abstract void finishedWork(AbstractProgressStrategy.Work wrk); public IProgress currentProgress() { return current; } public class Work implements IProgress { private AbstractProgressStrategy.Work prev; private String name; private String comment; private int estimate; private int total; private int done = 0; public Work(AbstractProgressStrategy.Work prev, String name, int estimate, int ofTotal) { this.prev = prev; this.name = name; this.estimate = estimate; this.total = ofTotal; } @Override public void beginWork(String name, int estimate, int ofTotal) { if (estimate <= 0) { throw new IllegalArgumentException("invalid estimate value"); } if (ofTotal < 0) { throw new IllegalArgumentException("invalid ofTotal value"); } begunWork(pushProgress(name, estimate, ofTotal)); } @Override public void advanceWork(String name, int done) { advanceWork(name, done, null); } @Override public void advanceWork(String name, int done, String comment) { if (done < 0) { throw new IllegalArgumentException("invalid done value"); } matchingOrTotal(name).primDone(done, comment); } @Override public void finishWork(String name) { AbstractProgressStrategy.Work wrk = matchingOrTotal(name); wrk.primDone(wrk.workLeft(), null); finishedWork(wrk); popProgress(wrk); } @Override public int workLeft() { return Math.max(0, estimate - done); } public int workDone() { return Math.min(estimate, done); } public int prevWork() { return total; } public double prevWorkRatio() { return ((double) prev.estimate) / total; } public String name() { return name; } public String fullName() { List<String> names = this.namePath(); return IterableUtils.join(ListSequence.fromList(names).reversedList(), "/"); } public String namePrefix() { List<String> names = this.namePath(); return IterableUtils.join(ListSequence.fromList(names).reversedList().cut(1), "/"); } public double doneRatio() { return ((double) Math.min(this.estimate, this.done)) / this.estimate; } public String comment() { return comment; } public AbstractProgressStrategy.Work matchingOrTotal(String name) { AbstractProgressStrategy.Work wrk = this; while (wrk.prev != null) { if (eq_idfyc1_a0a0b0u01(wrk.name, name)) { return wrk; } wrk = wrk.prev; } return wrk; } private List<String> namePath() { List<String> names = ListSequence.fromList(new ArrayList<String>()); AbstractProgressStrategy.Work wrk = this; while (wrk != null) { ListSequence.fromList(names).addElement(wrk.name); wrk = wrk.prev; } return names; } private void primDone(int primDone, String comment) { this.comment = comment; if (primDone > 0) { this.done += primDone; if (prev != null) { prev.primDone((int) Math.floor(((double) Math.min(primDone, estimate)) * total / estimate), null); } } advancedWork(this); } } public class CurrentProgress implements IProgress { public CurrentProgress() { } @Override public void beginWork(String name, int estimate, int ofTotal) { lastProgress().beginWork(name, estimate, ofTotal); } @Override public void finishWork(String name) { lastProgress().finishWork(name); } @Override public void advanceWork(String name, int done) { lastProgress().advanceWork(name, done); } @Override public void advanceWork(String name, int done, String comment) { lastProgress().advanceWork(name, done, comment); } @Override public int workLeft() { return lastProgress().workLeft(); } } private static boolean eq_idfyc1_a0a0b0u01(Object a, Object b) { return (a != null ? a.equals(b) : a == b); } }