package eu.project.ttc.history; import java.io.StringWriter; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import com.google.common.base.Preconditions; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import eu.project.ttc.models.Term; public class TermHistory { private static final String ERR_TERM_NOT_WATCHED = "Term key <%s> is not watched."; private Set<String> watchedTerms = Sets.newHashSet(); private LinkedListMultimap<String, PipelineEvent> events = LinkedListMultimap.create(); public void saveEvent(String termKey, Class<?> source, String msg) { Preconditions.checkArgument(isWatched(termKey), ERR_TERM_NOT_WATCHED); events.put(termKey, PipelineEvent.create(termKey, source, msg)); } public boolean isWatched(Term term) { return isWatched(term.getGroupingKey()); } public boolean isWatched(String termKey) { return watchedTerms.contains(termKey); } public List<PipelineEvent> getEvents(String termKey) { Preconditions.checkArgument(isWatched(termKey), ERR_TERM_NOT_WATCHED); return events.get(termKey); } public void addWatchedTerms(Iterable<String> termKeys) { for(String key:termKeys) watchedTerms.add(key); } public void addWatchedTerms(String[] termKeys) { addWatchedTerms(Lists.newArrayList(termKeys)); } private static final String LINE_FORMAT="[%s] <%s> %-25s > %s%n"; public String toString(String termKey) { Preconditions.checkArgument(isWatched(termKey), ERR_TERM_NOT_WATCHED); StringWriter writer = new StringWriter(); writer.write(String.format("*** History of term <%s> *** %n", termKey)); if(events.get(termKey).isEmpty()) writer.write("(no event)"); else for(PipelineEvent event:events.get(termKey)) writer.write(String.format(LINE_FORMAT, event.getDate().toString(), event.getTermKey(), event.getSource().getSimpleName(), event.getMessage())); return writer.toString(); } @Override public String toString() { return watchedTerms.stream().map(t -> toString(t)).collect(Collectors.joining("\n")); } public static TermHistory create(String... watchedTermKeys) { TermHistory history = new TermHistory(); history.watchedTerms = Sets.newHashSet(watchedTermKeys); return history; } }