/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2013 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;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.table.AbstractTableModel;
import org.apache.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.core.scanner.Alert;
import org.parosproxy.paros.model.HistoryReference;
/**
* A generic customizable TableModel for use by any panel that displays HistoryReferences.
*
* @deprecated (2.3.0) Superseded by {@link org.zaproxy.zap.view.table.HistoryReferencesTableModel}. It will be removed in a
* future release.
*/
@Deprecated
public class HistoryReferenceTableModel extends AbstractTableModel {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(HistoryReferenceTableModel.class);
/** The full set of allowed columns **/
public static final int COLUMN_ = 0;
public enum COLUMN {HREF_ID, TYPE_FLAG, METHOD, URL, CODE, REASON, RTT, SIZE, SESSION_ID, ALERT_FLAG, TAGS,
CUSTOM_1, CUSTOM_2, CUSTOM_3}
/** The column names. */
private static final String[] COLUMN_NAMES = {
Constant.messages.getString("view.href.table.header.hrefid"),
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.sessionid"),
Constant.messages.getString("view.href.table.header.highestalert"),
Constant.messages.getString("view.href.table.header.tags",
"", /* CUSTOM_1 */
"", /* CUSTOM_2 */
"")}; /* CUSTOM_3 */
/** The list to be displayed. */
private List<HistoryReference> hrefList;
private COLUMN[] columns = null;
/**
* Instantiates a new table model using the specified columns in the specified order.
*/
public HistoryReferenceTableModel(COLUMN[] columns) {
super();
this.columns = columns;
this.hrefList = new ArrayList<>();
}
/**
* This should be overriden for any custom columns
*/
@Override
public String getColumnName(int column) {
return COLUMN_NAMES[this.columns[column].ordinal()];
}
@Override
public int getColumnCount() {
return this.columns.length;
}
public COLUMN getColumn(int column) {
return this.columns[column];
}
@Override
public int getRowCount() {
return hrefList.size();
}
/**
* This should be overriden for any custom columns
*/
@Override
public Object getValueAt(int row, int col) {
// Get the href and the required field
HistoryReference href = hrefList.get(row);
try {
switch (this.columns[col]) {
case HREF_ID: return href.getHistoryId();
case TYPE_FLAG: return this.getHrefTypeIcon(href);
case METHOD: return href.getMethod();
case URL: return href.getURI().toString();
case CODE: return href.getStatusCode();
case REASON: return href.getReason();
case RTT: return href.getRtt();
case SIZE: return href.getResponseBodyLength();
case SESSION_ID: return href.getSessionId();
case ALERT_FLAG: return this.getHrefAlertIcon(href);
case TAGS: return listToCsv(href.getTags());
default: return null;
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
return null;
}
}
public HistoryReference getHistoryReference(int row) {
return hrefList.get(row);
}
private String listToCsv(List<String> list) {
if (list == null || list.size() == 0) {
return "";
}
StringBuilder sb = new StringBuilder();
for (String str : list) {
if (sb.length() > 0) {
sb.append(", ");
}
sb.append(str);
}
return sb.toString();
}
private ImageIcon getHrefAlertIcon(HistoryReference href) {
switch (href.getHighestAlert()) {
case Alert.RISK_INFO: return new ImageIcon(Constant.INFO_FLAG_IMAGE_URL);
case Alert.RISK_LOW: return new ImageIcon(Constant.LOW_FLAG_IMAGE_URL);
case Alert.RISK_MEDIUM: return new ImageIcon(Constant.MED_FLAG_IMAGE_URL);
case Alert.RISK_HIGH: return new ImageIcon(Constant.HIGH_FLAG_IMAGE_URL);
default: return null;
}
}
private ImageIcon getHrefTypeIcon(HistoryReference href) {
/*
switch (href.getHistoryType()) {
case Alert.RISK_INFO: return new ImageIcon(Constant.INFO_FLAG_IMAGE_URL);
case Alert.RISK_LOW: return new ImageIcon(Constant.LOW_FLAG_IMAGE_URL);
case Alert.RISK_MEDIUM: return new ImageIcon(Constant.MED_FLAG_IMAGE_URL);
case Alert.RISK_HIGH: return new ImageIcon(Constant.HIGH_FLAG_IMAGE_URL);
default: return null;
}
*/
return null;
}
/**
* Removes all the elements. Method is synchronized internally.
*/
public void removeAllElements() {
synchronized (hrefList) {
hrefList.clear();
fireTableDataChanged();
}
}
/**
* Adds a href. Method is synchronized internally.
*
* @param href the HistoryReference
*/
public void add(HistoryReference href) {
synchronized (hrefList) {
hrefList.add(href);
fireTableRowsInserted(hrefList.size() - 1, hrefList.size() - 1);
}
}
/**
* Removes the scan result for a particular uri and method. Method is synchronized internally.
*
* @param uri the uri
* @param method the method
*/
public void remove(HistoryReference href) {
synchronized (hrefList) {
int index = hrefList.indexOf(href);
if (index >= 0) {
hrefList.remove(index);
fireTableRowsDeleted(index, index);
}
}
}
/**
* Returns the type of column for given column index.
* This should be overriden for any custom columns
*
* @param columnIndex the column index
* @return the column class
*/
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (this.columns[columnIndex]) {
case HREF_ID: return Integer.class;
case TYPE_FLAG: return ImageIcon.class;
case METHOD: return String.class;
case URL: return String.class;
case CODE: return Integer.class;
case REASON: return String.class;
case RTT: return Integer.class;
case SIZE: return Integer.class;
case SESSION_ID: return Long.class;
case ALERT_FLAG: return ImageIcon.class;
case TAGS: return String.class;
default: return null;
}
}
}