diff --git a/gortools/src/main/scala/gorsat/Analysis/ForkWrite.scala b/gortools/src/main/scala/gorsat/Analysis/ForkWrite.scala index 92835e32..61885b76 100644 --- a/gortools/src/main/scala/gorsat/Analysis/ForkWrite.scala +++ b/gortools/src/main/scala/gorsat/Analysis/ForkWrite.scala @@ -159,10 +159,11 @@ case class ForkWrite(forkCol: Int, fullFileName.replace("#{fork}", forkValue).replace("""${fork}""", forkValue) } else { if (fullFileName.isEmpty && options.linkFile.nonEmpty) { + val (linkFileMeta, linkFileInfo) = extractLinkMetaInfo(options.linkFileMeta) val linkSourceRef = new SourceReference(options.linkFile, null, projectContext.getFileReader.getCommonRoot, null, null, true); // Infer the full file name from the link (and defautl locations) LinkFile.inferDataFileNameFromLinkFile( - projectContext.getFileReader.resolveDataSource(linkSourceRef).asInstanceOf[StreamSource]); + projectContext.getFileReader.resolveDataSource(linkSourceRef).asInstanceOf[StreamSource], linkFileMeta); } else { fullFileName } @@ -380,10 +381,15 @@ case class ForkWrite(forkCol: Int, linkFileContent = dataSource.getProjectLinkFileContent } } + val (linkFileMeta, linkFileInfo) = extractLinkMetaInfo(optLinkFileMeta) + (linkFile, linkFileContent, linkFileMeta, linkFileInfo) + } + + private def extractLinkMetaInfo(optLinkFileMeta: String) : (String, String) = { var linkFileMeta = "" var linkFileInfo = "" - if (linkFile.nonEmpty && !Strings.isNullOrEmpty(optLinkFileMeta)) { + if (!Strings.isNullOrEmpty(optLinkFileMeta)) { for (s <- CommandParseUtilities.quoteSafeSplit(StringUtils.strip(optLinkFileMeta, "\"\'"), ',')) { val l = s.trim if (l.startsWith(LinkFileEntryV1.ENTRY_INFO_KEY)) { @@ -394,7 +400,7 @@ case class ForkWrite(forkCol: Int, } } - (linkFile, linkFileContent, linkFileMeta, linkFileInfo) + (linkFileMeta, linkFileInfo) } private def writeLinkFile(linkFilePath: String, linkFileContent: String, 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 816e20df..8efe2413 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 @@ -91,9 +91,10 @@ public static String validateAndUpdateLinkFileName(String linkFilePath) { * Infer the data file name from the link file name. * * @param linkSource the link file path with the link extension + * @param linkFileMeta additional link file meta data * @return the data file path */ - public static String inferDataFileNameFromLinkFile(StreamSource linkSource) throws IOException { + public static String inferDataFileNameFromLinkFile(StreamSource linkSource, String linkFileMeta) throws IOException { if (linkSource == null || Strings.isNullOrEmpty(linkSource.getFullPath())) { throw new IllegalArgumentException("Link file path is null or empty. Can not infer data file name."); } @@ -105,13 +106,12 @@ public static String inferDataFileNameFromLinkFile(StreamSource linkSource) thro } var dataFileRootPath = ""; - - if (linkSource.exists()) { - var link = load(linkSource); - var linkDataFileRootPath = link.getMeta().getProperty(LinkFileMeta.HEADER_CONTENT_LOCATION_MANAGED_KEY); - if (!Strings.isNullOrEmpty(linkDataFileRootPath)) { - dataFileRootPath = linkDataFileRootPath; - } + var link = linkSource.exists() + ? load(linkSource).appendMeta(linkFileMeta) + : create(linkSource, linkFileMeta); + var linkDataFileRootPath = link.getMeta().getProperty(LinkFileMeta.HEADER_CONTENT_LOCATION_MANAGED_KEY); + if (!Strings.isNullOrEmpty(linkDataFileRootPath)) { + dataFileRootPath = linkDataFileRootPath; } if (Strings.isNullOrEmpty(dataFileRootPath)) { diff --git a/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFileMeta.java b/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFileMeta.java index b37abb2f..1dc7df45 100644 --- a/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFileMeta.java +++ b/model/src/main/java/org/gorpipe/gor/driver/linkfile/LinkFileMeta.java @@ -11,9 +11,9 @@ public class LinkFileMeta extends BaseMeta { public static final String HEADER_ENTRIES_COUNT_MAX_KEY = "ENTRIES_COUNT_MAX"; // Max age of entries to keep track of in the link file. public static final String HEADER_ENTRIES_AGE_MAX_KEY = "ENTRIES_AGE_MAX"; - // Determines if the content data location should be managed. + // Path if the managed content data location. public static final String HEADER_CONTENT_LOCATION_MANAGED_KEY = "CONTENT_LOCATION_MANAGED"; - // Should the content lifecycle be managed (data deleted if the link is removed from the link file). + // Should the content lifecycle be managed (data deleted if the link is removed from the link file) (true or false). public static final String HEADER_CONTENT_LIFECYCLE_MANAGED_KEY = "CONTENT_LIFECYCLE_MANAGED"; public static final String[] DEFAULT_TABLE_HEADER = new String[] {"File", "Timestamp", "MD5", "Serial", "Info"}; 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 f2bb7ff6..9156417e 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 @@ -168,18 +168,18 @@ public void testSaveLinkFileV1ToV0() throws IOException { @Test(expected = IllegalArgumentException.class) public void testInferDataFileNameFromLinkFile_NullOrEmptyPath() throws Exception { - LinkFile.inferDataFileNameFromLinkFile(new FileSource("")); + LinkFile.inferDataFileNameFromLinkFile(new FileSource(""), null); } @Test(expected = IllegalArgumentException.class) public void testInferDataFileNameFromLinkFile_AbsolutePath() throws Exception { - LinkFile.inferDataFileNameFromLinkFile(new FileSource("/abs/path/x.link")); + LinkFile.inferDataFileNameFromLinkFile(new FileSource("/abs/path/x.link"), null); } @Test(expected = IllegalArgumentException.class) public void testInferDataFileNameFromLinkFile_NoRootConfigured() throws Exception { environmentVariables.set(GorDriverConfig.GOR_DRIVER_LINK_MANAGED_DATA_FILES_URL, null); - LinkFile.inferDataFileNameFromLinkFile(new FileSource("x.link")); + LinkFile.inferDataFileNameFromLinkFile(new FileSource("x.link"), null); } @Test @@ -187,11 +187,9 @@ public void testInferDataFileNameFromLinkFile_FromEnvVariable_WithProject() thro String root = "/managed/root"; environmentVariables.set(GorDriverConfig.GOR_DRIVER_LINK_MANAGED_DATA_FILES_URL, root); - String result = LinkFile.inferDataFileNameFromLinkFile(new FileSource(new SourceReference("x.gor.link", null, "/projects/test", -1, null, null, false, false))); + String result = LinkFile.inferDataFileNameFromLinkFile(new FileSource(new SourceReference("x.gor.link", null, "/projects/test", -1, null, null, false, false)), null); assertNotNull(result); - assertTrue(result.startsWith(root + "/test/x")); - assertFalse(result.endsWith(".gor.link")); - assertNotEquals(result, root + "/test/x.gor.link"); + assertTrue(result.matches((root + "/test/x\\..*\\.gor").replace("/", "\\/"))); } @Test @@ -199,10 +197,44 @@ public void testInferDataFileNameFromLinkFile_FromEnvVariable_WithOutProject() t String root = "/managed/root"; environmentVariables.set(GorDriverConfig.GOR_DRIVER_LINK_MANAGED_DATA_FILES_URL, root); - String result = LinkFile.inferDataFileNameFromLinkFile(new FileSource("x.gor.link")); + String result = LinkFile.inferDataFileNameFromLinkFile(new FileSource("x.gor.link"), null); + assertTrue(result.matches((root + "/x\\..*\\.gor").replace("/", "\\/"))); + } + + @Test + public void testInferDataFileNameFromLinkFile_FromExiting_File() throws Exception { + String root = "/managed/fromfile"; + String linkFilePath = "x.gor.link"; + Files.createDirectory(workPath.resolve("test")); + Files.writeString(workPath.resolve("test").resolve(linkFilePath), "## " + LinkFileMeta.HEADER_CONTENT_LOCATION_MANAGED_KEY + " = " + root + "\nsource/y.gorz\n"); + + String result = LinkFile.inferDataFileNameFromLinkFile(new FileSource(new SourceReference(linkFilePath, null, workPath.resolve("test").toString(), -1, null, null, false, false)), null); + assertNotNull(result); + assertTrue(result.matches((root + "/test/x\\..*\\.gor").replace("/", "\\/"))); + } + + @Test + public void testInferDataFileNameFromLinkFile_FromMetaParam() throws Exception { + String root = "/managed/fromparam"; + String linkFilePath = "x.gor.link"; + String linkFileMeta = "## " + LinkFileMeta.HEADER_CONTENT_LOCATION_MANAGED_KEY + " = " + root; + + String result = LinkFile.inferDataFileNameFromLinkFile(new FileSource(new SourceReference(linkFilePath)), linkFileMeta); + assertNotNull(result); + assertTrue(result.matches((root + "/x\\..*\\.gor").replace("/", "\\/"))); + } + + @Test + public void testInferDataFileNameFromLinkFile_FromMetaParam_ExistingFile() throws Exception { + String fileroot = "/managed/fromfile"; + String linkFilePath = "x.gor.link"; + Files.writeString(workPath.resolve(linkFilePath), "## " + LinkFileMeta.HEADER_CONTENT_LOCATION_MANAGED_KEY + " = " + fileroot + "\nsource/y.gorz\n"); + + String paramroot = "/managed/fromparam"; + String linkFileMeta = "## " + LinkFileMeta.HEADER_CONTENT_LOCATION_MANAGED_KEY + " = " + paramroot; + + String result = LinkFile.inferDataFileNameFromLinkFile(new FileSource(new SourceReference(linkFilePath)), linkFileMeta); assertNotNull(result); - assertTrue(result.startsWith(root + "/x")); - assertFalse(result.endsWith(".gor.link")); - assertNotEquals(result, root + "/x.gor.link"); + assertTrue(result.matches((paramroot + "/x\\..*\\.gor").replace("/", "\\/"))); } }