From 1ed2f5408a5129abe0607aa22c600b8c7865438f Mon Sep 17 00:00:00 2001 From: Andrey G Date: Mon, 16 Mar 2026 16:53:28 +0100 Subject: [PATCH 1/2] Update jackson-dataformat-yaml dependency to 2.21.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index af5e019..a23104a 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ 9.0.5 9.0.5 3.18.0 - 2.19.1 + 2.21.1 1.18.38 3.7.7 5.11.4 From 5bec3a6bb4c4083ec2a94c7317e5685debde892a Mon Sep 17 00:00:00 2001 From: Andrey G Date: Mon, 23 Mar 2026 17:29:53 +0100 Subject: [PATCH 2/2] Replace Jackson DataformatYaml with SnakeYaml --- pom.xml | 21 +++++--- .../mapper/tools/AbstractBuilder.java | 48 +++++++++++++------ .../tools/configuration/ClassConfig.java | 22 ++++----- .../mapper/tools/configuration/KeyConfig.java | 2 +- .../com/aerospike/mapper/BooleanTest.java | 7 ++- 5 files changed, 62 insertions(+), 38 deletions(-) diff --git a/pom.xml b/pom.xml index a23104a..5817114 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,8 @@ 9.0.5 9.0.5 3.18.0 - 2.21.1 + 2.6 + 2.21.2 1.18.38 3.7.7 5.11.4 @@ -101,12 +102,18 @@ ${commons-lang3.version} - - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - ${jackson-dataformat-yaml.version} + + org.yaml + snakeyaml + ${snakeyaml.version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} + test diff --git a/src/main/java/com/aerospike/mapper/tools/AbstractBuilder.java b/src/main/java/com/aerospike/mapper/tools/AbstractBuilder.java index 9978291..1e30d70 100644 --- a/src/main/java/com/aerospike/mapper/tools/AbstractBuilder.java +++ b/src/main/java/com/aerospike/mapper/tools/AbstractBuilder.java @@ -2,6 +2,7 @@ import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -23,12 +24,14 @@ import com.aerospike.client.policy.ScanPolicy; import com.aerospike.mapper.annotations.AerospikeRecord; import com.aerospike.mapper.tools.ClassCache.PolicyType; +import com.aerospike.mapper.tools.configuration.BinConfig; import com.aerospike.mapper.tools.configuration.ClassConfig; import com.aerospike.mapper.tools.configuration.Configuration; import com.aerospike.mapper.tools.utils.TypeUtils; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.TypeDescription; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; public abstract class AbstractBuilder { private final T mapper; @@ -121,10 +124,9 @@ public AbstractBuilder withConfigurationFile(File file) throws IOException { } public AbstractBuilder withConfigurationFile(File file, boolean allowsInvalid) throws IOException { - ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); - Configuration configuration = objectMapper.readValue(file, Configuration.class); - this.loadConfiguration(configuration, allowsInvalid); - return this; + try (InputStream fis = new FileInputStream(file)) { + return this.withConfigurationFile(fis, allowsInvalid); + } } public AbstractBuilder withConfigurationFile(InputStream ios) throws IOException { @@ -132,23 +134,38 @@ public AbstractBuilder withConfigurationFile(InputStream ios) throws IOExcept } public AbstractBuilder withConfigurationFile(InputStream ios, boolean allowsInvalid) throws IOException { - ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); - Configuration configuration = objectMapper.readValue(ios, Configuration.class); + Yaml yaml = createYamlParser(); + Configuration configuration = yaml.load(ios); this.loadConfiguration(configuration, allowsInvalid); return this; } - public AbstractBuilder withConfiguration(String configurationYaml) throws JsonProcessingException { + public AbstractBuilder withConfiguration(String configurationYaml) { return this.withConfiguration(configurationYaml, false); } - public AbstractBuilder withConfiguration(String configurationYaml, boolean allowsInvalid) throws JsonProcessingException { - ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); - Configuration configuration = objectMapper.readValue(configurationYaml, Configuration.class); + public AbstractBuilder withConfiguration(String configurationYaml, boolean allowsInvalid) { + Yaml yaml = createYamlParser(); + Configuration configuration = yaml.load(configurationYaml); this.loadConfiguration(configuration, allowsInvalid); return this; } - + + private static Yaml createYamlParser() { + Constructor constructor = new Constructor(Configuration.class, new LoaderOptions()); + + TypeDescription configDesc = new TypeDescription(Configuration.class); + configDesc.addPropertyParameters("classes", ClassConfig.class); + constructor.addTypeDescription(configDesc); + + TypeDescription classConfigDesc = new TypeDescription(ClassConfig.class); + classConfigDesc.substituteProperty("class", String.class, "getClassName", "setClassName"); + classConfigDesc.addPropertyParameters("bins", BinConfig.class); + constructor.addTypeDescription(classConfigDesc); + + return new Yaml(constructor); + } + public AbstractBuilder withClassConfigurations(ClassConfig classConfig, ClassConfig ...classConfigs) { Configuration configuration = new Configuration(); configuration.add(classConfig); @@ -161,6 +178,9 @@ public AbstractBuilder withClassConfigurations(ClassConfig classConfig, Class } private void loadConfiguration(@NotNull Configuration configuration, boolean allowsInvalid) { + if (configuration == null) { + throw new AerospikeException("YAML configuration is empty or invalid"); + } for (ClassConfig config : configuration.getClasses()) { try { String name = config.getClassName(); diff --git a/src/main/java/com/aerospike/mapper/tools/configuration/ClassConfig.java b/src/main/java/com/aerospike/mapper/tools/configuration/ClassConfig.java index 4075294..3e2c400 100644 --- a/src/main/java/com/aerospike/mapper/tools/configuration/ClassConfig.java +++ b/src/main/java/com/aerospike/mapper/tools/configuration/ClassConfig.java @@ -9,10 +9,8 @@ import com.aerospike.mapper.annotations.AerospikeEmbed; import com.aerospike.mapper.annotations.AerospikeReference; import com.aerospike.mapper.tools.ConfigurationUtils; -import com.fasterxml.jackson.annotation.JsonProperty; public class ClassConfig { - @JsonProperty(value = "class") private String className; private String namespace; private String set; @@ -124,43 +122,43 @@ public void validate() { } } - private void setClassName(String className) { + public void setClassName(String className) { this.className = className; } - private void setNamespace(String namespace) { + public void setNamespace(String namespace) { this.namespace = namespace; } - private void setSet(String set) { + public void setSet(String set) { this.set = set; } - private void setTtl(Integer ttl) { + public void setTtl(Integer ttl) { this.ttl = ttl; } - private void setVersion(Integer version) { + public void setVersion(Integer version) { this.version = version; } - private void setSendKey(Boolean sendKey) { + public void setSendKey(Boolean sendKey) { this.sendKey = sendKey; } - private void setMapAll(Boolean mapAll) { + public void setMapAll(Boolean mapAll) { this.mapAll = mapAll; } - private void setDurableDelete(Boolean durableDelete) { + public void setDurableDelete(Boolean durableDelete) { this.durableDelete = durableDelete; } - private void setKey(KeyConfig key) { + public void setKey(KeyConfig key) { this.key = key; } - private void setShortName(String shortName) { + public void setShortName(String shortName) { this.shortName = shortName; } diff --git a/src/main/java/com/aerospike/mapper/tools/configuration/KeyConfig.java b/src/main/java/com/aerospike/mapper/tools/configuration/KeyConfig.java index 7dbe3ff..24fc1f3 100644 --- a/src/main/java/com/aerospike/mapper/tools/configuration/KeyConfig.java +++ b/src/main/java/com/aerospike/mapper/tools/configuration/KeyConfig.java @@ -24,7 +24,7 @@ public Boolean getStoreAsBin() { return storeAsBin; } - public void setStoreAsBin(boolean value) { + public void setStoreAsBin(Boolean value) { this.storeAsBin = value; } diff --git a/src/test/java/com/aerospike/mapper/BooleanTest.java b/src/test/java/com/aerospike/mapper/BooleanTest.java index 46b2a85..c78c778 100644 --- a/src/test/java/com/aerospike/mapper/BooleanTest.java +++ b/src/test/java/com/aerospike/mapper/BooleanTest.java @@ -6,7 +6,6 @@ import com.aerospike.mapper.annotations.AerospikeKey; import com.aerospike.mapper.annotations.AerospikeRecord; import com.aerospike.mapper.tools.AeroMapper; -import com.fasterxml.jackson.core.JsonProcessingException; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; @@ -28,7 +27,7 @@ public static class B { } @Test - public void testNumericEncoding() throws JsonProcessingException { + public void testNumericEncoding() { UseBoolBin = false; B b = new B(); @@ -57,7 +56,7 @@ public void testNumericEncoding() throws JsonProcessingException { } @Test - public void testObjectEncoding() throws JsonProcessingException { + public void testObjectEncoding() { UseBoolBin = true; B b = new B(); @@ -85,7 +84,7 @@ public void testObjectEncoding() throws JsonProcessingException { } @Test - public void testObjectByDefault() throws JsonProcessingException { + public void testObjectByDefault() { B b = new B(); b.boolValue = true; b.id = 1;