package mediawiki; import java.util.ArrayList; import java.util.Date; import mediawiki.event.CompletedListener; import mediawiki.event.ProgressChangeEvent; import mediawiki.event.ProgressChangeListener; public abstract class MediaWikiTask implements Runnable { private int togo = 0; private int done = 0; private ArrayList<ProgressChangeListener<MediaWikiTask,Double>> listeners = new ArrayList<>(); private ArrayList<CompletedListener> listeners2 =new ArrayList<>(); private long t1 = 0; private double p1 = 0; private boolean stopped = false; private MediaWikiConnection connection; public MediaWikiTask(MediaWikiConnection con){ if( ! con.isTestState() && ! con.isBot()) throw new IllegalStateException("the user has to be a bot to perform a WikipediaWikidataTask"); connection = con; } public MediaWikiConnection getConnection() { return connection; } public int getTogo() { return togo; } public int getDone() { return done; } protected void setTogo(int togo) { this.togo = togo; fireProgressChangeEvent(new ProgressChangeEvent<MediaWikiTask, Double>(this, getProgress())); } protected void setDone(int done) { this.done = done; fireProgressChangeEvent(new ProgressChangeEvent<MediaWikiTask, Double>(this, getProgress())); } public double getProgress(){ if(togo == 0) return Double.NaN; return ((double) done)/((double) togo); } protected void increaseDone(){ setDone(getDone()+1); } public void addProgressChangeListener(ProgressChangeListener<MediaWikiTask,Double> listener){ listeners.add(listener); } protected void fireProgressChangeEvent(ProgressChangeEvent<MediaWikiTask,Double> e){ for(ProgressChangeListener l : listeners) l.progressChanged(e); } public void addCompletedListener(CompletedListener listener){ listeners2.add(listener); } protected void fireCompletedEvent(){ for(CompletedListener l : listeners2) l.completed(); } public boolean isStopped() { return stopped; } public void setStopped(boolean stopped) { this.stopped = stopped; if(stopped == false) fireCompletedEvent(); } public void recordETA(){ if(getTogo() == 0) throw new IllegalStateException("Set Togo before recording ETA"); t1 = new Date().getTime(); p1 = getProgress(); } public Date getETA(){ if(getTogo() == 0) return null; if(t1 == 0) return null; long dT = new Date().getTime()-t1; double dP = getProgress()-p1; if(dP == Double.NaN || dP == 0) return null; long verbl = (long) ((1-getProgress())/(dP/dT)); return new Date(new Date().getTime()+verbl); } }