/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2014 The ZAP Development Team
*
* Licensed 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.zaproxy.zap.view.table;
import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;
import javax.swing.table.AbstractTableModel;
import org.parosproxy.paros.Constant;
/**
* An abstract implementation of {@code HistoryReferencesTableModel}. It contains basic implementation of all the methods except
* the ones that access the data. the names of all the columns and has
*
* @param <T> the type of table model entries
*/
public abstract class AbstractHistoryReferencesTableModel<T extends HistoryReferencesTableEntry> extends AbstractTableModel
implements HistoryReferencesTableModel<T> {
private static final long serialVersionUID = 1L;
private static final String[] COLUMN_NAMES = {
Constant.messages.getString("view.href.table.header.hrefid"),
Constant.messages.getString("view.href.table.header.timestamp.request"),
Constant.messages.getString("view.href.table.header.timestamp.response"),
Constant.messages.getString("view.href.table.header.hreftype"),
Constant.messages.getString("view.href.table.header.method"),
Constant.messages.getString("view.href.table.header.url"),
Constant.messages.getString("view.href.table.header.code"),
Constant.messages.getString("view.href.table.header.reason"),
Constant.messages.getString("view.href.table.header.rtt"),
Constant.messages.getString("view.href.table.header.size.message"),
Constant.messages.getString("view.href.table.header.size.requestheader"),
Constant.messages.getString("view.href.table.header.size.requestbody"),
Constant.messages.getString("view.href.table.header.size.responseheader"),
Constant.messages.getString("view.href.table.header.size.responsebody"),
Constant.messages.getString("view.href.table.header.sessionid"),
Constant.messages.getString("view.href.table.header.highestalert"),
Constant.messages.getString("view.href.table.header.note"),
Constant.messages.getString("view.href.table.header.tags") };
private final Column[] columns;
private final Map<Column, Integer> cacheColumnToColumnIdx;
/**
* Constructs an {@code AbstractHistoryReferencesTableModel} with the specified columns (in the specified order).
*
* @param columns the columns that will have the model
* @throws IllegalArgumentException if {@code columns} is null or empty.
*/
public AbstractHistoryReferencesTableModel(Column[] columns) {
super();
if (columns == null || columns.length == 0) {
throw new IllegalArgumentException("Parameter columns must not be null.");
}
this.columns = Arrays.copyOf(columns, columns.length);
this.cacheColumnToColumnIdx = buildCacheColumnToColumnIdx(columns);
}
private Map<Column, Integer> buildCacheColumnToColumnIdx(Column[] columns) {
Map<Column, Integer> cache = new TreeMap<>();
for (int i = 0; i < columns.length; i++) {
cache.put(columns[i], Integer.valueOf(i));
}
return cache;
}
/**
* Tells whether or not the given column index is a custom column.
*
* @param columnIndex the column index
* @return {@code true} if it is a custom column, {@code false} otherwise.
* @see HistoryReferencesTableModel.Column#CUSTOM
*/
protected boolean isCustomColumn(int columnIndex) {
return isCustomColumn(columns, columnIndex);
}
/**
* Returns the {@code Class} of the given column.
*
* @param columnIndex the column being queried
* @return the {@code Class} of the column
*/
@Override
public abstract Class<?> getColumnClass(int columnIndex);
@Override
public Column[] getColumns() {
return Arrays.copyOf(columns, columns.length);
}
@Override
public Column getColumn(int columnIndex) {
return columns[columnIndex];
}
@Override
public int getColumnIndex(Column column) {
Integer idx = cacheColumnToColumnIdx.get(column);
if (idx != null) {
return idx.intValue();
}
return -1;
}
@Override
public boolean isColumnEnabled(Column column) {
return getColumnIndex(column) != -1;
}
@Override
public String getColumnName(int columnIndex) {
return COLUMN_NAMES[this.columns[columnIndex].ordinal()];
}
@Override
public int getColumnCount() {
return this.columns.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return getEntry(rowIndex).getValue(getColumn(columnIndex));
}
/**
* Tells whether or not the given column index in the given columns is a custom column.
*
* @param columns the columns that will checked
* @param columnIndex the column index
* @return {@code true} if it is a custom column, {@code false} otherwise.
*/
protected static boolean isCustomColumn(final Column[] columns, final int columnIndex) {
return (columns[columnIndex] == Column.CUSTOM);
}
}