Skip to content

Commit 51475d8

Browse files
committed
Merge #317 from remote-tracking branch 'origin/301-allowUrlInFilemap_new'
2 parents 2294a74 + 6fe3a71 commit 51475d8

File tree

3 files changed

+60
-22
lines changed

3 files changed

+60
-22
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ nothing()
177177

178178
##### `put_filemap`
179179

180-
Defines an external map for [lookup](#lookup) from a file. Maps with more than 2 columns are supported but are reduced to a defined key and a value column.
180+
Defines an external map for [lookup](#lookup) from a file or a URL. Maps with more than 2 columns are supported but are reduced to a defined key and a value column.
181181

182182
```perl
183183
put_filemap("<sourceFile>", "<mapName>", sep_char: "\t")

metafix/src/main/java/org/metafacture/metafix/Metafix.java

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
import java.io.Reader;
3737
import java.io.StringReader;
3838
import java.io.UncheckedIOException;
39+
import java.net.MalformedURLException;
40+
import java.net.URL;
3941
import java.nio.file.Path;
4042
import java.nio.file.Paths;
4143
import java.util.ArrayList;
@@ -56,8 +58,7 @@
5658
* @author Christoph Böhme (Metamorph)
5759
* @author Fabian Steeg (Metafix)
5860
*/
59-
public class Metafix implements StreamPipe<StreamReceiver>, Maps {
60-
61+
public class Metafix implements StreamPipe<StreamReceiver>, Maps { // checkstyle-disable-line ClassDataAbstractionCoupling
6162
public static final String ARRAY_MARKER = "[]";
6263
public static final String FIX_EXTENSION = ".fix";
6364
public static final String VAR_END = "]";
@@ -148,26 +149,44 @@ public void literal(final String name, final String value) {
148149
}
149150

150151
public String resolvePath(final String path) {
151-
final Path basePath;
152+
final String resolvedPath;
152153

153-
if (path.startsWith(".")) {
154-
if (fixFile != null) {
155-
basePath = getPath(fixFile).getParent();
154+
if (isValidUrl(path)) {
155+
resolvedPath = path;
156+
LOG.debug("Resolved path: url = '{}'", resolvedPath);
157+
}
158+
else {
159+
final Path basePath;
160+
161+
if (path.startsWith(".")) {
162+
if (fixFile != null) {
163+
basePath = getPath(fixFile).getParent();
164+
}
165+
else {
166+
throw new IllegalArgumentException("Cannot resolve relative path: " + path);
167+
}
156168
}
157169
else {
158-
throw new IllegalArgumentException("Cannot resolve relative path: " + path);
170+
basePath = getPath("");
159171
}
160-
}
161-
else {
162-
basePath = getPath("");
163-
}
164172

165-
final String resolvedPath = basePath.resolve(path).normalize().toString();
166-
LOG.debug("Resolved path: base = '{}', path = '{}', result = '{}'", basePath, path, resolvedPath);
173+
resolvedPath = basePath.resolve(path).normalize().toString();
174+
LOG.debug("Resolved path: base = '{}', path = '{}', result = '{}'", basePath, path, resolvedPath);
175+
}
167176

168177
return resolvedPath;
169178
}
170179

180+
private boolean isValidUrl(final String url) {
181+
try {
182+
new URL(url);
183+
return true;
184+
}
185+
catch (final MalformedURLException e) {
186+
return false;
187+
}
188+
}
189+
171190
private Path getPath(final String path) {
172191
return Paths.get(path).toAbsolutePath().normalize();
173192
}

metafix/src/test/java/org/metafacture/metafix/MetafixLookupTest.java

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.io.IOException;
3636
import java.io.InputStreamReader;
3737
import java.util.Arrays;
38+
import java.util.Objects;
3839
import java.util.stream.Collectors;
3940

4041
/**
@@ -46,6 +47,8 @@
4647
@ExtendWith(MockitoExtension.class)
4748
public class MetafixLookupTest {
4849
private static final String CSV_MAP = "src/test/resources/org/metafacture/metafix/maps/test.csv";
50+
private static final String CSV_PATH = "/maps/test.csv";
51+
private static final String CSV_URL = "%s" + CSV_PATH;
4952
private static final String RDF_MAP = "src/test/resources/org/metafacture/metafix/maps/test.ttl";
5053
private static final String HCRT_RDF_MAP = "src/test/resources/org/metafacture/metafix/maps/hcrt.ttl";
5154
private static final String RDF_PATH = "/maps/rpb.ttl";
@@ -67,20 +70,27 @@ public MetafixLookupTest() {
6770
private static void setStubForWireMock() {
6871
WIRE_MOCK_SERVER.start();
6972

70-
final UrlPattern urlPattern = WireMock.urlPathEqualTo(RDF_PATH);
73+
// stubs for RDF
74+
final UrlPattern rdfUrlPattern = WireMock.urlPathEqualTo(RDF_PATH);
7175
final String redirectToUrl = "/redirect" + RDF_PATH;
7276
final UrlPattern urlPatternRedirectToUrl = WireMock.urlPathEqualTo(redirectToUrl);
73-
74-
WIRE_MOCK_SERVER.stubFor(WireMock.get(urlPattern)
77+
WIRE_MOCK_SERVER.stubFor(WireMock.get(rdfUrlPattern)
7578
.willReturn(WireMock.temporaryRedirect(redirectToUrl)));
76-
77-
final String responseBody = new BufferedReader(new InputStreamReader(
78-
MetafixLookupTest.class.getResourceAsStream("." + RDF_PATH))).lines().collect(Collectors.joining("\n"));
79-
79+
final String rdfResponseBody = loadFile(RDF_PATH);
8080
WIRE_MOCK_SERVER.stubFor(WireMock.get(urlPatternRedirectToUrl)
8181
.willReturn(WireMock.aResponse()
8282
.withHeader("Content-Type", "text/turtle")
83-
.withBody(responseBody)));
83+
.withBody(rdfResponseBody)));
84+
85+
// stub for CSV
86+
final UrlPattern csvUrlPattern = WireMock.urlPathEqualTo(CSV_PATH);
87+
final String csvResponseBody = loadFile(CSV_PATH);
88+
WIRE_MOCK_SERVER.stubFor(WireMock.get(csvUrlPattern).willReturn(WireMock.aResponse().withBody(csvResponseBody)));
89+
}
90+
91+
private static String loadFile(final String path) {
92+
return new BufferedReader(new InputStreamReader(
93+
Objects.requireNonNull(MetafixLookupTest.class.getResourceAsStream("." + path)))).lines().collect(Collectors.joining("\n"));
8494
}
8595

8696
@AfterAll
@@ -419,6 +429,15 @@ public void csv() {
419429
);
420430
}
421431

432+
@Test
433+
public void csvViaUrl() {
434+
final String baseUrl = WIRE_MOCK_SERVER.baseUrl();
435+
final String mockedCsvUrl = String.format(CSV_URL, baseUrl);
436+
assertMap(
437+
LOOKUP + " '" + mockedCsvUrl + "')"
438+
);
439+
}
440+
422441
@Test
423442
public void tsv() {
424443
assertMap(

0 commit comments

Comments
 (0)