Skip to content

Commit 0f2f1d5

Browse files
committed
refactor: enforce deserializer contract while keeping static APIs
1 parent 4963f4f commit 0f2f1d5

File tree

10 files changed

+81
-24
lines changed

10 files changed

+81
-24
lines changed

build.gradle

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,6 @@ subprojects {
88
mavenCentral()
99
}
1010

11-
java {
12-
toolchain {
13-
languageVersion = JavaLanguageVersion.of(11)
14-
}
15-
}
16-
1711
dependencies {
1812
testImplementation 'org.junit.jupiter:junit-jupiter:5.14.2'
1913
testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.14.2'

modules/deserializer/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ A language module typically:
3737

3838
The core mapper then handles the rest.
3939

40-
`Deserializer` is a common marker interface for format modules.
41-
`AbstractScriptDeserializer` provides shared static helpers for script-backed modules (Lua, Groovy) to normalize injected environment/global maps.
40+
`Deserializer` defines the required `deserialize(CharSequence, Class<T>)` contract and provides default file/path overloads.
41+
`ScriptInputNormalizer` provides shared helpers for script-backed modules (Lua, Groovy) to normalize injected environment/global maps.
4242

4343
## Error model
4444

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,28 @@
11
package org.msuo.config2java;
22

3-
/**
4-
* Marker interface for format deserializers.
5-
*
6-
* Implementations expose static `deserialize(...)` entry points.
7-
*/
8-
public interface Deserializer {}
3+
import java.io.File;
4+
import java.io.IOException;
5+
import java.nio.charset.Charset;
6+
import java.nio.charset.StandardCharsets;
7+
import java.nio.file.Files;
8+
import java.nio.file.Path;
9+
10+
public interface Deserializer {
11+
12+
<T> T deserialize(CharSequence source, Class<T> configClass);
13+
14+
default <T> T deserialize(Path file, Charset charset, Class<T> configClass)
15+
throws IOException {
16+
return deserialize((CharSequence) Files.readString(file, charset), configClass);
17+
}
18+
19+
default <T> T deserialize(Path file, Class<T> configClass)
20+
throws IOException {
21+
return deserialize(file, StandardCharsets.UTF_8, configClass);
22+
}
23+
24+
default <T> T deserialize(File file, Class<T> configClass)
25+
throws IOException {
26+
return deserialize(file.toPath(), configClass);
27+
}
28+
}

modules/deserializer/src/main/java/org/msuo/config2java/AbstractScriptDeserializer.java renamed to modules/deserializer/src/main/java/org/msuo/config2java/ScriptInputNormalizer.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@
44
import java.util.LinkedHashMap;
55
import java.util.Map;
66

7-
public abstract class AbstractScriptDeserializer implements Deserializer {
7+
final class ScriptInputNormalizer {
88

9-
protected static Map<String, String> normalizeEnvironment(
9+
private ScriptInputNormalizer() {}
10+
11+
static Map<String, String> normalizeEnvironment(
1012
Map<String, String> environment
1113
) {
1214
return environment == null
1315
? Collections.emptyMap()
1416
: Collections.unmodifiableMap(new LinkedHashMap<>(environment));
1517
}
1618

17-
protected static Map<String, Object> normalizeGlobals(Map<String, ?> globals) {
19+
static Map<String, Object> normalizeGlobals(Map<String, ?> globals) {
1820
return globals == null
1921
? Collections.emptyMap()
2022
: Collections.unmodifiableMap(new LinkedHashMap<>(globals));

modules/groovy2java/src/main/java/org/msuo/config2java/GroovyDeserializer.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,15 @@
55
import java.util.Collections;
66
import java.util.Map;
77

8-
public final class GroovyDeserializer extends AbstractScriptDeserializer {
8+
public final class GroovyDeserializer implements Deserializer {
99

1010
private GroovyDeserializer() {}
1111

12+
@Override
13+
public <T> T deserialize(CharSequence source, Class<T> configClass) {
14+
return deserialize(source.toString(), configClass);
15+
}
16+
1217
public static <T> T deserialize(String source, Class<T> configClass) {
1318
return deserialize(
1419
source,
@@ -25,7 +30,11 @@ public static <T> T deserialize(
2530
Map<String, ?> globals
2631
) {
2732
return ObjectMapper.deserialize(
28-
parse(source, normalizeEnvironment(environment), normalizeGlobals(globals)),
33+
parse(
34+
source,
35+
ScriptInputNormalizer.normalizeEnvironment(environment),
36+
ScriptInputNormalizer.normalizeGlobals(globals)
37+
),
2938
configClass
3039
);
3140
}

modules/json2java/src/main/java/org/msuo/config2java/JsonDeserializer.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
package org.msuo.config2java;
22

33
import com.fasterxml.jackson.databind.JsonNode;
4-
import com.fasterxml.jackson.databind.ObjectMapper;
54
import java.util.Iterator;
65
import java.util.Map;
76

87
public final class JsonDeserializer implements Deserializer {
98

10-
private static final ObjectMapper MAPPER = new ObjectMapper();
119
private JsonDeserializer() {}
1210

11+
@Override
12+
public <T> T deserialize(CharSequence source, Class<T> configClass) {
13+
return deserialize(source.toString(), configClass);
14+
}
15+
1316
public static <T> T deserialize(String source, Class<T> configClass) {
1417
return org.msuo.config2java.ObjectMapper.deserialize(parse(source), configClass);
1518
}
1619

1720
private static ConfigValue parse(String source) {
1821
try {
19-
JsonNode root = MAPPER.readTree(source);
22+
JsonNode root = JsonRuntime.MAPPER.readTree(source);
2023
return new JsonConfigValue(root);
2124
} catch (Exception e) {
2225
throw new ConfigSourceException("JSON", "parse", e.getMessage(), e);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.msuo.config2java;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
5+
final class JsonRuntime {
6+
7+
static final ObjectMapper MAPPER = new ObjectMapper();
8+
9+
private JsonRuntime() {}
10+
}

modules/lua2java/src/main/java/org/msuo/config2java/LuaDeserializer.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,15 @@
99
import org.luaj.vm2.lib.OneArgFunction;
1010
import org.luaj.vm2.lib.jse.JsePlatform;
1111

12-
public final class LuaDeserializer extends AbstractScriptDeserializer {
12+
public final class LuaDeserializer implements Deserializer {
1313

1414
private LuaDeserializer() {}
1515

16+
@Override
17+
public <T> T deserialize(CharSequence source, Class<T> configClass) {
18+
return deserialize(source.toString(), configClass);
19+
}
20+
1621
public static <T> T deserialize(String source, Class<T> configClass) {
1722
return deserialize(
1823
source,
@@ -29,7 +34,11 @@ public static <T> T deserialize(
2934
Map<String, ?> globals
3035
) {
3136
return ObjectMapper.deserialize(
32-
parse(source, normalizeEnvironment(environment), normalizeGlobals(globals)),
37+
parse(
38+
source,
39+
ScriptInputNormalizer.normalizeEnvironment(environment),
40+
ScriptInputNormalizer.normalizeGlobals(globals)
41+
),
3342
configClass
3443
);
3544
}

modules/toml2java/src/main/java/org/msuo/config2java/TomlDeserializer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ public final class TomlDeserializer implements Deserializer {
1111

1212
private TomlDeserializer() {}
1313

14+
@Override
15+
public <T> T deserialize(CharSequence source, Class<T> configClass) {
16+
return deserialize(source.toString(), configClass);
17+
}
18+
1419
public static <T> T deserialize(String source, Class<T> configClass) {
1520
return ObjectMapper.deserialize(parse(source), configClass);
1621
}

modules/xml2java/src/main/java/org/msuo/config2java/XmlDeserializer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ public final class XmlDeserializer implements Deserializer {
66

77
private XmlDeserializer() {}
88

9+
@Override
10+
public <T> T deserialize(CharSequence source, Class<T> configClass) {
11+
return deserialize(source.toString(), configClass);
12+
}
13+
914
public static <T> T deserialize(String source, Class<T> configClass) {
1015
return ObjectMapper.deserialize(parse(source), configClass);
1116
}

0 commit comments

Comments
 (0)