package karma;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import karma.model.ImpactIdentifier;
import karma.model.Reputable;
import karma.model.ReputationHolder;
import karma.model.ReputationHolderStore;
import play.Logger;
import play.Logger.ALogger;
public abstract class AbstractReputationHandler<R extends Reputable, RH extends ReputationHolder> {
private static ALogger log = Logger.of(AbstractReputationHandler.class);
Map<ImpactIdentifier, ImpactEvaluation<?, R, RH>> evaluations;
ReputationHolderStore<R, RH> reputationHolderStore;
public AbstractReputationHandler(
ReputationHolderStore<R, RH> reputationHolderStore) {
this.evaluations = new HashMap<ImpactIdentifier, ImpactEvaluation<?, R, RH>>();
this.reputationHolderStore = reputationHolderStore;
}
protected <C> void addImpact(ImpactIdentifier type,
ImpactEvaluation<C, R, RH> evaluation) {
evaluations.put(type, evaluation);
}
public <C> RH evaluate(C context, ImpactIdentifier impactType) {
ImpactEvaluation<C, R, RH> evaluation = evaluation(impactType);
if (log.isDebugEnabled())
log.debug("impact : " + evaluation);
if (evaluation != null) {
return evaluation.evaluate(context);
}
return null;
}
public <C> void reevaluateForSubject(R subject) {
// retrieve a valid holder
RH holder = reputationHolderStore.get(subject);
if (holder == null) {
holder = reputationHolderStore.create(subject);
}
Set<ImpactIdentifier> impactTypes = evaluations.keySet();
for (ImpactIdentifier impactType : impactTypes) {
ImpactEvaluation<C, R, RH> evaluation = evaluation(impactType);
holder = evaluation.reevaluate(subject, holder);
}
reputationHolderStore.update(holder);
}
@SuppressWarnings("unchecked")
private <C> ImpactEvaluation<C, R, RH> evaluation(ImpactIdentifier impactType) {
return (ImpactEvaluation<C, R, RH>) evaluations.get(impactType);
}
}