Package com.eviware.soapui.impl.wsdl.panels.teststeps

Source Code of com.eviware.soapui.impl.wsdl.panels.teststeps.WsdlRunTestCaseStepDesktopPanel$CancelRunTestCaseAction

/*
*  soapUI, copyright (C) 2004-2011 eviware.com
*
*  soapUI is free software; you can redistribute it and/or modify it under the
*  terms of version 2.1 of the GNU Lesser General Public License as published by
*  the Free Software Foundation.
*
*  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
*  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*  See the GNU Lesser General Public License for more details at gnu.org.
*/

package com.eviware.soapui.impl.wsdl.panels.teststeps;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.RunTestCaseRunModeTypeConfig;
import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.WsdlTestSuite;
import com.eviware.soapui.impl.wsdl.panels.support.MockTestRunContext;
import com.eviware.soapui.impl.wsdl.panels.support.MockTestRunner;
import com.eviware.soapui.impl.wsdl.panels.testcase.JTestRunLog;
import com.eviware.soapui.impl.wsdl.panels.testcase.TestRunLogTestRunListener;
import com.eviware.soapui.impl.wsdl.panels.teststeps.support.PropertyHolderTable;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCaseRunner;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlRunTestCaseTestStep;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStepResult;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.support.ModelSupport;
import com.eviware.soapui.model.testsuite.TestCase;
import com.eviware.soapui.model.testsuite.TestCaseRunContext;
import com.eviware.soapui.model.testsuite.TestCaseRunner;
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.types.StringList;
import com.eviware.soapui.ui.support.ModelItemDesktopPanel;
import com.eviware.x.form.XFormDialog;
import com.eviware.x.form.XFormField;
import com.eviware.x.form.XFormFieldListener;
import com.eviware.x.form.support.ADialogBuilder;
import com.eviware.x.form.support.AField;
import com.eviware.x.form.support.AField.AFieldType;
import com.eviware.x.form.support.AForm;
import com.eviware.x.form.support.XFormMultiSelectList;

public class WsdlRunTestCaseStepDesktopPanel extends ModelItemDesktopPanel<WsdlRunTestCaseTestStep> implements
    PropertyChangeListener
{
  private WsdlProject project;
  private TitledBorder titledBorder;
  private OptionsAction optionsAction;
  private RunAction runAction;
  private OpenTestCaseAction openTestCaseAction;
  private JTestRunLog testRunLog;
  private CancelRunTestCaseAction cancelAction;
  private XFormDialog optionsDialog;
  private JInspectorPanel inspectorPanel;
  private PropertyHolderTable propertiesTable;

  public WsdlRunTestCaseStepDesktopPanel( WsdlRunTestCaseTestStep modelItem )
  {
    super( modelItem );

    project = getModelItem().getTestCase().getTestSuite().getProject();

    getModelItem().addPropertyChangeListener( WsdlRunTestCaseTestStep.TARGET_TESTCASE, this );
    WsdlTestCase targetTestCase = getModelItem().getTargetTestCase();
    if( targetTestCase != null )
    {
      targetTestCase.addPropertyChangeListener( WsdlTestCase.NAME_PROPERTY, this );
      targetTestCase.getTestSuite().addPropertyChangeListener( WsdlTestCase.NAME_PROPERTY, this );
    }

    buildUI();
    setEnabledState();

    if( modelItem.getTargetTestCase() == null )
    {
      SwingUtilities.invokeLater( new Runnable()
      {

        public void run()
        {
          optionsAction.actionPerformed( null );
        }
      } );
    }

    setPreferredSize( new Dimension( 400, 600 ) );
  }

  private void setEnabledState()
  {
    runAction.setEnabled( getModelItem().getTargetTestCase() != null );
    openTestCaseAction.setEnabled( getModelItem().getTargetTestCase() != null );
  }

  private void buildUI()
  {
    add( buildToolbar(), BorderLayout.NORTH );
    add( buildContent(), BorderLayout.CENTER );
  }

  private Component buildContent()
  {
    inspectorPanel = JInspectorPanelFactory.build( createPropertiesTable() );

    inspectorPanel.addInspector( new JComponentInspector<JComponent>( buildLog(), "TestCase Log",
        "log output from testcase run", true ) );

    return inspectorPanel.getComponent();
  }

  private JComponent buildLog()
  {
    testRunLog = new JTestRunLog( getModelItem().getSettings() );
    return testRunLog;
  }

  protected PropertyHolderTable createPropertiesTable()
  {
    propertiesTable = new PropertyHolderTable( getModelItem() );

    titledBorder = BorderFactory.createTitledBorder( createTitleForBorder() );
    propertiesTable.setBorder( titledBorder );

    return propertiesTable;
  }

  private String createTitleForBorder()
  {
    WsdlTestCase targetTestCase = getModelItem().getTargetTestCase();
    return "TestCase ["
        + ( targetTestCase == null ? "- none selected -" : targetTestCase.getTestSuite().getName() + ":"
            + targetTestCase.getName() ) + "] Run Properties";
  }

  private Component buildToolbar()
  {
    JXToolBar toolbar = UISupport.createToolbar();

    toolbar.add( UISupport.createToolbarButton( runAction = new RunAction() ) );
    toolbar.add( UISupport.createToolbarButton( cancelAction = new CancelRunTestCaseAction(), false ) );
    toolbar.add( UISupport.createToolbarButton( optionsAction = new OptionsAction() ) );
    toolbar.add( UISupport.createToolbarButton( openTestCaseAction = new OpenTestCaseAction() ) );

    toolbar.addGlue();
    toolbar.add( UISupport.createToolbarButton( new ShowOnlineHelpAction( HelpUrls.RUNTESTCASESTEP_HELP_URL ) ) );

    return toolbar;
  }

  @Override
  public boolean dependsOn( ModelItem modelItem )
  {
    WsdlRunTestCaseTestStep callStep = getModelItem();

    return modelItem == callStep || modelItem == callStep.getTestCase()
        || modelItem == callStep.getTestCase().getTestSuite()
        || modelItem == callStep.getTestCase().getTestSuite().getProject();
  }

  public boolean onClose( boolean canCancel )
  {
    getModelItem().removePropertyChangeListener( WsdlRunTestCaseTestStep.TARGET_TESTCASE, this );

    WsdlTestCase targetTestCase = getModelItem().getTargetTestCase();
    if( targetTestCase != null )
    {
      targetTestCase.removePropertyChangeListener( WsdlTestCase.NAME_PROPERTY, this );
      targetTestCase.getTestSuite().removePropertyChangeListener( WsdlTestCase.NAME_PROPERTY, this );
    }

    testRunLog.release();
    if( optionsDialog != null )
    {
      optionsDialog.release();
      optionsDialog = null;
    }

    propertiesTable.release();
    inspectorPanel.release();

    return release();
  }

  private class RunAction extends AbstractAction
  {
    public RunAction()
    {
      putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/run_testcase.gif" ) );
      putValue( Action.SHORT_DESCRIPTION, "Runs the selected TestCases" );
    }

    public void actionPerformed( ActionEvent e )
    {
      runAction.setEnabled( false );
      cancelAction.setEnabled( true );

      new Thread( new Runnable()
      {

        public void run()
        {
          WsdlRunTestCaseTestStep testStep = getModelItem();
          InternalTestRunListener testRunListener = new InternalTestRunListener();
          testStep.addTestRunListener( testRunListener );

          try
          {
            testRunLog.clear();
            MockTestRunner mockTestRunner = new MockTestRunner( testStep.getTestCase(), SoapUI.ensureGroovyLog() );
            WsdlTestStepResult result = ( WsdlTestStepResult )testStep.run( mockTestRunner,
                new MockTestRunContext( mockTestRunner, testStep ) );

            Throwable er = result.getError();
            if( er != null )
            {
              UISupport.showErrorMessage( er.toString() );
            }
          }
          catch( Throwable t )
          {
            UISupport.showErrorMessage( t );
          }
          finally
          {
            testStep.removeTestRunListener( testRunListener );
            runAction.setEnabled( true );
            cancelAction.setEnabled( false );
          }
        }
      } ).start();
    }
  }

  private class OpenTestCaseAction extends AbstractAction
  {
    public OpenTestCaseAction()
    {
      putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/testCase.gif" ) );
      putValue( Action.SHORT_DESCRIPTION, "Opens the target TestCases editor" );
    }

    public void actionPerformed( ActionEvent e )
    {
      WsdlTestCase targetTestCase = getModelItem().getTargetTestCase();
      if( targetTestCase == null )
        UISupport.showErrorMessage( "No target TestCase selected" );
      else
        UISupport.showDesktopPanel( targetTestCase );
    }
  }

  private class OptionsAction extends AbstractAction
  {
    public OptionsAction()
    {
      putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/options.gif" ) );
      putValue( Action.SHORT_DESCRIPTION, "Sets Options" );
    }

    public void actionPerformed( ActionEvent e )
    {
      if( optionsDialog == null )
      {
        optionsDialog = ADialogBuilder.buildDialog( OptionsForm.class );
        optionsDialog.getFormField( OptionsForm.TESTSUITE ).addFormFieldListener( new XFormFieldListener()
        {

          public void valueChanged( XFormField sourceField, String newValue, String oldValue )
          {
            List<TestCase> testCaseList = project.getTestSuiteByName( newValue ).getTestCaseList();
            testCaseList.remove( getModelItem().getTestCase() );
            optionsDialog.setOptions( OptionsForm.TESTCASE, ModelSupport.getNames( testCaseList ) );

            if( testCaseList.size() > 0 )
            {
              WsdlTestCase testCase = project.getTestSuiteByName( newValue ).getTestCaseAt( 0 );
              optionsDialog.setOptions( OptionsForm.RETURN_PROPERTIES, testCase.getPropertyNames() );
              ( ( XFormMultiSelectList )optionsDialog.getFormField( OptionsForm.RETURN_PROPERTIES ) )
                  .setSelectedOptions( getModelItem().getReturnProperties().toStringArray() );
            }
          }
        } );
        optionsDialog.getFormField( OptionsForm.TESTCASE ).addFormFieldListener( new XFormFieldListener()
        {

          public void valueChanged( XFormField sourceField, String newValue, String oldValue )
          {
            WsdlTestSuite testSuite = project.getTestSuiteByName( optionsDialog.getValue( OptionsForm.TESTSUITE ) );
            WsdlTestCase testCase = testSuite.getTestCaseByName( newValue );
            optionsDialog.setOptions( OptionsForm.RETURN_PROPERTIES, testCase.getPropertyNames() );
            ( ( XFormMultiSelectList )optionsDialog.getFormField( OptionsForm.RETURN_PROPERTIES ) )
                .setSelectedOptions( getModelItem().getReturnProperties().toStringArray() );
          }
        } );
      }

      WsdlTestCase targetTestCase = getModelItem().getTargetTestCase();

      optionsDialog.setOptions( OptionsForm.TESTSUITE, ModelSupport.getNames( project.getTestSuiteList() ) );
      if( targetTestCase != null )
      {
        optionsDialog.setValue( OptionsForm.TESTSUITE, targetTestCase.getTestSuite().getName() );

        List<TestCase> testCaseList = targetTestCase.getTestSuite().getTestCaseList();
        testCaseList.remove( getModelItem().getTestCase() );

        optionsDialog.setOptions( OptionsForm.TESTCASE, ModelSupport.getNames( testCaseList ) );
        optionsDialog.setValue( OptionsForm.TESTCASE, targetTestCase.getName() );

        optionsDialog.setOptions( OptionsForm.RETURN_PROPERTIES, targetTestCase.getPropertyNames() );
        ( ( XFormMultiSelectList )optionsDialog.getFormField( OptionsForm.RETURN_PROPERTIES ) )
            .setSelectedOptions( getModelItem().getReturnProperties().toStringArray() );
      }
      else
      {
        if( project.getTestSuiteCount() == 0 )
        {
          optionsDialog.setOptions( OptionsForm.TESTCASE, new String[0] );
          optionsDialog.setOptions( OptionsForm.RETURN_PROPERTIES, new String[0] );
        }
        else
        {
          List<TestCase> testCaseList = project.getTestSuiteAt( 0 ).getTestCaseList();
          testCaseList.remove( getModelItem().getTestCase() );
          optionsDialog.setOptions( OptionsForm.TESTCASE, ModelSupport.getNames( testCaseList ) );

          if( testCaseList.isEmpty() )
            optionsDialog.setOptions( OptionsForm.RETURN_PROPERTIES, new String[0] );
          else
            optionsDialog.setOptions( OptionsForm.RETURN_PROPERTIES, testCaseList.get( 0 ).getPropertyNames() );
        }
      }

      switch( getModelItem().getRunMode().intValue() )
      {
      case RunTestCaseRunModeTypeConfig.INT_PARALLELL :
        optionsDialog.setValue( OptionsForm.RUN_MODE, OptionsForm.CREATE_ISOLATED_COPY_FOR_EACH_RUN );
        break;
      case RunTestCaseRunModeTypeConfig.INT_SINGLETON_AND_FAIL :
        optionsDialog.setValue( OptionsForm.RUN_MODE, OptionsForm.RUN_PRIMARY_TEST_CASE );
        break;
      case RunTestCaseRunModeTypeConfig.INT_SINGLETON_AND_WAIT :
        optionsDialog.setValue( OptionsForm.RUN_MODE, OptionsForm.RUN_SYNCHRONIZED_TESTCASE );
        break;
      }

      optionsDialog.setBooleanValue( OptionsForm.COPY_HTTP_SESSION, getModelItem().isCopyHttpSession() );
      optionsDialog
          .setBooleanValue( OptionsForm.COPY_LOADTEST_PROPERTIES, getModelItem().isCopyLoadTestProperties() );
      optionsDialog.setBooleanValue( OptionsForm.IGNORE_EMPTY_PROPERTIES, getModelItem().isIgnoreEmptyProperties() );

      if( optionsDialog.show() )
      {
        WsdlTestSuite testSuite = project.getTestSuiteByName( optionsDialog.getValue( OptionsForm.TESTSUITE ) );
        getModelItem().setTargetTestCase(
            testSuite == null ? null
                : testSuite.getTestCaseByName( optionsDialog.getValue( OptionsForm.TESTCASE ) ) );
        getModelItem().setReturnProperties(
            new StringList(
                ( ( XFormMultiSelectList )optionsDialog.getFormField( OptionsForm.RETURN_PROPERTIES ) )
                    .getSelectedOptions() ) );

        switch( optionsDialog.getValueIndex( OptionsForm.RUN_MODE ) )
        {
        case 0 :
          getModelItem().setRunMode( RunTestCaseRunModeTypeConfig.PARALLELL );
          break;
        case 1 :
          getModelItem().setRunMode( RunTestCaseRunModeTypeConfig.SINGLETON_AND_FAIL );
          break;
        case 2 :
          getModelItem().setRunMode( RunTestCaseRunModeTypeConfig.SINGLETON_AND_WAIT );
          break;
        }

        getModelItem().setCopyHttpSession( optionsDialog.getBooleanValue( OptionsForm.COPY_HTTP_SESSION ) );
        getModelItem().setCopyLoadTestProperties(
            optionsDialog.getBooleanValue( OptionsForm.COPY_LOADTEST_PROPERTIES ) );
        getModelItem().setIgnoreEmptyProperties(
            optionsDialog.getBooleanValue( OptionsForm.IGNORE_EMPTY_PROPERTIES ) );

        titledBorder.setTitle( createTitleForBorder() );
      }
    }
  }

  @AForm( name = "Run TestCase Options", description = "Set options for the Run TestCase Step below", helpUrl = HelpUrls.RUNTESTCASESTEP_HELP_URL )
  private static interface OptionsForm
  {
    public static final String RUN_PRIMARY_TEST_CASE = "Run primary TestCase (fail if already running)";
    public static final String CREATE_ISOLATED_COPY_FOR_EACH_RUN = "Create isolated copy for each run (Thread-Safe)";
    public static final String RUN_SYNCHRONIZED_TESTCASE = "Run primary TestCase (wait for running to finish, Thread-Safe)";

    @AField( name = "Target TestCase", description = "Selects the TestCase to run", type = AFieldType.ENUMERATION )
    public static final String TESTCASE = "Target TestCase";

    @AField( name = "Target TestSuite", description = "Selects the containing TestSuite to run", type = AFieldType.ENUMERATION )
    public static final String TESTSUITE = "Target TestSuite";

    @AField( name = "Return Properties", description = "Selects the properties that are return values", type = AFieldType.MULTILIST )
    public static final String RETURN_PROPERTIES = "Return Properties";

    @AField( name = "Run Mode", description = "Sets how to run the target TestCase", type = AFieldType.RADIOGROUP, values = {
        CREATE_ISOLATED_COPY_FOR_EACH_RUN, RUN_PRIMARY_TEST_CASE, RUN_SYNCHRONIZED_TESTCASE } )
    public static final String RUN_MODE = "Run Mode";

    @AField( name = "Copy LoadTest Properties", description = "Copies LoadTest related properties to target context", type = AFieldType.BOOLEAN )
    public static final String COPY_LOADTEST_PROPERTIES = "Copy LoadTest Properties";

    @AField( name = "Copy HTTP Session", description = "Copies LoadTest related properties to target context", type = AFieldType.BOOLEAN )
    public static final String COPY_HTTP_SESSION = "Copy HTTP Session";

    @AField( name = "Ignore Empty Properties", description = "Does not set empty TestCase property values", type = AFieldType.BOOLEAN )
    public static final String IGNORE_EMPTY_PROPERTIES = "Ignore Empty Properties";
  }

  public void propertyChange( PropertyChangeEvent evt )
  {
    super.propertyChange( evt );

    if( evt.getPropertyName().equals( WsdlRunTestCaseTestStep.TARGET_TESTCASE ) )
    {
      WsdlTestCase targetTestCase = ( WsdlTestCase )evt.getOldValue();
      if( targetTestCase != null )
      {
        targetTestCase.removePropertyChangeListener( WsdlTestCase.NAME_PROPERTY, this );
        targetTestCase.getTestSuite().removePropertyChangeListener( WsdlTestCase.NAME_PROPERTY, this );
      }

      targetTestCase = ( WsdlTestCase )evt.getNewValue();
      if( targetTestCase != null )
      {
        targetTestCase.addPropertyChangeListener( WsdlTestCase.NAME_PROPERTY, this );
        targetTestCase.getTestSuite().addPropertyChangeListener( WsdlTestCase.NAME_PROPERTY, this );
      }
    }

    setEnabledState();
    titledBorder.setTitle( createTitleForBorder() );
    repaint();
  }

  public class InternalTestRunListener extends TestRunLogTestRunListener
  {
    public InternalTestRunListener()
    {
      super( testRunLog, true );
    }

    public void beforeRun( TestCaseRunner testRunner, TestCaseRunContext runContext )
    {
      runAction.setEnabled( false );
      cancelAction.setEnabled( true );
    }

    public void afterRun( TestCaseRunner testRunner, TestCaseRunContext runContext )
    {
      runAction.setEnabled( true );
      cancelAction.setEnabled( false );
    }
  }

  public class CancelRunTestCaseAction extends AbstractAction
  {
    public CancelRunTestCaseAction()
    {
      putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/stop_testcase.gif" ) );
      putValue( Action.SHORT_DESCRIPTION, "Stops running this testcase" );
    }

    public void actionPerformed( ActionEvent e )
    {
      WsdlTestCaseRunner testCaseRunner = getModelItem().getTestCaseRunner();
      if( testCaseRunner != null )
        testCaseRunner.cancel( "Canceled from RunTestCase UI" );
    }
  }
}
TOP

Related Classes of com.eviware.soapui.impl.wsdl.panels.teststeps.WsdlRunTestCaseStepDesktopPanel$CancelRunTestCaseAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.