/**
* WS-Attacker - A Modular Web Services Penetration Testing Framework Copyright
* (C) 2010 Christian Mainka
*
* This program 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 2 of the License, or (at your option) any later
* version.
*
* This program 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
* this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package wsattacker.gui.component.attackoverview.subcomponent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import wsattacker.gui.util.CenteredTableCellRenderer;
import wsattacker.gui.util.ColoredResultTableCellRenderer;
import wsattacker.gui.util.MultiLineTableCellRenderer;
import wsattacker.main.composition.ResultObserver;
import wsattacker.main.plugin.result.Result;
import wsattacker.main.plugin.result.ResultEntry;
import wsattacker.main.plugin.result.ResultLevel;
import wsattacker.util.DateFormater;
public class ResultTable
extends JTable
{
private static final long serialVersionUID = 1L;
ResultTableModel model;
JTable table;
public ResultTable()
{
table = this;
model = new ResultTableModel();
this.setModel( model );
this.setAutoscrolls( true );
this.getColumnModel().getColumn( 0 ).setPreferredWidth( 50 );
this.getColumnModel().getColumn( 1 ).setPreferredWidth( 50 );
this.getColumnModel().getColumn( 2 ).setPreferredWidth( 100 );
this.getColumnModel().getColumn( 3 ).setPreferredWidth( 500 );
this.getColumnModel().getColumn( 0 ).setCellRenderer( new CenteredTableCellRenderer() );
this.getColumnModel().getColumn( 1 ).setCellRenderer( new ColoredResultTableCellRenderer() );
this.getColumnModel().getColumn( 2 ).setCellRenderer( new CenteredTableCellRenderer() );
this.getColumnModel().getColumn( 3 ).setCellRenderer( new MultiLineTableCellRenderer() );
}
public void filterSources( List<String> sources )
{
model.filterSources( sources );
}
public void setLevel( ResultLevel level )
{
model.setLevel( level );
}
public class ResultTableModel
extends AbstractTableModel
implements ResultObserver
{
private static final long serialVersionUID = 1L;
final private String[] columnNames = { "Time", "Level", "Source", "Content" };
Result global;
Result result;
ResultLevel level;
List<String> sources;
public ResultTableModel()
{
result = new Result();
global = Result.getGlobalResult();
global.registerObserver( this );
level = ResultLevel.Important;
global.setObserverLevel( this, level );
sources = new ArrayList<String>();
}
public void setLevel( ResultLevel level )
{
this.level = level;
result = global.filterOnly( level );
if ( sources.size() > 0 )
{
result = result.filterOnly( sources );
}
global.setObserverLevel( this, level );
this.fireTableDataChanged();
}
public void filterSources( List<String> sources )
{
this.sources = sources;
result = global.filterOnly( level );
if ( sources.size() > 0 )
{
result = result.filterOnly( sources );
}
global.setSources( this, sources );
this.fireTableDataChanged();
}
@Override
public int getColumnCount()
{
return columnNames.length;
}
@Override
public String getColumnName( int num )
{
return this.columnNames[num];
}
@Override
public boolean isCellEditable( int y, int x )
{
return false;
}
@Override
public int getRowCount()
{
return result.size();
}
@Override
public Object getValueAt( int row, int col )
{
ResultEntry entry = result.get( row );
switch ( col )
{
case 0:
return DateFormater.timeonly( entry.getDate() );
case 1:
return entry.getLevel().toString();
case 2:
return entry.getSource();
case 3:
return entry.getContent();
}
return null;
}
@SuppressWarnings( { "rawtypes", "unchecked" } )
@Override
public Class getColumnClass( int c )
{
return getValueAt( 0, c ).getClass();
}
@Override
public void logUpdate( ResultEntry log )
{
result.add( log );
this.fireTableDataChanged();
// this.fireTableRowsInserted(getRowCount(), getRowCount()); // does
// not work for multiline cells
// SwingUtilities.invokeLater(new Runnable() {
//
// @Override
// public void run() {
// table.scrollRectToVisible(table.getCellRect(table.getRowCount() -
// 1, 0, true));
// }
// });
}
@Override
public void logClear()
{
result.clear();
this.fireTableRowsDeleted( 0, getRowCount() );
}
}
}