package de.otto.edison.status.indicator; import de.otto.edison.status.domain.StatusDetail; import net.jcip.annotations.ThreadSafe; import static java.util.Objects.requireNonNull; @ThreadSafe public class MutableStatusDetailIndicator implements StatusDetailIndicator { private volatile StatusDetail statusDetail; public MutableStatusDetailIndicator(final StatusDetail initialStatusDetail) { this.statusDetail = requireNonNull(initialStatusDetail, "Initial StatusDetail must not be null"); } @Override public StatusDetail statusDetail() { return statusDetail; } public void update(final StatusDetail statusDetail) { if (!this.statusDetail.getName().equals(statusDetail.getName())) { throw new IllegalArgumentException("Must not update StatusDetail with different names. That would be confusing."); } this.statusDetail = requireNonNull(statusDetail, "Parameter StatusDetail must not be null"); } public void toOk(String message) { update(statusDetail.toOk(message)); } public void toWarning(String message) { update(statusDetail.toWarning(message)); } public void toError(String message) { update(statusDetail.toError(message)); } public void withDetail(String key, String value) { update(statusDetail.withDetail(key, value)); } public void withoutDetail(String key) { update(statusDetail.withoutDetail(key)); } }