package org.openflexo.fib.utils;
import java.awt.Color;
import java.awt.Window;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import org.openflexo.fib.FIBLibrary;
import org.openflexo.fib.controller.FIBDialog;
import org.openflexo.fib.model.FIBComponent;
import org.openflexo.icon.UtilsIconLibrary;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.logging.FlexoLoggingManager;
import org.openflexo.logging.LogRecord;
import org.openflexo.logging.LogRecords;
import org.openflexo.logging.LoggingFilter;
import org.openflexo.logging.LoggingFilter.FilterType;
import org.openflexo.toolbox.FileResource;
import org.openflexo.toolbox.HasPropertyChangeSupport;
import org.openflexo.toolbox.ImageIconResource;
import org.openflexo.toolbox.StringUtils;
public class FlexoLoggingViewer implements HasPropertyChangeSupport {
static final Logger logger = Logger.getLogger(FlexoLoggingViewer.class.getPackage().getName());
public static final File LOGGING_VIEWER_FIB = new FileResource("Fib/LoggingViewer.fib");
public static final ImageIcon FILTER_ICON = new ImageIconResource("Icons/Utils/Search.png");
private FlexoLoggingManager loggingManager;
private PropertyChangeSupport _pcSupport;
public Vector<LoggingFilter> filters = new Vector<LoggingFilter>();
public String searchedText;
public boolean displayLogLevel = false;
public boolean displayPackage = true;
public boolean displayClass = true;
public boolean displayMethod = true;
public boolean displaySequence = true;
public boolean displayDate = true;
public boolean displayMillis = true;
public boolean displayThread = true;
private static FlexoLoggingViewer instance;
private static FIBDialog<FlexoLoggingViewer> dialog;
public static void showLoggingViewer(FlexoLoggingManager loggingManager, Window parent) {
System.out.println("showLoggingViewer with " + loggingManager);
FIBComponent loggingViewerComponent = FIBLibrary.instance().retrieveFIBComponent(LOGGING_VIEWER_FIB);
if (instance == null || dialog == null) {
instance = new FlexoLoggingViewer(loggingManager);
dialog = FIBDialog.instanciateAndShowDialog(loggingViewerComponent, instance, parent, false,
FlexoLocalization.getMainLocalizer());
} else {
dialog.showDialog();
}
}
public FlexoLoggingViewer(FlexoLoggingManager loggingManager) {
_pcSupport = new PropertyChangeSupport(this);
this.loggingManager = loggingManager;
}
public LogRecords getRecords() {
return loggingManager.logRecords;
}
public Icon getIconForFilter(LoggingFilter filter) {
return FILTER_ICON;
}
public Icon getIconForLogRecord(LogRecord record) {
if (record.level == Level.WARNING) {
return UtilsIconLibrary.WARNING_ICON;
}
if (record.level == Level.SEVERE) {
return UtilsIconLibrary.ERROR_ICON;
}
return null;
}
public Color getColorForLogRecord(LogRecord record) {
if (record.level == Level.INFO) {
return Color.BLACK;
} else if (record.level == Level.WARNING) {
return Color.RED;
} else if (record.level == Level.SEVERE) {
return Color.PINK;
}
return Color.GRAY;
}
public Color getBgColorForLogRecord(LogRecord record) {
if (getRecords().filtersApplied()) {
for (LoggingFilter f : filters) {
if (f.type == FilterType.Highlight && f.filterDoesApply(record)) {
return Color.YELLOW;
}
}
}
return null;
}
private static final Level[] LEVELS = { Level.SEVERE, Level.WARNING, Level.INFO, Level.FINE, Level.FINER, Level.FINEST };
public Level[] getAvailableLevels() {
return LEVELS;
}
public int getNumberOfLogsToKeep() {
return loggingManager.getMaxLogCount();
}
public void setNumberOfLogsToKeep(int numberOfLogsToKeep) {
loggingManager.setMaxLogCount(numberOfLogsToKeep);
}
public boolean getIsInfiniteNumberOfLogs() {
return getNumberOfLogsToKeep() == -1;
}
public void setIsInfiniteNumberOfLogs(boolean isInfinite) {
if (isInfinite) {
setNumberOfLogsToKeep(-1);
} else {
setNumberOfLogsToKeep(500);
}
}
public boolean isKeepLogTraceInMemory() {
return loggingManager.getKeepLogTrace();
}
public void setKeepLogTraceInMemory(boolean keepLogTraceInMemory) {
loggingManager.setKeepLogTrace(keepLogTraceInMemory);
}
private File configurationFile;
public File getConfigurationFile() {
if (configurationFile == null) {
String loggingFileName = loggingManager.getConfigurationFileName();
if (loggingFileName != null && new File(loggingFileName).exists()) {
configurationFile = new File(loggingFileName);
}
}
return configurationFile;
}
public void setConfigurationFile(File configurationFile) {
this.configurationFile = configurationFile;
loggingManager.setConfigurationFileName(configurationFile.getAbsolutePath());
_pcSupport.firePropertyChange("configurationFile", null, configurationFile);
}
public Level getLogLevel() {
return loggingManager.getDefaultLoggingLevel();
}
public void setLogLevel(Level lev) {
loggingManager.setDefaultLoggingLevel(lev);
configurationFile = null;
_pcSupport.firePropertyChange("configurationFile", null, configurationFile);
}
public void refresh() {
_pcSupport.firePropertyChange("records", null, getRecords());
}
@Override
public String getDeletedProperty() {
return null;
}
@Override
public PropertyChangeSupport getPropertyChangeSupport() {
return _pcSupport;
}
public void printStackTrace(LogRecord record) {
if (record == null) {
return;
}
System.err.println("Stack trace for '" + record.message + "':");
StringTokenizer st = new StringTokenizer(record.getStackTraceAsString(), StringUtils.LINE_SEPARATOR);
while (st.hasMoreTokens()) {
System.err.println("\t" + st.nextToken());
}
}
public LoggingFilter createFilter() {
LoggingFilter newFilter = new LoggingFilter("New filter");
filters.add(newFilter);
return newFilter;
}
public void deleteFilter(LoggingFilter filter) {
filters.remove(filter);
}
public void applyFilters() {
getRecords().applyFilters(filters);
}
public void dismissFilters() {
getRecords().dismissFilters();
}
public void searchText() {
if (StringUtils.isNotEmpty(searchedText)) {
getRecords().searchText(searchedText);
}
}
public void dismissSearchText() {
getRecords().dismissSearchText();
}
public void loadLogsFile(File logsFile) {
System.out.println("Open logs " + logsFile);
System.out.println("logs=" + FlexoLoggingManager.loadLogFile(logsFile));
}
}