From db056fc148ced53d7fdbb75197701eacc79ad731 Mon Sep 17 00:00:00 2001 From: Jens Wille Date: Tue, 15 Feb 2022 15:56:45 +0100 Subject: [PATCH] Apply relative path "magic" to file maps. Originally introduced for `include()` (#12). --- .../org/metafacture/metafix/FixMethod.java | 20 +++------------ .../java/org/metafacture/metafix/Metafix.java | 15 +++++++++-- .../metafix/MetafixLookupTest.java | 25 +++++++++++++++++++ .../metafix/MetafixScriptTest.java | 23 +++++++++++++++++ .../org/metafacture/metafix/fixes/filemap.fix | 1 + .../metafix/fixes/filemap_lookup.fix | 1 + 6 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 metafix/src/test/resources/org/metafacture/metafix/fixes/filemap.fix create mode 100644 metafix/src/test/resources/org/metafacture/metafix/fixes/filemap_lookup.fix diff --git a/metafix/src/main/java/org/metafacture/metafix/FixMethod.java b/metafix/src/main/java/org/metafacture/metafix/FixMethod.java index 570491b1..73acc041 100644 --- a/metafix/src/main/java/org/metafacture/metafix/FixMethod.java +++ b/metafix/src/main/java/org/metafacture/metafix/FixMethod.java @@ -21,7 +21,6 @@ import org.metafacture.metamorph.api.Maps; import org.metafacture.metamorph.maps.FileMap; -import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; @@ -44,26 +43,13 @@ public enum FixMethod implements FixFunction { @Override public void apply(final Metafix metafix, final Record record, final List params, final Map options) { final String includeFile = params.get(0); - final String includePath; if (!Metafix.isFixFile(includeFile)) { throw new IllegalArgumentException("Not a Fix file: " + includeFile); } // TODO: Catmandu load path - if (includeFile.startsWith(".")) { - final String fixFile = metafix.getFixFile(); - - if (fixFile != null) { - includePath = Paths.get(fixFile).resolveSibling(includeFile).toString(); - } - else { - throw new IllegalArgumentException("Cannot resolve relative path: " + includeFile); - } - } - else { - includePath = includeFile; - } + final String includePath = metafix.resolvePath(includeFile); final RecordTransformer recordTransformer = metafix.getRecordTransformer(); recordTransformer.setRecord(recordTransformer.transformRecord( @@ -83,9 +69,9 @@ public void apply(final Metafix metafix, final Record record, final List final FileMap fileMap = new FileMap(); fileMap.setSeparator(options.getOrDefault(FILEMAP_SEPARATOR_OPTION, FILEMAP_DEFAULT_SEPARATOR)); - fileMap.setFile(fileName); + fileMap.setFile(metafix.resolvePath(fileName)); - metafix.putMap(params.size() <= 1 ? fileName : params.get(1), fileMap); + metafix.putMap(params.size() > 1 ? params.get(1) : fileName, fileMap); } }, put_map { diff --git a/metafix/src/main/java/org/metafacture/metafix/Metafix.java b/metafix/src/main/java/org/metafacture/metafix/Metafix.java index 7a888a0f..76ff7226 100644 --- a/metafix/src/main/java/org/metafacture/metafix/Metafix.java +++ b/metafix/src/main/java/org/metafacture/metafix/Metafix.java @@ -36,6 +36,7 @@ import java.io.Reader; import java.io.StringReader; import java.io.UncheckedIOException; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -126,8 +127,18 @@ public Metafix(final Reader fixDef, final Map vars) { return fixDef.endsWith(FIX_EXTENSION); } - /*package-private*/ String getFixFile() { - return fixFile; + public String resolvePath(final String path) { + if (path.startsWith(".")) { + if (fixFile != null) { + return Paths.get(fixFile).resolveSibling(path).toString(); + } + else { + throw new IllegalArgumentException("Cannot resolve relative path: " + path); + } + } + else { + return path; + } } public RecordTransformer getRecordTransformer() { diff --git a/metafix/src/test/java/org/metafacture/metafix/MetafixLookupTest.java b/metafix/src/test/java/org/metafacture/metafix/MetafixLookupTest.java index 1467ffd0..7b2b88cb 100644 --- a/metafix/src/test/java/org/metafacture/metafix/MetafixLookupTest.java +++ b/metafix/src/test/java/org/metafacture/metafix/MetafixLookupTest.java @@ -155,6 +155,31 @@ public void shouldLookupInSeparateExternalFileMap() { ); } + @Test + public void shouldNotLookupInRelativeExternalFileMapFromInlineScript() { + final String mapFile = "../maps/test.csv"; + + MetafixTestHelpers.assertThrowsCause(IllegalArgumentException.class, "Cannot resolve relative path: " + mapFile, () -> + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + LOOKUP + " '" + mapFile + "')" + ), + i -> { + i.startRecord(""); + i.endRecord(); + }, + o -> { + } + ) + ); + } + + @Test + public void shouldLookupInRelativeExternalFileMapFromExternalScript() { + assertMap( + "src/test/resources/org/metafacture/metafix/fixes/filemap_lookup.fix" + ); + } + @Test public void shouldLookupInSeparateExternalFileMapWithName() { assertMap( diff --git a/metafix/src/test/java/org/metafacture/metafix/MetafixScriptTest.java b/metafix/src/test/java/org/metafacture/metafix/MetafixScriptTest.java index f23c98d1..3563eac1 100644 --- a/metafix/src/test/java/org/metafacture/metafix/MetafixScriptTest.java +++ b/metafix/src/test/java/org/metafacture/metafix/MetafixScriptTest.java @@ -114,6 +114,29 @@ public void shouldPutExternalFileMap() { assertMap("put_filemap('" + CSV_MAP + "')", CSV_MAP); } + @Test + public void shouldNotPutRelativeExternalFileMapFromInlineScript() { + final String mapFile = "../maps/test.csv"; + + MetafixTestHelpers.assertThrowsCause(IllegalArgumentException.class, "Cannot resolve relative path: " + mapFile, () -> + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + "put_filemap('" + mapFile + "')" + ), + i -> { + i.startRecord(""); + i.endRecord(); + }, + o -> { + } + ) + ); + } + + @Test + public void shouldPutRelativeExternalFileMapFromExternalScript() { + assertMap("src/test/resources/org/metafacture/metafix/fixes/filemap.fix", MAP_NAME); + } + @Test public void shouldPutMultipleExternalFileMaps() { assertFix("put_filemap('" + CSV_MAP + "')\nput_filemap('" + TSV_MAP + "')", f -> { diff --git a/metafix/src/test/resources/org/metafacture/metafix/fixes/filemap.fix b/metafix/src/test/resources/org/metafacture/metafix/fixes/filemap.fix new file mode 100644 index 00000000..2084b6a2 --- /dev/null +++ b/metafix/src/test/resources/org/metafacture/metafix/fixes/filemap.fix @@ -0,0 +1 @@ +put_filemap("../maps/test.csv", "testMap") diff --git a/metafix/src/test/resources/org/metafacture/metafix/fixes/filemap_lookup.fix b/metafix/src/test/resources/org/metafacture/metafix/fixes/filemap_lookup.fix new file mode 100644 index 00000000..4a47502e --- /dev/null +++ b/metafix/src/test/resources/org/metafacture/metafix/fixes/filemap_lookup.fix @@ -0,0 +1 @@ +lookup("title.*", "../maps/test.csv")