/*
* 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.scan;
import java.util.LinkedHashSet;
import java.util.Set;
import org.zaproxy.zap.model.Context;
/**
* An implementation of a {@link BaseScannerThread} for scans done on {@link Context Contexts},
* adding support for notifying a list of {@link ScanListener scan listeners}.
*
* @param <StartOptions> the type of the start scan options
* @param <Listener> the type of scan listener
* @see BaseScannerThread
* @see ScanListener
* @see Context
*/
public abstract class BaseContextScannerThread<StartOptions extends ScanStartOptions, Listener extends ScanListener>
extends BaseScannerThread<StartOptions> {
protected Set<Listener> listeners;
protected int contextId;
/**
* Instantiates a new base context scanner thread for a Context with a given id.
*
* @param contextId the context id
*/
public BaseContextScannerThread(int contextId) {
super();
this.contextId = contextId;
this.listeners = new LinkedHashSet<Listener>();
}
/**
* Adds a new scan listener.
* @param l the listener to add
*/
public void addScanListener(Listener l) {
listeners.add(l);
}
/**
* Removes a scan listener.
* @param l the listener to remove
*/
public void removeScanListener(Listener l) {
listeners.remove(l);
}
/**
* Notifies listeners that the scan has started.
*/
protected void notifyScanStarted() {
for (ScanListener l : listeners)
l.scanStarted(contextId);
}
/**
* Notifies listeners that the scan has finished.
*/
protected void notifyScanFinished() {
for (ScanListener l : listeners)
l.scanFinished(contextId);
}
/**
* Notifies listeners that the scan has changes it's progress. The progress sent to the
* listeners is the one set for the scan (via {@link #setScanProgress(int)}).
*/
protected void notifyScanProgress() {
for (ScanListener l : listeners)
l.scanProgress(contextId, getScanProgress(), getScanMaximumProgress());
}
@Override
public void setScanProgress(int progress) {
super.setScanProgress(progress);
notifyScanProgress();
}
}