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

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

/*
* Copyright 2004-2014 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/

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.