/* * * Paros and its related class files. * * Paros is an HTTP/HTTPS proxy for assessing web application security. * Copyright (C) 2003-2004 Chinotec Technologies Company * * This program is free software; you can redistribute it and/or * modify it under the terms of the Clarified Artistic License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Clarified Artistic License for more details. * * You should have received a copy of the Clarified Artistic License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // ZAP: 2013/03/03 Issue 546: Remove all template Javadoc comments // ZAP: 2014/03/23 Issue 503: Change the footer tabs to display the data // with tables instead of lists // ZAP: 2014/03/23 Issue 1106: HistoryList's mapping of history ID to list // indexes not updated when history entry is deleted package org.parosproxy.paros.model; import java.util.Hashtable; import java.util.Map.Entry; import javax.swing.DefaultListModel; /** * @deprecated (2.3.0) Replaced with use of {@link org.zaproxy.zap.view.table.HistoryReferencesTableModel}. It will be removed * in a future release. */ @Deprecated public class HistoryList extends DefaultListModel<HistoryReference> { private static final long serialVersionUID = 1L; // ZAP: Added hashtable to allow elements of the list to be accessed via historyid private Hashtable<Integer, Integer> historyIdToIndex = new Hashtable<>(); @Override public void addElement(final HistoryReference hRef) { int sizeBefore = super.size(); super.addElement(hRef); if (sizeBefore == super.size() -1 ) { historyIdToIndex.put(hRef.getHistoryId(), sizeBefore); } else { // Cope with multiple threads adding to the list historyIdToIndex.put(hRef.getHistoryId(), indexOf(hRef)); } } public synchronized void notifyItemChanged(Object obj) { int i = indexOf(obj); if (i >= 0) { fireContentsChanged(this, i, i); } } public synchronized void notifyItemChanged(int historyId) { Integer i = historyIdToIndex.get(historyId); if (i != null) { fireContentsChanged(this, i, i); } } public HistoryReference getHistoryReference (int historyId) { Integer i = historyIdToIndex.get(historyId); if (i != null) { return this.elementAt(i); } return null; } @Override public void clear() { super.clear(); historyIdToIndex.clear(); } @Override public void removeAllElements() { super.removeAllElements(); historyIdToIndex.clear(); } @Override public HistoryReference remove(int index) { HistoryReference hRef = super.remove(index); historyIdToIndex.remove(hRef.getHistoryId()); updateIndexes(index); return hRef; } @Override public boolean removeElement(Object obj) { if (super.removeElement(obj)) { int idx = historyIdToIndex.remove(((HistoryReference) obj).getHistoryId()); updateIndexes(idx); return true; } return false; } @Override public void removeElementAt(int index) { remove(index); } // Note: implementation copied from base class (DefaultListModel) but changed to call the local method removeElementAt(int) @Override public void removeRange(int fromIndex, int toIndex) { if (fromIndex > toIndex) { throw new IllegalArgumentException("fromIndex must be <= toIndex"); } for (int i = toIndex; i >= fromIndex; i--) { removeElementAt(i); } fireIntervalRemoved(this, fromIndex, toIndex); } private void updateIndexes(int fromIndex) { for (Entry<Integer, Integer> entry : historyIdToIndex.entrySet()) { if (entry.getValue() > fromIndex) { entry.setValue(entry.getValue() - 1); } } } }