blob: 494c5446001d299ad4b14bb1bf5d1b708b5a361d [file] [log] [blame]
package org.apache.log4j.chainsaw.vfs;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemException;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.chainsaw.SortTableModel;
/**=
* Displays the file objects in a List in a TableModel.
* @author psmith
*
*/
public class DirectoryListTableModel extends AbstractTableModel implements SortTableModel{
private final String[] COLUMN_NAMES = new String[] {"Name", "Size", "Last Modified"};
private List data = new ArrayList();
private NumberFormat nf = NumberFormat.getIntegerInstance();
private int currentSortColumn;
private boolean currentSortAscending;
private boolean sortEnabled;
private final Logger logger = LogManager.getLogger(DirectoryListTableModel.class);
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnCount()
*/
public int getColumnCount() {
return COLUMN_NAMES.length;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getRowCount()
*/
public int getRowCount() {
return data.size();
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
public Object getValueAt(int rowIndex, int columnIndex) {
FileObject fileObject = (FileObject) data.get(rowIndex);
try {
if (fileObject.getType().hasChildren() || !fileObject.getType().hasContent()) {
return handleDirectory(columnIndex, fileObject);
} else {
return handleFile(columnIndex, fileObject);
}
} catch (Exception e) {
logger.error("error retrieving value", e);
}
return "{Error}";
}
/**
* @param columnIndex
* @param fileObject
*/
private Object handleDirectory(int columnIndex, FileObject fileObject) throws FileSystemException {
switch (columnIndex) {
case 0 :
return fileObject.getName().getBaseName();
case 1 :
return "";
case 2 :
return new Date(fileObject.getContent()
.getLastModifiedTime());
}
return null;
}
/**
* @param columnIndex
* @param fileObject
* @return
*/
private Object handleFile(int columnIndex, FileObject fileObject) throws FileSystemException {
switch (columnIndex) {
case 0 :
return fileObject.getName().getBaseName();
case 1 :
return formatFileSize(fileObject.getContent().getSize());
case 2 :
return new Date(fileObject.getContent()
.getLastModifiedTime());
}
return null;
}
/**
* Returns a formatted version of the file size
* @param l
* @return
*/
private Object formatFileSize(double size) {
// // TODO format should come from a preference model
if(size <1024) {
return nf.format(size);
}else if(size < 1024*1024) {
return nf.format((size/1024)) + "kb";
}else {
return nf.format(size/(1024*1024))+"Mb";
}
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnName(int)
*/
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}
/**
* Clears the underlying model and replaces it with the array, firing a TableDataChanged event in the process.
* @param objects
*/
public void setFiles(Collection objects) {
this.data.clear();
this.data.addAll(objects);
sort();
fireTableDataChanged();
}
/**
* Clears the underlying model, and fires a TableDataChanged event.
*/
public void clear() {
data.clear();
fireTableDataChanged();
}
/**
*
*/
public DirectoryListTableModel() {
super();
nf.setGroupingUsed(true);
nf.setMaximumFractionDigits(2);
}
/* (non-Javadoc)
* @see org.apache.log4j.chainsaw.SortTableModel#sortColumn(int, boolean)
*/
public void sortColumn(int col, boolean ascending) {
this.currentSortColumn = col;
this.currentSortAscending = ascending;
this.sortEnabled = true;
sort();
}
/* (non-Javadoc)
* @see org.apache.log4j.chainsaw.SortTableModel#sort()
*/
public void sort() {
if (isSortEnabled()) {
synchronized (data) {
Collections.sort(
data,new Comparator() {
public int compare(Object o1, Object o2) {
FileObject fo1 = (FileObject) o1;
FileObject fo2 = (FileObject) o2;
int sort = 0;
try {
switch (currentSortColumn) {
case 0 :
sort = fo1
.getName()
.getBaseName()
.compareTo(
fo2.getName().getBaseName());
break;
case 1 :
sort = new Long(fo1.getContent().getSize())
.compareTo(new Long(fo2
.getContent().getSize()));
break;
case 2:
sort = new Long(fo1.getContent().getLastModifiedTime()).compareTo(new Long(fo2.getContent().getLastModifiedTime()));
break;
}
} catch (Exception e) {
logger.error("Error during sort", e);
sort = -1;
}
sort = (currentSortAscending)?sort:-sort;
return sort;
}});
}
fireTableRowsUpdated(0, Math.max(data.size() - 1, 0));
}
}
/* (non-Javadoc)
* @see org.apache.log4j.chainsaw.SortTableModel#isSortable(int)
*/
public boolean isSortable(int col) {
// TODO should all columns be sorted? I think so...
return true;
}
/* (non-Javadoc)
* @see org.apache.log4j.chainsaw.SortTableModel#isSortEnabled()
*/
public boolean isSortEnabled() {
return sortEnabled;
}
/**
* @param row
* @return
*/
public FileObject getFileObject(int row) {
if(row >= data.size()) {
return null;
}
return (FileObject) data.get(row);
}
}