package evopaint.util.logging;
import evopaint.interfaces.IObjectRenderer;
import java.util.HashMap;
import java.util.Hashtable;
public abstract class Log {
private final int logLevel;
public Log(int logLevel) {
this.logLevel = logLevel;
}
public class Verbosity {
public static final int BRIEF = 0, VERBOSE = 1, VERBOSEVERBOSE = 2;
}
public void information(String message, Object... parameters) {
if (logLevel < LogLevel.INFORMATION) return;
String text = createLogText(message, parameters);
writeInformation(text);
}
public void warning(String message, Object... parameters) {
if (logLevel < LogLevel.WARNING) return;
String text = createLogText(message, parameters);
writeWarning(text);
}
public void error(String message, Object... parameters) {
if (logLevel < LogLevel.ERROR) return;
String text = createLogText(message, parameters);
writeError(text);
}
public void debug(String message, Object... parameters) {
if (logLevel >= LogLevel.DEBUG);
String text = createLogText(message, parameters);
writeDebug(text);
}
private String createLogText(String message, Object... parameters) {
String[] params = new String[parameters.length];
int i = 0;
for(Object o : parameters) {
params[i] = WriteObject(o);
i++;
}
return String.format(message, params);
}
protected abstract void writeInformation(String message);
protected abstract void writeWarning(String message);
protected abstract void writeError(String message);
protected abstract void writeDebug(String message);
private HashMap<Class<? extends Object>, IObjectRenderer> renderers = new HashMap<Class<? extends Object>, IObjectRenderer>();
private DefaultRenderer defaultRenderer = new DefaultRenderer();
private IObjectRenderer FindSuitableRenderer(Class<? extends Object> target) {
if (renderers.containsKey(target))
return renderers.get(target);
Class<? extends Object> superclass = target.getSuperclass();
if (superclass == null) return defaultRenderer;
//Recursive finding of higher renderer
if (renderers.containsKey(superclass)) {
IObjectRenderer renderer = renderers.get(superclass);
renderers.put(target, renderer);
}
return FindSuitableRenderer(superclass);
}
private String WriteObject(Object message) {
IObjectRenderer iObjectRenderer = FindSuitableRenderer(message.getClass());
return iObjectRenderer.render(message);
}
public void addRenderer(Class target, IObjectRenderer renderer) {
renderers.put(target, renderer);
}
public void clearRenderers() {
renderers.clear();
}
private class DefaultRenderer implements IObjectRenderer {
public String render(Object object) {
return object.toString();
}
}
}