/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.logging;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import org.openflexo.kvc.KVCObject;
import org.openflexo.logging.LoggingFilter.FilterType;
import org.openflexo.toolbox.HasPropertyChangeSupport;
import org.openflexo.xmlcode.XMLSerializable;
/**
* This class is used to encode all log records of a session (current or expired) of Flexo.<br>
* An instance of LogRecords can be represented in a FlexoLoggingViewer.
*
* @author sguerin
*/
public class LogRecords extends KVCObject implements XMLSerializable, HasPropertyChangeSupport {
private LinkedList<LogRecord> allRecords;
private ArrayList<LogRecord> filteredRecords = new ArrayList<LogRecord>();
private List<LogRecord> records;
private int totalLogs = 0;
private int totalWarningLogs = 0;
private int totalSevereLogs = 0;
private int logCount = 0;
private int warningCount = 0;
private int severeCount = 0;
private boolean filtersApplied = false;
private boolean textSearchApplied = false;
private PropertyChangeSupport pcSupport;
public LogRecords() {
super();
pcSupport = new PropertyChangeSupport(this);
allRecords = new LinkedList<LogRecord>();
records = allRecords;
}
@Override
public PropertyChangeSupport getPropertyChangeSupport() {
return pcSupport;
}
@Override
public String getDeletedProperty() {
return null;
}
public void add(LogRecord record, FlexoLoggingManager loggingManager) {
synchronized (allRecords) {
if (loggingManager.getMaxLogCount() > -1 && allRecords.size() > loggingManager.getMaxLogCount()) {
allRecords.remove(0);
}
allRecords.add(record);
if (record.level == Level.WARNING) {
totalWarningLogs++;
}
if (record.level == Level.SEVERE) {
totalSevereLogs++;
}
totalLogs++;
}
}
public LogRecord elementAt(int row) {
return allRecords.get(row);
}
/*
@Override
public int getRowCount() {
return allRecords.size();
}
@Override
public int getColumnCount() {
return 9;
}
@Override
public String getColumnName(int arg0) {
switch (arg0) {
case 0:
return "Level";
case 1:
return "Message";
case 2:
return "Package";
case 3:
return "Class";
case 4:
return "Method";
case 5:
return "Seq";
case 6:
return "Date";
case 7:
return "Millis";
case 8:
return "Thread";
default:
return "";
}
}
@Override
public Class<String> getColumnClass(int arg0) {
return String.class;
}
@Override
public boolean isCellEditable(int arg0, int arg1) {
return false;
}
@Override
public Object getValueAt(int row, int col) {
LogRecord record = allRecords.get(row);
switch (col) {
case 0:
return record.level;
case 1:
return record.message;
case 2:
return record.logger;
case 3:
return record.classAsString();
case 4:
return record.methodName;
case 5:
return record.sequenceAsString();
case 6:
return record.dateAsString();
case 7:
return record.millisAsString();
case 8:
return record.threadAsString();
default:
return "";
}
}
@Override
public void setValueAt(Object arg0, int arg1, int arg2) {
// do nothing : a log record is not editable
}
@Override
public void addTableModelListener(TableModelListener arg0) {
model.addTableModelListener(arg0);
}
@Override
public void removeTableModelListener(TableModelListener arg0) {
model.removeTableModelListener(arg0);
}
*/
public List<LogRecord> getRecords() {
return records;
}
public void setRecords(List<LogRecord> records) {
this.records = records;
}
public void addToRecords(LogRecord record) {
records.add(record);
}
public void removeFromRecords(LogRecord record) {
records.remove(record);
}
public int getTotalLogs() {
return totalLogs;
}
public int getWarningLogs() {
return totalWarningLogs;
}
public int getSevereLogs() {
return totalSevereLogs;
}
public int getLogCount() {
if (!filtersApplied && !textSearchApplied) {
return totalLogs;
}
return logCount;
}
public int getWarningCount() {
if (!filtersApplied && !textSearchApplied) {
return totalWarningLogs;
}
return warningCount;
}
public int getSevereCount() {
if (!filtersApplied && !textSearchApplied) {
return totalSevereLogs;
}
return severeCount;
}
public void applyFilters(List<LoggingFilter> filters) {
logCount = 0;
warningCount = 0;
severeCount = 0;
filtersApplied = true;
filteredRecords.clear();
boolean onlyKeep = false;
for (LoggingFilter f : filters) {
if (f.type == FilterType.OnlyKeep) {
onlyKeep = true;
}
}
for (LogRecord r : allRecords) {
boolean keepRecord = !onlyKeep;
for (LoggingFilter f : filters) {
if (f.filterDoesApply(r)) {
if (f.type == FilterType.OnlyKeep) {
keepRecord = true;
}
}
}
for (LoggingFilter f : filters) {
if (f.filterDoesApply(r)) {
if (f.type == FilterType.Dismiss) {
keepRecord = false;
}
}
}
if (keepRecord) {
filteredRecords.add(r);
logCount++;
if (r.level == Level.WARNING) {
warningCount++;
} else if (r.level == Level.SEVERE) {
severeCount++;
}
}
}
records = filteredRecords;
notifyFilteringChange();
}
public void dismissFilters() {
filtersApplied = false;
records = allRecords;
notifyFilteringChange();
}
public void searchText(String someText) {
logCount = 0;
warningCount = 0;
severeCount = 0;
textSearchApplied = true;
records = new ArrayList<LogRecord>();
LoggingFilter f = new LoggingFilter("search");
f.setHasFilteredMessage(true);
f.filteredContent = someText;
for (LogRecord r : filtersApplied() ? filteredRecords : allRecords) {
if (f.filterDoesApply(r)) {
records.add(r);
logCount++;
if (r.level == Level.WARNING) {
warningCount++;
} else if (r.level == Level.SEVERE) {
severeCount++;
}
}
}
notifyFilteringChange();
}
public void dismissSearchText() {
textSearchApplied = false;
if (filtersApplied()) {
records = filteredRecords;
notifyFilteringChange();
} else {
records = allRecords;
notifyFilteringChange();
}
}
private void notifyFilteringChange() {
pcSupport.firePropertyChange("logCount", -1, logCount);
pcSupport.firePropertyChange("warningCount", -1, warningCount);
pcSupport.firePropertyChange("severeCount", -1, severeCount);
pcSupport.firePropertyChange("records", null, records);
pcSupport.firePropertyChange("filtersApplied", false, true);
pcSupport.firePropertyChange("textSearchApplied", false, true);
}
public boolean filtersApplied() {
return filtersApplied;
}
public boolean textSearchApplied() {
return textSearchApplied;
}
}