Skip to content
This repository was archived by the owner on Oct 29, 2025. It is now read-only.

Commit f3bb4fe

Browse files
committed
refactor: split resource map from resource factory
1 parent 26f264f commit f3bb4fe

File tree

9 files changed

+85
-87
lines changed

9 files changed

+85
-87
lines changed

core/riot-file/src/main/java/com/redis/riot/file/FileReaderRegistry.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ public ReaderFactory getReaderFactory(MimeType type) {
1919

2020
public static FileReaderRegistry defaultReaderRegistry() {
2121
FileReaderRegistry registry = new FileReaderRegistry();
22-
registry.register(ResourceFactory.JSON, new JsonReaderFactory());
23-
registry.register(ResourceFactory.JSON_LINES, new JsonLinesReaderFactory());
24-
registry.register(ResourceFactory.XML, new XmlReaderFactory());
25-
registry.register(ResourceFactory.CSV, new DelimitedReaderFactory(FileOptions.DELIMITER_COMMA));
26-
registry.register(ResourceFactory.PSV, new DelimitedReaderFactory(FileOptions.DELIMITER_PIPE));
27-
registry.register(ResourceFactory.TSV, new DelimitedReaderFactory(FileOptions.DELIMITER_TAB));
28-
registry.register(ResourceFactory.TEXT, new FixedWidthReaderFactory());
22+
registry.register(RiotResourceMap.JSON, new JsonReaderFactory());
23+
registry.register(RiotResourceMap.JSON_LINES, new JsonLinesReaderFactory());
24+
registry.register(RiotResourceMap.XML, new XmlReaderFactory());
25+
registry.register(RiotResourceMap.CSV, new DelimitedReaderFactory(FileOptions.DELIMITER_COMMA));
26+
registry.register(RiotResourceMap.PSV, new DelimitedReaderFactory(FileOptions.DELIMITER_PIPE));
27+
registry.register(RiotResourceMap.TSV, new DelimitedReaderFactory(FileOptions.DELIMITER_TAB));
28+
registry.register(RiotResourceMap.TEXT, new FixedWidthReaderFactory());
2929
return registry;
3030
}
3131

core/riot-file/src/main/java/com/redis/riot/file/FileWriterRegistry.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ public WriterFactory getWriterFactory(MimeType type) {
1919

2020
public static FileWriterRegistry defaultWriterRegistry() {
2121
FileWriterRegistry registry = new FileWriterRegistry();
22-
registry.register(ResourceFactory.JSON, new JsonWriterFactory());
23-
registry.register(ResourceFactory.JSON_LINES, new JsonLinesWriterFactory());
24-
registry.register(ResourceFactory.XML, new XmlWriterFactory());
25-
registry.register(ResourceFactory.CSV, new DelimitedWriterFactory(FileOptions.DELIMITER_COMMA));
26-
registry.register(ResourceFactory.PSV, new DelimitedWriterFactory(FileOptions.DELIMITER_PIPE));
27-
registry.register(ResourceFactory.TSV, new DelimitedWriterFactory(FileOptions.DELIMITER_TAB));
28-
registry.register(ResourceFactory.TEXT, new FormattedWriterFactory());
22+
registry.register(RiotResourceMap.JSON, new JsonWriterFactory());
23+
registry.register(RiotResourceMap.JSON_LINES, new JsonLinesWriterFactory());
24+
registry.register(RiotResourceMap.XML, new XmlWriterFactory());
25+
registry.register(RiotResourceMap.CSV, new DelimitedWriterFactory(FileOptions.DELIMITER_COMMA));
26+
registry.register(RiotResourceMap.PSV, new DelimitedWriterFactory(FileOptions.DELIMITER_PIPE));
27+
registry.register(RiotResourceMap.TSV, new DelimitedWriterFactory(FileOptions.DELIMITER_TAB));
28+
registry.register(RiotResourceMap.TEXT, new FormattedWriterFactory());
2929
return registry;
3030
}
3131

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.redis.riot.file;
22

33
import java.io.IOException;
4-
import java.net.FileNameMap;
54
import java.util.HashSet;
65
import java.util.Set;
76
import java.util.zip.GZIPInputStream;
@@ -11,58 +10,13 @@
1110
import org.springframework.core.io.Resource;
1211
import org.springframework.core.io.WritableResource;
1312
import org.springframework.util.Assert;
14-
import org.springframework.util.MimeType;
15-
import org.springframework.util.MimeTypeUtils;
1613

1714
public class ResourceFactory {
1815

1916
public static final String GZ_SUFFIX = ".gz";
2017

21-
public static final MimeType CSV = new MimeType("text", "csv");
22-
public static final MimeType PSV = new MimeType("text", "psv");
23-
public static final MimeType TSV = new MimeType("text", "tsv");
24-
public static final MimeType TEXT = new MimeType("text", "plain");
25-
public static final MimeType JSON = MimeTypeUtils.APPLICATION_JSON;
26-
public static final MimeType JSON_LINES = new MimeType("application", "jsonlines");
27-
public static final MimeType XML = MimeTypeUtils.APPLICATION_XML;
28-
29-
private ResourceMap resourceMap = defaultResourceMap();
3018
private Set<ProtocolResolver> protocolResolvers = new HashSet<>();
3119

32-
public MimeType type(Resource resource) {
33-
return MimeType.valueOf(resourceMap.getContentTypeFor(resource));
34-
}
35-
36-
public MimeType type(Resource resource, FileOptions options) {
37-
if (options.getContentType() == null) {
38-
return MimeType.valueOf(resourceMap.getContentTypeFor(resource));
39-
}
40-
return options.getContentType();
41-
}
42-
43-
private static class JsonLinesFileNameMap implements FileNameMap {
44-
45-
public static final String JSONL_SUFFIX = ".jsonl";
46-
47-
@Override
48-
public String getContentTypeFor(String fileName) {
49-
if (fileName == null) {
50-
return null;
51-
}
52-
if (fileName.endsWith(JSONL_SUFFIX)) {
53-
return JSON_LINES.toString();
54-
}
55-
return null;
56-
}
57-
58-
}
59-
60-
public static ResourceMap defaultResourceMap() {
61-
RiotResourceMap resourceMap = new RiotResourceMap();
62-
resourceMap.addFileNameMap(new JsonLinesFileNameMap());
63-
return resourceMap;
64-
}
65-
6620
public void addProtocolResolver(ProtocolResolver protocolResolver) {
6721
protocolResolvers.add(protocolResolver);
6822
}
@@ -110,12 +64,4 @@ public static String stripGzipSuffix(String filename) {
11064
return filename;
11165
}
11266

113-
public ResourceMap getResourceMap() {
114-
return resourceMap;
115-
}
116-
117-
public void setResourceMap(ResourceMap resourceMap) {
118-
this.resourceMap = resourceMap;
119-
}
120-
12167
}
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
11
package com.redis.riot.file;
22

33
import org.springframework.core.io.Resource;
4+
import org.springframework.util.MimeType;
5+
import org.springframework.util.MimeTypeUtils;
46

57
public interface ResourceMap {
68

7-
String getContentTypeFor(Resource resource);
9+
MimeType CSV = new MimeType("text", "csv");
10+
MimeType PSV = new MimeType("text", "psv");
11+
MimeType TSV = new MimeType("text", "tsv");
12+
MimeType TEXT = new MimeType("text", "plain");
13+
MimeType JSON = MimeTypeUtils.APPLICATION_JSON;
14+
MimeType JSON_LINES = new MimeType("application", "jsonlines");
15+
MimeType XML = MimeTypeUtils.APPLICATION_XML;
16+
17+
MimeType getContentTypeFor(Resource resource);
818

919
}

core/riot-file/src/main/java/com/redis/riot/file/RiotResourceMap.java

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Set;
99

1010
import org.springframework.core.io.Resource;
11+
import org.springframework.util.MimeType;
1112

1213
public class RiotResourceMap implements ResourceMap {
1314

@@ -18,7 +19,7 @@ public void addFileNameMap(FileNameMap map) {
1819
}
1920

2021
@Override
21-
public String getContentTypeFor(Resource resource) {
22+
public MimeType getContentTypeFor(Resource resource) {
2223
String type = null;
2324
if (resource.isFile()) {
2425
try {
@@ -30,22 +31,44 @@ public String getContentTypeFor(Resource resource) {
3031
if (type == null) {
3132
return getContentTypeFor(resource.getFilename());
3233
}
33-
return type;
34+
return MimeType.valueOf(type);
3435
}
3536

36-
public String getContentTypeFor(String filename) {
37+
public MimeType getContentTypeFor(String filename) {
3738
String normalizedFilename = ResourceFactory.stripGzipSuffix(filename);
3839
String type = URLConnection.guessContentTypeFromName(normalizedFilename);
3940
if (type != null) {
40-
return type;
41+
return MimeType.valueOf(type);
4142
}
4243
for (FileNameMap nameMap : fileNameMaps) {
4344
String mapType = nameMap.getContentTypeFor(normalizedFilename);
4445
if (mapType != null) {
45-
return mapType;
46+
return MimeType.valueOf(mapType);
4647
}
4748
}
4849
throw new IllegalArgumentException("Could not determine type of " + filename);
4950
}
5051

52+
public static RiotResourceMap defaultResourceMap() {
53+
RiotResourceMap resourceMap = new RiotResourceMap();
54+
resourceMap.addFileNameMap(new JsonLinesFileNameMap());
55+
return resourceMap;
56+
}
57+
58+
private static class JsonLinesFileNameMap implements FileNameMap {
59+
60+
public static final String JSONL_SUFFIX = ".jsonl";
61+
62+
@Override
63+
public String getContentTypeFor(String fileName) {
64+
if (fileName == null) {
65+
return null;
66+
}
67+
if (fileName.endsWith(JSONL_SUFFIX)) {
68+
return JSON_LINES.toString();
69+
}
70+
return null;
71+
}
72+
73+
}
5174
}

core/riot-file/src/test/java/com/redis/riot/file/ReaderTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public class ReaderTests {
3939
public static final String JSON_GZ_URL = "http://storage.googleapis.com/jrx/beers.json.gz";
4040

4141
private final ResourceFactory resourceFactory = new ResourceFactory();
42+
private final ResourceMap resourceMap = RiotResourceMap.defaultResourceMap();
4243
private final FileReaderRegistry registry = FileReaderRegistry.defaultReaderRegistry();
4344

4445
@Test
@@ -103,7 +104,7 @@ private void assertRead(String location, Class<?> expectedType, int expectedCoun
103104
private void assertRead(String location, ReadOptions options, Class<?> expectedType, int expectedCount)
104105
throws Exception {
105106
Resource resource = resourceFactory.resource(location, options);
106-
MimeType type = resourceFactory.type(resource);
107+
MimeType type = resourceMap.getContentTypeFor(resource);
107108
ItemReader<?> reader = registry.getReaderFactory(type).create(resource, options);
108109
Assertions.assertNotNull(reader);
109110
List<?> items = readAll(reader);

plugins/riot/src/main/java/com/redis/riot/AbstractFileExport.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import com.redis.riot.core.Step;
2121
import com.redis.riot.file.FileWriterRegistry;
2222
import com.redis.riot.file.ResourceFactory;
23+
import com.redis.riot.file.ResourceMap;
24+
import com.redis.riot.file.RiotResourceMap;
2325
import com.redis.riot.file.RuntimeIOException;
2426
import com.redis.riot.file.StdOutProtocolResolver;
2527
import com.redis.riot.file.WriteOptions;
@@ -36,7 +38,7 @@
3638
public abstract class AbstractFileExport extends AbstractRedisExportCommand {
3739

3840
private Set<MimeType> flatFileTypes = new HashSet<>(
39-
Arrays.asList(ResourceFactory.CSV, ResourceFactory.PSV, ResourceFactory.TSV, ResourceFactory.TEXT));
41+
Arrays.asList(ResourceMap.CSV, ResourceMap.PSV, ResourceMap.TSV, ResourceMap.TEXT));
4042

4143
@Parameters(arity = "0..1", description = "File path or URL. If omitted, export is written to stdout.", paramLabel = "FILE")
4244
private String file = StdOutProtocolResolver.DEFAULT_FILENAME;
@@ -49,16 +51,22 @@ public abstract class AbstractFileExport extends AbstractRedisExportCommand {
4951

5052
private FileWriterRegistry writerRegistry;
5153
private ResourceFactory resourceFactory;
54+
private ResourceMap resourceMap;
5255
private WriteOptions writeOptions;
5356

5457
@Override
5558
protected void initialize() throws RiotInitializationException {
5659
super.initialize();
5760
writerRegistry = writerRegistry();
5861
resourceFactory = resourceFactory();
62+
resourceMap = resourceMap();
5963
writeOptions = writeOptions();
6064
}
6165

66+
protected RiotResourceMap resourceMap() {
67+
return RiotResourceMap.defaultResourceMap();
68+
}
69+
6270
protected FileWriterRegistry writerRegistry() {
6371
return FileWriterRegistry.defaultWriterRegistry();
6472
}
@@ -95,7 +103,8 @@ public void setFlatFileTypes(MimeType... types) {
95103
} catch (IOException e) {
96104
throw new RuntimeIOException(String.format("Could not create resource from file %s", file), e);
97105
}
98-
MimeType type = resourceFactory.type(resource, writeOptions);
106+
MimeType type = writeOptions.getContentType() == null ? resourceMap.getContentTypeFor(resource)
107+
: writeOptions.getContentType();
99108
WriterFactory writerFactory = writerRegistry.getWriterFactory(type);
100109
Assert.notNull(writerFactory, String.format("No writer found for file %s", file));
101110
ItemWriter<?> writer = writerFactory.create(resource, writeOptions);

plugins/riot/src/main/java/com/redis/riot/AbstractFileImport.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import com.redis.riot.file.ReadOptions;
3131
import com.redis.riot.file.ReaderFactory;
3232
import com.redis.riot.file.ResourceFactory;
33+
import com.redis.riot.file.ResourceMap;
34+
import com.redis.riot.file.RiotResourceMap;
3335
import com.redis.riot.file.RuntimeIOException;
3436
import com.redis.riot.file.StdInProtocolResolver;
3537
import com.redis.riot.function.MapToFieldFunction;
@@ -46,7 +48,7 @@ public abstract class AbstractFileImport extends AbstractRedisImportCommand {
4648

4749
public static final String STDIN_FILENAME = "-";
4850
private static final Set<MimeType> keyValueTypes = new HashSet<>(
49-
Arrays.asList(ResourceFactory.JSON, ResourceFactory.JSON_LINES, ResourceFactory.XML));
51+
Arrays.asList(ResourceMap.JSON, ResourceMap.JSON_LINES, ResourceMap.XML));
5052

5153
@Parameters(arity = "1..*", description = "Files or URLs to import. Use '-' to read from stdin.", paramLabel = "FILE")
5254
private List<String> files;
@@ -58,6 +60,7 @@ public abstract class AbstractFileImport extends AbstractRedisImportCommand {
5860
private Map<String, Pattern> regexes = new LinkedHashMap<>();
5961

6062
private FileReaderRegistry readerRegistry;
63+
private RiotResourceMap resourceMap;
6164
private ResourceFactory resourceFactory;
6265
private ReadOptions readOptions;
6366

@@ -67,9 +70,14 @@ protected void initialize() throws RiotInitializationException {
6770
Assert.notEmpty(files, "No file specified");
6871
readerRegistry = readerRegistry();
6972
resourceFactory = resourceFactory();
73+
resourceMap = resourceMap();
7074
readOptions = readOptions();
7175
}
7276

77+
protected RiotResourceMap resourceMap() {
78+
return RiotResourceMap.defaultResourceMap();
79+
}
80+
7381
protected FileReaderRegistry readerRegistry() {
7482
return FileReaderRegistry.defaultReaderRegistry();
7583
}
@@ -94,7 +102,8 @@ protected Job job() {
94102
} catch (IOException e) {
95103
throw new RuntimeIOException(String.format("Could not create resource from %s", location), e);
96104
}
97-
MimeType type = resourceFactory.type(resource, readOptions);
105+
MimeType type = readOptions.getContentType() == null ? resourceMap.getContentTypeFor(resource)
106+
: readOptions.getContentType();
98107
ReaderFactory readerFactory = readerRegistry.getReaderFactory(type);
99108
Assert.notNull(readerFactory, () -> String.format("No reader found for file %s", location));
100109
ItemReader<?> reader = readerFactory.create(resource, readOptions);

plugins/riot/src/main/java/com/redis/riot/FileTypeArgs.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import org.springframework.util.MimeType;
88

9-
import com.redis.riot.file.ResourceFactory;
9+
import com.redis.riot.file.ResourceMap;
1010

1111
import picocli.CommandLine.ITypeConverter;
1212
import picocli.CommandLine.Option;
@@ -29,13 +29,13 @@ public void setType(MimeType type) {
2929

3030
public static Map<String, MimeType> typeMap() {
3131
Map<String, MimeType> map = new HashMap<>();
32-
map.put("csv", ResourceFactory.CSV);
33-
map.put("psv", ResourceFactory.PSV);
34-
map.put("tsv", ResourceFactory.TSV);
35-
map.put("fw", ResourceFactory.TEXT);
36-
map.put("json", ResourceFactory.JSON);
37-
map.put("jsonl", ResourceFactory.JSON_LINES);
38-
map.put("xml", ResourceFactory.XML);
32+
map.put("csv", ResourceMap.CSV);
33+
map.put("psv", ResourceMap.PSV);
34+
map.put("tsv", ResourceMap.TSV);
35+
map.put("fw", ResourceMap.TEXT);
36+
map.put("json", ResourceMap.JSON);
37+
map.put("jsonl", ResourceMap.JSON_LINES);
38+
map.put("xml", ResourceMap.XML);
3939
return map;
4040
}
4141

0 commit comments

Comments
 (0)