/*
* 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.text.MessageFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.model.HistoryReference;
import org.zaproxy.zap.view.table.HistoryReferencesTableModel.Column;
/**
* A default implementation of {@code HistoryReferencesTableEntry}.
* <p>
* Only the necessary column values will be kept in memory as specified in constructor.
*/
public class DefaultHistoryReferencesTableEntry extends AbstractHistoryReferencesTableEntry {
private static final String VALUES_SEPARATOR = Constant.messages.getString("generic.value.text.separator.comma");
private final Integer historyId;
private final Integer historyType;
private final Long sessionId;
private final String method;
private final String uri;
private final Integer statusCode;
private final String reason;
private final Date timeSentMillis;
private final Date timeReceivedMillis;
private final Integer rtt;
private final Long messageSize;
private final Integer requestHeaderSize;
private final Integer requestBodySize;
private final Integer responseHeaderSize;
private final Integer responseBodySize;
private AlertRiskTableCellItem alertRiskCellItem;
private final boolean highestAlertColumn;
private Boolean note;
private final boolean noteColumn;
private String tags;
private final boolean tagsColumn;
public DefaultHistoryReferencesTableEntry(HistoryReference historyReference, Column[] columns) {
super(historyReference);
Column[] sortedColumns = Arrays.copyOf(columns, columns.length);
Arrays.sort(sortedColumns);
historyId = hasColumn(sortedColumns, Column.HREF_ID) ? Integer.valueOf(historyReference.getHistoryId()) : null;
historyType = hasColumn(sortedColumns, Column.HREF_TYPE) ? Integer.valueOf(historyReference.getHistoryType()) : null;
sessionId = hasColumn(sortedColumns, Column.SESSION_ID) ? Long.valueOf(historyReference.getSessionId()) : null;
method = hasColumn(sortedColumns, Column.METHOD) ? historyReference.getMethod() : null;
statusCode = hasColumn(sortedColumns, Column.STATUS_CODE) ? Integer.valueOf(historyReference.getStatusCode()) : null;
reason = hasColumn(sortedColumns, Column.STATUS_REASON) ? historyReference.getReason() : null;
rtt = hasColumn(sortedColumns, Column.RTT) ? Integer.valueOf(historyReference.getRtt()) : null;
uri = hasColumn(sortedColumns, Column.URL) ? historyReference.getURI().toString() : null;
timeSentMillis = hasColumn(sortedColumns, Column.REQUEST_TIMESTAMP)
? new Date(historyReference.getTimeSentMillis())
: null;
timeReceivedMillis = hasColumn(sortedColumns, Column.RESPONSE_TIMESTAMP) ? new Date(
historyReference.getTimeReceivedMillis()) : null;
requestHeaderSize = hasColumn(sortedColumns, Column.SIZE_REQUEST_HEADER)
? Integer.valueOf(historyReference.getRequestHeaderLength())
: null;
requestBodySize = hasColumn(sortedColumns, Column.SIZE_REQUEST_BODY)
? Integer.valueOf(historyReference.getRequestBodyLength())
: null;
responseHeaderSize = hasColumn(sortedColumns, Column.SIZE_RESPONSE_HEADER)
? Integer.valueOf(historyReference.getResponseHeaderLength())
: null;
responseBodySize = hasColumn(sortedColumns, Column.SIZE_RESPONSE_BODY)
? Integer.valueOf(historyReference.getResponseBodyLength())
: null;
messageSize = extractMessageSize(historyReference, hasColumn(sortedColumns, Column.SIZE_MESSAGE));
highestAlertColumn = hasColumn(sortedColumns, Column.HIGHEST_ALERT);
noteColumn = hasColumn(sortedColumns, Column.NOTE);
tagsColumn = hasColumn(sortedColumns, Column.TAGS);
alertRiskCellItem = super.getHighestAlert();
refreshCachedValues();
}
private Long extractMessageSize(HistoryReference historyReference, boolean required) {
if (!required) {
return Long.valueOf(0);
}
return Long.valueOf(historyReference.getRequestHeaderLength() + historyReference.getRequestBodyLength()
+ historyReference.getResponseHeaderLength() + historyReference.getResponseBodyLength());
}
private static boolean hasColumn(Column[] columns, Column column) {
for (int i = 0; i < columns.length; i++) {
if (column == columns[i]) {
return true;
}
}
return false;
}
@Override
public Integer getHistoryId() {
return historyId;
}
@Override
public Integer getHistoryType() {
return historyType;
}
@Override
public Long getSessionId() {
return sessionId;
}
@Override
public String getMethod() {
return method;
}
@Override
public String getUri() {
return uri;
}
@Override
public Integer getStatusCode() {
return statusCode;
}
@Override
public String getReason() {
return reason;
}
@Override
public Date getRequestTimestamp() {
return timeSentMillis;
}
@Override
public Date getResponseTimestamp() {
return timeReceivedMillis;
}
@Override
public Integer getRtt() {
return rtt;
}
@Override
public Long getMessageSize() {
return messageSize;
}
@Override
public Integer getRequestHeaderSize() {
return requestHeaderSize;
}
@Override
public Integer getRequestBodySize() {
return requestBodySize;
}
@Override
public Integer getResponseHeaderSize() {
return responseHeaderSize;
}
@Override
public Integer getResponseBodySize() {
return responseBodySize;
}
@Override
public AlertRiskTableCellItem getHighestAlert() {
return alertRiskCellItem;
}
@Override
public Boolean hasNote() {
return note;
}
@Override
public String getTags() {
return tags;
}
/**
* Refresh the cached values of {@code HistoryReference}'s mutable fields.
*
* @see HistoryReference#getHighestAlert()
* @see HistoryReference#getTags()
*/
public void refreshCachedValues() {
if (noteColumn) {
note = Boolean.valueOf(getHistoryReference().hasNote());
}
if (tagsColumn) {
tags = listToCsv(getHistoryReference().getTags());
}
if (highestAlertColumn) {
alertRiskCellItem = AlertRiskTableCellItem.getItemForRisk(getHistoryReference().getHighestAlert());
}
}
private static String listToCsv(List<String> list) {
if (list == null || list.size() == 0) {
return "";
} else if (list.size() == 1) {
return list.get(0);
} else if (list.size() == 2) {
return MessageFormat.format(VALUES_SEPARATOR, new Object[] { list.get(0), list.get(1) });
}
String tags = VALUES_SEPARATOR;
int total = list.size() - 2;
for (int i = 0; i < total; i++) {
tags = MessageFormat.format(tags, new Object[] { list.get(i), VALUES_SEPARATOR });
}
tags = MessageFormat.format(tags, new Object[] { list.get(total), list.get(list.size() - 1) });
return tags;
}
}