/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.commons.lang.os;
/**
* Escapes Windows path to unix-style path.
*
* @author Alexander Garagatyi
*/
public class WindowsPathEscaper {
/** Implements singleton pattern. */
private static final WindowsPathEscaper escaper = new WindowsPathEscaper();
/** Does nothing. Can be used for mocking purposes. */
public WindowsPathEscaper() {}
/**
* Static version of method that escapes paths on Windows.
* It is discouraged to use this method because it is too hard to mock it.
* Use {@link #escapePath(String)} instead.
*
* @param path path on Windows. Can be unix-style path also.
* @return unix-style path
* @see #escapePath(String)
*/
public static String escapePathStatic(String path) {
return escaper.escapePath(path);
}
/**
* Escapes Windows path to unix-style path.
*
* @param path path on Windows. Can be unix-style path also.
* @return unix-style path
*/
public String escapePath(String path) {
String esc;
if (path.indexOf(":") == 1) {
// check and replace only occurrence of ":" after disk label on Windows host (e.g. C:/)
// but keep other occurrences it can be marker for docker mount volumes
// (e.g. /path/dir/from/host:/name/of/dir/in/container )
esc = path.replaceFirst(":", "").replace('\\', '/');
esc = Character.toLowerCase(esc.charAt(0)) + esc.substring(1); //letter of disk mark must be lower case
} else {
esc = path.replace('\\', '/');
}
if (!esc.startsWith("/")) {
esc = "/" + esc;
}
return esc;
}
}