blob: aff5f7364056edcefdfc9b2e872891343a9c5558 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.log4j.chainsaw;
import java.util.Comparator;
import org.apache.log4j.helpers.Constants;
import org.apache.log4j.spi.LoggingEvent;
/**
*
* @author Claude Duguay
* @author Paul Smith <psmith@apache.org>
* @author Scott Deboy <sdeboy@apache.org>
*/
public class ColumnComparator implements Comparator {
protected int index;
protected boolean ascending;
protected String columnName;
public ColumnComparator(String columnName, int index, boolean ascending) {
this.columnName = columnName;
this.index = index;
this.ascending = ascending;
}
public int compare(Object o1, Object o2) {
int sort = 1;
if (o1 instanceof LogEventWrapper && o2 instanceof LogEventWrapper) {
// TODO not everything catered for here yet...
LoggingEvent e1 = ((LogEventWrapper) o1).getLogEvent();
LoggingEvent e2 = ((LogEventWrapper) o2).getLogEvent();
switch (index + 1) {
case ChainsawColumns.INDEX_LEVEL_COL_NAME:
sort = e1.getLevel().isGreaterOrEqual(e2.getLevel()) ? 1 : (-1);
break;
case ChainsawColumns.INDEX_LOGGER_COL_NAME:
sort = e1.getLoggerName().compareToIgnoreCase(e2.getLoggerName());
break;
case ChainsawColumns.INDEX_MESSAGE_COL_NAME:
sort =
e1.getMessage().toString().compareToIgnoreCase(
e2.getMessage().toString());
break;
case ChainsawColumns.INDEX_NDC_COL_NAME:
if (e1.getNDC() != null && e2.getNDC() != null) {
sort =
e1.getNDC().compareToIgnoreCase(
e2.getNDC());
} else if (e1.getNDC() == null && e2.getNDC() == null) {
sort = 0;
} else if (e1.getNDC() == null) {
sort = -1;
} else if (e2.getNDC() == null) {
sort = 1;
}
break;
case ChainsawColumns.INDEX_METHOD_COL_NAME:
if (
(e1.locationInformationExists())
& (e2.locationInformationExists())) {
sort =
e1.getLocationInformation().getMethodName().compareToIgnoreCase(
e2.getLocationInformation().getMethodName());
}
break;
case ChainsawColumns.INDEX_CLASS_COL_NAME:
if (
(e1.locationInformationExists())
& (e2.locationInformationExists())) {
sort =
e1.getLocationInformation().getClassName().compareToIgnoreCase(
e2.getLocationInformation().getClassName());
}
break;
case ChainsawColumns.INDEX_FILE_COL_NAME:
if (
(e1.locationInformationExists())
& (e2.locationInformationExists())) {
sort =
e1.getLocationInformation().getFileName().compareToIgnoreCase(
e2.getLocationInformation().getFileName());
}
break;
case ChainsawColumns.INDEX_TIMESTAMP_COL_NAME:
sort = (e1.getTimeStamp()<e2.getTimeStamp() ? -1 : (e1.getTimeStamp()==e2.getTimeStamp() ? 0 : 1));
break;
case ChainsawColumns.INDEX_THREAD_COL_NAME:
sort = e1.getThreadName().compareToIgnoreCase(e2.getThreadName());
break;
case ChainsawColumns.INDEX_ID_COL_NAME:
int id1 = Integer.parseInt(e1.getProperty(Constants.LOG4J_ID_KEY));
int id2 = Integer.parseInt(e2.getProperty(Constants.LOG4J_ID_KEY));
if (id1 == id2) {
sort = 0;
} else if (id1 < id2) {
sort = 1;
} else {
sort = -1;
}
break;
case ChainsawColumns.INDEX_THROWABLE_COL_NAME:
if (e1.getThrowableStrRep() != null && e2.getThrowableStrRep() != null) {
String[] s1 = e1.getThrowableStrRep();
String[] s2 = e2.getThrowableStrRep();
boolean foundDiff = false;
for (int i = 0;i<s1.length;i++) {
if (foundDiff || i > s2.length) {
break;
}
sort = s1[i].compareToIgnoreCase(s2[i]);
foundDiff = sort != 0;
}
}
break;
case ChainsawColumns.INDEX_LINE_COL_NAME:
if (
(e1.locationInformationExists())
& (e2.locationInformationExists())) {
sort =
e1.getLocationInformation().getLineNumber().compareToIgnoreCase(
e2.getLocationInformation().getLineNumber());
}
break;
//other columns may be Property values - see if there is an Property value matching column name
default:
if (e1.getProperty(columnName) != null && e2.getProperty(columnName) != null) {
sort = e1.getProperty(columnName).toString().compareToIgnoreCase(e2.getProperty(columnName).toString());
}
}
}
sort = (sort == 0) ? 0 : ((sort < 0) ? (-1) : 1);
if (!ascending && (sort != 0)) {
sort = (sort < 0) ? 1 : (-1);
}
return sort;
}
}