Package com.eviware.soapui

Source Code of com.eviware.soapui.DefaultSoapUICore

/*
*  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;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.util.TimerTask;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;

import org.apache.commons.ssl.OpenSSL;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;

import com.eviware.soapui.config.SoapuiSettingsDocumentConfig;
import com.eviware.soapui.impl.settings.XmlBeansSettingsImpl;
import com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport;
import com.eviware.soapui.impl.wsdl.support.soap.SoapVersion;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionUtils;
import com.eviware.soapui.model.settings.Settings;
import com.eviware.soapui.monitor.JettyMockEngine;
import com.eviware.soapui.monitor.MockEngine;
import com.eviware.soapui.security.registry.SecurityScanRegistry;
import com.eviware.soapui.settings.HttpSettings;
import com.eviware.soapui.settings.ProxySettings;
import com.eviware.soapui.settings.SecuritySettings;
import com.eviware.soapui.settings.UISettings;
import com.eviware.soapui.settings.WSISettings;
import com.eviware.soapui.settings.WebRecordingSettings;
import com.eviware.soapui.settings.WsaSettings;
import com.eviware.soapui.settings.WsdlSettings;
import com.eviware.soapui.support.SecurityScanUtil;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.action.SoapUIActionRegistry;
import com.eviware.soapui.support.factory.SoapUIFactoryRegistry;
import com.eviware.soapui.support.listener.SoapUIListenerRegistry;
import com.eviware.soapui.support.types.StringList;

/**
* Initializes core objects. Transform to a Spring "ApplicationContext"?
*
* @author ole.matzura
*/

public class DefaultSoapUICore implements SoapUICore
{
  public static Logger log;

  private boolean logIsInitialized;
  private String root;
  protected SoapuiSettingsDocumentConfig settingsDocument;
  private MockEngine mockEngine;
  private XmlBeansSettingsImpl settings;
  private SoapUIListenerRegistry listenerRegistry;
  private SoapUIActionRegistry actionRegistry;
  private SoapUIFactoryRegistry factoryRegistry;
  private long lastSettingsLoad = 0;

  private String settingsFile;
  private String password;
  protected boolean initialImport;
  private TimerTask settingsWatcher;
  private SoapUIExtensionClassLoader extClassLoader;

  public boolean isSavingSettings;

  protected SecurityScanRegistry securityScanRegistry;

  public boolean getInitialImport()
  {
    return initialImport;
  }

  public void setInitialImport( boolean initialImport )
  {
    this.initialImport = initialImport;
  }

  public static DefaultSoapUICore createDefault()
  {
    return new DefaultSoapUICore( null, DEFAULT_SETTINGS_FILE );
  }

  public DefaultSoapUICore()
  {
  }

  /*
   * this method is added for enabling settings password (like in core) all the
   * way down in hierarchy boolean setingPassword is a dummy parameter, because
   * the constructor with only one string parameter already existed
   */
  public DefaultSoapUICore( boolean settingPassword, String soapUISettingsPassword )
  {
    this.password = soapUISettingsPassword;
  }

  public DefaultSoapUICore( String root )
  {
    this.root = root;
  }

  public DefaultSoapUICore( String root, String settingsFile )
  {
    this( root );
    init( settingsFile );
  }

  public DefaultSoapUICore( String root, String settingsFile, String password )
  {
    this( root );
    this.password = password;
    init( settingsFile );
  }

  public void init( String settingsFile )
  {
    initLog();

    SoapUI.setSoapUICore( this );

    loadExternalLibraries();
    initSettings( settingsFile == null ? DEFAULT_SETTINGS_FILE : settingsFile );

    initCoreComponents();
    initExtensions( getExtensionClassLoader() );

    // this is to provoke initialization
    SoapVersion.Soap11.equals( SoapVersion.Soap12 );
  }

  protected void initExtensions( ClassLoader extensionClassLoader )
  {
    String extDir = System.getProperty( "soapui.ext.listeners" );
    addExternalListeners( extDir != null ? extDir : root == null ? "listeners" : root + File.separatorChar
        + "listeners", extensionClassLoader );

    String factoriesDir = System.getProperty( "soapui.ext.factories" );
    addExternalFactories( factoriesDir != null ? factoriesDir : root == null ? "factories" : root
        + File.separatorChar + "factories", extensionClassLoader );
  }

  protected void initCoreComponents()
  {
  }

  public String getRoot()
  {
    if( root == null || root.length() == 0 )
      root = System.getProperty( "soapui.home", new File( "." ).getAbsolutePath() );
    return root;
  }

  protected Settings initSettings( String fileName )
  {
    // TODO Why try to load settings from current directory before using root?
    // This caused a bug in Eclipse:
    // https://sourceforge.net/tracker/?func=detail&atid=737763&aid=2620284&group_id=136013
    File settingsFile = new File( fileName ).exists() ? new File( fileName ) : null;

    try
    {
      if( settingsFile == null )
      {
        settingsFile = new File( new File( getRoot() ), DEFAULT_SETTINGS_FILE );
        if( !settingsFile.exists() )
        {
          settingsFile = new File( new File( System.getProperty( "user.home", "." ) ), DEFAULT_SETTINGS_FILE );
          lastSettingsLoad = 0;
        }
      }
      else
      {
        settingsFile = new File( fileName );
        if( !settingsFile.getAbsolutePath().equals( this.settingsFile ) )
          lastSettingsLoad = 0;
      }

      if( !settingsFile.exists() )
      {
        if( settingsDocument == null )
        {
          log.info( "Creating new settings at [" + settingsFile.getAbsolutePath() + "]" );
          settingsDocument = SoapuiSettingsDocumentConfig.Factory.newInstance();
          setInitialImport( true );
        }

        lastSettingsLoad = System.currentTimeMillis();
      }
      else if( settingsFile.lastModified() > lastSettingsLoad )
      {
        settingsDocument = SoapuiSettingsDocumentConfig.Factory.parse( settingsFile );

        byte[] encryptedContent = settingsDocument.getSoapuiSettings().getEncryptedContent();
        if( encryptedContent != null )
        {
          char[] password = null;
          if( this.password == null )
          {
            // swing element -!! uh!
            JPasswordField passwordField = new JPasswordField();
            JLabel qLabel = new JLabel( "Password" );
            JOptionPane.showConfirmDialog( null, new Object[] { qLabel, passwordField }, "Global Settings",
                JOptionPane.OK_CANCEL_OPTION );
            password = passwordField.getPassword();
          }
          else
          {
            password = this.password.toCharArray();
          }

          byte[] data = OpenSSL.decrypt( "des3", password, encryptedContent );
          try
          {
            settingsDocument = SoapuiSettingsDocumentConfig.Factory.parse( new String( data, "UTF-8" ) );
          }
          catch( Exception e )
          {
            log.warn( "Wrong password." );
            JOptionPane.showMessageDialog( null, "Wrong password, creating backup settings file [ "
                + settingsFile.getAbsolutePath() + ".bak.xml. ]\nSwitch to default settings.",
                "Error - Wrong Password", JOptionPane.ERROR_MESSAGE );
            settingsDocument.save( new File( settingsFile.getAbsolutePath() + ".bak.xml" ) );
            throw e;
          }
        }

        log.info( "initialized soapui-settings from [" + settingsFile.getAbsolutePath() + "]" );
        lastSettingsLoad = settingsFile.lastModified();

        if( settingsWatcher == null )
        {
          settingsWatcher = new SettingsWatcher();
          SoapUI.getSoapUITimer().scheduleAtFixedRate( settingsWatcher, 10000, 10000 );
        }
      }
    }
    catch( Exception e )
    {
      log.warn( "Failed to load settings from [" + e.getMessage() + "], creating new" );
      settingsDocument = SoapuiSettingsDocumentConfig.Factory.newInstance();
      lastSettingsLoad = 0;
    }

    if( settingsDocument.getSoapuiSettings() == null )
    {
      settingsDocument.addNewSoapuiSettings();
      settings = new XmlBeansSettingsImpl( null, null, settingsDocument.getSoapuiSettings() );

      initDefaultSettings( settings );
    }
    else
    {
      settings = new XmlBeansSettingsImpl( null, null, settingsDocument.getSoapuiSettings() );
    }

    this.settingsFile = settingsFile.getAbsolutePath();

    if( !settings.isSet( WsdlSettings.EXCLUDED_TYPES ) )
    {
      StringList list = new StringList();
      list.add( "schema@http://www.w3.org/2001/XMLSchema" );
      settings.setString( WsdlSettings.EXCLUDED_TYPES, list.toXml() );
    }

    if( !settings.isSet( WebRecordingSettings.EXCLUDED_HEADERS ) )
    {
      StringList list = new StringList();
      list.add( "Cookie" );
      list.add( "Set-Cookie" );
      list.add( "Referer" );
      list.add( "Keep-Alive" );
      list.add( "Connection" );
      list.add( "Proxy-Connection" );
      list.add( "Pragma" );
      list.add( "Cache-Control" );
      list.add( "Transfer-Encoding" );
      list.add( "Date" );
      settings.setString( WebRecordingSettings.EXCLUDED_HEADERS, list.toXml() );
    }

    if( settings.getString( HttpSettings.HTTP_VERSION, HttpSettings.HTTP_VERSION_1_1 ).equals(
        HttpSettings.HTTP_VERSION_0_9 ) )
    {
      settings.setString( HttpSettings.HTTP_VERSION, HttpSettings.HTTP_VERSION_1_1 );
    }

    setIfNotSet( WsdlSettings.NAME_WITH_BINDING, true );
    setIfNotSet( WsdlSettings.NAME_WITH_BINDING, 500 );
    setIfNotSet( HttpSettings.HTTP_VERSION, HttpSettings.HTTP_VERSION_1_1 );
    setIfNotSet( HttpSettings.MAX_TOTAL_CONNECTIONS, 2000 );
    setIfNotSet( HttpSettings.RESPONSE_COMPRESSION, true );
    setIfNotSet( HttpSettings.LEAVE_MOCKENGINE, true );
    setIfNotSet( UISettings.AUTO_SAVE_PROJECTS_ON_EXIT, true );
    setIfNotSet( UISettings.SHOW_DESCRIPTIONS, true );
    setIfNotSet( WsdlSettings.XML_GENERATION_ALWAYS_INCLUDE_OPTIONAL_ELEMENTS, true );
    setIfNotSet( WsaSettings.USE_DEFAULT_RELATES_TO, true );
    setIfNotSet( WsaSettings.USE_DEFAULT_RELATIONSHIP_TYPE, true );
    setIfNotSet( UISettings.SHOW_STARTUP_PAGE, true );
    setIfNotSet( UISettings.GC_INTERVAL, "60" );
    setIfNotSet( WsdlSettings.CACHE_WSDLS, true );
    setIfNotSet( WsdlSettings.PRETTY_PRINT_RESPONSE_MESSAGES, true );
    setIfNotSet( HttpSettings.RESPONSE_COMPRESSION, true );
    setIfNotSet( HttpSettings.INCLUDE_REQUEST_IN_TIME_TAKEN, true );
    setIfNotSet( HttpSettings.INCLUDE_RESPONSE_IN_TIME_TAKEN, true );
    setIfNotSet( HttpSettings.LEAVE_MOCKENGINE, true );
    setIfNotSet( UISettings.AUTO_SAVE_INTERVAL, "0" );
    setIfNotSet( UISettings.GC_INTERVAL, "60" );
    setIfNotSet( UISettings.SHOW_STARTUP_PAGE, true );
    setIfNotSet( WsaSettings.SOAP_ACTION_OVERRIDES_WSA_ACTION, false );
    setIfNotSet( WsaSettings.USE_DEFAULT_RELATIONSHIP_TYPE, true );
    setIfNotSet( WsaSettings.USE_DEFAULT_RELATES_TO, true );
    setIfNotSet( WsaSettings.OVERRIDE_EXISTING_HEADERS, false );
    setIfNotSet( WsaSettings.ENABLE_FOR_OPTIONAL, false );

    boolean setWsiDir = false;
    String wsiLocationString = settings.getString( WSISettings.WSI_LOCATION, null );
    if( StringUtils.isNullOrEmpty( wsiLocationString ) )
    {
      setWsiDir = true;
    }
    else
    {
      File wsiFile = new File( wsiLocationString );
      if( !wsiFile.exists() )
      {
        setWsiDir = true;
      }
    }
    if( setWsiDir )
    {
      String wsiDir = System.getProperty( "wsi.dir", new File( "." ).getAbsolutePath() );
      settings.setString( WSISettings.WSI_LOCATION, wsiDir );
    }
    HttpClientSupport.addSSLListener( settings );

    return settings;
  }

  private void setIfNotSet( String id, boolean value )
  {
    if( !settings.isSet( id ) )
      settings.setBoolean( id, true );
  }

  private void setIfNotSet( String id, String value )
  {
    if( !settings.isSet( id ) )
      settings.setString( id, value );
  }

  private void setIfNotSet( String id, long value )
  {
    if( !settings.isSet( id ) )
      settings.setLong( id, value );
  }

  /*
   * (non-Javadoc)
   *
   * @see com.eviware.soapui.SoapUICore#importSettings(java.io.File)
   */
  public Settings importSettings( File file ) throws Exception
  {
    if( file != null )
    {
      log.info( "Importing preferences from [" + file.getAbsolutePath() + "]" );
      return initSettings( file.getAbsolutePath() );
    }
    return null;
  }

  /*
   * (non-Javadoc)
   *
   * @see com.eviware.soapui.SoapUICore#getSettings()
   */
  public Settings getSettings()
  {
    if( settings == null )
    {
      initSettings( DEFAULT_SETTINGS_FILE );
    }

    return settings;
  }

  protected void initDefaultSettings( Settings settings2 )
  {

  }

  /*
   * (non-Javadoc)
   *
   * @see com.eviware.soapui.SoapUICore#saveSettings()
   */
  public String saveSettings() throws Exception
  {
    PropertyExpansionUtils.saveGlobalProperties();
    SecurityScanUtil.saveGlobalSecuritySettings();
    isSavingSettings = true;
    try
    {
      if( settingsFile == null )
        settingsFile = getRoot() + File.separatorChar + DEFAULT_SETTINGS_FILE;

      // Save settings to root or user.home
      File file = new File( settingsFile );
      if( !file.canWrite() )
      {
        file = new File( new File( System.getProperty( "user.home", "." ) ), DEFAULT_SETTINGS_FILE );
      }

      SoapuiSettingsDocumentConfig settingsDocument = ( SoapuiSettingsDocumentConfig )this.settingsDocument.copy();
      String password = settings.getString( SecuritySettings.SHADOW_PASSWORD, null );

      if( password != null && password.length() > 0 )
      {
        try
        {
          byte[] data = settingsDocument.xmlText().getBytes();
          byte[] encryptedData = OpenSSL.encrypt( "des3", password.toCharArray(), data );
          settingsDocument.setSoapuiSettings( null );
          settingsDocument.getSoapuiSettings().setEncryptedContent( encryptedData );
        }
        catch( UnsupportedEncodingException e )
        {
          log.error( "Encryption error", e );
        }
        catch( IOException e )
        {
          log.error( "Encryption error", e );
        }
        catch( GeneralSecurityException e )
        {
          log.error( "Encryption error", e );
        }
      }

      FileOutputStream out = new FileOutputStream( file );
      settingsDocument.save( out );
      out.flush();
      out.close();
      log.info( "Settings saved to [" + file.getAbsolutePath() + "]" );
      lastSettingsLoad = file.lastModified();
      return file.getAbsolutePath();
    }
    finally
    {
      isSavingSettings = false;
    }
  }

  public String getSettingsFile()
  {
    return settingsFile;
  }

  public void setSettingsFile( String settingsFile )
  {
    this.settingsFile = settingsFile;
  }

  protected void initLog()
  {
    if( !logIsInitialized )
    {
      String logFileName = System.getProperty( "soapui.log4j.config", "soapui-log4j.xml" );
      File log4jconfig = root == null ? new File( logFileName ) : new File( new File( getRoot() ), logFileName );
      if( log4jconfig.exists() )
      {
        System.out.println( "Configuring log4j from [" + log4jconfig.getAbsolutePath() + "]" );
        DOMConfigurator.configureAndWatch( log4jconfig.getAbsolutePath(), 5000 );
      }
      else
      {
        URL url = SoapUI.class.getResource( "/com/eviware/soapui/resources/conf/soapui-log4j.xml" );
        if( url != null )
        {
          DOMConfigurator.configure( url );
        }
        else
          System.err.println( "Missing soapui-log4j.xml configuration" );
      }

      logIsInitialized = true;

      log = Logger.getLogger( DefaultSoapUICore.class );
    }
  }

  public synchronized void loadExternalLibraries()
  {
    if( extClassLoader == null )
    {
      try
      {
        extClassLoader = SoapUIExtensionClassLoader.create( getRoot(), getExtensionClassLoaderParent() );
      }
      catch( MalformedURLException e )
      {
        SoapUI.logError( e );
      }
    }
  }

  protected ClassLoader getExtensionClassLoaderParent()
  {
    return SoapUI.class.getClassLoader();
  }

  public SoapUIExtensionClassLoader getExtensionClassLoader()
  {
    if( extClassLoader == null )
      loadExternalLibraries();

    return extClassLoader;
  }

  /*
   * (non-Javadoc)
   *
   * @see com.eviware.soapui.SoapUICore#getMockEngine()
   */
  public MockEngine getMockEngine()
  {
    if( mockEngine == null )
      mockEngine = buildMockEngine();

    return mockEngine;
  }

  protected MockEngine buildMockEngine()
  {
    return new JettyMockEngine();
  }

  /*
   * (non-Javadoc)
   *
   * @see com.eviware.soapui.SoapUICore#getListenerRegistry()
   */
  public SoapUIListenerRegistry getListenerRegistry()
  {
    if( listenerRegistry == null )
      initListenerRegistry();

    return listenerRegistry;
  }

  protected void initListenerRegistry()
  {
    listenerRegistry = new SoapUIListenerRegistry( null );
  }

  /*
   * (non-Javadoc)
   *
   * @see com.eviware.soapui.SoapUICore#getActionRegistry()
   */
  public SoapUIActionRegistry getActionRegistry()
  {
    if( actionRegistry == null )
      actionRegistry = initActionRegistry();

    return actionRegistry;
  }

  protected SoapUIActionRegistry initActionRegistry()
  {
    return new SoapUIActionRegistry(
        DefaultSoapUICore.class.getResourceAsStream( "/com/eviware/soapui/resources/conf/soapui-actions.xml" ) );
  }

  protected void addExternalListeners( String folder, ClassLoader classLoader )
  {
    File[] actionFiles = new File( folder ).listFiles();
    if( actionFiles != null )
    {
      for( File actionFile : actionFiles )
      {
        if( actionFile.isDirectory() )
        {
          addExternalListeners( actionFile.getAbsolutePath(), classLoader );
          continue;
        }

        if( !actionFile.getName().toLowerCase().endsWith( "-listeners.xml" ) )
          continue;

        try
        {
          log.info( "Adding listeners from [" + actionFile.getAbsolutePath() + "]" );

          SoapUI.getListenerRegistry().addConfig( new FileInputStream( actionFile ), classLoader );
        }
        catch( Exception e )
        {
          SoapUI.logError( e );
        }
      }
    }
  }

  protected void addExternalFactories( String folder, ClassLoader classLoader )
  {
    File[] factoryFiles = new File( folder ).listFiles();
    if( factoryFiles != null )
    {
      for( File factoryFile : factoryFiles )
      {
        if( factoryFile.isDirectory() )
        {
          addExternalListeners( factoryFile.getAbsolutePath(), classLoader );
          continue;
        }

        if( !factoryFile.getName().toLowerCase().endsWith( "-factories.xml" ) )
          continue;

        try
        {
          log.info( "Adding factories from [" + factoryFile.getAbsolutePath() + "]" );

          getFactoryRegistry().addConfig( new FileInputStream( factoryFile ), classLoader );
        }
        catch( Exception e )
        {
          SoapUI.logError( e );
        }
      }
    }
  }

  private class SettingsWatcher extends TimerTask
  {
    @Override
    public void run()
    {
      if( settingsFile != null && !isSavingSettings )
      {
        File file = new File( settingsFile );
        if( file.exists() && file.lastModified() > lastSettingsLoad )
        {
          log.info( "Reloading updated settings file" );
          initSettings( settingsFile );
          SoapUI.setProxyEnabled( getSettings().getBoolean( ProxySettings.ENABLE_PROXY ) );
        }
      }
    }
  }

  @Override
  public SoapUIFactoryRegistry getFactoryRegistry()
  {
    if( factoryRegistry == null )
      initFactoryRegistry();

    return factoryRegistry;
  }

  protected void initFactoryRegistry()
  {
    factoryRegistry = new SoapUIFactoryRegistry( null );
  }

  protected void initSecurityScanRegistry()
  {
    securityScanRegistry = SecurityScanRegistry.getInstance();
  }

  @Override
  public SecurityScanRegistry getSecurityScanRegistry()
  {
    if( securityScanRegistry == null )
      initSecurityScanRegistry();
    return securityScanRegistry;
  }
}
TOP

Related Classes of com.eviware.soapui.DefaultSoapUICore

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.