All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.invation.code.toval.debug.Debug Maven / Gradle / Ivy

package de.invation.code.toval.debug;

import java.io.IOException;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import de.invation.code.toval.file.FileWriter;
import de.invation.code.toval.validate.ParameterException;

/**
 * Debugging class.
 * It provides methods for debugging messages.
 * Printing of debug-messages depends on the actual {@link DebugMode}.
 * @author stocker
 *
 */
public class Debug {
	/**
	 * Date format for debug-outputs
	 */
	private static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
	/**
	 * Debug mode
	 */
	private static DebugMode debugMode = DebugMode.SILENT;
	
	private static PrintStream printStream = System.out;
	
	private static final String messageOffset = "                    ";
	
	private static FileWriter fileWriter = null;
	
	private static OutputMode outputMode = OutputMode.SYSOUT;
	
	private static boolean includeHeader = true;
	
	private static Map storedDebugInfo = new HashMap();
	
	public static synchronized void setOutputMode(OutputMode mode){
		outputMode = mode;
		if(outputMode == OutputMode.FILE && fileWriter == null){
			try {
				fileWriter = new FileWriter("debug");
			} catch (ParameterException e) {
				printStream.println("Cannot prepare file writer for output-mode FILE: Parameter Exception");
			}
		}
	}
	
	public static int newStoredDebuggingInfo(){
		int i=0;
		while(storedDebugInfo.containsKey(i)){
			i++;
		}
		storedDebugInfo.put(i, new StringBuilder());
		return i;
	}
	
	public static void addStoredDebuggingInfo(int key){
		if(debugMode == DebugMode.SILENT)
			return;
		println(storedDebugInfo.get(key).toString());
		storedDebugInfo.remove(key);
	}
	
	public static void setIncludeHeader(boolean includeHeader) {
		Debug.includeHeader = includeHeader;
	}

	/**
	 * Sets the debug mode
	 * @param mode New debug mode
	 * @see DebugMode
	 */
	public static void setDebugMode(DebugMode mode){
		debugMode = mode;
	} 
	
	public static DebugMode getDebugMode(){
		return debugMode;
	}
	
	public static boolean isActive(){
		return debugMode != DebugMode.SILENT;
	}
	
	public static void deactivate(){
		setDebugMode(DebugMode.SILENT);
	}
	
	public static void closeFile(){
		try {
			fileWriter.closeFile();
		} catch (IOException e) {
			printStream.println("Cannot close file: I/O Exception");
		}
	}
	
	/**
	 * Prints a debug message.
	 * This method is used for all low-priority messages.
	 * They are only printed, when {@link Debug#debugMode} is {@link DebugMode#EXTENDED}.
	 * @param message Debug message
	 */
	public static void message(String message){
		message(message, DebugMode.EXTENDED);
	}
	
	public static void message(Integer key, String message){
		message(key, message, DebugMode.EXTENDED);
	}
	
	public static void message(String message, DebugMode mode){
		message(message, mode, true);
	}
	
	public static void message(Integer key, String message, DebugMode mode){
		message(key, message, mode, true);
	}
	
	public static void message(String message, DebugMode mode, boolean withHeader){
		message(null, message, mode, withHeader);
	}
	
	public static void message(Integer key, String message, DebugMode mode, boolean withHeader){
		if(debugMode == DebugMode.SILENT)
			return;
		if(mode.ordinal() >= debugMode.ordinal()){
			if(withHeader && includeHeader){
				if(key != null){
					storedDebugInfo.get(key).append(getTime()+" Message:   "+prepareMessage(message));
					storedDebugInfo.get(key).append('\n');
				} else {
					println(getTime()+" Message:   "+prepareMessage(message));
				}
			} else {
				if(key != null){
					storedDebugInfo.get(key).append(prepareMessage(message));
					storedDebugInfo.get(key).append('\n');
				} else {
					println(prepareMessage(message));
				}
			}
		}
	}
	
	public static void messageN(String message){
		messageN(message, DebugMode.EXTENDED);
	}
	
	public static void messageN(String message, DebugMode mode){
		if(debugMode == DebugMode.SILENT)
			return;
		if(mode.ordinal() >= debugMode.ordinal()){
			print(getTime()+" Message:   "+prepareMessage(message));
		}
	}
	
	private static String prepareText(String text, String offset){
		String output = new String();
		for(int i=0; i= debugMode.ordinal()){
			if(outputMode == OutputMode.SYSOUT){
				printStream.println();
			} else if(outputMode == OutputMode.FILE){
				try {
					fileWriter.newLine();
				} catch (IOException e) {
					printStream.println("Cannot write output to file: I/O Exception");
				}
			}
		}
	}
	
	private static void print(String string){
		if(outputMode == OutputMode.SYSOUT){
			printStream.print(string);
		} else if(outputMode == OutputMode.FILE){
			try {
				fileWriter.write(string);
			} catch (IOException e) {
				printStream.println("Cannot write output to file: I/O Exception");
			}
		}
	}
	
	private static void println(String string){
		if(outputMode == OutputMode.SYSOUT){
			printStream.println(string);
		} else if(outputMode == OutputMode.FILE){
			try {
				fileWriter.writeLine(string);
			} catch (IOException e) {
				printStream.println("Cannot write output to file: I/O Exception");
			}
		}
	}
	
	public static void newMethod(){
//		newLine();
	}
	
	/**
	 * Returns the actual time in the format specified by {@link Debug#sdf}.
	 * @return The actual date
	 */
	private static synchronized String getTime(){
		return sdf.format(new Date());
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy