/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2012 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.extension.autoupdate;
import org.apache.commons.lang.Validate;
import org.zaproxy.zap.control.AddOn;
import org.zaproxy.zap.utils.Enableable;
public class AddOnWrapper extends Enableable {
public enum Status {newAddon, newVersion};
private AddOn addOn = null;
private AddOn.InstallationStatus installationStatus;
private AddOn addOnUpdate;
private Status status = null;
private int progress = 0;
private boolean failed = false;
/**
* The issues that prevent this add-on, or its extensions, from being run, contents in HTML format.
*/
private String runningIssues;
/**
* Flag that indicates if the running issues are caused by the add-on. If not are caused by its extensions.
*/
private boolean addOnRunningIssues;
/**
* The issues that prevent this add-on, or its extensions, from being run after updating, contents in HTML format.
*/
private String updateIssues;
/**
* Flag that indicates if the update issues are caused by the add-on. If not are caused by its extensions.
*/
private boolean addOnUpdateIssues;
public AddOnWrapper(AddOn addOn, Status status) {
this(addOn, status, "");
}
/**
* Creates an {@code AddOnWrapper} with the given {@code addOn}, {@code status} and {@code runningIssues}.
*
* @param addOn the add-on
* @param status the status of the add-on
* @param runningIssues a String containing the issues that prevents the add-on from being run, in HTML format
* @throws IllegalArgumentException if {@code runningIssues} is null.
* @since 2.4.0
*/
public AddOnWrapper(AddOn addOn, Status status, String runningIssues) {
Validate.notNull(runningIssues, "Parameter runningIssues must not be null.");
this.addOn = addOn;
this.installationStatus = addOn.getInstallationStatus();
this.status = status;
this.runningIssues = runningIssues;
this.updateIssues = "";
}
public AddOn getAddOn() {
return addOn;
}
public Status getStatus() {
return status;
}
public int getProgress() {
return progress;
}
public void setAddOn(AddOn addOn) {
this.addOn = addOn;
this.installationStatus = addOn.getInstallationStatus();
addOnUpdate = null;
progress = 0;
status = null;
failed = false;
setEnabled(false);
}
/**
* Gets the installation status of the wrapper.
*
* @return the installation status of the wrapper.
* @since 2.4.0
* @see #setInstallationStatus(org.zaproxy.zap.control.AddOn.InstallationStatus)
*/
public AddOn.InstallationStatus getInstallationStatus() {
return installationStatus;
}
/**
* Sets the installation status of the wrapper.
* <p>
* The status might not be the same as the wrapped add-on, when the add-on is being, for example, downloaded and then
* installed. This allows to properly report the state of the add-on until a final status was achieved.
*
* @param installationStatus the new installation status
* @since 2.4.0
* @see #getInstallationStatus()
*/
public void setInstallationStatus(AddOn.InstallationStatus installationStatus) {
this.installationStatus = installationStatus;
}
/**
* Sets the newer version of the wrapped add-on.
* <p>
* The status is updated to {@code newVersion}.
*
* @param addOnUpdate the newer version or {@code null} if none
* @since 2.4.0
* @see #getAddOnUpdate()
*/
public void setAddOnUpdate(AddOn addOnUpdate) {
this.addOnUpdate = addOnUpdate;
setStatus(AddOnWrapper.Status.newVersion);
}
/**
* Gets newer version of the wrapped add-on. Might be {@code null} if none.
*
* @return the newer version or {@code null} if none
* @since 2.4.0
* @see #setAddOnUpdate(AddOn)
*/
public AddOn getAddOnUpdate() {
return addOnUpdate;
}
public void setStatus(Status status) {
this.status = status;
}
public void setProgress(int progress) {
this.progress = progress;
}
public boolean isFailed() {
return failed;
}
public void setFailed(boolean failed) {
this.failed = failed;
}
/**
* Tells whether or not the running issues are caused by the add-on.
*
* @return {@code true} if the running issues are caused by the add-on, {@code false} if caused by its extensions.
* @since 2.4.0
* @see #hasRunningIssues()
*/
public boolean isAddOnRunningIssues() {
return addOnRunningIssues;
}
/**
* Tells whether or not the wrapped add-on or its extensions have issues that prevent them from being run.
*
* @return {@code true} if the add-on or its extensions have issues that prevent them from being run, {@code false}
* otherwise
* @since 2.4.0
* @see #isAddOnRunningIssues()
* @see #getRunningIssues()
*/
public boolean hasRunningIssues() {
return !runningIssues.isEmpty();
}
/**
* Gets the issues that the wrapped add-on or its extensions might have that prevent them from being run. Might be empty if
* there's no issues.
* <p>
* The contents are in HTML.
*
* @return the issues of the add-on or its extensions that prevent them from being run, empty if there's no issues.
* @since 2.4.0
* @see #hasRunningIssues()
*/
public String getRunningIssues() {
return runningIssues;
}
/**
* Sets the issues that the wrapped add-on or its extensions might have that prevent them from being run.
* <p>
* The contents should be in HTML.
*
* @param runningIssues the running issues of the add-on or its extensions, empty if there's no issues.
* @param addOnIssues {@code true} if the issues are caused by the add-on, {@code false} if are caused by the extensions
* @since 2.4.0
* @see #getRunningIssues()
*/
public void setRunningIssues(String runningIssues, boolean addOnIssues) {
Validate.notNull(runningIssues, "Parameter runningIssues must not be null.");
this.runningIssues = runningIssues;
this.addOnRunningIssues = addOnIssues;
}
/**
* Tells whether or not the running issues, after updating, are caused by the add-on.
*
* @return {@code true} if the running issues, after updating, are caused by the add-on, {@code false} if caused by its
* extensions.
* @since 2.4.0
* @see #hasUpdateIssues()
*/
public boolean isAddOnUpdateIssues() {
return addOnUpdateIssues;
}
/**
* Tells whether or not the wrapped add-on or its extensions have issues that prevents them from being run after updating.
*
* @return {@code true} if the add-on or its extensions have issues that prevents them from being run after updating,
* {@code false} otherwise
* @since 2.4.0
* @see #isAddOnUpdateIssues()
* @see #getUpdateIssues()
*/
public boolean hasUpdateIssues() {
return !updateIssues.isEmpty();
}
/**
* Gets the issues that the wrapped add-on or its extensions might have that prevent them from being run after updating.
* Might be empty if there's no issues.
* <p>
* The contents are in HTML.
*
* @return the issues of the add-on or its extensions that prevent them from being run after updating, empty if there's no
* issues.
* @since 2.4.0
* @see #hasUpdateIssues()
*/
public String getUpdateIssues() {
return updateIssues;
}
/**
* Sets the issues that the newer version of the wrapped add-on or its extensions might have that prevents them from being
* run.
* <p>
* The contents should be in HTML.
*
* @param updateIssues the running issues of the add-on or its extensions, empty if there's no issues.
* @param addOnIssues {@code true} if the issues are caused by the add-on, {@code false} if are caused by the extensions
* @since 2.4.0
* @see #getUpdateIssues()
*/
public void setUpdateIssues(String updateIssues, boolean addOnIssues) {
Validate.notNull(updateIssues, "Parameter updateIssues must not be null.");
this.updateIssues = updateIssues;
this.addOnUpdateIssues = addOnIssues;
}
@Override
public int hashCode() {
return 31 * super.hashCode() + ((addOn == null) ? 0 : addOn.hashCode());
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
AddOnWrapper other = (AddOnWrapper) obj;
if (addOn == null) {
if (other.addOn != null) {
return false;
}
} else if (!addOn.equals(other.addOn)) {
return false;
}
return true;
}
}