package com.datascience.core.results; import com.datascience.core.base.LObject; import com.datascience.core.base.Worker; import java.util.*; import static com.google.common.base.Preconditions.checkArgument; /** * @Author: konrad & Artur * T - object class * U - datum results class * V - worker results class */ public abstract class AbstractResults<T, U, V> implements IResults<T, U, V>{ protected transient List<INewResultsListener<T, U, V>> newResultsListeners; protected transient boolean notifyEnabled; protected ResultsFactory.DatumResultCreator<U> datumCreator; protected ResultsFactory.WorkerResultCreator<V> workerCreator; public AbstractResults(){ newResultsListeners = new LinkedList<INewResultsListener<T, U, V>>(); notifyEnabled = false; } public AbstractResults(ResultsFactory.DatumResultCreator<U> datumCreator, ResultsFactory.WorkerResultCreator<V> workerCreator){ this(); this.datumCreator = datumCreator; this.workerCreator = workerCreator; } public ResultsFactory.WorkerResultCreator<V> getWorkerResultsCreator(){ return workerCreator; } @Override public Map<Worker, V> getWorkerResults(Collection<Worker> workers){ Map<Worker, V> results = new HashMap<Worker, V>(workers.size()); for (Worker worker: workers) { results.put(worker, uncheckedGetWorkerResult(worker)); } return results; } @Override public Map<LObject<T>, U> getDatumResults(Collection<LObject<T>> objects){ Map<LObject<T>, U> results = new HashMap<LObject<T>, U>(objects.size()); for (LObject<T> object: objects){ results.put(object, uncheckedGetDatumResults(object)); } return results; } @Override public U getOrCreateDatumResult(LObject<T> obj){ U ret = uncheckedGetDatumResults(obj); if (ret == null){ ret = datumCreator.create(); } return ret; } @Override public U getDatumResult(LObject<T> obj){ U ret = uncheckedGetDatumResults(obj); checkArgument(ret != null, "You have not run compute or there is no object named " + obj.getName()); return ret; } @Override public V getOrCreateWorkerResult(Worker wor){ V ret = uncheckedGetWorkerResult(wor); if (ret == null){ ret = workerCreator.create(); } return ret; } @Override public V createEmptyWorkerResult(Worker wor){ return workerCreator.create(); } @Override public V getWorkerResult(Worker worker){ V ret = uncheckedGetWorkerResult(worker); checkArgument(ret != null, "You have not run compute or there is no worker named " + worker.getName()); return ret; } @Override public void addNewResultsListener(INewResultsListener<T, U, V> newResultsListener){ newResultsListeners.add(newResultsListener); notifyEnabled = true; } @Override public void setNotifyEnabled(boolean enabled){ notifyEnabled = enabled; } @Override public boolean isNotifyEnabled(){ return notifyEnabled; } protected void notifyNewWorkerResults(Worker worker, V result){ if (!notifyEnabled) return; for (INewResultsListener<T, U, V> newResultsListener: newResultsListeners){ newResultsListener.newResultsForWorker(worker, result); } } protected void notifyNewObjectResults(LObject<T> object, U result){ if (!notifyEnabled) return; for (INewResultsListener<T, U, V> newResultsListener: newResultsListeners){ newResultsListener.newResultsForObject(object, result); } } @Override public void notifyAllNewResults(){ if (!notifyEnabled) return; for (INewResultsListener<T, U, V> newResultsListener: newResultsListeners){ newResultsListener.newResultsForAll(); } } }