/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* 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.extension.spider;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import org.parosproxy.paros.Constant;
/**
* The Class HttpSessionsTableModel that is used as a TableModel for the Http Sessions Panel.
*/
public class SpiderPanelTableModel extends AbstractTableModel {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = -6380136823410869457L;
/** The column names. */
private static final String[] COLUMN_NAMES = { Constant.messages.getString("spider.table.header.inScope"),
Constant.messages.getString("spider.table.header.method"),
Constant.messages.getString("spider.table.header.uri"),
Constant.messages.getString("spider.table.header.flags") };
/** The Constant defining the COLUMN COUNT. */
private static final int COLUMN_COUNT = COLUMN_NAMES.length;
/** The Spider scan results. */
private List<SpiderScanResult> scanResults;
/**
* Instantiates a new spider panel table model.
*/
public SpiderPanelTableModel() {
super();
scanResults = new ArrayList<>();
}
@Override
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}
@Override
public int getColumnCount() {
return COLUMN_COUNT;
}
@Override
public int getRowCount() {
return scanResults.size();
}
@Override
public Object getValueAt(int row, int col) {
// Get the ScanResult and the required field
SpiderScanResult result = scanResults.get(row);
switch (col) {
case 0:
return result.processed;
case 1:
return result.method;
case 2:
return result.uri;
case 3:
return result.flags;
default:
return null;
}
}
/**
* Removes all the elements. Method is synchronized internally.
*/
public void removeAllElements() {
scanResults.clear();
fireTableDataChanged();
}
/**
* Adds a new spider scan result. Method is synchronized internally.
*
* @param uri the uri
* @param method the method
* @param flags the flags
* @param skipped {@code true} if the result was skipped, {@code false} otherwise
*/
public void addScanResult(String uri, String method, String flags, boolean skipped) {
SpiderScanResult result = new SpiderScanResult(uri, method, flags, !skipped);
scanResults.add(result);
fireTableRowsInserted(scanResults.size() - 1, scanResults.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 removesScanResult(String uri, String method) {
SpiderScanResult toRemove = new SpiderScanResult(uri, method);
int index = scanResults.indexOf(toRemove);
if (index >= 0) {
scanResults.remove(index);
fireTableRowsDeleted(index, index);
}
}
/**
* Returns the type of column for given column index.
*
* @param columnIndex the column index
* @return the column class
*/
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return Boolean.class;
case 1:
return String.class;
case 2:
return String.class;
case 3:
return String.class;
}
return null;
}
/**
* The Class SpiderScanResult that stores an entry in the table (a result for the spidering
* process).
*/
private static class SpiderScanResult {
/** The uri. */
protected String uri;
/** The method. */
protected String method;
/** The flags. */
protected String flags;
/** The in scope. */
protected boolean processed;
/**
* Instantiates a new spider scan result.
*
* @param uri the uri
* @param method the method
*/
protected SpiderScanResult(String uri, String method) {
super();
this.uri = uri;
this.method = method;
}
/**
* Instantiates a new spider scan result.
*
* @param uri the uri
* @param method the method
* @param flags the flags
* @param processed {@code true} if the result was processed, {@code false} otherwise
*/
protected SpiderScanResult(String uri, String method, String flags, boolean processed) {
super();
this.uri = uri;
this.method = method;
this.flags = flags;
this.processed = processed;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((method == null) ? 0 : method.hashCode());
result = prime * result + ((uri == null) ? 0 : uri.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
// Removed some irrelevant checks, to speed up the method.
SpiderScanResult other = (SpiderScanResult) obj;
if (method == null) {
if (other.method != null)
return false;
} else if (!method.equals(other.method))
return false;
if (uri == null) {
if (other.uri != null)
return false;
} else if (!uri.equals(other.uri))
return false;
return true;
}
}
}