package com.datascience.core.base;
import com.datascience.core.algorithms.INewDataObserver;
import java.util.*;
import static com.google.common.base.Preconditions.checkArgument;
/**
* @Author: konrad
*/
public abstract class AbstractData<T> implements IData<T> {
static protected final int WORKER_NAME_LIMIT = 100;
static protected final int OBJECT_NAME_LIMIT = 100;
protected transient List<INewDataObserver<T>> newDataObservers;
public AbstractData(){
newDataObservers = new LinkedList<INewDataObserver<T>>();
}
@Override
public Worker getOrCreateWorker(String workerId){
Worker worker = getWorker(workerId);
if (worker == null) {
worker = new Worker(workerId);
}
return worker;
}
@Override
public LObject<T> getOrCreateObject(String objectId){
LObject<T> object = getObject(objectId);
if (object == null) {
object = new LObject<T>(objectId);
}
return object;
}
@Override
public void addWorker(Worker worker) {
checkArgument(worker.getName().length() < WORKER_NAME_LIMIT,
"Worker name should be shorter than " + WORKER_NAME_LIMIT + " chars");
uncheckedAddWorker(worker);
}
abstract protected void uncheckedAddWorker(Worker worker);
@Override
public void addObject(LObject<T> object) {
checkArgument(object.getName().length() < OBJECT_NAME_LIMIT,
"Object name should be shorter than " + OBJECT_NAME_LIMIT + " chars");
uncheckedAddObject(object);
}
abstract protected void uncheckedAddObject(LObject<T> object);
abstract protected LObject<T> uncheckedGetGoldObject(String objectId);
@Override
public LObject<T> getGoldObject(String objectId){
LObject<T> object = uncheckedGetGoldObject(objectId);
checkArgument(object != null && object.isGold(),
"There is no gold object with id = " + objectId);
return object;
}
abstract protected LObject<T> uncheckedGetEvaluationObject(String objectId);
@Override
public LObject<T> getEvaluationObject(String objectId){
LObject<T> object = uncheckedGetEvaluationObject(objectId);
checkArgument(object != null && object.isEvaluation(),
"There is no evaluation object with id = " + objectId);
return object;
}
@Override
public void addNewUpdatableAlgorithm(INewDataObserver<T> updatableAlgorithm){
newDataObservers.add(updatableAlgorithm);
}
protected void notifyNewAssign(AssignedLabel<T> assign){
for (INewDataObserver<T> updatableAlgorithm: newDataObservers) {
updatableAlgorithm.newAssign(assign);
}
}
protected void notifyNewGoldObject(LObject<T> object){
for (INewDataObserver<T> updatableAlgorithm: newDataObservers) {
updatableAlgorithm.newGoldObject(object);
}
}
protected void notifyNewObject(LObject<T> object){
for (INewDataObserver<T> updatableAlgorithm: newDataObservers) {
updatableAlgorithm.newObject(object);
}
}
protected void notifyNewWorker(Worker worker){
for (INewDataObserver<T> updatableAlgorithm: newDataObservers) {
updatableAlgorithm.newWorker(worker);
}
}
@Override
public Collection<AssignedLabel<T>> getWorkerAssigns(Worker worker) {
Collection<AssignedLabel<T>> ret = uncheckedGetWorkerAssigns(worker);
if (ret == null)
return new LinkedList<AssignedLabel<T>>();
return ret;
}
public abstract Collection<AssignedLabel<T>> uncheckedGetWorkerAssigns(Worker worker);
@Override
public Collection<AssignedLabel<T>> getAssignsForObject(LObject<T> lObject) {
Collection<AssignedLabel<T>> ret = uncheckedGetAssignsForObject(lObject);
if (ret == null)
return new LinkedList<AssignedLabel<T>>();
return ret;
}
public abstract Collection<AssignedLabel<T>> uncheckedGetAssignsForObject(LObject<T> lObject);
}