package com.datascience.scheduler; import com.datascience.core.base.IData; import com.datascience.core.base.LObject; import com.datascience.core.base.Project; import com.datascience.core.base.Worker; import java.util.Comparator; public class Scheduler<T> implements IScheduler<T> { protected IIterablePriorityQueue<LObject<T>> queue; protected IData<T> data; protected IPriorityCalculator<T> calculator; protected ISchedulerForWorker workerScheduler; public Scheduler() { queue = new IterablePriorityQueue<LObject<T>>(getObjectComparator()); } public Scheduler(Project<T, ?, ?, ?> project, IPriorityCalculator<T> calculator) { this(); setUpQueue(calculator); setSchedulerForWorker(new SchedulersForWorker.FirstNotSeen<T>()); registerOnProject(project); } protected Comparator<LObject<T>> getObjectComparator(){ return new Comparator<LObject<T>>() { @Override public int compare(LObject<T> object, LObject<T> object2) { return object.getName().compareTo(object2.getName()); } }; } private double getPriority(LObject<T> object){ return calculator.getPriority(object); } @Override public void update() { queue.clear(); for (LObject<T> object: data.getObjects()){ queue.addReplacing(object, getPriority(object)); } } @Override public void update(LObject<T> object) { queue.addReplacing(object, getPriority(object)); } @Override public LObject<T> nextObject() { return queue.first(); } @Override public LObject<T> nextObject(Worker worker) { return workerScheduler.nextObjectForWorker(queue.iterator(), worker); } @Override public void setUpQueue(IPriorityCalculator<T> calculator) { this.calculator = calculator; } @Override public void setSchedulerForWorker(ISchedulerForWorker schedulerForWorker){ workerScheduler = schedulerForWorker; } @Override public <V, W> void registerOnProject(Project<T, ?, V, W> project) { data = project.getData(); calculator.registerOnProject(project); workerScheduler.setProject(project); ISchedulerNotificator<T> notificator = calculator.getSchedulerNotificator(project); notificator.registerOnProject(project); notificator.setScheduler(this); } @Override public IData<T> getData(){ return data; } @Override public IPriorityCalculator<T> getCalculator() { return calculator; } @Override public String getId(){ return "scheduler"; } }