StringUtils.cleanPath retains plain pointer to current directory

Issue: SPR-16908
This commit is contained in:
Juergen Hoeller 2018-06-28 13:44:16 +02:00
parent b6d95567e8
commit 7a02e438e7
2 changed files with 41 additions and 31 deletions

View File

@ -646,7 +646,7 @@ public abstract class StringUtils {
String prefix = ""; String prefix = "";
if (prefixIndex != -1) { if (prefixIndex != -1) {
prefix = pathToUse.substring(0, prefixIndex + 1); prefix = pathToUse.substring(0, prefixIndex + 1);
if (prefix.contains("/")) { if (prefix.contains(FOLDER_SEPARATOR)) {
prefix = ""; prefix = "";
} }
else { else {
@ -659,7 +659,7 @@ public abstract class StringUtils {
} }
String[] pathArray = delimitedListToStringArray(pathToUse, FOLDER_SEPARATOR); String[] pathArray = delimitedListToStringArray(pathToUse, FOLDER_SEPARATOR);
List<String> pathElements = new LinkedList<>(); LinkedList<String> pathElements = new LinkedList<>();
int tops = 0; int tops = 0;
for (int i = pathArray.length - 1; i >= 0; i--) { for (int i = pathArray.length - 1; i >= 0; i--) {
@ -687,6 +687,10 @@ public abstract class StringUtils {
for (int i = 0; i < tops; i++) { for (int i = 0; i < tops; i++) {
pathElements.add(0, TOP_PATH); pathElements.add(0, TOP_PATH);
} }
// If nothing else left, at least explicitly point to current path.
if (pathElements.size() == 1 && "".equals(pathElements.getLast()) && !prefix.endsWith(FOLDER_SEPARATOR)) {
pathElements.add(0, CURRENT_PATH);
}
return prefix + collectionToDelimitedString(pathElements, FOLDER_SEPARATOR); return prefix + collectionToDelimitedString(pathElements, FOLDER_SEPARATOR);
} }

View File

@ -378,53 +378,59 @@ public class StringUtilsTests {
assertEquals("../mypath/myfile", StringUtils.cleanPath("mypath/../../mypath/myfile")); assertEquals("../mypath/myfile", StringUtils.cleanPath("mypath/../../mypath/myfile"));
assertEquals("/../mypath/myfile", StringUtils.cleanPath("/../mypath/myfile")); assertEquals("/../mypath/myfile", StringUtils.cleanPath("/../mypath/myfile"));
assertEquals("/mypath/myfile", StringUtils.cleanPath("/a/:b/../../mypath/myfile")); assertEquals("/mypath/myfile", StringUtils.cleanPath("/a/:b/../../mypath/myfile"));
assertEquals("file:///c:/path/to/the%20file.txt", StringUtils.cleanPath("file:///c:/some/../path/to/the%20file.txt")); assertEquals("/", StringUtils.cleanPath("/"));
assertEquals("/", StringUtils.cleanPath("/mypath/../"));
assertEquals("", StringUtils.cleanPath("mypath/.."));
assertEquals("", StringUtils.cleanPath("mypath/../."));
assertEquals("./", StringUtils.cleanPath("mypath/../"));
assertEquals("./", StringUtils.cleanPath("././"));
assertEquals("./", StringUtils.cleanPath("./"));
assertEquals("../", StringUtils.cleanPath("../"));
assertEquals("../", StringUtils.cleanPath("./../"));
assertEquals("../", StringUtils.cleanPath(".././"));
assertEquals("file:/", StringUtils.cleanPath("file:/"));
assertEquals("file:/", StringUtils.cleanPath("file:/mypath/../"));
assertEquals("file:", StringUtils.cleanPath("file:mypath/.."));
assertEquals("file:", StringUtils.cleanPath("file:mypath/../."));
assertEquals("file:./", StringUtils.cleanPath("file:mypath/../"));
assertEquals("file:./", StringUtils.cleanPath("file:././"));
assertEquals("file:./", StringUtils.cleanPath("file:./"));
assertEquals("file:../", StringUtils.cleanPath("file:../"));
assertEquals("file:../", StringUtils.cleanPath("file:./../"));
assertEquals("file:../", StringUtils.cleanPath("file:.././"));
assertEquals("file:///c:/path/the%20file.txt", StringUtils.cleanPath("file:///c:/some/../path/the%20file.txt"));
} }
@Test @Test
public void testPathEquals() { public void testPathEquals() {
assertTrue("Must be true for the same strings", assertTrue("Must be true for the same strings",
StringUtils.pathEquals("/dummy1/dummy2/dummy3", StringUtils.pathEquals("/dummy1/dummy2/dummy3", "/dummy1/dummy2/dummy3"));
"/dummy1/dummy2/dummy3"));
assertTrue("Must be true for the same win strings", assertTrue("Must be true for the same win strings",
StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", "C:\\dummy1\\dummy2\\dummy3"));
"C:\\dummy1\\dummy2\\dummy3"));
assertTrue("Must be true for one top path on 1", assertTrue("Must be true for one top path on 1",
StringUtils.pathEquals("/dummy1/bin/../dummy2/dummy3", StringUtils.pathEquals("/dummy1/bin/../dummy2/dummy3", "/dummy1/dummy2/dummy3"));
"/dummy1/dummy2/dummy3"));
assertTrue("Must be true for one win top path on 2", assertTrue("Must be true for one win top path on 2",
StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", "C:\\dummy1\\bin\\..\\dummy2\\dummy3"));
"C:\\dummy1\\bin\\..\\dummy2\\dummy3"));
assertTrue("Must be true for two top paths on 1", assertTrue("Must be true for two top paths on 1",
StringUtils.pathEquals("/dummy1/bin/../dummy2/bin/../dummy3", StringUtils.pathEquals("/dummy1/bin/../dummy2/bin/../dummy3", "/dummy1/dummy2/dummy3"));
"/dummy1/dummy2/dummy3"));
assertTrue("Must be true for two win top paths on 2", assertTrue("Must be true for two win top paths on 2",
StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", "C:\\dummy1\\bin\\..\\dummy2\\bin\\..\\dummy3"));
"C:\\dummy1\\bin\\..\\dummy2\\bin\\..\\dummy3"));
assertTrue("Must be true for double top paths on 1", assertTrue("Must be true for double top paths on 1",
StringUtils.pathEquals("/dummy1/bin/tmp/../../dummy2/dummy3", StringUtils.pathEquals("/dummy1/bin/tmp/../../dummy2/dummy3", "/dummy1/dummy2/dummy3"));
"/dummy1/dummy2/dummy3"));
assertTrue("Must be true for double top paths on 2 with similarity", assertTrue("Must be true for double top paths on 2 with similarity",
StringUtils.pathEquals("/dummy1/dummy2/dummy3", StringUtils.pathEquals("/dummy1/dummy2/dummy3", "/dummy1/dum/dum/../../dummy2/dummy3"));
"/dummy1/dum/dum/../../dummy2/dummy3"));
assertTrue("Must be true for current paths", assertTrue("Must be true for current paths",
StringUtils.pathEquals("./dummy1/dummy2/dummy3", StringUtils.pathEquals("./dummy1/dummy2/dummy3", "dummy1/dum/./dum/../../dummy2/dummy3"));
"dummy1/dum/./dum/../../dummy2/dummy3"));
assertFalse("Must be false for relative/absolute paths", assertFalse("Must be false for relative/absolute paths",
StringUtils.pathEquals("./dummy1/dummy2/dummy3", StringUtils.pathEquals("./dummy1/dummy2/dummy3", "/dummy1/dum/./dum/../../dummy2/dummy3"));
"/dummy1/dum/./dum/../../dummy2/dummy3"));
assertFalse("Must be false for different strings", assertFalse("Must be false for different strings",
StringUtils.pathEquals("/dummy1/dummy2/dummy3", StringUtils.pathEquals("/dummy1/dummy2/dummy3", "/dummy1/dummy4/dummy3"));
"/dummy1/dummy4/dummy3"));
assertFalse("Must be false for one false path on 1", assertFalse("Must be false for one false path on 1",
StringUtils.pathEquals("/dummy1/bin/tmp/../dummy2/dummy3", StringUtils.pathEquals("/dummy1/bin/tmp/../dummy2/dummy3", "/dummy1/dummy2/dummy3"));
"/dummy1/dummy2/dummy3"));
assertFalse("Must be false for one false win top path on 2", assertFalse("Must be false for one false win top path on 2",
StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", "C:\\dummy1\\bin\\tmp\\..\\dummy2\\dummy3"));
"C:\\dummy1\\bin\\tmp\\..\\dummy2\\dummy3"));
assertFalse("Must be false for top path on 1 + difference", assertFalse("Must be false for top path on 1 + difference",
StringUtils.pathEquals("/dummy1/bin/../dummy2/dummy3", StringUtils.pathEquals("/dummy1/bin/../dummy2/dummy3", "/dummy1/dummy2/dummy4"));
"/dummy1/dummy2/dummy4"));
} }
@Test @Test