/*
* SoapUI, Copyright (C) 2004-2016 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 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;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
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;
}
}