package ru.vyarus.dropwizard.guice.module.installer.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.Marker; import org.slf4j.MarkerFactory; import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller; /** * Helper class to simplify installers dropwizard style report building. * * @author Vyacheslav Rusakov * @since 12.10.2014 */ @SuppressWarnings("PMD.AvoidStringBufferField") public class Reporter { public static final String NEWLINE = String.format("%n"); public static final String TAB = " "; protected static final String LAZY_MARKER = " *LAZY_MARKER"; // marker to be able switch off reports easily private static final Marker MARKER = MarkerFactory.getMarker("installer reporter"); private final Logger logger; private StringBuilder message; private int counter; private boolean wasEmptyLine; public Reporter(final Class<? extends FeatureInstaller> type, final String title) { this.logger = LoggerFactory.getLogger(type); this.message = new StringBuilder(); message.append(title).append(NEWLINE); emptyLine(); } /** * Supports {@code @LazyBinding} annotation, to show lazy marks in report. * * @param isLazy lazy marker * @return empty string if lazy not set, lazy marker if lazy set. */ public final String lazy(final boolean isLazy) { return isLazy ? LAZY_MARKER : ""; } /** * Prints formatted line. * * @param line line with {@code String.format} syntax * @param args message arguments * @return reporter instance */ public final Reporter line(final String line, final Object... args) { counter++; wasEmptyLine = false; message.append(TAB).append(String.format(line, args)).append(NEWLINE); return this; } /** * Prints empty line. * * @return reporter instance */ public final Reporter emptyLine() { wasEmptyLine = true; message.append(NEWLINE); return this; } /** * Writes empty line if something was printed before and it was not {@link #emptyLine()}. * * @return reporter instance */ public final Reporter separate() { if (message.length() > 0 && !wasEmptyLine) { emptyLine(); } return this; } /** * Prints composed report into logger or do nothing if no lines were provided. */ @SuppressWarnings("PMD.NullAssignment") public void report() { if (counter > 0) { logger.info(MARKER, message.toString()); } // report could be called multiple times when JRebel used message = new StringBuilder(); } }