/*******************************************************************************
* Copyright (c) 2003-2005, 2013 Till Zoppke.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Till Zoppke - initial API and implementation
******************************************************************************/
/*
* Created on 10.08.2003
*
* To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
package eniac.log;
import java.util.LinkedList;
import java.util.List;
import eniac.Manager;
import eniac.util.Status;
import eniac.util.StatusListener;
/**
* @author zoppke
*
* To change the template for this generated type comment go to Window -
* Preferences - Java - Code Generation - Code and Comments
*/
public class Log implements StatusListener {
// containing all text that was passed to this logger
private StringBuilder _stringBuilder = new StringBuilder();
// vector containing all registered logListeners
private List<LogListener> _logListeners = new LinkedList<>();
// reference to LogPanel
private LogPanel _logPanel = null;
// ========================== singleton stuff
// ===============================
// self reference
private static Log instance = null;
private Log() {
// empty
}
public static synchronized Log getInstance() {
if (instance == null) {
instance = new Log();
instance.init();
}
return instance;
}
private void init() {
Status.LIFECYCLE.addListener(this);
addLogListener(new ConsolePrinter());
addLogListener(new DialogPrinter());
}
// ============================ methods
// =====================================
/**
* @return
*/
public String getText() {
return _stringBuilder.toString();
}
/**
* adds a line to this stringbuffer
*
* @param line
* A string to be added to this logger
*/
private void addMessage(LogMessage message) {
_stringBuilder.append(message);
_stringBuilder.append('\n');
// inform listeners
for (LogListener listener : _logListeners) {
listener.incomingMessage(message);
}
}
/**
* empties the Logger.
*/
public void clear() {
_stringBuilder = new StringBuilder();
// inform listeners
for (LogListener listener : _logListeners) {
listener.cleared();
}
}
/**
* Registers a logListener at this logger
*
* @param listener
* the listener to be added
*/
public void addLogListener(LogListener listener) {
_logListeners.add(listener);
}
/**
* Removes a logListener from this logger
*
* @param listener
* The listener to be removed
*/
public void removeLogListener(LogListener listener) {
_logListeners.remove(listener);
}
/**
* @return
*/
public LogPanel getLogPanel() {
if (_logPanel == null) {
_logPanel = new LogPanel();
_logPanel.init();
addLogListener(_logPanel);
}
return _logPanel;
}
// ======================== convenience methods
// =============================
public static void log(String message) {
getInstance().addMessage(new LogMessage(message));
}
public static void log(String message, int type) {
getInstance().addMessage(new LogMessage(message, type));
}
public static void log(String message, int type, Object[] objects) {
getInstance().addMessage(new LogMessage(message, type, objects, false));
}
public static void log(String message, int type, Object object) {
getInstance().addMessage(new LogMessage(message, type, new Object[]{object}, false));
}
public static void log(String message, int type, Object object, boolean forUser) {
getInstance().addMessage(new LogMessage(message, type, new Object[]{object}, forUser));
}
public static void log(String message, int type, boolean forUser) {
getInstance().addMessage(new LogMessage(message, type, forUser));
}
@Override
public void statusChanged(Status status, Object newValue) {
if (newValue == Manager.LifeCycle.DESTROYED) {
instance = null;
}
}
}