Package com.eviware.soapui.impl.wsdl.actions.iface.tools.support

Source Code of com.eviware.soapui.impl.wsdl.actions.iface.tools.support.AbstractToolsAction

/*
*  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.actions.iface.tools.support;

import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FilenameFilter;

import javax.swing.AbstractAction;
import javax.swing.Action;

import org.apache.log4j.Logger;

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.actions.SoapUIPreferencesAction;
import com.eviware.soapui.impl.support.AbstractInterface;
import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.support.PathUtils;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.iface.Interface;
import com.eviware.soapui.settings.ProjectSettings;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.Tools;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.action.support.AbstractSoapUIAction;
import com.eviware.soapui.support.action.swing.ActionList;
import com.eviware.soapui.support.action.swing.DefaultActionList;
import com.eviware.soapui.support.types.StringToStringMap;
import com.eviware.x.form.XForm;
import com.eviware.x.form.XFormDialog;
import com.eviware.x.form.XFormDialogBuilder;
import com.eviware.x.form.XFormField;
import com.eviware.x.form.XFormTextField;

/**
* Abstract base class for Tool Actions
*
* @author Ole.Matzura
*/

public abstract class AbstractToolsAction<T extends ModelItem> extends AbstractSoapUIAction<T>
{
  @SuppressWarnings( "unused" )
  private static final Logger log = Logger.getLogger( AbstractToolsAction.class );

  protected static final String WSDL = "WSDL";
  protected static final String CACHED_WSDL = "Use cached WSDL";
  protected static final String JAVA_ARGS = "Java Args";
  protected static final String TOOL_ARGS = "Tool Args";

  private XFormDialog dialog;
  protected String valuesSettingID;
  private XFormField useCached;
  private T modelItem;

  // Configure behavior of this action:
  private boolean fixedWSDL = false;
  private Action toolsSettingsAction = new ShowIntegratedToolsSettingsAction();;

  public AbstractToolsAction( String name, String description )
  {
    super( name, description );
  }

  public XFormDialog getDialog()
  {
    return dialog;
  }

  public String getValuesSettingID()
  {
    return valuesSettingID;
  }

  public void setValuesSettingID( String valuesSettingID )
  {
    this.valuesSettingID = valuesSettingID;
  }

  /**
   * Set this to true to not let the user edit the WSDL.
   *
   * @param b
   */
  public void setFixedWSDL( boolean b )
  {
    this.fixedWSDL = b;
  }

  public T getModelItem()
  {
    return modelItem;
  }

  public void perform( T target, Object param )
  {
    this.valuesSettingID = this.getClass().getName() + "@values";
    if( target == null )
      this.valuesSettingID += "-global";
    else
      this.valuesSettingID += "-local";

    modelItem = target;

    // Could reuse the dialog in Swing, but not in Eclipse.
    // if( dialog == null )
    dialog = buildDialog( ( T )target );

    if( dialog == null )
    {
      try
      {
        generate( initValues( ( T )target, param ), UISupport.getToolHost(), ( T )target );
      }
      catch( Exception e1 )
      {
        UISupport.showErrorMessage( e1 );
      }
    }
    else
    {
      StringToStringMap values = initValues( ( T )target, param );

      dialog.setValues( values );
      dialog.setVisible( true );
    }
  }

  /**
   * Perform an
   *
   * @param target
   * @param param
   */
  public void performHeadless( T target, Object param )
  {
    this.valuesSettingID = this.getClass().getName() + "@values";
    if( target == null )
      this.valuesSettingID += "-global";
    else
      this.valuesSettingID += "-local";

    modelItem = target;

    try
    {
      generate( initValues( ( T )target, param ), UISupport.getToolHost(), ( T )target );
    }
    catch( Exception e1 )
    {
      UISupport.showErrorMessage( e1 );
    }
  }

  protected StringToStringMap initValues( T modelItem, Object param )
  {
    String settingValues = modelItem == null ? SoapUI.getSettings().getString( valuesSettingID, null ) : modelItem
        .getSettings().getString( valuesSettingID, null );

    StringToStringMap result = settingValues == null ? new StringToStringMap() : StringToStringMap
        .fromXml( settingValues );

    if( modelItem instanceof WsdlInterface )
    {
      initWSDL( result, ( WsdlInterface )modelItem );
    }

    if( dialog != null && modelItem != null )
    {
      String projectRoot = modelItem.getSettings().getString( ProjectSettings.PROJECT_ROOT, null );
      if( projectRoot != null )
        dialog.setFormFieldProperty( ProjectSettings.PROJECT_ROOT, projectRoot );
    }

    return result;
  }

  protected XFormDialog buildDialog( T modelItem )
  {
    return null;
  }

  protected void addWSDLFields( XForm mainForm, T modelItem )
  {
    if( !fixedWSDL )
    {
      XFormTextField tf = mainForm.addTextField( WSDL, "url to wsdl", XForm.FieldType.URL );

      if( modelItem instanceof Interface )
      {
        useCached = mainForm.addCheckBox( CACHED_WSDL, null );
        useCached.addComponentEnabler( tf, "false" );
      }
    }
    else
    {
      if( modelItem instanceof Interface )
      {
        useCached = mainForm.addCheckBox( CACHED_WSDL, null );
      }
    }
  }

  protected void initWSDL( StringToStringMap values, WsdlInterface iface )
  {
    boolean cached = iface.isCached();
    if( useCached != null )
      useCached.setEnabled( cached );

    if( !values.containsKey( CACHED_WSDL ) )
      values.put( CACHED_WSDL, Boolean.toString( cached ) );

    if( values.getBoolean( CACHED_WSDL ) || !values.hasValue( WSDL ) )
      values.put( WSDL, PathUtils.expandPath( iface.getDefinition(), iface ) );
  }

  protected abstract void generate( StringToStringMap values, ToolHost toolHost, T modelItem ) throws Exception;

  public void run( ToolHost toolHost, T modelItem, Object param ) throws Exception
  {
    generate( initValues( modelItem, param ), toolHost, modelItem );
  }

  /**
   * To be overridden..
   */

  public void onClose( T modelItem )
  {
    if( dialog == null )
      return;

    if( modelItem == null )
    {
      SoapUI.getSettings().setString( valuesSettingID, dialog.getValues().toXml() );
    }
    else
    {
      modelItem.getSettings().setString( valuesSettingID, dialog.getValues().toXml() );
    }
  }

  protected String getWsdlUrl( StringToStringMap values, T modelItem )
  {
    String wsdl = values.get( WSDL );
    boolean useCached = values.getBoolean( CACHED_WSDL );

    if( modelItem instanceof AbstractInterface )
    {
      AbstractInterface<?> iface = ( AbstractInterface<?> )modelItem;

      boolean hasDefinition = StringUtils.hasContent( iface.getDefinition() );
      if( wsdl == null && !useCached && hasDefinition )
      {
        return PathUtils.expandPath( iface.getDefinition(), iface );
      }

      if( !hasDefinition || ( useCached && iface.getDefinitionContext().isCached() ) )
      {
        try
        {
          File tempFile = File.createTempFile( "tempdir", null );
          String path = tempFile.getAbsolutePath();
          tempFile.delete();
          wsdl = iface.getDefinitionContext().export( path );

          // CachedWsdlLoader loader = (CachedWsdlLoader)
          // iface.createWsdlLoader();
          // wsdl = loader.saveDefinition(path);
        }
        catch( Exception e )
        {
          SoapUI.logError( e );
        }
      }
    }

    return wsdl;
  }

  protected String buildClasspath( File jarDir )
  {
    String[] jars = jarDir.list( new FilenameFilter()
    {

      public boolean accept( File dir, String name )
      {
        return name.endsWith( ".jar" );
      }
    } );

    StringBuilder classpath = new StringBuilder();

    for( int c = 0; c < jars.length; c++ )
    {
      if( c > 0 )
        classpath.append( File.pathSeparatorChar );

      classpath.append( jars[c] );
    }
    return classpath.toString();
  }

  protected ActionList buildDefaultActions( String helpUrl, T modelItem )
  {
    ActionList actions = new DefaultActionList( "Actions" );

    if( helpUrl != null )
    {
      actions.addAction( new ShowOnlineHelpAction( helpUrl ) );
      actions.addSeparator();
    }

    Action runAction = createRunOption( modelItem );
    actions.addAction( runAction );
    actions.setDefaultAction( runAction );
    actions.addAction( new CloseAction( modelItem ) );

    if( toolsSettingsAction != null )
      actions.addAction( toolsSettingsAction );

    return actions;
  }

  public Action getToolsSettingsAction()
  {
    return toolsSettingsAction;
  }

  public void setToolsSettingsAction( Action toolsSettingsAction )
  {
    this.toolsSettingsAction = toolsSettingsAction;
  }

  protected Action createRunOption( T modelItem )
  {
    return new GenerateAction( modelItem );
  }

  protected String getDefinition( T modelItem )
  {
    if( modelItem == null )
      return "";
    WsdlInterface iface = ( WsdlInterface )modelItem;
    String definition = PathUtils.expandPath( iface.getDefinition(), iface );
    if( definition.startsWith( "file:" ) )
      definition = definition.substring( 5 );

    return definition;
  }

  protected void addJavaArgs( StringToStringMap values, ArgumentBuilder builder )
  {
    String[] javaArgs = Tools.tokenizeArgs( values.get( JAVA_ARGS ) );
    if( javaArgs != null )
      builder.addArgs( javaArgs );
  }

  protected void addToolArgs( StringToStringMap values, ArgumentBuilder builder )
  {
    String[] toolArgs = Tools.tokenizeArgs( values.get( TOOL_ARGS ) );
    if( toolArgs != null )
      builder.addArgs( toolArgs );
  }

  protected XForm buildArgsForm( XFormDialogBuilder builder, boolean addJavaArgs, String toolName )
  {
    XForm argsForm = builder.createForm( "Custom Args" );
    if( addJavaArgs )
      argsForm.addTextField( JAVA_ARGS, "additional arguments to java", XForm.FieldType.TEXT );

    argsForm.addTextField( TOOL_ARGS, "additional arguments to " + toolName, XForm.FieldType.TEXT );
    return argsForm;
  }

  public static final class ShowIntegratedToolsSettingsAction extends AbstractAction
  {
    public ShowIntegratedToolsSettingsAction()
    {
      super( "Tools" );
    }

    public void actionPerformed( ActionEvent e )
    {
      SoapUIPreferencesAction.getInstance().show( SoapUIPreferencesAction.INTEGRATED_TOOLS );
    }
  }

  protected final class CloseAction extends AbstractAction
  {
    private final T modelItem;

    public CloseAction( T modelItem )
    {
      super( "Close" );
      this.modelItem = modelItem;
    }

    public void actionPerformed( ActionEvent e )
    {
      closeDialog( modelItem );
    }
  }

  public void closeDialog( T modelItem )
  {
    onClose( modelItem );
    if( dialog != null )
      dialog.setVisible( false );
  }

  protected final class GenerateAction extends AbstractAction
  {
    private final T modelItem;

    public GenerateAction( T modelItem )
    {
      super( "Generate" );
      this.modelItem = modelItem;
    }

    public void actionPerformed( ActionEvent e )
    {
      try
      {
        if( dialog.validate() )
        {
          generate( dialog.getValues(), UISupport.getToolHost(), modelItem );
        }
      }
      catch( Exception e1 )
      {
        UISupport.showErrorMessage( e1 );
      }
    }
  }
}
TOP

Related Classes of com.eviware.soapui.impl.wsdl.actions.iface.tools.support.AbstractToolsAction

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.