Package com.eviware.soapui.tools

Source Code of com.eviware.soapui.tools.MockAsWar

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

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;

import org.apache.log4j.Logger;

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.Tools;
import com.eviware.soapui.support.UISupport;
import com.eviware.x.dialogs.Worker.WorkerAdapter;
import com.eviware.x.dialogs.XProgressDialog;
import com.eviware.x.dialogs.XProgressMonitor;

public class MockAsWar
{
  protected static final String SOAPUI_SETTINGS = "[soapUISettings]";
  protected static final String PROJECT_FILE_NAME = "[ProjectFileName]";
  protected static final String MOCKSERVICE_ENDPOINT = "[mockServiceEndpoint]";

  protected File projectFile;
  protected File settingsFile;
  protected File warDir;
  private File warFile;
  protected File webInf;
  private File lib;
  private File soapuiDir;

  protected Logger log = Logger.getLogger( MockAsWar.class );
  private boolean includeExt;
  protected boolean includeActions;
  protected boolean includeListeners;
  private File actionsDir;
  private File listenersDir;
  protected final String localEndpoint;
  protected boolean enableWebUI;

  public MockAsWar( String projectPath, String settingsPath, String warDir, String warFile, boolean includeExt,
      boolean actions, boolean listeners, String localEndpoint, boolean enableWebUI )
  {
    this.localEndpoint = localEndpoint;
    this.projectFile = new File( projectPath );
    this.settingsFile = StringUtils.hasContent( settingsPath ) ? new File( settingsPath ) : null;
    this.warDir = StringUtils.hasContent( warDir ) ? new File( warDir ) : new File(
        System.getProperty( "java.io.tmpdir" ), "warasmock" );
    if( !this.warDir.exists() )
    {
      this.warDir.mkdir();
    }
    this.warFile = !StringUtils.hasContent( warFile ) ? null : new File( warFile );
    this.includeExt = includeExt;
    this.includeActions = actions;
    this.includeListeners = listeners;
    this.enableWebUI = enableWebUI;
  }

  public void createMockAsWarArchive()
  {
    XProgressDialog progressDialog = UISupport.getDialogs().createProgressDialog( "Creating War File", 3,
        "Building war file..", false );
    WorkerAdapter warWorker = new WorkerAdapter()
    {

      public Object construct( XProgressMonitor monitor )
      {
        if( prepareWarFile() )
        {
          createWebXml();

          if( warFile != null )
          {
            ArrayList<File> files = getAllFilesFrom( webInf );
            files.add( new File( warDir, "stylesheet.css" ) );
            files.add( new File( warDir, "header_logo.jpg" ) );

            File[] filez = files.toArray( new File[files.size()] );
            JarPackager.createJarArchive( warFile, warDir, filez );
          }
        }
        return null;
      }
    };
    try
    {
      progressDialog.run( warWorker );
    }
    catch( Exception e )
    {
      log.error( e.getMessage(), e );
    }

  }

  private ArrayList<File> getAllFilesFrom( File dir )
  {
    ArrayList<File> result = new ArrayList<File>();
    if( dir.isDirectory() )
    {
      result.addAll( Arrays.asList( dir.listFiles() ) );
      ArrayList<File> toAdd = new ArrayList<File>();
      for( File f : result )
      {
        if( f.isDirectory() )
          toAdd.addAll( getAllFilesFrom( f ) );
      }
      result.addAll( toAdd );
    }
    return result;
  }

  protected void createWebXml()
  {
    URL url = SoapUI.class.getResource( "/com/eviware/soapui/resources/mockaswar/web.xml" );
    try
    {
      BufferedReader in = new BufferedReader( new InputStreamReader( url.openStream() ) );
      String inputLine;
      StringBuilder content = new StringBuilder();

      while( ( inputLine = in.readLine() ) != null )
        content.append( inputLine + "\n" );

      createContent( content );

      BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( new File( webInf,
          "web.xml" ) ) ) );
      out.write( content.toString() );
      out.flush();
      out.close();
    }
    catch( IOException e )
    {
      log.error( e.getMessage(), e );
    }
  }

  protected void createContent( StringBuilder content )
  {
    content.replace( content.indexOf( PROJECT_FILE_NAME ),
        content.indexOf( PROJECT_FILE_NAME ) + PROJECT_FILE_NAME.length(), projectFile.getName() );

    content.replace(
        content.indexOf( SOAPUI_SETTINGS ),
        content.indexOf( SOAPUI_SETTINGS ) + SOAPUI_SETTINGS.length(),
        settingsFile != null && settingsFile.exists() && settingsFile.isFile() ? "WEB-INF/soapui/"
            + settingsFile.getName() : "" );// settingsFile.getAbsolutePath()
                                  // );
    content.replace( content.indexOf( MOCKSERVICE_ENDPOINT ), content.indexOf( MOCKSERVICE_ENDPOINT )
        + MOCKSERVICE_ENDPOINT.length(), localEndpoint );

    if( !includeActions )
      content.replace( content.indexOf( "WEB-INF/actions" ), content.indexOf( "WEB-INF/actions" )
          + "WEB-INF/actions".length(), "" );
    if( !includeListeners )
      content.replace( content.indexOf( "WEB-INF/listeners" ), content.indexOf( "WEB-INF/listeners" )
          + "WEB-INF/listeners".length(), "" );
    if( !enableWebUI )
      content.replace( content.indexOf( "<param-value>true</param-value>" ),
          content.indexOf( "<param-value>true</param-value>" ) + "<param-value>true</param-value>".length(),
          "<param-value>false</param-value>" );
  }

  protected boolean prepareWarFile()
  {
    // create file system first
    if( createWarFileSystem() )
    {
      // copy all from bin/../lib to soapui.home/war/WEB-INF/lib/
      File fromDir = new File( System.getProperty( "soapui.home" ), ".." + File.separator + "lib" );
      JarPackager.copyAllFromTo( fromDir, lib, new FileFilter()
      {
        public boolean accept( File pathname )
        {
          return pathname.getName().indexOf( "servlet" ) == -1 && pathname.getName().indexOf( "xulrunner" ) == -1
              && pathname.getName().indexOf( "Mozilla" ) == -1 && pathname.getName().indexOf( "l2fprod" ) == -1
              && pathname.getName().indexOf( "tuxpack" ) == -1 && pathname.getName().indexOf( "winpack" ) == -1
              && pathname.getName().indexOf( "rsyntax" ) == -1
              && pathname.getName().indexOf( "ActiveQueryBuilder" ) == -1
              && pathname.getName().indexOf( "jxbrowser" ) == -1;
        }
      } );

      if( includeExt )
      {
        // copy all from bin/ext to soapui.home/war/WEB-INF/lib/
        fromDir = new File( System.getProperty( "soapui.home" ), "ext" );
        JarPackager.copyAllFromTo( fromDir, lib, null );
      }

      // copy soapui jar to soapui.home/war/WEB-INF/lib/
      File soapUIHome = new File( System.getProperty( "soapui.home" ) );
      String[] mainJar = soapUIHome.list( new FilenameFilter()
      {
        public boolean accept( File dir, String name )
        {
          if( name.toLowerCase().startsWith( "soapui" ) && name.toLowerCase().endsWith( ".jar" ) )
            return true;
          return false;
        }
      } );

      fromDir = new File( System.getProperty( "soapui.home" ), mainJar[0] );
      JarPackager.copyFileToDir( fromDir, lib );
      // copy project and settings file to bin/war/WEB-INF/soapui/
      JarPackager.copyFileToDir( projectFile, soapuiDir );
      if( settingsFile != null && settingsFile.exists() && settingsFile.isFile() )
        JarPackager.copyFileToDir( settingsFile, soapuiDir );

      // actions
      if( includeActions )
      {
        fromDir = new File( System.getProperty( "soapui.ext.actions" ) );
        JarPackager.copyAllFromTo( fromDir, actionsDir, null );
      }
      // listeners
      if( includeListeners )
      {
        fromDir = new File( System.getProperty( "soapui.ext.listeners" ) );
        JarPackager.copyAllFromTo( fromDir, listenersDir, null );
      }

      copyWarResource( "header_logo.jpg" );
      copyWarResource( "stylesheet.css" );

      return true;
    }
    return false;
  }

  private void copyWarResource( String resource )
  {
    try
    {
      Tools.writeAll( new FileOutputStream( new File( warDir, resource ) ),
          SoapUI.class.getResourceAsStream( "/com/eviware/soapui/resources/mockaswar/" + resource ) );
    }
    catch( Exception e )
    {
      e.printStackTrace();
    }
  }

  protected boolean createWarFileSystem()
  {
    if( warDir.isDirectory() )
    {
      log.info( "Creating WAR directory in [" + warDir.getAbsolutePath() + "]" );
      webInf = new File( warDir, "WEB-INF" );
      if( !( webInf.mkdir() || webInf.exists() ) )
      {
        UISupport.showErrorMessage( "Could not create directory " + webInf.getAbsolutePath() );
        return false;
      }
      else
      {
        clearDir( webInf );
        lib = new File( webInf, "lib" );
        if( !( lib.mkdir() || lib.exists() ) )
        {
          UISupport.showErrorMessage( "Could not create directory " + lib.getAbsolutePath() );
          return false;
        }
        soapuiDir = new File( webInf, "soapui" );
        if( !( soapuiDir.mkdir() || soapuiDir.exists() ) )
        {
          UISupport.showErrorMessage( "Could not create directory " + soapuiDir.getAbsolutePath() );
          return false;
        }
        clearDir( soapuiDir );

        if( includeActions )
        {
          actionsDir = new File( webInf, "actions" );
          if( !( actionsDir.mkdirs() || actionsDir.exists() ) )
          {
            UISupport.showErrorMessage( "Could not create directory " + actionsDir.getAbsolutePath() );
            return false;
          }
          clearDir( actionsDir );
        }
        if( includeListeners )
        {
          listenersDir = new File( webInf, "listeners" );
          if( !( listenersDir.mkdirs() || listenersDir.exists() ) )
          {
            UISupport.showErrorMessage( "Could not create directory " + listenersDir.getAbsolutePath() );
            return false;
          }
          clearDir( listenersDir );
        }
        return true;
      }
    }
    else
    {
      UISupport.showErrorMessage( warDir.getName() + " need to be directory!" );
      return false;
    }
  }

  /**
   * Deletes all files, just files, in directory
   *
   * @param dir
   */
  protected void clearDir( File dir )
  {
    for( File file : dir.listFiles() )
      if( file.isFile() )
        file.delete();
  }

}
TOP

Related Classes of com.eviware.soapui.tools.MockAsWar

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.