/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others. *
* All rights reserved. This program and the accompanying materials *
* are made available under the terms of the Eclipse Public License v1.0 *
* which accompanies this distribution, and is available at *
* http://www.eclipse.org/legal/epl-v10.html *
* Contributors: *
* Soyatec - initial API and implementation *
*******************************************************************************/
package org.eclipse.papyrus.xwt.utils;
import java.io.File;
import java.util.StringTokenizer;
/**
* @author jliu jin.liu@soyatec.com
*/
public class PathHelper {
public static final String URL_IDENTIFY_PREFIX = "file:";
public static final String BACKWARD_SLASH = "\\";
public static final String FORWARD_SLASH = "/";
public static final String RELATIVE_PATH_SIG = "../";
public static final String WHITE_SPACE_ASCII = "%20";
public static String getRelativePath(String source, String target) {
if(source == null || target == null) {
return target;
}
File sourceFile = new File(source);
if(!sourceFile.exists()) {
return target;
}
File targetFile = new File(target);
if(!targetFile.exists()) {
return target;
}
source = switchToForwardSlashes(source);
target = switchToForwardSlashes(target);
int index = target.indexOf(FORWARD_SLASH);
String container = null;
while(index != -1) {
container = target.substring(0, index);
if(!source.startsWith(container + FORWARD_SLASH)) {
break;
}
source = source.substring(index + 1);
target = target.substring(index + 1);
index = target.indexOf(FORWARD_SLASH);
}
index = source.indexOf(FORWARD_SLASH);
while(index != -1) {
target = RELATIVE_PATH_SIG + target;
source = source.substring(index + 1);
index = source.indexOf(FORWARD_SLASH);
}
return target;
}
/**
* Switch to file path slashes
*/
public static String switchToForwardSlashes(String path) {
path = path.replace(File.separatorChar, FORWARD_SLASH.charAt(0));
path = path.replace(BACKWARD_SLASH.charAt(0), FORWARD_SLASH.charAt(0));
return path;
}
public static String getAbsolutePath(String source, String relative) {
if(source.indexOf(WHITE_SPACE_ASCII) != -1) {
source = source.replace(WHITE_SPACE_ASCII, " ");
}
if(relative.indexOf(WHITE_SPACE_ASCII) != -1) {
relative = relative.replace(WHITE_SPACE_ASCII, " ");
}
if(source.startsWith(FORWARD_SLASH)) {
source = source.substring(1);
}
String prefix = null;
if(source.startsWith(URL_IDENTIFY_PREFIX)) {
prefix = URL_IDENTIFY_PREFIX;
source = source.substring(URL_IDENTIFY_PREFIX.length());
if(System.getProperty("os.arch").startsWith("Win")) {
source = source.substring(1);
}
}
File file = new File(source);
if(!file.exists()) {
return relative;
}
if(file.isFile()) {
source = file.getParent();
}
source = switchToForwardSlashes(source);
relative = switchToForwardSlashes(relative);
if(relative.startsWith(FORWARD_SLASH)) {
relative = relative.substring(1);
}
int index = relative.lastIndexOf(FORWARD_SLASH);
if(index != -1) {
String container = relative.substring(0, index);
int i = source.indexOf(container);
if(i != -1) {
source = source.substring(0, i);
} else {
int j = relative.indexOf(RELATIVE_PATH_SIG);
while(j != -1) {
relative = relative.substring(j + RELATIVE_PATH_SIG.length());
source = source.substring(0, source.lastIndexOf(FORWARD_SLASH));
j = relative.indexOf(RELATIVE_PATH_SIG);
}
}
}
if(System.getProperty("os.arch").startsWith("Win")) {
source = "/" + source;
}
return (prefix != null ? prefix : "") + source + FORWARD_SLASH + relative;
}
/**
* Convert to relative url based on base
*/
public static String convertToRelative(String input, String base) {
StringTokenizer inputTokenizer = new StringTokenizer(input, FORWARD_SLASH);
StringTokenizer baseTokenizer = new StringTokenizer(base, FORWARD_SLASH);
String token1 = "", token2 = "";
//
while(true) {
if(!inputTokenizer.hasMoreTokens() || !baseTokenizer.hasMoreTokens())
break;
token1 = baseTokenizer.nextToken();
token2 = inputTokenizer.nextToken();
if(!token1.equals(token2))
break;
}
StringBuilder builder = new StringBuilder();
while(baseTokenizer.hasMoreTokens()) {
baseTokenizer.nextToken();
builder.append(RELATIVE_PATH_SIG);
}
builder.append(token2);
while(inputTokenizer.hasMoreTokens()) {
builder.append(FORWARD_SLASH + inputTokenizer.nextToken());
}
return builder.toString();
}
}