/*
* 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.amf;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.analytics.Analytics;
import com.eviware.soapui.analytics.SoapUIActions;
import com.eviware.soapui.config.AMFRequestTestStepConfig;
import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
import com.eviware.soapui.impl.support.components.ModelItemXmlEditor;
import com.eviware.soapui.impl.support.components.RequestMessageXmlEditor;
import com.eviware.soapui.impl.support.components.ResponseMessageXmlEditor;
import com.eviware.soapui.impl.support.panels.AbstractHttpRequestDesktopPanel;
import com.eviware.soapui.impl.wsdl.panels.support.TestRunComponentEnabler;
import com.eviware.soapui.impl.wsdl.panels.teststeps.AssertionsPanel;
import com.eviware.soapui.impl.wsdl.panels.teststeps.support.DefaultPropertyHolderTableModel;
import com.eviware.soapui.impl.wsdl.panels.teststeps.support.GroovyEditor;
import com.eviware.soapui.impl.wsdl.panels.teststeps.support.GroovyEditorModel;
import com.eviware.soapui.impl.wsdl.panels.teststeps.support.PropertyHolderTable;
import com.eviware.soapui.impl.wsdl.submit.transports.http.DocumentContent;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext;
import com.eviware.soapui.impl.wsdl.teststeps.AMFRequestTestStep;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStepWithProperties;
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.Submit.Status;
import com.eviware.soapui.model.iface.SubmitContext;
import com.eviware.soapui.model.iface.SubmitListener;
import com.eviware.soapui.model.settings.Settings;
import com.eviware.soapui.model.testsuite.Assertable;
import com.eviware.soapui.model.testsuite.Assertable.AssertionStatus;
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.settings.UISettings;
import com.eviware.soapui.support.DocumentListenerAdapter;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.actions.ChangeSplitPaneOrientationAction;
import com.eviware.soapui.support.components.JComponentInspector;
import com.eviware.soapui.support.components.JEditorStatusBarWithProgress;
import com.eviware.soapui.support.components.JInspectorPanel;
import com.eviware.soapui.support.components.JInspectorPanelFactory;
import com.eviware.soapui.support.components.JUndoableTextField;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.support.components.SimpleForm;
import com.eviware.soapui.support.editor.Editor;
import com.eviware.soapui.support.editor.EditorView;
import com.eviware.soapui.support.editor.support.AbstractEditorView;
import com.eviware.soapui.support.editor.xml.support.AbstractXmlDocument;
import com.eviware.soapui.support.propertyexpansion.PropertyExpansionPopupListener;
import com.eviware.soapui.support.scripting.SoapUIScriptEngine;
import com.eviware.soapui.support.scripting.SoapUIScriptEngineRegistry;
import com.eviware.soapui.support.swing.SoapUISplitPaneUI;
import com.eviware.soapui.ui.support.ModelItemDesktopPanel;
import org.apache.log4j.Logger;
import javax.annotation.Nonnull;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.Document;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static com.eviware.soapui.impl.wsdl.teststeps.Script.SCRIPT_PROPERTY;
@SuppressWarnings("serial")
public class AMFRequestTestStepDesktopPanel extends ModelItemDesktopPanel<AMFRequestTestStep> implements SubmitListener {
private static final String ENDPOINT = "Endpoint";
private static final String AMF_CALL = "AMF Call";
private final static Logger log = Logger.getLogger(AbstractHttpRequestDesktopPanel.class);
private JPanel configPanel;
private JButton addAssertionButton;
private JInspectorPanel inspectorPanel;
private AMFRequestTestStep amfRequestTestStep;
protected AMFRequestTestStepConfig amfRequestTestStepConfig;
private JComponentInspector<?> assertionInspector;
private AssertionsPanel assertionsPanel;
private InternalAssertionsListener assertionsListener = new InternalAssertionsListener();
private InternalTestMonitorListener testMonitorListener = new InternalTestMonitorListener();
private JComponent requestEditor;
private ModelItemXmlEditor<?, ?> responseEditor;
private Submit submit;
private JButton submitButton;
private JToggleButton tabsButton;
private JTabbedPane requestTabs;
private JPanel requestTabPanel;
private boolean responseHasFocus;
private JSplitPane requestSplitPane;
private JEditorStatusBarWithProgress statusBar;
private JButton cancelButton;
private JButton splitButton;
private JComponent propertiesTableComponent;
private SoapUIScriptEngine scriptEngine;
private RunAction runAction = new RunAction();
private GroovyEditor groovyEditor;
private JTextField amfCallField;
public boolean updating;
SimpleForm configForm;
private JTextField endpointField;
private TestRunComponentEnabler componentEnabler;
protected PropertyHolderTable propertyHolderTable;
public AMFRequestTestStepDesktopPanel(AMFRequestTestStep modelItem) {
super(modelItem);
amfRequestTestStep = modelItem;
componentEnabler = new TestRunComponentEnabler(amfRequestTestStep.getTestCase());
initConfig();
initContent();
SoapUI.getTestMonitor().addTestMonitorListener(testMonitorListener);
setEnabled(!SoapUI.getTestMonitor().hasRunningTest(amfRequestTestStep.getTestCase()));
amfRequestTestStep.addAssertionsListener(assertionsListener);
scriptEngine = SoapUIScriptEngineRegistry.create(modelItem);
scriptEngine.setScript(amfRequestTestStep.getScript());
}
protected void initConfig() {
amfRequestTestStepConfig = amfRequestTestStep.getAMFRequestTestStepConfig();
}
private JComponent buildContent() {
requestSplitPane = UISupport.createHorizontalSplit();
requestSplitPane.setResizeWeight(0.5);
requestSplitPane.setBorder(null);
JComponent content;
submitButton = createActionButton(new SubmitAction(), true);
submitButton.setEnabled(enableSubmit());
cancelButton = createActionButton(new CancelAction(), false);
tabsButton = new JToggleButton(new ChangeToTabsAction());
tabsButton.setPreferredSize(UISupport.TOOLBAR_BUTTON_DIMENSION);
splitButton = createActionButton(new ChangeSplitPaneOrientationAction(requestSplitPane), true);
addAssertionButton = UISupport.createToolbarButton(new AddAssertionAction(amfRequestTestStep));
addAssertionButton.setEnabled(true);
requestTabs = new JTabbedPane();
requestTabs.setTabPlacement(JTabbedPane.LEFT);
requestTabs.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
int ix = requestTabs.getSelectedIndex();
if (ix == 0) {
requestEditor.requestFocus();
} else if (ix == 1 && responseEditor != null) {
responseEditor.requestFocus();
}
}
});
}
});
addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
if (requestTabs.getSelectedIndex() == 1 || responseHasFocus) {
responseEditor.requestFocusInWindow();
} else {
requestEditor.requestFocusInWindow();
}
}
});
requestTabPanel = UISupport.createTabPanel(requestTabs, true);
requestEditor = (JComponent) buildRequestConfigPanel();
responseEditor = buildResponseEditor();
if (amfRequestTestStep.getSettings().getBoolean(UISettings.START_WITH_REQUEST_TABS)) {
requestTabs.addTab("Request", requestEditor);
if (responseEditor != null) {
requestTabs.addTab("Response", responseEditor);
}
tabsButton.setSelected(true);
splitButton.setEnabled(false);
content = requestTabPanel;
} else {
requestSplitPane.setTopComponent(requestEditor);
requestSplitPane.setBottomComponent(responseEditor);
requestSplitPane.setDividerLocation(0.5);
content = requestSplitPane;
}
inspectorPanel = JInspectorPanelFactory.build(content);
inspectorPanel.setDefaultDividerLocation(0.7F);
add(buildToolbar(), BorderLayout.NORTH);
add(inspectorPanel.getComponent(), BorderLayout.CENTER);
assertionsPanel = buildAssertionsPanel();
assertionInspector = new JComponentInspector<JComponent>(assertionsPanel, "Assertions ("
+ getModelItem().getAssertionCount() + ")", "Assertions for this Request", true);
inspectorPanel.addInspector(assertionInspector);
// setPreferredSize(new Dimension(600, 450));
updateStatusIcon();
return inspectorPanel.getComponent();
}
@SuppressWarnings("unchecked")
protected JComponent buildRequestConfigPanel() {
ModelItemXmlEditor<?, ?> reqEditor = buildRequestEditor();
configPanel = UISupport.addTitledBorder(new JPanel(new BorderLayout()), "Script");
configPanel.add(buildToolbarButtonAndText(), BorderLayout.NORTH);
groovyEditor = (GroovyEditor) UISupport.getEditorFactory().buildGroovyEditor(new ScriptStepGroovyEditorModel());
configPanel.add(groovyEditor, BorderLayout.CENTER);
propertiesTableComponent = buildProperties();
final JSplitPane split = UISupport.createVerticalSplit(propertiesTableComponent, configPanel);
split.setDividerLocation(120);
reqEditor.addEditorView((EditorView) new AbstractEditorView<AMFRequestDocument>("AMF",
(Editor<AMFRequestDocument>) reqEditor, "amf") {
@Override
public JComponent buildUI() {
return split;
}
});
reqEditor.selectView(1);
return reqEditor;
}
private JComponent buildToolbarButtonAndText() {
JXToolBar toolBar = UISupport.createToolbar();
JButton runButton = UISupport.createToolbarButton(runAction);
toolBar.add(runButton);
toolBar.add(Box.createHorizontalGlue());
JLabel label = new JLabel("<html>Script is invoked with <code>log</code>, <code>context</code> "
+ ", <code>parameters</code> and <code>amfHeaders</code> variables</html>");
label.setToolTipText(label.getText());
label.setMinimumSize(label.getPreferredSize());
label.setMaximumSize(label.getPreferredSize());
toolBar.add(label);
toolBar.addRelatedGap();
toolBar.add(UISupport.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.GROOVYSTEPEDITOR_HELP_URL)));
componentEnabler.add(runButton);
return toolBar;
}
protected JComponent buildToolbar() {
JPanel panel = new JPanel(new BorderLayout());
panel.add(buildToolbar1(), BorderLayout.NORTH);
panel.add(buildToolbar2(), BorderLayout.SOUTH);
return panel;
}
protected void initContent() {
amfRequestTestStep.getAMFRequest().addSubmitListener(this);
add(buildContent(), BorderLayout.CENTER);
add(buildToolbar(), BorderLayout.NORTH);
add(buildStatusLabel(), BorderLayout.SOUTH);
setPreferredSize(new Dimension(600, 500));
addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
if (requestTabs.getSelectedIndex() == 1 || responseHasFocus) {
responseEditor.requestFocusInWindow();
} else {
requestEditor.requestFocusInWindow();
}
}
});
}
protected JComponent buildStatusLabel() {
statusBar = new JEditorStatusBarWithProgress();
statusBar.setBorder(BorderFactory.createEmptyBorder(1, 0, 0, 0));
return statusBar;
}
protected JComponent buildProperties() {
propertyHolderTable = new PropertyHolderTable(getModelItem()) {
@Override
protected DefaultPropertyHolderTableModel getPropertyHolderTableModel() {
return new DefaultPropertyHolderTableModel(holder) {
@Override
public String[] getPropertyNames() {
List<String> propertyNamesList = new ArrayList<String>();
for (String name : holder.getPropertyNames()) {
if (name.equals(WsdlTestStepWithProperties.RESPONSE_AS_XML)) {
continue;
}
propertyNamesList.add(name);
}
return propertyNamesList.toArray(new String[propertyNamesList.size()]);
}
};
}
};
JUndoableTextField textField = new JUndoableTextField(true);
PropertyExpansionPopupListener.enable(textField, getModelItem());
propertyHolderTable.getPropertiesTable().setDefaultEditor(String.class, new DefaultCellEditor(textField));
return propertyHolderTable;
}
protected JComponent buildToolbar1() {
JXToolBar toolbar = UISupport.createToolbar();
toolbar.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
toolbar.addFixed(submitButton);
toolbar.add(cancelButton);
toolbar.addFixed(addAssertionButton);
toolbar.add(Box.createHorizontalGlue());
toolbar.add(tabsButton);
toolbar.add(splitButton);
toolbar.addFixed(UISupport
.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.TEST_AMF_REQUEST_EDITOR_HELP_URL)));
return toolbar;
}
protected JComponent buildToolbar2() {
JXToolBar toolbar = UISupport.createToolbar();
toolbar.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
toolbar.addLabeledFixed(ENDPOINT, addEndpointField());
toolbar.addSeparator();
toolbar.addLabeledFixed(AMF_CALL, addAmfCallField());
return toolbar;
}
public AMFRequestTestStep getAMFRequestTestStep() {
return amfRequestTestStep;
}
protected AssertionsPanel buildAssertionsPanel() {
return new AMFAssertionsPanel(amfRequestTestStep) {
};
}
protected class AMFAssertionsPanel extends AssertionsPanel {
public AMFAssertionsPanel(Assertable assertable) {
super(assertable);
}
}
private JTextField addAmfCallField() {
amfCallField = new JTextField();
amfCallField.setText(amfRequestTestStep.getAmfCall());
amfCallField.setColumns(20);
amfCallField.setToolTipText("object.methodName for amf method call");
PropertyExpansionPopupListener.enable(amfCallField, amfRequestTestStep);
addAmfCallDocumentListener();
return amfCallField;
}
private JTextField addEndpointField() {
endpointField = new JTextField();
endpointField.setText(amfRequestTestStep.getEndpoint());
endpointField.setColumns(35);
endpointField.setToolTipText("http to connect");
PropertyExpansionPopupListener.enable(endpointField, amfRequestTestStep);
addEndpointCallDocumentListener();
return endpointField;
}
protected void addAmfCallDocumentListener() {
amfCallField.getDocument().addDocumentListener(new DocumentListenerAdapter() {
@Override
public void update(Document document) {
if (!updating) {
amfRequestTestStep.setAmfCall(amfCallField.getText());
}
submitButton.setEnabled(enableSubmit());
}
});
}
protected void addEndpointCallDocumentListener() {
endpointField.getDocument().addDocumentListener(new DocumentListenerAdapter() {
@Override
public void update(Document document) {
if (!updating) {
amfRequestTestStep.setEndpoint(endpointField.getText());
}
submitButton.setEnabled(enableSubmit());
}
});
}
protected boolean enableSubmit() {
return !StringUtils.isNullOrEmpty(amfRequestTestStep.getEndpoint())
&& !StringUtils.isNullOrEmpty(amfRequestTestStep.getAmfCall());
}
private class ScriptStepGroovyEditorModel implements GroovyEditorModel {
public String[] getKeywords() {
return new String[]{"log", "context", "property"};
}
public Action getRunAction() {
return runAction;
}
public String getScript() {
return amfRequestTestStep.getScript();
}
public void setScript(String text) {
if (updating) {
return;
}
updating = true;
amfRequestTestStep.setScript(text);
updating = false;
}
public Settings getSettings() {
return SoapUI.getSettings();
}
public String getScriptName() {
return null;
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
}
public ModelItem getModelItem() {
return amfRequestTestStep;
}
}
private class RunAction extends AbstractAction {
public RunAction() {
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/run.png"));
putValue(Action.SHORT_DESCRIPTION,
"Runs this script in a seperate thread using a mock testRunner and testContext");
}
public void actionPerformed(ActionEvent e) {
SoapUI.getThreadPool().execute(new Runnable() {
public void run() {
SubmitContext context = new WsdlTestRunContext(getModelItem());
statusBar.setIndeterminate(true);
amfRequestTestStep.initAmfRequest(context);
if (context.getProperty(AMFRequest.AMF_SCRIPT_ERROR) != null) {
UISupport.showInfoMessage(((Throwable) context.getProperty(AMFRequest.AMF_SCRIPT_ERROR))
.getMessage());
} else {
UISupport.showInfoMessage(scriptInfo(context));
}
statusBar.setIndeterminate(false);
amfRequestTestStep.getAMFRequest().clearArguments();
}
@SuppressWarnings("unchecked")
private String scriptInfo(SubmitContext context) {
HashMap<String, Object> parameters = (HashMap<String, Object>) context
.getProperty(AMFRequest.AMF_SCRIPT_PARAMETERS);
HashMap<String, Object> amfHeaders = (HashMap<String, Object>) context
.getProperty(AMFRequest.AMF_SCRIPT_HEADERS);
StringBuilder sb = new StringBuilder();
sb.append("parameters " + (parameters != null ? parameters.toString() : ""));
sb.append("\n");
sb.append("amfHeaders " + (amfHeaders != null ? amfHeaders.toString() : ""));
return sb.toString();
}
});
}
}
protected ModelItemXmlEditor<?, ?> buildResponseEditor() {
return new AMFResponseMessageEditor();
}
protected ModelItemXmlEditor<?, ?> buildRequestEditor() {
return new AMFRequestMessageEditor();
}
public class AMFResponseMessageEditor extends ResponseMessageXmlEditor<AMFRequestTestStep, AMFResponseDocument> {
public AMFResponseMessageEditor() {
super(new AMFResponseDocument(), amfRequestTestStep);
}
@Override
public void release() {
getDocument().release();
super.release();
}
}
public class AMFRequestMessageEditor extends RequestMessageXmlEditor<AMFRequestTestStep, AMFRequestDocument> {
public AMFRequestMessageEditor() {
super(new AMFRequestDocument(), amfRequestTestStep);
}
@Override
public void release() {
getDocument().release();
super.release();
}
}
public boolean dependsOn(ModelItem modelItem) {
return modelItem == getModelItem() || modelItem == getModelItem().getTestCase()
|| modelItem == getModelItem().getTestCase().getTestSuite()
|| modelItem == getModelItem().getTestCase().getTestSuite().getProject();
}
public boolean onClose(boolean canCancel) {
configPanel.removeAll();
inspectorPanel.release();
requestEditor.removeAll();
((ModelItemXmlEditor<?, ?>) requestEditor).release();
responseEditor.release();
responseEditor.removeAll();
responseEditor = null;
assertionsPanel.release();
SoapUI.getTestMonitor().removeTestMonitorListener(testMonitorListener);
amfRequestTestStep.removeAssertionsListener(assertionsListener);
amfRequestTestStep.getAMFRequest().removeSubmitListener(this);
componentEnabler.release();
groovyEditor.release();
amfRequestTestStep.release();
propertyHolderTable.release();
this.removeAll();
return release();
}
public class AMFResponseDocument extends AbstractXmlDocument implements PropertyChangeListener {
public AMFResponseDocument() {
amfRequestTestStep.addPropertyChangeListener(AMFRequestTestStep.RESPONSE_PROPERTY, this);
}
public void propertyChange(PropertyChangeEvent evt) {
fireContentChanged();
}
@Override
@Nonnull
public DocumentContent getDocumentContent(Format format) {
AMFResponse response = amfRequestTestStep.getAMFRequest().getResponse();
return new DocumentContent(response == null ? null : response.getContentType(), response == null ? null : response.getResponseContentXML());
}
@Override
public void setDocumentContent(DocumentContent documentContent) {
if (amfRequestTestStep.getAMFRequest().getResponse() != null) {
amfRequestTestStep.getAMFRequest().getResponse().setResponseContentXML(documentContent.getContentAsString());
}
}
public void release() {
super.release();
amfRequestTestStep.removePropertyChangeListener(AMFRequestTestStep.RESPONSE_PROPERTY, this);
}
}
public class AMFRequestDocument extends AbstractXmlDocument implements PropertyChangeListener {
public AMFRequestDocument() {
amfRequestTestStep.addPropertyChangeListener(AMFRequestTestStep.REQUEST_PROPERTY, this);
}
public void propertyChange(PropertyChangeEvent evt) {
fireContentChanged();
}
@Override
@Nonnull
public DocumentContent getDocumentContent(Format format) {
AMFRequest request = amfRequestTestStep.getAMFRequest();
return new DocumentContent(null, request == null ? null : request.requestAsXML());
}
@Override
public void setDocumentContent(DocumentContent documentContent) {
}
public void release() {
super.release();
amfRequestTestStep.removePropertyChangeListener(AMFRequestTestStep.REQUEST_PROPERTY, this);
}
}
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 class SubmitAction extends AbstractAction {
public SubmitAction() {
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/submit_request.gif"));
putValue(Action.SHORT_DESCRIPTION, "Submit request to specified endpoint URL");
putValue(Action.ACCELERATOR_KEY, UISupport.getKeyStroke("alt ENTER"));
}
public void actionPerformed(ActionEvent e) {
onSubmit();
}
}
protected void onSubmit() {
if (submit != null && submit.getStatus() == Submit.Status.RUNNING) {
if (UISupport.confirm("Cancel current request?", "Submit Request")) {
submit.cancel();
} else {
return;
}
}
try {
submit = doSubmit();
} catch (SubmitException e1) {
SoapUI.logError(e1);
}
}
protected Submit doSubmit() throws SubmitException {
SubmitContext submitContext = new WsdlTestRunContext(getModelItem());
if (!amfRequestTestStep.initAmfRequest(submitContext)) {
throw new SubmitException("AMF request is not initialised properly !");
}
Analytics.trackAction(SoapUIActions.RUN_TEST_STEP.getActionName(), "StepType", "AMF");
return amfRequestTestStep.getAMFRequest().submit(submitContext, true);
}
protected final class InputAreaFocusListener implements FocusListener {
public InputAreaFocusListener(JComponent editor) {
}
public void focusGained(FocusEvent e) {
responseHasFocus = false;
// statusBar.setTarget(sourceEditor.getInputArea());
if (!splitButton.isEnabled()) {
requestTabs.setSelectedIndex(0);
return;
}
// if
// (getModelItem().getSettings().getBoolean(UISettings.NO_RESIZE_REQUEST_EDITOR))
// return;
// // dont resize if split has been dragged
// if (requestSplitPane.getUI() instanceof SoapUISplitPaneUI
// && ((SoapUISplitPaneUI) requestSplitPane.getUI()).hasBeenDragged())
// return;
//
int pos = requestSplitPane.getDividerLocation();
if (pos >= 600) {
return;
}
if (requestSplitPane.getMaximumDividerLocation() > 700) {
requestSplitPane.setDividerLocation(600);
} else {
requestSplitPane.setDividerLocation(0.8);
}
}
public void focusLost(FocusEvent e) {
}
}
protected final class ResultAreaFocusListener implements FocusListener {
@SuppressWarnings("unused")
private final ModelItemXmlEditor<?, ?> responseEditor;
public ResultAreaFocusListener(ModelItemXmlEditor<?, ?> editor) {
this.responseEditor = editor;
}
public void focusGained(FocusEvent e) {
responseHasFocus = true;
// statusBar.setTarget(sourceEditor.getInputArea());
if (!splitButton.isEnabled()) {
requestTabs.setSelectedIndex(1);
return;
}
if (getModelItem().getSettings().getBoolean(UISettings.NO_RESIZE_REQUEST_EDITOR)) {
return;
}
// dont resize if split has been dragged or result is empty
if (requestSplitPane.getUI() instanceof SoapUISplitPaneUI
&& ((SoapUISplitPaneUI) requestSplitPane.getUI()).hasBeenDragged()
|| amfRequestTestStep.getAMFRequest().getResponse() == null) {
return;
}
int pos = requestSplitPane.getDividerLocation();
int maximumDividerLocation = requestSplitPane.getMaximumDividerLocation();
if (pos + 600 < maximumDividerLocation) {
return;
}
if (maximumDividerLocation > 700) {
requestSplitPane.setDividerLocation(maximumDividerLocation - 600);
} else {
requestSplitPane.setDividerLocation(0.2);
}
}
public void focusLost(FocusEvent e) {
}
}
private final class ChangeToTabsAction extends AbstractAction {
public ChangeToTabsAction() {
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/toggle_tabs.gif"));
putValue(Action.SHORT_DESCRIPTION, "Toggles to tab-based layout");
}
public void actionPerformed(ActionEvent e) {
if (splitButton.isEnabled()) {
splitButton.setEnabled(false);
removeContent(requestSplitPane);
setContent(requestTabPanel);
requestTabs.addTab("Request", requestEditor);
if (responseEditor != null) {
requestTabs.addTab("Response", responseEditor);
}
if (responseHasFocus) {
requestTabs.setSelectedIndex(1);
requestEditor.requestFocus();
}
requestTabs.repaint();
} else {
int selectedIndex = requestTabs.getSelectedIndex();
splitButton.setEnabled(true);
removeContent(requestTabPanel);
setContent(requestSplitPane);
requestSplitPane.setTopComponent(requestEditor);
if (responseEditor != null) {
requestSplitPane.setBottomComponent(responseEditor);
}
requestSplitPane.setDividerLocation(0.5);
if (selectedIndex == 0 || responseEditor == null) {
requestEditor.requestFocus();
} else {
responseEditor.requestFocus();
}
requestSplitPane.repaint();
}
revalidate();
}
}
public void setContent(JComponent content) {
inspectorPanel.setContentComponent(content);
}
public void removeContent(JComponent content) {
inspectorPanel.setContentComponent(null);
}
private class CancelAction extends AbstractAction {
public CancelAction() {
super();
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/cancel_request.png"));
putValue(Action.SHORT_DESCRIPTION, "Aborts ongoing request");
putValue(Action.ACCELERATOR_KEY, UISupport.getKeyStroke("alt X"));
}
public void actionPerformed(ActionEvent e) {
onCancel();
}
}
protected void onCancel() {
if (submit == null) {
return;
}
cancelButton.setEnabled(false);
submit.cancel();
setEnabled(true);
submit = null;
}
public void setEnabled(boolean enabled) {
if (responseEditor != null) {
responseEditor.setEnabled(enabled);
}
submitButton.setEnabled(enabled && enableSubmit());
addAssertionButton.setEnabled(enabled);
propertiesTableComponent.setEnabled(enabled);
groovyEditor.setEnabled(enabled);
endpointField.setEnabled(enabled);
amfCallField.setEnabled(enabled);
statusBar.setIndeterminate(!enabled);
}
public void afterSubmit(Submit submit, SubmitContext context) {
if (submit.getRequest() != amfRequestTestStep.getAMFRequest()) {
return;
}
Status status = submit.getStatus();
AMFResponse response = (AMFResponse) submit.getResponse();
if (status == Status.FINISHED) {
amfRequestTestStep.setResponse(response, context);
}
cancelButton.setEnabled(false);
setEnabled(true);
String message = null;
String infoMessage = null;
String requestName = amfRequestTestStep.getName();
if (status == Status.CANCELED) {
message = "CANCELED";
infoMessage = "[" + requestName + "] - CANCELED";
} else {
if (status == Status.ERROR || response == null) {
message = "Error getting response; " + submit.getError();
infoMessage = "Error getting response for [" + requestName + "]; " + submit.getError();
} else {
message = "response time: " + response.getTimeTaken() + "ms (" + response.getContentLength() + " bytes)";
infoMessage = "Got response for [" + requestName + "] in " + response.getTimeTaken() + "ms ("
+ response.getContentLength() + " bytes)";
if (!splitButton.isEnabled()) {
requestTabs.setSelectedIndex(1);
}
responseEditor.requestFocus();
}
}
logMessages(message, infoMessage);
if (getModelItem().getSettings().getBoolean(UISettings.AUTO_VALIDATE_RESPONSE)) {
responseEditor.getSourceEditor().validate();
}
AMFRequestTestStepDesktopPanel.this.submit = null;
updateStatusIcon();
}
protected void logMessages(String message, String infoMessage) {
log.info(infoMessage);
statusBar.setInfo(message);
}
public boolean beforeSubmit(Submit submit, SubmitContext context) {
if (submit.getRequest() != amfRequestTestStep.getAMFRequest()) {
return true;
}
setEnabled(false);
cancelButton.setEnabled(AMFRequestTestStepDesktopPanel.this.submit != null);
return true;
}
public void propertyChange(PropertyChangeEvent evt) {
super.propertyChange(evt);
if (evt.getPropertyName().equals(SCRIPT_PROPERTY) && !updating) {
updating = true;
groovyEditor.getEditArea().setText((String) evt.getNewValue());
updating = false;
}
if (evt.getPropertyName().equals(AMFRequestTestStep.STATUS_PROPERTY)) {
updateStatusIcon();
}
}
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() + ")");
}
}
private void updateStatusIcon() {
AssertionStatus status = amfRequestTestStep.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;
}
}
}
}