/*
* 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.httppanel.view.paramtable;
import java.io.UnsupportedEncodingException;
import java.util.LinkedList;
import javax.swing.table.AbstractTableModel;
import org.apache.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.network.HtmlParameter;
import org.parosproxy.paros.network.HttpMessage;
import org.zaproxy.zap.extension.httppanel.view.paramtable.addins.ParamAddinInterface;
public abstract class HttpPanelParamTableModel extends AbstractTableModel {
private static final long serialVersionUID = 8714941615215038148L;
private static final Logger log = Logger.getLogger(HttpPanelParamTableModel.class);
private static final String[] columnNames = {
Constant.messages.getString("http.panel.view.tableparam.type"),
Constant.messages.getString("http.panel.view.table.paramName"),
Constant.messages.getString("http.panel.view.table.paramValue"),
Constant.messages.getString("http.panel.view.tableparam.functions")
};
protected HttpMessage httpMessage;
protected LinkedList<HtmlParameter> allParams;
private boolean isEditable;
private boolean hasChanged;
public HttpPanelParamTableModel() {
allParams = new LinkedList<>();
}
@Override
public int getColumnCount() {
if (isEditable) {
return 4;
}
return 3;
}
@Override
public int getRowCount() {
return allParams.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (rowIndex > allParams.size() || rowIndex < 0) {
return null;
}
HtmlParameter htmlParameter = allParams.get(rowIndex);
switch(columnIndex) {
case 0:
return htmlParameter.getType();
case 1:
return htmlParameter.getName();
case 2:
return htmlParameter.getValue();
}
return "";
}
@Override
public Class<String> getColumnClass(int c) {
return String.class;
}
@Override
public void setValueAt(Object value, int row, int col) {
boolean changed = false;
HtmlParameter htmlParameter = allParams.get(row);
if (col == 0) {
htmlParameter.setType((HtmlParameter.Type)value);
changed = true;
} else if (col == 1) {
htmlParameter.setName((String)value);
changed = true;
} else if (col == 2) {
htmlParameter.setValue((String)value);
changed = true;
} else if (col == 3) {
if (value instanceof ParamAddinInterface) {
try {
htmlParameter.setValue( ((ParamAddinInterface) value).convertData(htmlParameter.getValue()));
changed = true;
col = 2;
} catch (UnsupportedEncodingException e) {
log.warn(e.getMessage(), e);
}
}
}
if (changed) {
hasChanged = true;
this.fireTableCellUpdated(row, col);
}
if (row == allParams.size()-1) {
htmlParameter = allParams.getLast();
if (!(htmlParameter.getName().isEmpty() && htmlParameter.getValue().isEmpty())) {
allParams.add(getDefaultHtmlParameter());
this.fireTableRowsInserted(row+1, row+1);
}
}
}
public boolean hasChanged() {
return hasChanged;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return isEditable;
}
public void setEditable(boolean editable) {
isEditable = editable;
}
public void setHttpMessage(HttpMessage ahttpMessage) {
this.httpMessage = ahttpMessage;
hasChanged = false;
allParams.clear();
if (httpMessage == null) {
this.fireTableDataChanged();
return;
}
loadAllParams();
if (isEditable) {
allParams.add(getDefaultHtmlParameter());
}
this.fireTableDataChanged();
}
public HttpMessage getHttpMessage() {
return httpMessage;
}
public void save() {
if (! hasChanged) {
return;
}
saveAllParams();
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
protected abstract void loadAllParams();
public abstract void saveAllParams();
protected abstract HtmlParameter getDefaultHtmlParameter();
}