Package com.eviware.soapui.impl.wsdl.support

Source Code of com.eviware.soapui.impl.wsdl.support.PathUtils

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

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.wsdl.AbstractWsdlModelItem;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.project.Project;
import com.eviware.soapui.model.propertyexpansion.DefaultPropertyExpansionContext;
import com.eviware.soapui.model.propertyexpansion.PropertyExpander;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
import com.eviware.soapui.model.support.ModelSupport;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.Tools;
import com.eviware.soapui.support.UISupport;

public class PathUtils
{
  public static String getAbsoluteFolder( String path )
  {
    File folder = new File( path );

    if( !folder.exists() )
      return null;

    if( folder.isDirectory() )
      return folder.getAbsolutePath();

    File parentFile = folder.getParentFile();
    return parentFile == null ? null : parentFile.getAbsolutePath();
  }

  public static String expandPath( String path, AbstractWsdlModelItem<?> modelItem )
  {
    return expandPath( path, modelItem, null );
  }

  public static String expandPath( String path, AbstractWsdlModelItem<?> modelItem, PropertyExpansionContext context )
  {
    // if ( path != null ) {
    path = stripQuotes( path );
    if( isHttpPath( path ) )
      path = path.replaceAll( " ", "%20" );
    // }
    path = context == null ? PropertyExpander.expandProperties( modelItem, path ) : PropertyExpander
        .expandProperties( context, path );

    if( !isRelativePath( path ) )
      return path;

    String root = getExpandedResourceRoot( modelItem, context );
    if( StringUtils.isNullOrEmpty( root ) || StringUtils.isNullOrEmpty( root ) )
      return path;

    if( isHttpPath( root ) )
      root += "/";
    else
      root += File.separatorChar;

    return Tools.joinRelativeUrl( root, path );
  }

  private static String stripQuotes( String path )
  {
    if( path != null )
    {
      if( path.startsWith( "\"" ) && path.endsWith( "\"" ) )
      {
        path = path.substring( 1, path.length() - 1 );
      }
    }
    return path;
  }

  public static String adjustRelativePath( String str, String root, ModelItem contextModelItem )
  {
    if( StringUtils.isNullOrEmpty( root ) || StringUtils.isNullOrEmpty( str ) )
      return str;

    if( !isRelativePath( str ) )
      return str;

    root = PropertyExpander.expandProperties( contextModelItem, root );

    if( isHttpPath( root ) )
      root += "/";
    else
      root += File.separatorChar;

    return Tools.joinRelativeUrl( root, str );

    // if( isHttpPath( str ))
    // return root + '/' + str;
    // else
    // return root + File.separatorChar + str;
  }

  public static boolean isHttpPath( String str )
  {
    if( StringUtils.isNullOrEmpty( str ) )
      return false;

    str = str.toLowerCase();

    return str.startsWith( "http:/" ) || str.startsWith( "https:/" );
  }

  public static boolean isRelativePath( String str )
  {
    if( StringUtils.isNullOrEmpty( str ) )
      return false;

    str = str.toLowerCase();

    return !str.startsWith( "/" ) && !str.startsWith( "\\" ) && !str.startsWith( "http:/" )
        && !str.startsWith( "https:/" ) && str.indexOf( ":\\" ) != 1 && !str.startsWith( "file:" )
        && str.indexOf( ":/" ) != 1;
  }

  public static String createRelativePath( String path, String root, ModelItem contextModelItem )
  {
    if( StringUtils.isNullOrEmpty( root ) )
      return path;

    root = PropertyExpander.expandProperties( contextModelItem, root );

    return relativize( path, root );
  }

  public static String relativizeResourcePath( String path, ModelItem modelItem )
  {
    if( modelItem == null || StringUtils.isNullOrEmpty( path ) || isRelativePath( path ) || isHttpPath( path ) )
      return path;

    Project project = ModelSupport.getModelItemProject( modelItem );
    if( project == null )
      return path;

    if( StringUtils.isNullOrEmpty( project.getPath() ) && project.getResourceRoot().indexOf( "${projectDir}" ) >= 0 )
    {
      if( UISupport.confirm( "Save project before setting path?", "Project has not been saved" ) )
      {
        try
        {
          project.save();
        }
        catch( IOException e )
        {
          SoapUI.logError( e );
          UISupport.showErrorMessage( e );
          return path;
        }
      }
    }

    String projectPath = PropertyExpander.expandProperties( project, project.getResourceRoot() );
    if( StringUtils.isNullOrEmpty( projectPath ) )
      return path;

    return PathUtils.relativize( path, projectPath );
  }

  public static String resolveResourcePath( String path, ModelItem modelItem )
  {
    if( path == null || modelItem == null )
      return path;

    path = PathUtils.denormalizePath( path );
    path = PropertyExpander.expandProperties( new DefaultPropertyExpansionContext( modelItem ), path );

    String prefix = "";

    if( path.startsWith( "file:" ) )
    {
      prefix = path.substring( 0, 5 );
      path = path.substring( 5 );
    }

    if( PathUtils.isAbsolutePath( path ) )
      return prefix + path;

    WsdlProject project = ( WsdlProject )ModelSupport.getModelItemProject( modelItem );
    if( project == null )
      return prefix + path;

    String resourceRoot = getExpandedResourceRoot( modelItem );

    if( StringUtils.hasContent( resourceRoot ) && !resourceRoot.endsWith( File.separator ) )
      resourceRoot += File.separator;

    String result = Tools.joinRelativeUrl( resourceRoot, path );
    return prefix + result;
  }

  public static String relativize( String path, String rootPath )
  {
    if( StringUtils.isNullOrEmpty( path ) || StringUtils.isNullOrEmpty( rootPath ) )
      return path;

    if( path.toLowerCase().startsWith( "http:/" ) || path.toLowerCase().startsWith( "https:/" ) )
    {
      String prefix = "";

      while( rootPath != null )
      {
        if( path.startsWith( rootPath ) )
        {
          path = path.substring( rootPath.length() );
          if( path.startsWith( "/" ) )
            path = path.substring( 1 );

          break;
        }
        else
        {
          int ix = rootPath.lastIndexOf( '/' );
          rootPath = ix == -1 ? null : rootPath.substring( 0, ix );
          prefix += "../";
        }
      }

      return prefix + path;
    }
    else
    {
      String prefix = "";

      // file url?
      if( path.toLowerCase().startsWith( "file:" ) )
      {
        try
        {
          path = new File( new URL( path ).toURI() ).getAbsolutePath();
        }
        catch( Exception e )
        {
          e.printStackTrace();
        }
      }

      if( rootPath.startsWith( "file:" ) )
      {
        try
        {
          rootPath = new File( new URL( rootPath ).toURI() ).getAbsolutePath();
        }
        catch( Exception e )
        {
          e.printStackTrace();
        }
      }

      // different drives on windows? (can't relativize)
      if( rootPath.toUpperCase().charAt( 0 ) != path.toUpperCase().charAt( 0 )
          && ( ( rootPath.indexOf( ":\\" ) == 1 || rootPath.indexOf( ":/" ) == 1 ) && ( path.indexOf( ":\\" ) == 1 || path
              .indexOf( ":/" ) == 1 ) ) )
      {
        return path;
      }

      while( rootPath != null )
      {
        if( path.startsWith( rootPath ) )
        {
          path = path.substring( rootPath.length() );
          if( path.startsWith( File.separator ) )
            path = path.substring( 1 );

          break;
        }
        else
        {
          File file = new File( rootPath );
          rootPath = file.getParent();
          prefix += ".." + File.separatorChar;
        }
      }

      return prefix + path;
    }
  }

  public static boolean isAbsolutePath( String path )
  {
    return !isRelativePath( path );
  }

  public static boolean isFilePath( String path )
  {
    if( StringUtils.isNullOrEmpty( path ) )
      return false;

    return !isHttpPath( path );
  }

  public static String normalizePath( String path )
  {
    if( StringUtils.isNullOrEmpty( path ) )
      return path;

    return File.separatorChar == '/' ? path : path.replace( File.separatorChar, '/' );
  }

  public static String denormalizePath( String path )
  {
    if( StringUtils.isNullOrEmpty( path ) )
      return path;

    if( isHttpPath( path ) )
      return path;

    return File.separatorChar == '/' ? path.replace( '\\', File.separatorChar ) : path.replace( '/',
        File.separatorChar );
  }

  public static String getExpandedResourceRoot( ModelItem modelItem )
  {
    return getExpandedResourceRoot( modelItem, null );
  }

  public static String getExpandedResourceRoot( ModelItem modelItem, PropertyExpansionContext context )
  {
    if( !( modelItem instanceof AbstractWsdlModelItem<?> ) )
      return null;

    WsdlProject project = ( WsdlProject )ModelSupport.getModelItemProject( modelItem );
    if( project == null )
      return null;

    String docroot = project.getResourceRoot();
    if( !StringUtils.hasContent( docroot ) )
      return new File( "" ).getAbsolutePath();

    docroot = context == null ? PropertyExpander.expandProperties( modelItem, docroot ) : PropertyExpander
        .expandProperties( context, docroot );

    return docroot;
  }

  public static String ensureFilePathIsUrl( String url )
  {
    if( isFilePath( url ) && !url.startsWith( "file:" ) )
    {
      try
      {
        return new File( url ).toURI().toURL().toString();
      }
      catch( MalformedURLException e )
      {
        e.printStackTrace();
      }
    }

    return url;
  }

  public static String fixForwardSlashesInPath( String path )
  {
    String prefix = null;
    String query = null;

    int ix = path.indexOf( '?' );
    if( ix >= 0 )
    {
      query = path.substring( ix );
      path = path.substring( 0, ix );
    }

    if( path.contains( "://" ) )
    {
      prefix = path.substring( 0, path.indexOf( "://" ) + 3 );
      path = path.substring( prefix.length() );
    }

    // remove double-slashes in path
    path = path.replaceAll( "/{2,}", "/" );

    if( prefix != null )
      path = prefix + path;

    if( query != null )
      path = path + query;

    return path;
  }
}
TOP

Related Classes of com.eviware.soapui.impl.wsdl.support.PathUtils

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.