SandboxHintConsole.java

/*******************************************************************************
 * Copyright (c) 2026 Carsten Hammer.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Carsten Hammer - initial API and implementation
 *******************************************************************************/
package org.sandbox.jdt.triggerpattern.ui;

import java.io.IOException;

import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.Platform;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.console.MessageConsoleStream;

/**
 * Console for streaming embedded Java execution logs during cleanup/quickfix runs.
 *
 * <p>Provides color-coded output:</p>
 * <ul>
 *   <li>Green: successful guard evaluation</li>
 *   <li>Yellow: skipped guard (returned false)</li>
 *   <li>Red: execution failure/exception</li>
 *   <li>Default: general info messages</li>
 * </ul>
 *
 * @since 1.5.0
 */
public final class SandboxHintConsole {

	private static final String CONSOLE_NAME= "Sandbox Hint Execution"; //$NON-NLS-1$

	private static final class Holder {
		static final SandboxHintConsole INSTANCE= new SandboxHintConsole();

		private Holder() {
		}
	}

	private final MessageConsole console;

	private SandboxHintConsole() {
		console= new MessageConsole(CONSOLE_NAME, null);
		ConsolePlugin plugin= ConsolePlugin.getDefault();
		if (plugin != null) {
			IConsoleManager manager= plugin.getConsoleManager();
			manager.addConsoles(new IConsole[] { console });
		}
	}

	/**
	 * Returns the lazily initialized singleton console instance.
	 *
	 * @return the console instance
	 */
	public static SandboxHintConsole getInstance() {
		return Holder.INSTANCE;
	}

	/** Logs a successful guard execution using green text. */
	public void logSuccess(String message) {
		writeColored(message, Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN));
	}

	/** Logs a skipped guard execution using yellow text. */
	public void logSkipped(String message) {
		writeColored(message, Display.getDefault().getSystemColor(SWT.COLOR_DARK_YELLOW));
	}

	/** Logs a failed execution using red text. */
	public void logError(String message) {
		writeColored(message, Display.getDefault().getSystemColor(SWT.COLOR_DARK_RED));
	}

	/** Logs a general information message using the default color. */
	public void logInfo(String message) {
		try (MessageConsoleStream stream= console.newMessageStream()) {
			stream.println(message);
		} catch (IOException e) {
			ILog log= Platform.getLog(SandboxHintConsole.class);
			log.warn("Failed to write to console", e); //$NON-NLS-1$
		}
	}

	/** Reveals the console in the Console view. */
	public void reveal() {
		ConsolePlugin plugin= ConsolePlugin.getDefault();
		if (plugin != null) {
			IConsoleManager manager= plugin.getConsoleManager();
			manager.showConsoleView(console);
		}
	}

	/** Clears the console output. */
	public void clear() {
		console.clearConsole();
	}

	private void writeColored(String message, Color color) {
		try (MessageConsoleStream stream= console.newMessageStream()) {
			stream.setColor(color);
			stream.println(message);
		} catch (IOException e) {
			ILog log= Platform.getLog(SandboxHintConsole.class);
			log.warn("Failed to write to console", e); //$NON-NLS-1$
		}
	}
}