/* * 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.config.JdbcRequestTestStepConfig; import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction; import com.eviware.soapui.impl.support.components.ModelItemXmlEditor; import com.eviware.soapui.impl.support.components.ResponseMessageXmlEditor; import com.eviware.soapui.impl.support.panels.AbstractHttpRequestDesktopPanel; import com.eviware.soapui.impl.wsdl.MutableTestPropertyHolder; import com.eviware.soapui.impl.wsdl.panels.teststeps.support.DefaultPropertyHolderTableModel; 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.JdbcRequestTestStep; 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.propertyexpansion.DefaultPropertyExpansionContext; import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext; 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.DateUtil; import com.eviware.soapui.support.DocumentListenerAdapter; import com.eviware.soapui.support.ListDataChangeListener; import com.eviware.soapui.support.MessageSupport; import com.eviware.soapui.support.SoapUIException; 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.xml.support.AbstractXmlDocument; import com.eviware.soapui.support.jdbc.JdbcUtils; import com.eviware.soapui.support.log.JLogList; import com.eviware.soapui.support.propertyexpansion.PropertyExpansionPopupListener; import com.eviware.soapui.support.types.StringToStringMap; import com.eviware.soapui.support.xml.SyntaxEditorUtil; import com.eviware.soapui.ui.support.ModelItemDesktopPanel; import org.apache.log4j.Logger; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; 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.JCheckBox; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.ListModel; 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.ItemEvent; import java.awt.event.ItemListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List; public class JdbcRequestTestStepDesktopPanel extends ModelItemDesktopPanel<JdbcRequestTestStep> implements SubmitListener { private final static Logger log = Logger.getLogger(AbstractHttpRequestDesktopPanel.class); private final static MessageSupport messages = MessageSupport.getMessages(JdbcRequestTestStepDesktopPanel.class); protected JPanel configPanel; private JButton addAssertionButton; protected JInspectorPanel inspectorPanel; protected JdbcRequestTestStep jdbcRequestTestStep; protected JComponentInspector<?> assertionInspector; protected AssertionsPanel assertionsPanel; private InternalAssertionsListener assertionsListener = new InternalAssertionsListener(); private InternalTestMonitorListener testMonitorListener = new InternalTestMonitorListener(); protected JComponent requestEditor; protected ModelItemXmlEditor<?, ?> responseEditor; protected JPanel panel; protected SimpleForm configForm; protected static final String DRIVER_FIELD = "Driver"; protected static final String CONNSTR_FIELD = "Connection String"; protected static final String PASS_FIELD = "Password"; public static final String QUERY_FIELD = "SQL Query"; protected static final String STOREDPROCEDURE_FIELD = "Stored Procedure"; protected static final String RESULT_COLUMNS_NAMES_TO_UPPER_CASE = messages.get("JdbcRequestTestStepDesktopPanel.ResultColumnsToUpperCase.Name"); protected static final String DATA_CONNECTION_FIELD = "Connection"; protected static final String QUERY_ELEMENT = "query"; protected static final String STOREDPROCEDURE_ELEMENT = "stored-procedure"; protected Connection connection; protected RSyntaxTextArea queryArea; protected JCheckBox isStoredProcedureCheckBox; protected JCheckBox resultColumnsNamesToUpperCaseCheckBox; protected JTextField driverTextField; protected JTextField connStrTextField; protected JButton testConnectionButton; protected JPasswordField passField; private Submit submit; private SubmitAction submitAction; protected 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; protected JComponent propertiesTableComponent; private JComponentInspector<?> logInspector; protected JLogList logArea; private long startTime; protected JButton reconfigureConnPropertiesButton; protected PropertyHolderTable propertyHolderTable; protected JdbcRequestTestStepConfig jdbcRequestTestStepConfig; public JdbcRequestTestStepDesktopPanel(JdbcRequestTestStep modelItem) { super(modelItem); jdbcRequestTestStep = modelItem; initConfig(); initContent(); SoapUI.getTestMonitor().addTestMonitorListener(testMonitorListener); setEnabled(!SoapUI.getTestMonitor().hasRunningTest(jdbcRequestTestStep.getTestCase())); jdbcRequestTestStep.addAssertionsListener(assertionsListener); } // added this again cause without it connection is set to none whenever jdbc // test step is reopened protected void initConfig() { jdbcRequestTestStepConfig = jdbcRequestTestStep.getJdbcRequestTestStepConfig(); } protected JComponent buildContent() { requestSplitPane = UISupport.createHorizontalSplit(); requestSplitPane.setResizeWeight(0.5); requestSplitPane.setBorder(null); JComponent content; submitAction = new SubmitAction(); submitButton = createActionButton(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(jdbcRequestTestStep)); addAssertionButton.setEnabled(true); requestTabs = new JTabbedPane(); 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 = buildRequestConfigPanel(); responseEditor = buildResponseEditor(); if (jdbcRequestTestStep.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); logInspector = new JComponentInspector<JComponent>(buildLogPanel(), "Request Log (0)", "Log of requests", true); inspectorPanel.addInspector(logInspector); inspectorPanel.setCurrentInspector("Assertions"); updateStatusIcon(); return inspectorPanel.getComponent(); } protected JComponent buildRequestConfigPanel() { configPanel = UISupport.addTitledBorder(new JPanel(new BorderLayout()), "Configuration"); if (panel == null) { panel = new JPanel(new BorderLayout()); configForm = new SimpleForm(); createSimpleJdbcConfigForm(); addStoreProcedureChangeListener(); addResultColumnsNamesToUpperCaseChangeListener(); panel.add(new JScrollPane(configForm.getPanel())); } configPanel.add(panel, BorderLayout.CENTER); propertiesTableComponent = buildProperties(); JSplitPane split = UISupport.createVerticalSplit(propertiesTableComponent, configPanel); split.setDividerLocation(120); split.setPreferredSize(new Dimension(330, 500)); return new JScrollPane(split); } protected void initContent() { jdbcRequestTestStep.getJdbcRequest().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; } public PropertyHolderTable getPropertyHolderTable() { return propertyHolderTable; } //Used from SoapUI Pro public void setPropertyHolderTable(StringToStringMap preparedProperties) { // first remove the old content String[] names = propertyHolderTable.getHolder().getPropertyNames(); if (names.length > 0) { for (String propertyName : names) { ((MutableTestPropertyHolder) propertyHolderTable.getHolder()).removeProperty(propertyName); } } propertyHolderTable.getPropertiesTable().removeAll(); if (preparedProperties != null) { int i = 0; for (String key : preparedProperties.keySet()) { String value = preparedProperties.get(key); ((MutableTestPropertyHolder) propertyHolderTable.getHolder()).addProperty(key); ((MutableTestPropertyHolder) propertyHolderTable.getHolder()).setPropertyValue(key, value); i++; } } } protected JComponent buildToolbar() { 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.JDBCSTEPEDITOR_HELP_URL))); return toolbar; } public JdbcRequestTestStep getJdbcRequestTestStep() { return jdbcRequestTestStep; } public void setQuery(String query) { if (configForm != null) { configForm.setComponentValue(QUERY_FIELD, query); jdbcRequestTestStep.setQuery(query); } else { // this.query = query; jdbcRequestTestStep.setQuery(query); } } 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 JdbcAssertionsPanel(jdbcRequestTestStep) { }; } protected class JdbcAssertionsPanel extends AssertionsPanel { public JdbcAssertionsPanel(Assertable assertable) { super(assertable); } } protected void createSimpleJdbcConfigForm() { configForm.addSpace(5); configForm.setDefaultTextFieldColumns(SimpleForm.LONG_TEXT_FIELD_COLUMNS); driverTextField = configForm.appendTextField(DRIVER_FIELD, "JDBC Driver to use"); driverTextField.setText(jdbcRequestTestStep.getDriver()); PropertyExpansionPopupListener.enable(driverTextField, jdbcRequestTestStep); addDriverDocumentListener(); connStrTextField = configForm.appendTextField(CONNSTR_FIELD, "JDBC Driver Connection String"); connStrTextField.setText(jdbcRequestTestStep.getConnectionString()); PropertyExpansionPopupListener.enable(connStrTextField, jdbcRequestTestStep); addConnStrDocumentListener(); passField = configForm.appendPasswordField(PASS_FIELD, "Connection string Password"); passField.setVisible(false); passField.setText(jdbcRequestTestStep.getPassword()); addPasswordDocumentListener(); reconfigureConnPropertiesButton = new JButton(); configForm.addLeftComponent(reconfigureConnPropertiesButton); reconfigureConnPropertiesButton.setVisible(false); configForm.appendSeparator(); testConnectionButton = configForm.appendButton("TestConnection", "Test selected database connection"); testConnectionButton.setAction(new TestConnectionAction()); testConnectionButton.setEnabled(enableTestConnection()); submitButton.setEnabled(enableSubmit()); queryArea = SyntaxEditorUtil.createDefaultSQLSyntaxTextArea(); PropertyExpansionPopupListener.enable(queryArea, jdbcRequestTestStep); queryArea.setText(jdbcRequestTestStep.getQuery()); JScrollPane scrollPane = new JScrollPane(queryArea); scrollPane.setPreferredSize(new Dimension(400, 150)); configForm.append(QUERY_FIELD, scrollPane); queryArea.getDocument().addDocumentListener(new DocumentListenerAdapter() { @Override public void update(Document document) { jdbcRequestTestStep.setQuery(queryArea.getText()); submitButton.setEnabled(enableSubmit()); } }); isStoredProcedureCheckBox = configForm.appendCheckBox(STOREDPROCEDURE_FIELD, "Select if this is a stored procedure", jdbcRequestTestStep.isStoredProcedure()); resultColumnsNamesToUpperCaseCheckBox = configForm.appendCheckBox(RESULT_COLUMNS_NAMES_TO_UPPER_CASE, messages.get("JdbcRequestTestStepDesktopPanel.ResultColumnsToUpperCase.Description"), jdbcRequestTestStep.isConvertColumnNamesToUpperCase()); } protected void addPasswordDocumentListener() { passField.getDocument().addDocumentListener(new DocumentListenerAdapter() { @Override public void update(Document document) { jdbcRequestTestStep.setPassword(configForm.getComponentValue(PASS_FIELD)); testConnectionButton.setEnabled(enableTestConnection()); submitButton.setEnabled(enableSubmit()); } }); } protected void addConnStrDocumentListener() { connStrTextField.getDocument().addDocumentListener(new DocumentListenerAdapter() { @Override public void update(Document document) { jdbcRequestTestStep.setConnectionString(configForm.getComponentValue(CONNSTR_FIELD)); testConnectionButton.setEnabled(enableTestConnection()); submitButton.setEnabled(enableSubmit()); } }); } protected void addDriverDocumentListener() { driverTextField.getDocument().addDocumentListener(new DocumentListenerAdapter() { @Override public void update(Document document) { jdbcRequestTestStep.setDriver(configForm.getComponentValue(DRIVER_FIELD)); testConnectionButton.setEnabled(enableTestConnection()); submitButton.setEnabled(enableSubmit()); } }); } protected void addStoreProcedureChangeListener() { isStoredProcedureCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent arg0) { jdbcRequestTestStep.setStoredProcedure(((JCheckBox) arg0.getSource()).isSelected()); SwingUtilities.invokeLater(new Runnable() { public void run() { if (UISupport.confirm("Would you like to empty current sql and properties?", "Reset query and properties")) { queryArea.setText(""); ((JdbcRequestTestStep) getPropertyHolderTable().getHolder()).removeAllProperties(); } } }); } }); } protected void addResultColumnsNamesToUpperCaseChangeListener() { resultColumnsNamesToUpperCaseCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent arg0) { jdbcRequestTestStep.setConvertColumnNamesToUpperCase(((JCheckBox) arg0.getSource()).isSelected()); } }); } protected boolean enableTestConnection() { if (StringUtils.isNullOrEmpty(jdbcRequestTestStep.getDriver()) || StringUtils.isNullOrEmpty(jdbcRequestTestStep.getConnectionString()) || (JdbcRequestTestStep.isNeededPassword(jdbcRequestTestStep.getConnectionString()) && StringUtils .isNullOrEmpty(jdbcRequestTestStep.getPassword()))) { return false; } else { if (jdbcRequestTestStep.getConnectionString().contains(JdbcRequestTestStep.PASS_TEMPLATE)) { return !StringUtils.isNullOrEmpty(jdbcRequestTestStep.getPassword()); } else { return true; } } } protected boolean enableSubmit() { return enableTestConnection() && !StringUtils.isNullOrEmpty(jdbcRequestTestStep.getQuery()); } protected ModelItemXmlEditor<?, ?> buildResponseEditor() { return new JdbcResponseMessageEditor(); } public class JdbcResponseMessageEditor extends ResponseMessageXmlEditor<JdbcRequestTestStep, JdbcResponseDocument> { public JdbcResponseMessageEditor() { super(new JdbcResponseDocument(), jdbcRequestTestStep); } } 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(); SoapUI.getTestMonitor().removeTestMonitorListener(testMonitorListener); jdbcRequestTestStep.removeAssertionsListener(assertionsListener); jdbcRequestTestStep.getJdbcRequest().removeSubmitListener(this); responseEditor.release(); assertionsPanel.release(); inspectorPanel.release(); propertyHolderTable.release(); return release(); } public class JdbcResponseDocument extends AbstractXmlDocument implements PropertyChangeListener { public JdbcResponseDocument() { jdbcRequestTestStep.addPropertyChangeListener(JdbcRequestTestStep.RESPONSE_PROPERTY, this); } public void propertyChange(PropertyChangeEvent evt) { fireContentChanged(); } @Override public void setDocumentContent(DocumentContent documentContent) { if (jdbcRequestTestStep.getJdbcRequest().getResponse() != null) { jdbcRequestTestStep.getJdbcRequest().getResponse().setContentAsString(documentContent.getContentAsString()); } } public void release() { super.release(); jdbcRequestTestStep.removePropertyChangeListener(JdbcRequestTestStep.RESPONSE_PROPERTY, this); } @Nonnull @Override public DocumentContent getDocumentContent(Format format) { JdbcResponse response = jdbcRequestTestStep.getJdbcRequest().getResponse(); return new DocumentContent(response == null ? null : response.getContentType(), response == null ? null : response.getContentAsString()); } } protected class TestConnectionAction extends AbstractAction { public TestConnectionAction() { putValue(Action.SMALL_ICON, UISupport.createImageIcon("/run.png")); putValue(Action.SHORT_DESCRIPTION, "Test the current Connection"); setEnabled(false); } public void actionPerformed(ActionEvent arg0) { try { PropertyExpansionContext context = new DefaultPropertyExpansionContext(getModelItem()); JdbcUtils.initConnection(context, jdbcRequestTestStep.getDriver(), jdbcRequestTestStep.getConnectionString(), jdbcRequestTestStep.getPassword()); UISupport.showInfoMessage("The Connection Successfully Tested"); } catch (SoapUIException e) { SoapUI.logError(e); UISupport.showErrorMessage(e.toString()); } catch (SQLException e) { SoapUI.logError(e); UISupport.showErrorMessage("Can't get the Connection for specified properties; " + e.toString()); } } } 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 database"); 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 { Analytics.trackAction(SoapUIActions.RUN_TEST_STEP.getActionName(), "StepType", "JDBC"); return jdbcRequestTestStep.getJdbcRequest().submit(new WsdlTestRunContext(getModelItem()), true); } 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.setEditable(enabled); } submitButton.setEnabled(enabled); addAssertionButton.setEnabled(enabled); driverTextField.setEnabled(enabled); connStrTextField.setEnabled(enabled); passField.setEnabled(enabled); queryArea.setEnabled(enabled); queryArea.setEditable(enabled); isStoredProcedureCheckBox.setEnabled(enabled); propertiesTableComponent.setEnabled(enabled); testConnectionButton.setEnabled(enabled); statusBar.setIndeterminate(!enabled); } public void afterSubmit(Submit submit, SubmitContext context) { if (submit.getRequest() != jdbcRequestTestStep.getJdbcRequest()) { return; } Status status = submit.getStatus(); JdbcResponse response = (JdbcResponse) submit.getResponse(); if (status == Status.FINISHED) { jdbcRequestTestStep.setResponse(response, context); } cancelButton.setEnabled(false); setEnabled(true); String message = null; String infoMessage = null; String requestName = jdbcRequestTestStep.getName(); String rawSql = ""; 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)"; rawSql = ((JdbcSubmit) submit).getRawSql(); if (!splitButton.isEnabled()) { requestTabs.setSelectedIndex(1); } responseEditor.requestFocus(); } } if (!StringUtils.isNullOrEmpty(rawSql)) { logMessages("Sql executed: " + rawSql, rawSql); } logMessages(message, infoMessage); if (getModelItem().getSettings().getBoolean(UISettings.AUTO_VALIDATE_RESPONSE)) { responseEditor.getSourceEditor().validate(); } JdbcRequestTestStepDesktopPanel.this.submit = null; updateStatusIcon(); } protected void logMessages(String message, String infoMessage) { log.info(infoMessage); statusBar.setInfo(message); logArea.addLine(DateUtil.formatFull(new Date(startTime)) + " - " + message); } public boolean beforeSubmit(Submit submit, SubmitContext context) { if (submit.getRequest() != jdbcRequestTestStep.getJdbcRequest()) { return true; } setEnabled(false); cancelButton.setEnabled(JdbcRequestTestStepDesktopPanel.this.submit != null); startTime = System.currentTimeMillis(); return true; } public void propertyChange(PropertyChangeEvent evt) { super.propertyChange(evt); if (evt.getPropertyName().equals(JdbcRequestTestStep.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 = jdbcRequestTestStep.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; } } } }