package com.mozilla.grouperfish.model;
import java.io.Serializable;
import java.util.List;
import org.joda.time.Instant;
import com.google.common.collect.ImmutableList;
import com.mozilla.grouperfish.base.Assert;
import com.mozilla.grouperfish.naming.Namespace;
/** Immutable task description. */
public class Task implements Serializable {
// We do not want to serialize the namespace Object itself, but rather its name.
private final String namespace;
private final Query query;
private final TransformConfig transform;
private final Instant created;
private final List<String> failures;
public Task(final Namespace ns, final Query query, final TransformConfig transform) {
Assert.nonNull(ns, query, transform);
this.namespace = ns.raw();
this.query = query;
this.transform = transform;
created = Instant.now();
failures = ImmutableList.of();
}
private Task(final Task task, final String failure) {
Assert.nonNull(task, failure);
Assert.check(!failure.isEmpty());
this.namespace = task.namespace;
this.query = task.query;
this.transform = task.transform;
this.created = task.created();
this.failures = new ImmutableList.Builder<String>().addAll(task.failures).add(failure).build();
}
public boolean isOk() {
return failures.isEmpty();
}
public Namespace namespace() {
return new Namespace(namespace);
}
public Query query() {
return query;
}
public String toString() {
final String faildesc = (failures.size() == 0) ? "" : String.format(" (%s failed attempts)", failures.size());
return String.format("[Task @%s, T:%s, Q:%s%s]", created(), transform.name(), query.name(), faildesc);
}
public TransformConfig transform() {
return transform;
}
public Task fail(final String failureMessage) {
return new Task(this, failureMessage);
}
public List<String> failures() {
return failures;
}
public Instant created() {
return created;
}
private static final long serialVersionUID = 0;
}