/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.security.support;
import com.eviware.soapui.model.security.SecurityScan;
import com.eviware.soapui.model.testsuite.TestCaseRunner;
import com.eviware.soapui.model.testsuite.TestRunner.Status;
import com.eviware.soapui.model.testsuite.TestStepResult;
import com.eviware.soapui.security.SecurityTest;
import com.eviware.soapui.security.SecurityTestRunContext;
import com.eviware.soapui.security.SecurityTestRunnerImpl;
import com.eviware.soapui.security.result.SecurityResult.ResultStatus;
import com.eviware.soapui.security.result.SecurityScanRequestResult;
import com.eviware.soapui.security.result.SecurityScanResult;
import com.eviware.soapui.security.result.SecurityTestStepResult;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import java.awt.Color;
import java.util.List;
/**
* Class that keeps a JProgressBars state in sync with a SecurityTest
*
* @author dragica.soldo
*/
public class ProgressBarSecurityTestAdapter {
private final JProgressBar progressBar;
private final SecurityTest securityTest;
private InternalTestRunListener internalTestRunListener;
private JLabel counterLabel;
private static final Color OK_COLOR = new Color(0, 204, 102);
private static final Color FAILED_COLOR = new Color(255, 102, 0);
private static final Color UNKNOWN_COLOR = new Color(240, 240, 240);
private static final String STATE_RUN = "In progress";
private static final String STATE_DONE = "Done";
private static final String STATE_CANCEL = "Canceled";
private int alertsCounter;
private int previousMaxCheckPosition;
public ProgressBarSecurityTestAdapter(JProgressBar progressBar, SecurityTest securityTest, JLabel cntLabel) {
this.progressBar = progressBar;
this.securityTest = securityTest;
progressBar.setBackground(UNKNOWN_COLOR);
internalTestRunListener = new InternalTestRunListener();
securityTest.addSecurityTestRunListener(internalTestRunListener);
cntLabel.setOpaque(true);
this.counterLabel = cntLabel;
}
public void release() {
securityTest.removeSecurityTestRunListener(internalTestRunListener);
}
public class InternalTestRunListener extends SecurityTestRunListenerAdapter {
public void beforeRun(TestCaseRunner testRunner, SecurityTestRunContext runContext) {
int maximum = ((SecurityTestRunnerImpl) testRunner).getSecurityTest().getSecurityScanCount();
for (String key : securityTest.getSecurityScansMap().keySet()) {
List<SecurityScan> securityCheckList = securityTest.getSecurityScansMap().get(key);
if (securityCheckList.size() > 0) {
if (securityCheckList.get(0).getTestStep().isDisabled()) {
maximum -= securityCheckList.size();
}
}
}
progressBar.getModel().setMaximum(maximum);
progressBar.setForeground(OK_COLOR);
progressBar.setBackground(Color.white);
progressBar.setValue(0);
counterLabel.setOpaque(false);
alertsCounter = 0;
counterLabel.setText("");
}
@Override
public void beforeSecurityScan(TestCaseRunner testRunner, SecurityTestRunContext runContext,
SecurityScan securityCheck) {
if (progressBar.isIndeterminate()) {
return;
}
if (securityCheck != null) {
progressBar.setString(STATE_RUN + ":" + securityCheck.getTestStep().getName() + " - "
+ securityCheck.getName());
progressBar.setValue(runContext.getCurrentScanOnSecurityTestIndex());
}
}
@Override
public void afterSecurityScan(TestCaseRunner testRunner, SecurityTestRunContext runContext,
SecurityScanResult securityCheckResult) {
if (securityCheckResult.getStatus() == ResultStatus.CANCELED) {
progressBar.setString(STATE_CANCEL);
}
if (securityCheckResult.getStatus() == ResultStatus.CANCELED
&& securityCheckResult.isHasRequestsWithWarnings()) {
progressBar.setForeground(FAILED_COLOR);
} else if (securityCheckResult.getStatus() == ResultStatus.FAILED) {
progressBar.setForeground(FAILED_COLOR);
} else if (securityCheckResult.getStatus() == ResultStatus.OK) {
if (!progressBar.getForeground().equals(FAILED_COLOR)) {
progressBar.setForeground(OK_COLOR);
}
}
// progressBar.setValue(
// runContext.getCurrentCheckOnSecurityTestIndex() + 1 );
}
@Override
public void beforeStep(TestCaseRunner testRunner, SecurityTestRunContext runContext,
TestStepResult testStepResult) {
previousMaxCheckPosition = progressBar.getValue();
}
@Override
public void afterStep(TestCaseRunner testRunner, SecurityTestRunContext runContext, SecurityTestStepResult result) {
int currentStepChecksCount = securityTest.getTestStepSecurityScansCount(result.getTestStep().getId());
progressBar.setValue(previousMaxCheckPosition + currentStepChecksCount);
}
public void afterRun(TestCaseRunner testRunner, SecurityTestRunContext runContext) {
if (testRunner.getStatus() == Status.FAILED) {
progressBar.setForeground(FAILED_COLOR);
} else if (testRunner.getStatus() == Status.FINISHED) {
if (!progressBar.getForeground().equals(FAILED_COLOR)) {
progressBar.setForeground(OK_COLOR);
}
}
if (progressBar.isIndeterminate()) {
return;
}
if (!progressBar.getString().equals(STATE_CANCEL)) {
progressBar.setString(STATE_DONE);
}
progressBar.setBackground(UNKNOWN_COLOR);
// progressBar.setValue( progressBar.getMaximum() );
}
@Override
public void afterSecurityScanRequest(TestCaseRunner testRunner, SecurityTestRunContext runContext,
SecurityScanRequestResult securityCheckReqResult) {
if (securityCheckReqResult.getStatus() == ResultStatus.FAILED) {
counterLabel.setOpaque(true);
counterLabel.setBackground(FAILED_COLOR);
alertsCounter++;
counterLabel.setText(" " + alertsCounter + " ");
progressBar.setForeground(FAILED_COLOR);
} else if (securityCheckReqResult.getStatus() == ResultStatus.CANCELED) {
progressBar.setString(STATE_CANCEL);
}
}
}
}