/*
* 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.impl.wsdl.panels.teststeps;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.analytics.Analytics;
import com.eviware.soapui.analytics.SoapUIActions;
import com.eviware.soapui.impl.rest.RestMethod;
import com.eviware.soapui.impl.rest.RestResource;
import com.eviware.soapui.impl.rest.panels.request.AbstractRestRequestDesktopPanel;
import com.eviware.soapui.impl.rest.support.RestUtils;
import com.eviware.soapui.impl.support.components.ModelItemXmlEditor;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext;
import com.eviware.soapui.impl.wsdl.teststeps.RestTestRequest;
import com.eviware.soapui.impl.wsdl.teststeps.RestTestRequestInterface;
import com.eviware.soapui.impl.wsdl.teststeps.RestTestRequestStep;
import com.eviware.soapui.impl.wsdl.teststeps.actions.AddAssertionAction;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.iface.Request.SubmitException;
import com.eviware.soapui.model.iface.Submit;
import com.eviware.soapui.model.iface.SubmitContext;
import com.eviware.soapui.model.testsuite.Assertable.AssertionStatus;
import com.eviware.soapui.model.testsuite.AssertionError;
import com.eviware.soapui.model.testsuite.AssertionsListener;
import com.eviware.soapui.model.testsuite.LoadTestRunner;
import com.eviware.soapui.model.testsuite.TestAssertion;
import com.eviware.soapui.model.testsuite.TestCaseRunner;
import com.eviware.soapui.monitor.support.TestMonitorListenerAdapter;
import com.eviware.soapui.security.SecurityTestRunner;
import com.eviware.soapui.support.DateUtil;
import com.eviware.soapui.support.ListDataChangeListener;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.components.JComponentInspector;
import com.eviware.soapui.support.components.JInspectorPanel;
import com.eviware.soapui.support.components.JInspectorPanelFactory;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.support.log.JLogList;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListModel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.util.Date;
public class RestTestRequestDesktopPanel extends AbstractRestRequestDesktopPanel<RestTestRequestStep, RestTestRequest> {
private JLogList logArea;
private InternalTestMonitorListener testMonitorListener = new InternalTestMonitorListener();
private JButton addAssertionButton;
protected JComboBox methodResourceCombo;
private AssertionsPanel assertionsPanel;
private JInspectorPanel inspectorPanel;
private JComponentInspector<?> assertionInspector;
private JComponentInspector<?> logInspector;
private InternalAssertionsListener assertionsListener = new InternalAssertionsListener();
private long startTime;
protected JLabel pathLabel;
public RestTestRequestDesktopPanel(RestTestRequestStep requestStep) {
super(requestStep, requestStep.getTestRequest());
SoapUI.getTestMonitor().addTestMonitorListener(testMonitorListener);
setEnabled(!SoapUI.getTestMonitor().hasRunningTest(requestStep.getTestCase()));
requestStep.getTestRequest().addAssertionsListener(assertionsListener);
}
protected JComponent buildLogPanel() {
logArea = new JLogList("Request Log");
logArea.getLogList().getModel().addListDataListener(new ListDataChangeListener() {
public void dataChanged(ListModel model) {
logInspector.setTitle("Request Log (" + model.getSize() + ")");
}
});
return logArea;
}
protected AssertionsPanel buildAssertionsPanel() {
return new AssertionsPanel(getRequest()) {
protected void selectError(AssertionError error) {
ModelItemXmlEditor<?, ?> editor = getResponseEditor();
editor.requestFocus();
}
};
}
public void setContent(JComponent content) {
inspectorPanel.setContentComponent(content);
}
public void removeContent(JComponent content) {
inspectorPanel.setContentComponent(null);
}
protected String getHelpUrl() {
return HelpUrls.TESTREQUESTEDITOR_HELP_URL;
}
protected JComponent buildContent() {
JComponent component = super.buildContent();
inspectorPanel = JInspectorPanelFactory.build(component);
assertionsPanel = buildAssertionsPanel();
assertionInspector = new JComponentInspector<JComponent>(assertionsPanel, "Assertions ("
+ getModelItem().getAssertionCount() + ")", "Assertions for this Request", true);
inspectorPanel.addInspector(assertionInspector);
logInspector = new JComponentInspector<JComponent>(buildLogPanel(), "Request Log (0)", "Log of requests", true);
inspectorPanel.addInspector(logInspector);
inspectorPanel.setDefaultDividerLocation(0.6F);
inspectorPanel.setCurrentInspector("Assertions");
updateStatusIcon();
return inspectorPanel.getComponent();
}
private void updateStatusIcon() {
AssertionStatus status = getModelItem().getTestRequest().getAssertionStatus();
switch (status) {
case FAILED: {
assertionInspector.setIcon(UISupport.createImageIcon("/failed_assertion.gif"));
inspectorPanel.activate(assertionInspector);
break;
}
case UNKNOWN: {
assertionInspector.setIcon(UISupport.createImageIcon("/unknown_assertion.png"));
break;
}
case VALID: {
assertionInspector.setIcon(UISupport.createImageIcon("/valid_assertion.gif"));
inspectorPanel.deactivate();
break;
}
}
}
@Override
protected void addTopToolbarComponents(JXToolBar toolBar) {
//RestTestRequestDesktopPanel does not need any extra top toolbar component
}
@Override
protected void addBottomToolbar(JPanel panel) {
if (getRequest().getResource() != null) {
JXToolBar toolbar = UISupport.createToolbar();
methodResourceCombo = new JComboBox(new PathComboBoxModel());
methodResourceCombo.setRenderer(new RestMethodListCellRenderer());
methodResourceCombo.setPreferredSize(new Dimension(200, 20));
methodResourceCombo.setSelectedItem(getRequest().getRestMethod());
toolbar.addLabeledFixed("Resource/Method:", methodResourceCombo);
toolbar.addSeparator();
pathLabel = new JLabel();
updateFullPathLabel();
toolbar.add(pathLabel);
panel.add(toolbar, BorderLayout.SOUTH);
}
}
@Override
protected void updateUiValues() {
updateFullPathLabel();
}
private void updateFullPathLabel() {
if (pathLabel != null && getRequest().getResource() != null) {
String text = RestUtils.expandPath(getRequest().getResource().getFullPath(), getRequest().getParams(),
getRequest());
pathLabel.setText("[" + text + "]");
pathLabel.setToolTipText(text);
}
}
@Override
protected void insertButtons(JXToolBar toolbar) {
addAssertionButton = createActionButton(new AddAssertionAction(getRequest()), true);
toolbar.add(addAssertionButton);
}
public void setEnabled(boolean enabled) {
if (enabled) {
enabled = !SoapUI.getTestMonitor().hasRunningLoadTest(getModelItem().getTestCase())
&& !SoapUI.getTestMonitor().hasRunningSecurityTest(getModelItem().getTestCase());
}
super.setEnabled(enabled);
addAssertionButton.setEnabled(enabled);
assertionsPanel.setEnabled(enabled);
if (SoapUI.getTestMonitor().hasRunningLoadTest(getRequest().getTestCase())
|| SoapUI.getTestMonitor().hasRunningSecurityTest(getRequest().getTestCase())) {
getRequest().removeSubmitListener(this);
} else {
getRequest().addSubmitListener(this);
}
}
protected Submit doSubmit() throws SubmitException {
Analytics.trackAction(SoapUIActions.RUN_TEST_STEP.getActionName(), "StepType", "REST");
return getRequest().submit(new WsdlTestRunContext(getModelItem()), true);
}
private final class InternalAssertionsListener implements AssertionsListener {
public void assertionAdded(TestAssertion assertion) {
assertionInspector.setTitle("Assertions (" + getModelItem().getAssertionCount() + ")");
}
public void assertionRemoved(TestAssertion assertion) {
assertionInspector.setTitle("Assertions (" + getModelItem().getAssertionCount() + ")");
}
public void assertionMoved(TestAssertion assertion, int ix, int offset) {
assertionInspector.setTitle("Assertions (" + getModelItem().getAssertionCount() + ")");
}
}
public boolean beforeSubmit(Submit submit, SubmitContext context) {
boolean result = super.beforeSubmit(submit, context);
startTime = System.currentTimeMillis();
return result;
}
protected void logMessages(String message, String infoMessage) {
super.logMessages(message, infoMessage);
logArea.addLine(DateUtil.formatFull(new Date(startTime)) + " - " + message);
}
@Override
public void afterSubmit(Submit submit, SubmitContext context) {
super.afterSubmit(submit, context);
if (!isHasClosed()) {
updateStatusIcon();
}
}
public boolean onClose(boolean canCancel) {
if (super.onClose(canCancel)) {
assertionsPanel.release();
inspectorPanel.release();
SoapUI.getTestMonitor().removeTestMonitorListener(testMonitorListener);
getModelItem().getTestRequest().removeAssertionsListener(assertionsListener);
return true;
}
return false;
}
public boolean dependsOn(ModelItem modelItem) {
if (getRequest().getResource() == null) {
return modelItem == getRequest() || modelItem == getModelItem() || modelItem == getRequest().getOperation()
|| modelItem == getModelItem().getTestCase() || modelItem == getModelItem().getTestCase().getTestSuite()
|| modelItem == getModelItem().getTestCase().getTestSuite().getProject();
} else {
return modelItem == getRequest() || modelItem == getModelItem() || modelItem == getRequest().getOperation()
|| modelItem == getRequest().getOperation().getInterface()
|| modelItem == getRequest().getOperation().getInterface().getProject()
|| modelItem == getModelItem().getTestCase() || modelItem == getModelItem().getTestCase().getTestSuite();
}
}
private class InternalTestMonitorListener extends TestMonitorListenerAdapter {
public void loadTestFinished(LoadTestRunner runner) {
setEnabled(!SoapUI.getTestMonitor().hasRunningTest(getModelItem().getTestCase()));
}
public void loadTestStarted(LoadTestRunner runner) {
if (runner.getLoadTest().getTestCase() == getModelItem().getTestCase()) {
setEnabled(false);
}
}
public void securityTestFinished(SecurityTestRunner runner) {
setEnabled(!SoapUI.getTestMonitor().hasRunningTest(getModelItem().getTestCase()));
}
public void securityTestStarted(SecurityTestRunner runner) {
if (runner.getSecurityTest().getTestCase() == getModelItem().getTestCase()) {
setEnabled(false);
}
}
public void testCaseFinished(TestCaseRunner runner) {
setEnabled(!SoapUI.getTestMonitor().hasRunningTest(getModelItem().getTestCase()));
}
public void testCaseStarted(TestCaseRunner runner) {
if (runner.getTestCase() == getModelItem().getTestCase()) {
setEnabled(false);
}
}
}
public void propertyChange(PropertyChangeEvent evt) {
super.propertyChange(evt);
if (evt.getPropertyName().equals(RestTestRequestInterface.STATUS_PROPERTY)) {
updateStatusIcon();
}
}
private class PathComboBoxModel extends AbstractListModel implements ComboBoxModel {
public int getSize() {
int sz = 0;
for (RestResource resource : getRequest().getResource().getService().getAllResources()) {
sz += resource.getRestMethodCount();
}
return sz;
}
public Object getElementAt(int index) {
int sz = 0;
for (RestResource resource : getRequest().getResource().getService().getAllResources()) {
if (index < sz + resource.getRestMethodCount()) {
return resource.getRestMethodAt(index - sz);
}
sz += resource.getRestMethodCount();
}
return null;
}
public void setSelectedItem(Object anItem) {
getRequest().getTestStep().setRestMethod((RestMethod) anItem);
}
public Object getSelectedItem() {
return getRequest().getRestMethod();
}
}
private class RestMethodListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
Component result = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value instanceof RestMethod) {
RestMethod item = (RestMethod) value;
setIcon(item.getIcon());
setText(item.getResource().getName() + " -> " + item.getName());
}
return result;
}
}
}