From c147c3ed0cc1d26fce58b5a6d63f97f37b2b35c0 Mon Sep 17 00:00:00 2001 From: Wesley Willard Date: Thu, 13 Oct 2022 15:25:59 -0500 Subject: [PATCH 1/6] Handle absolute path in getAll method DAT-11890 --- .../liquibase/resource/AbstractPathResourceAccessor.java | 5 +++++ liquibase-core/src/main/java/liquibase/util/FileUtil.java | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java b/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java index d7755b6e8d8..5cd5cb0d454 100644 --- a/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java +++ b/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java @@ -2,6 +2,7 @@ import liquibase.Scope; import liquibase.logging.Logger; +import liquibase.util.FileUtil; import java.io.File; import java.io.IOException; @@ -36,6 +37,10 @@ public List getAll(String path) throws IOException { if (path == null) { return returnList; } + if (FileUtil.isAbsolute(path)) { + log.fine("Path " + path + " in " + getRootPath() + " does not exist"); + return returnList; + } Path finalPath = getRootPath().resolve(path); if (Files.exists(finalPath)) { returnList.add(createResource(finalPath, path)); diff --git a/liquibase-core/src/main/java/liquibase/util/FileUtil.java b/liquibase-core/src/main/java/liquibase/util/FileUtil.java index 77fa42dc122..fbcd38a0853 100644 --- a/liquibase-core/src/main/java/liquibase/util/FileUtil.java +++ b/liquibase-core/src/main/java/liquibase/util/FileUtil.java @@ -52,10 +52,13 @@ public static String getFileNotFoundMessage(String physicalChangeLogLocation) { return message; } - public static boolean isAbsolute(String path) throws IOException { + public static boolean isAbsolute(String path) { if (path == null) { return false; } + if (path.matches("^\\w\\w+:.*")) { + return true; + } return new File(path).isAbsolute(); } From 2ba1311fc7f3d4dfe680065464469930b542273f Mon Sep 17 00:00:00 2001 From: Wesley Willard Date: Thu, 13 Oct 2022 15:39:06 -0700 Subject: [PATCH 2/6] Handle edge case for FileUtil.isAbsolute(path) --- liquibase-core/src/main/java/liquibase/util/FileUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liquibase-core/src/main/java/liquibase/util/FileUtil.java b/liquibase-core/src/main/java/liquibase/util/FileUtil.java index fbcd38a0853..e49eec91049 100644 --- a/liquibase-core/src/main/java/liquibase/util/FileUtil.java +++ b/liquibase-core/src/main/java/liquibase/util/FileUtil.java @@ -56,7 +56,7 @@ public static boolean isAbsolute(String path) { if (path == null) { return false; } - if (path.matches("^\\w\\w+:.*")) { + if (! path.toLowerCase().startsWith("file:") && path.matches("^\\w\\w+:.*")) { return true; } return new File(path).isAbsolute(); From 7ebcb8886782619af7423e7f0520c34babfe1439 Mon Sep 17 00:00:00 2001 From: Wesley Willard Date: Fri, 14 Oct 2022 11:04:55 -0500 Subject: [PATCH 3/6] Another strategy for handling absolute path DAT-11890 --- .../resource/AbstractPathResourceAccessor.java | 11 ++++++----- .../src/main/java/liquibase/util/FileUtil.java | 4 ---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java b/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java index 5cd5cb0d454..ad1d612fcb1 100644 --- a/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java +++ b/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java @@ -37,10 +37,6 @@ public List getAll(String path) throws IOException { if (path == null) { return returnList; } - if (FileUtil.isAbsolute(path)) { - log.fine("Path " + path + " in " + getRootPath() + " does not exist"); - return returnList; - } Path finalPath = getRootPath().resolve(path); if (Files.exists(finalPath)) { returnList.add(createResource(finalPath, path)); @@ -53,7 +49,12 @@ public List getAll(String path) throws IOException { private String standardizePath(String path) { try { - return new File(path).toPath().normalize().toString().replace("\\", "/").replaceFirst("^/", ""); + String rootPath = getRootPath().toString(); + String result = new File(path).toPath().normalize().toString().replace("\\", "/").replaceFirst("^/", ""); + if (rootPath.equals("/") || rootPath.equals("\\")) { + return result; + } + return result.replaceFirst("^\\w:/",""); } catch (InvalidPathException e) { Scope.getCurrentScope().getLog(getClass()).warning("Failed to standardize path " + path, e); return path; diff --git a/liquibase-core/src/main/java/liquibase/util/FileUtil.java b/liquibase-core/src/main/java/liquibase/util/FileUtil.java index fbcd38a0853..3cd117443dc 100644 --- a/liquibase-core/src/main/java/liquibase/util/FileUtil.java +++ b/liquibase-core/src/main/java/liquibase/util/FileUtil.java @@ -56,10 +56,6 @@ public static boolean isAbsolute(String path) { if (path == null) { return false; } - if (path.matches("^\\w\\w+:.*")) { - return true; - } return new File(path).isAbsolute(); } - } From 724e2594331ded10c98c205ddf49caf0e4a4e5d8 Mon Sep 17 00:00:00 2001 From: Wesley Willard Date: Mon, 17 Oct 2022 09:49:10 -0500 Subject: [PATCH 4/6] Added comments --- .../liquibase/resource/AbstractPathResourceAccessor.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java b/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java index ad1d612fcb1..e15a63399a4 100644 --- a/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java +++ b/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java @@ -49,11 +49,19 @@ public List getAll(String path) throws IOException { private String standardizePath(String path) { try { + // + // Flip the separators to Linux-style and replace the first separator + // If then root path is the absolute path for Linux or Windows then return that result + // String rootPath = getRootPath().toString(); String result = new File(path).toPath().normalize().toString().replace("\\", "/").replaceFirst("^/", ""); if (rootPath.equals("/") || rootPath.equals("\\")) { return result; } + + // + // Strip off any Windows drive prefix and return the result + // return result.replaceFirst("^\\w:/",""); } catch (InvalidPathException e) { Scope.getCurrentScope().getLog(getClass()).warning("Failed to standardize path " + path, e); From cebb4afb01dba008d1d05ee3a0380f61296607b0 Mon Sep 17 00:00:00 2001 From: Wesley Willard Date: Mon, 17 Oct 2022 10:26:37 -0500 Subject: [PATCH 5/6] Removed accidental commit DAT-11890 --- .../renameColumn/sqlite.sql | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 liquibase-core/src/test/java/liquibase/verify/saved_state/compareGeneratedSqlWithExpectedSqlForMinimalChangesets/renameColumn/sqlite.sql diff --git a/liquibase-core/src/test/java/liquibase/verify/saved_state/compareGeneratedSqlWithExpectedSqlForMinimalChangesets/renameColumn/sqlite.sql b/liquibase-core/src/test/java/liquibase/verify/saved_state/compareGeneratedSqlWithExpectedSqlForMinimalChangesets/renameColumn/sqlite.sql deleted file mode 100644 index 5fede009dc9..00000000000 --- a/liquibase-core/src/test/java/liquibase/verify/saved_state/compareGeneratedSqlWithExpectedSqlForMinimalChangesets/renameColumn/sqlite.sql +++ /dev/null @@ -1,5 +0,0 @@ --- Database: sqlite --- Change Parameter: newColumnName=full_name --- Change Parameter: oldColumnName=name --- Change Parameter: tableName=person -ALTER TABLE person RENAME COLUMN name TO full_name; From 00c257358648aa88812ab9177fa04495fa2625fc Mon Sep 17 00:00:00 2001 From: Wesley Willard Date: Mon, 17 Oct 2022 14:11:44 -0500 Subject: [PATCH 6/6] Added a unit test for ResourceAccessor.getAll() to test full Windows path DAT-11890 --- .../DirectoryResourceAccessorTest.groovy | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/liquibase-core/src/test/groovy/liquibase/resource/DirectoryResourceAccessorTest.groovy b/liquibase-core/src/test/groovy/liquibase/resource/DirectoryResourceAccessorTest.groovy index a908aa78b23..561a119244e 100644 --- a/liquibase-core/src/test/groovy/liquibase/resource/DirectoryResourceAccessorTest.groovy +++ b/liquibase-core/src/test/groovy/liquibase/resource/DirectoryResourceAccessorTest.groovy @@ -93,14 +93,15 @@ class DirectoryResourceAccessorTest extends Specification { simpleTestAccessor.getAll(path)*.getPath() == expected where: - path | expected - "liquibase/resource/DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] - "/liquibase/resource/DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] - "liquibase\\resource\\DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] - "\\liquibase\\resource\\DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] - "com/example/file with space.txt" | ["com/example/file with space.txt"] - "com\\example\\file with space.txt" | ["com/example/file with space.txt"] - "com/example/file with space.txt" | ["com/example/file with space.txt"] + path | expected + "liquibase/resource/DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] + "/liquibase/resource/DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] + "liquibase\\resource\\DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] + "\\liquibase\\resource\\DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] + "com/example/file with space.txt" | ["com/example/file with space.txt"] + "com\\example\\file with space.txt" | ["com/example/file with space.txt"] + "com/example/file with space.txt" | ["com/example/file with space.txt"] + "c:\\liquibase\\resource\\DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] } def "getAll returns empty if nothing matches"() {