package tc.oc.analytics; public interface Event { enum Level { SUCCESS, INFO, WARNING, ERROR } Level level(); String key(); String title(); String body(); default Event withBody(String body) { return new EventImpl(level(), key(), title(), body); } static Event of(Level level, String key, String title, String body) { return new EventImpl(level, key, title, body); } static Event of(Level level, String key, String title) { return new EventImpl(level, key, title, ""); } static Event success(String key, String title) { return of(Level.SUCCESS, key, title); } static Event info(String key, String title) { return of(Level.INFO, key, title); } static Event warning(String key, String title) { return of(Level.WARNING, key, title); } static Event error(String key, String title) { return of(Level.ERROR, key, title); } } class EventImpl implements Event { private final Level level; private final String key, title, body; EventImpl(Level level, String key, String title, String body) { this.level = level; this.key = key; this.title = title; this.body = body; } @Override public Level level() { return level; } @Override public String key() { return key; } @Override public String title() { return title; } @Override public String body() { return body; } }