package sk.stuba.fiit.perconik.core.debug.runtime; import javax.annotation.Nullable; import org.eclipse.core.runtime.Plugin; import sk.stuba.fiit.perconik.eclipse.core.runtime.PluginConsole; import sk.stuba.fiit.perconik.eclipse.core.runtime.PluginConsoles; import sk.stuba.fiit.perconik.environment.Environment; import sk.stuba.fiit.perconik.utilities.SmartStringBuilder; import static com.google.common.base.Preconditions.checkNotNull; public final class DebugConsole implements PluginConsole { private static final int MAX_BUFFER_SIZE = 8192; private final boolean enabled; private final PluginConsole console; private final SmartStringBuilder builder; private DebugConsole(final PluginConsole console) { this.enabled = Environment.debug; this.console = checkNotNull(console); this.builder = new SmartStringBuilder(); } private enum Factory implements DebugConsoleFactory { INSTANCE; public DebugConsole create(final Plugin plugin) { return of(plugin); } } public static DebugConsoleFactory factory() { return Factory.INSTANCE; } public static DebugConsole of(final Plugin plugin) { return of(PluginConsoles.create(plugin)); } public static DebugConsole of(final PluginConsole console) { if (console instanceof DebugConsole) { return (DebugConsole) console; } return new DebugConsole(console); } private boolean isEnabled() { return this.enabled; } public PluginConsole append(@Nullable final CharSequence s) { this.builder.append(s); return this; } public PluginConsole append(@Nullable final CharSequence s, final int from, final int to) { this.builder.append(s, from, to); return this; } public PluginConsole append(final char c) { this.builder.append(c); return this; } public void close() {} public void flush() {} public void tab() { this.builder.tab(); } public void untab() { this.builder.untab(); } private void trim() { if (this.builder.capacity() >= MAX_BUFFER_SIZE) { this.builder.trimToSize(); } } private String indent(@Nullable final String message) { return this.builder.lines(String.format(String.valueOf(message))).toString(); } private String indent(final String format, final Object ... args) { return this.builder.lines(String.format(format, args)).toString(); } @Override public void put(@Nullable final String message) { if (this.isEnabled()) { this.console.put(indent(message)); this.putHook(); } } @Override public void put(final String format, final Object ... args) { if (this.isEnabled()) { this.console.put(indent(format, args)); this.putHook(); } } private void putHook() { this.builder.setLength(0); this.trim(); } @Override public void print(@Nullable final String message) { if (this.isEnabled()) { this.console.print(indent(message)); this.printHook(); } } @Override public void print(final String format, final Object ... args) { if (this.isEnabled()) { this.console.print(indent(format, args)); this.printHook(); } } private void printHook() { this.builder.truncate(); this.trim(); } @Override public void notice(@Nullable final String message) { if (this.isEnabled()) { this.console.notice(message); } } @Override public void notice(final String format, final Object ... args) { if (this.isEnabled()) { this.console.notice(format, args); } } @Override public void warning(@Nullable final String message) { if (this.isEnabled()) { this.console.warning(message); } } @Override public void warning(final String format, final Object ... args) { if (this.isEnabled()) { this.console.warning(format, args); } } public void error(@Nullable final String message) { if (this.isEnabled()) { this.console.error(message); } } public void error(final String format, final Object ... args) { if (this.isEnabled()) { this.console.error(format, args); } } public void error(final Throwable failure, @Nullable final String message) { if (this.isEnabled()) { this.console.error(failure, message); } } public void error(final Throwable failure, final String format, final Object ... args) { if (this.isEnabled()) { this.console.error(failure, format, args); } } }