From fabc74ea254bc0db5eade234ba578fa1ce53c624 Mon Sep 17 00:00:00 2001 From: Gisli Magnusson Date: Fri, 5 Dec 2025 01:56:43 +0000 Subject: [PATCH 1/2] feat(ENGKNOW-2957): More control over link data path. --- .../gorpipe/gor/driver/GorDriverConfig.java | 6 ++++ .../gorpipe/gor/driver/linkfile/LinkFile.java | 17 +++++++++-- .../gor/driver/linkfile/LinkFileTest.java | 28 +++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/model/src/main/java/org/gorpipe/gor/driver/GorDriverConfig.java b/model/src/main/java/org/gorpipe/gor/driver/GorDriverConfig.java index d97c1496..460cc110 100644 --- a/model/src/main/java/org/gorpipe/gor/driver/GorDriverConfig.java +++ b/model/src/main/java/org/gorpipe/gor/driver/GorDriverConfig.java @@ -187,4 +187,10 @@ public interface GorDriverConfig extends Config { @Key(GOR_DRIVER_LINK_MANAGED_DATA_FILES_URL) @DefaultValue("") String managedLinkDataFilesURL(); + + String GOR_DRIVER_LINK_INFER_REPLACE = "GOR_DRIVER_LINK_INFER_REPLACE"; + @Documentation("Replacement patterns when inferring link file paths ([;]).") + @Key(GOR_DRIVER_LINK_INFER_REPLACE) + @DefaultValue("") + String linkeInferReplace(); } \ No newline at end of file diff --git a/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFile.java b/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFile.java index 8efe2413..940cb03b 100644 --- a/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFile.java +++ b/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFile.java @@ -59,7 +59,7 @@ public abstract class LinkFile { public static final int LINK_FILE_MAX_SIZE = 10000; - private static final boolean USE_LINK_CACHE = Boolean.parseBoolean(System.getProperty("gor.driver.cache.link", "true")); + private static final boolean USE_LINK_CACHE = Boolean.parseBoolean(System.getProperty("gor.driver.link.cache", "true")); private static final Cache linkCache = Caffeine.newBuilder() .maximumSize(10000) .expireAfterWrite(2, TimeUnit.HOURS).build(); @@ -101,11 +101,21 @@ public static String inferDataFileNameFromLinkFile(StreamSource linkSource, Stri var linkPath = linkSource.getSourceReference().getUrl(); + // Remove common the root if set. + var pathReplacements = System.getenv("GOR_DRIVER_LINK_INFER_REPLACE"); + if (!Strings.isNullOrEmpty(pathReplacements)) { + var parts = pathReplacements.split(";"); + linkPath = linkPath.replaceAll(parts[0], parts.length > 1 ? parts[1] : ""); + } + + // Adjust link path so it suitable as part of data file path. if (PathUtils.isAbsolutePath(linkPath)) { - throw new IllegalArgumentException("Link file path is absolute. Can not infer data file name: " + linkSource.getFullPath()); + throw new IllegalArgumentException("Link file path is absolute and gor.driver.link.common.root is not set. Can not infer data file name: " + linkSource.getFullPath()); } var dataFileRootPath = ""; + + // Get root from the link file var link = linkSource.exists() ? load(linkSource).appendMeta(linkFileMeta) : create(linkSource, linkFileMeta); @@ -114,6 +124,7 @@ public static String inferDataFileNameFromLinkFile(StreamSource linkSource, Stri dataFileRootPath = linkDataFileRootPath; } + // Get root from global const if (Strings.isNullOrEmpty(dataFileRootPath)) { dataFileRootPath = System.getenv(GorDriverConfig.GOR_DRIVER_LINK_MANAGED_DATA_FILES_URL); } @@ -122,6 +133,7 @@ public static String inferDataFileNameFromLinkFile(StreamSource linkSource, Stri throw new IllegalArgumentException("Link file data root path is not set. Can not infer data file name from link file: " + linkSource.getFullPath()); } + // Create file name String randomString = RandomStringUtils.random(8, true, true); var linkPathSplit = linkPath.indexOf('.'); if (linkPathSplit > 0) { @@ -135,6 +147,7 @@ public static String inferDataFileNameFromLinkFile(StreamSource linkSource, Stri linkPath = linkPath.replaceAll("\\.link$", ""); + // Insert project var project = linkSource.getSourceReference().getCommonRoot() != null ? PathUtils.getFileName(linkSource.getSourceReference().getCommonRoot()) : ""; if (!Strings.isNullOrEmpty(project)) { diff --git a/model/src/test/java/org/gorpipe/gor/driver/linkfile/LinkFileTest.java b/model/src/test/java/org/gorpipe/gor/driver/linkfile/LinkFileTest.java index 9156417e..3ac2cbd7 100644 --- a/model/src/test/java/org/gorpipe/gor/driver/linkfile/LinkFileTest.java +++ b/model/src/test/java/org/gorpipe/gor/driver/linkfile/LinkFileTest.java @@ -8,6 +8,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.contrib.java.lang.system.EnvironmentVariables; +import org.junit.contrib.java.lang.system.RestoreSystemProperties; import org.junit.rules.TemporaryFolder; import java.io.ByteArrayInputStream; @@ -26,6 +27,9 @@ public class LinkFileTest { @Rule public TemporaryFolder workDir = new TemporaryFolder(); + @Rule + public final RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties(); + @Rule public final EnvironmentVariables environmentVariables = new EnvironmentVariables(); @@ -237,4 +241,28 @@ public void testInferDataFileNameFromLinkFile_FromMetaParam_ExistingFile() throw assertNotNull(result); assertTrue(result.matches((paramroot + "/x\\..*\\.gor").replace("/", "\\/"))); } + + @Test + public void testInferDataFileNameFromLinkFile_PathReplace() throws Exception { + String root = "/managed/root"; + environmentVariables.set(GorDriverConfig.GOR_DRIVER_LINK_MANAGED_DATA_FILES_URL, root); + environmentVariables.set(GorDriverConfig.GOR_DRIVER_LINK_INFER_REPLACE, "wont;will"); + + String result = LinkFile.inferDataFileNameFromLinkFile(new FileSource("wont/x.gor.link"), null); + + assertNotNull(result); + assertTrue(result.matches((root + "/will/x\\..*\\.gor").replace("/", "\\/"))); + } + + @Test + public void testInferDataFileNameFromLinkFile_AbsolutePathReplace() throws Exception { + String root = "/managed/root"; + environmentVariables.set(GorDriverConfig.GOR_DRIVER_LINK_MANAGED_DATA_FILES_URL, root); + environmentVariables.set(GorDriverConfig.GOR_DRIVER_LINK_INFER_REPLACE, "\\/abs\\/"); + + String result = LinkFile.inferDataFileNameFromLinkFile(new FileSource("/abs/path/x.gor.link"), null); + + assertNotNull(result); + assertTrue(result.matches((root + "/path/x\\..*\\.gor").replace("/", "\\/"))); + } } From f924978d7d45f1e43f97f0d0272223fbad529db5 Mon Sep 17 00:00:00 2001 From: Gisli Magnusson Date: Mon, 8 Dec 2025 14:28:25 +0000 Subject: [PATCH 2/2] feat(ENGKNOW-2957): More control over link data path. --- .../src/main/java/org/gorpipe/gor/driver/linkfile/LinkFile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFile.java b/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFile.java index 940cb03b..be184836 100644 --- a/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFile.java +++ b/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFile.java @@ -104,7 +104,7 @@ public static String inferDataFileNameFromLinkFile(StreamSource linkSource, Stri // Remove common the root if set. var pathReplacements = System.getenv("GOR_DRIVER_LINK_INFER_REPLACE"); if (!Strings.isNullOrEmpty(pathReplacements)) { - var parts = pathReplacements.split(";"); + var parts = pathReplacements.split(";", 2); linkPath = linkPath.replaceAll(parts[0], parts.length > 1 ? parts[1] : ""); }