/*
* 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.panels;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStep;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.security.SecurityScan;
import com.eviware.soapui.model.testsuite.TestStep;
import com.eviware.soapui.security.SecurityTest;
import com.eviware.soapui.security.scan.AbstractSecurityScan;
import com.eviware.soapui.security.support.ProgressBarSecurityScanAdapter;
import com.eviware.soapui.security.support.ProgressBarSecurityTestStepAdapter;
import com.eviware.soapui.support.UISupport;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTree;
import javax.swing.SwingConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("serial")
public class SecurityTreeCellRender implements TreeCellRenderer {
Map<DefaultMutableTreeNode, Component> componentTree = new HashMap<DefaultMutableTreeNode, Component>();
private JTree tree;
Color selected = new Color(205, 205, 205);
Color unselected = new Color(228, 228, 228);
// Color noSecurable = new Color( 102, 102, 102 );
private boolean released;
@Override
public Component getTreeCellRendererComponent(JTree arg0, Object node, boolean sel, boolean exp, boolean leaf,
int arg5, boolean arg6) {
Component result = null;
if (released) {
if (node instanceof TestStepNode) {
result = getTreeCellRendererTestNode(arg0, (TestStepNode) node, sel, exp, leaf, arg5, arg6);
}
if (node instanceof SecurityScanNode) {
result = getTreeCellRendererSecurityScanNode(arg0, (SecurityScanNode) node, sel, exp, leaf, arg5, arg6);
}
return result;
}
this.tree = arg0;
if (componentTree.containsKey(node)) {
result = componentTree.get(node);
((CustomTreeNode) result).setExpandedIcon(exp);
((CustomTreeNode) result).updateLabel();
((CustomTreeNode) result).setSelected(sel);
} else {
if (node instanceof TestStepNode) {
result = getTreeCellRendererTestNode(arg0, (TestStepNode) node, sel, exp, leaf, arg5, arg6);
}
if (node instanceof SecurityScanNode) {
result = getTreeCellRendererSecurityScanNode(arg0, (SecurityScanNode) node, sel, exp, leaf, arg5, arg6);
}
componentTree.put((DefaultMutableTreeNode) node, result);
}
return result;
}
private Component getTreeCellRendererSecurityScanNode(JTree arg0, SecurityScanNode node, boolean sel, boolean arg3,
boolean arg4, int arg5, boolean arg6) {
return new SecurityScanCellRender(arg0, node, sel, arg3, arg4, arg5, arg6);
}
private Component getTreeCellRendererTestNode(JTree arg0, TestStepNode node, boolean sel, boolean arg3,
boolean arg4, int arg5, boolean arg6) {
return new TestStepCellRender(arg0, node, sel, arg3, arg4, arg5, arg6);
}
public class TestStepCellRender extends JPanel implements PropertyChangeListener, CustomTreeNode, ReleasableNode {
private WsdlTestStep testStep;
private JProgressBar progressBar;
private JLabel label;
private ProgressBarSecurityTestStepAdapter progressBarAdapter;
private SecurityTest securityTest;
private Icon collapsed = UISupport.createImageIcon("/plus.gif");
private Icon expanded = UISupport.createImageIcon("/minus.gif");
private JLabel expandCollapseBtn;
private DefaultMutableTreeNode node;
private JPanel innerLeftPanel;
private JPanel progressPanel;
private JLabel cntLabel;
public TestStepCellRender(final JTree tree, TestStepNode node, boolean sel, boolean exp, boolean leaf, int arg5,
boolean arg6) {
super(new BorderLayout());
this.node = node;
this.testStep = (WsdlTestStep) node.getTestStep();
securityTest = ((SecurityTreeRootNode) node.getParent()).getSecurityTest();
if (AbstractSecurityScan.isSecurable(testStep)) {
if (securityTest.getSecurityScansMap().get(testStep.getId()) != null) {
String labelText = securityTest.getSecurityScansMap().get(testStep.getId()).size() == 1 ? securityTest
.getSecurityScansMap().get(testStep.getId()).size()
+ " scan)" : securityTest.getSecurityScansMap().get(testStep.getId()).size() + " scans)";
label = new JLabel(testStep.getLabel() + " (" + labelText, SwingConstants.LEFT);
} else {
label = new JLabel(testStep.getLabel() + " (0 scans)", SwingConstants.LEFT);
}
} else {
label = new JLabel(testStep.getLabel(), SwingConstants.LEFT);
}
label.setIcon(testStep.getIcon());
label.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
label.setEnabled(!testStep.isDisabled() && AbstractSecurityScan.isSecurable(testStep));
testStep.addPropertyChangeListener(TestStep.ICON_PROPERTY, TestStepCellRender.this);
testStep.addPropertyChangeListener(TestStep.DISABLED_PROPERTY, TestStepCellRender.this);
innerLeftPanel = new JPanel(new BorderLayout());
if (exp) {
expandCollapseBtn = new JLabel(expanded);
} else {
expandCollapseBtn = new JLabel(collapsed);
}
expandCollapseBtn.setEnabled(false);
if (securityTest.getSecurityScansMap().get(testStep.getId()) == null
|| securityTest.getSecurityScansMap().get(testStep.getId()).size() == 0) {
expandCollapseBtn.setVisible(false);
} else {
expandCollapseBtn.setVisible(true);
}
innerLeftPanel.add(expandCollapseBtn, BorderLayout.WEST);
if (AbstractSecurityScan.isSecurable(testStep)) {
progressBar = new JProgressBar();
progressPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0));
progressBar.setValue(0);
progressBar.setStringPainted(true);
progressBar.setString("");
progressBar.setIndeterminate(false);
progressBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 1, Color.LIGHT_GRAY));
progressPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 0));
progressPanel.add(progressBar);
progressBar.setMinimumSize(new Dimension(0, 200));
progressBar.setInheritsPopupMenu(true);
cntLabel = new JLabel("");
cntLabel.setForeground(Color.white);
cntLabel.setBackground(selected);
cntLabel.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
progressPanel.add(cntLabel);
add(progressPanel, BorderLayout.LINE_END);
expandCollapseBtn.setVisible(true);
innerLeftPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
} else {
expandCollapseBtn.setVisible(false);
innerLeftPanel.setBorder(BorderFactory.createEmptyBorder(0, 21, 0, 0));
}
innerLeftPanel.add(label, BorderLayout.CENTER);
add(innerLeftPanel, BorderLayout.LINE_START);
setSelected(sel);
setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.black));
progressBarAdapter = new ProgressBarSecurityTestStepAdapter(tree, node, progressBar, securityTest, testStep,
cntLabel);
}
public void reset() {
progressBar.setValue(0);
progressBar.setString("");
}
public void setSelected(boolean sel) {
if (AbstractSecurityScan.isSecurable(testStep)) {
if (sel) {
this.setBackground(selected);
this.label.setBackground(selected);
this.innerLeftPanel.setBackground(selected);
expandCollapseBtn.setBackground(selected);
progressPanel.setBackground(selected);
} else {
this.setBackground(unselected);
this.label.setBackground(unselected);
this.innerLeftPanel.setBackground(unselected);
expandCollapseBtn.setBackground(unselected);
progressPanel.setBackground(unselected);
}
} else {
this.setBackground(unselected);
this.label.setBackground(unselected);
this.innerLeftPanel.setBackground(unselected);
expandCollapseBtn.setBackground(unselected);
}
}
protected TestStep getTestStep() {
return testStep;
}
public ModelItem getModelItem() {
return testStep;
}
@Override
public void propertyChange(PropertyChangeEvent arg0) {
label.setIcon(testStep.getIcon());
label.setEnabled(!testStep.isDisabled() && AbstractSecurityScan.isSecurable(testStep));
updateLabel();
((DefaultTreeModel) tree.getModel()).nodeChanged(node);
}
@Override
public void setExpandedIcon(boolean exp) {
if (securityTest.getSecurityScansMap().get(testStep.getId()) == null
|| securityTest.getSecurityScansMap().get(testStep.getId()).size() == 0) {
expandCollapseBtn.setVisible(false);
innerLeftPanel.setBorder(BorderFactory.createEmptyBorder(0, 21, 0, 0));
} else {
expandCollapseBtn.setVisible(true);
innerLeftPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
}
if (exp) {
expandCollapseBtn.setIcon(expanded);
} else {
expandCollapseBtn.setIcon(collapsed);
}
}
@Override
public void updateLabel() {
if (AbstractSecurityScan.isSecurable(testStep)) {
if (securityTest.getSecurityScansMap().get(testStep.getId()) != null) {
String labelText = securityTest.getSecurityScansMap().get(testStep.getId()).size() == 1 ? securityTest
.getSecurityScansMap().get(testStep.getId()).size()
+ " scan)" : securityTest.getSecurityScansMap().get(testStep.getId()).size() + " scans)";
label.setText(testStep.getLabel() + " (" + labelText);
} else {
label.setText(testStep.getLabel() + " (0 scans)");
}
} else {
label.setText(testStep.getLabel());
}
}
public boolean isOnExpandButton(int x, int y) {
y = y - 30 * (tree.getRowForLocation(x, y));
if ((5 <= x) && (20 >= x) && (5 <= y) && (20 >= y)) {
return true;
}
return false;
}
public void release() {
testStep.removePropertyChangeListener(TestStep.ICON_PROPERTY, TestStepCellRender.this);
testStep.removePropertyChangeListener(TestStep.DISABLED_PROPERTY, TestStepCellRender.this);
progressBarAdapter.release();
testStep = null;
securityTest = null;
}
}
public class SecurityScanCellRender extends JPanel implements PropertyChangeListener, CustomTreeNode, ReleasableNode {
private SecurityScan securityCheck;
private JProgressBar progressBar;
private JLabel label;
private ProgressBarSecurityScanAdapter progressBarAdapter;
private JPanel progressPanel;
private JLabel cntLabel;
private SecurityScanNode node;
private JPanel leftInnerPanel;
public SecurityScanCellRender(JTree tree, SecurityScanNode node, boolean sel, boolean arg3, boolean arg4,
int arg5, boolean arg6) {
super(new BorderLayout());
this.node = node;
this.securityCheck = (SecurityScan) node.getSecurityScan();
this.securityCheck.addPropertyChangeListener(this);
label = new JLabel(securityCheck.getName(), SwingConstants.LEFT);
String iconPath = UISupport.getIconPath(securityCheck.getIcon());
label.setIcon(UISupport.createImageIcon(iconPath));
label.setBorder(BorderFactory.createEmptyBorder(5, 45, 5, 5));
label.setEnabled(!securityCheck.isDisabled());
leftInnerPanel = new JPanel(new BorderLayout());
leftInnerPanel.add(label, BorderLayout.CENTER);
leftInnerPanel.setBackground(getBackground());
progressBar = new JProgressBar();
progressPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0));
progressBar.setValue(0);
progressBar.setStringPainted(true);
progressBar.setString("");
progressBar.setIndeterminate(false);
progressBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 1, Color.LIGHT_GRAY));
progressPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 0));
progressPanel.add(progressBar);
progressBar.setMinimumSize(new Dimension(0, 200));
progressBar.setInheritsPopupMenu(true);
cntLabel = new JLabel("");
cntLabel.setForeground(Color.white);
cntLabel.setBackground(selected);
cntLabel.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
progressPanel.add(cntLabel);
add(progressPanel, BorderLayout.LINE_END);
add(leftInnerPanel, BorderLayout.LINE_START);
setSelected(sel);
setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.black));
progressBarAdapter = new ProgressBarSecurityScanAdapter(tree, this.node, progressBar, securityCheck,
(SecurityTest) ((SecurityScan) securityCheck).getParent(), cntLabel);
}
public void release() {
progressBarAdapter.release();
}
public void reset() {
progressBar.setValue(0);
progressBar.setString("");
}
public void setSelected(boolean sel) {
if (sel) {
this.setBackground(selected);
this.label.setBackground(selected);
progressPanel.setBackground(selected);
leftInnerPanel.setBackground(selected);
} else {
this.setBackground(unselected);
this.label.setBackground(unselected);
progressPanel.setBackground(unselected);
leftInnerPanel.setBackground(unselected);
}
}
@Override
public void propertyChange(PropertyChangeEvent arg0) {
label.setEnabled(!securityCheck.isDisabled());
((DefaultTreeModel) tree.getModel()).nodeChanged(node);
}
@Override
public void setExpandedIcon(boolean exp) {
// TODO Auto-generated method stub
}
@Override
public void updateLabel() {
label.setEnabled(!securityCheck.isDisabled());
}
}
public void remove(DefaultMutableTreeNode node) {
Component component = componentTree.get(node);
if (component instanceof ReleasableNode) {
((ReleasableNode) component).release();
}
componentTree.remove(node);
}
public boolean isOn(TestStepNode node, int x, int y) {
TestStepCellRender component = (TestStepCellRender) componentTree.get(node);
return component.isOnExpandButton(x, y);
}
public void release() {
released = true;
for (DefaultMutableTreeNode key : componentTree.keySet()) {
if (componentTree.get(key) instanceof ReleasableNode) {
((ReleasableNode) componentTree.get(key)).release();
}
}
componentTree.clear();
}
}