From 4cf310c4cbd42ae40a53baa5801d9f5af39041a0 Mon Sep 17 00:00:00 2001 From: Tristan Tarrant Date: Wed, 19 Oct 2022 16:38:24 +0200 Subject: [PATCH] ISPN-14247 Drop snakeyaml dependency from everywhere --- cli/pom.xml | 5 --- .../cli/commands/kubernetes/Kube.java | 15 ++++++--- .../java/org/infinispan/cli/util/Utils.java | 2 +- .../io/yaml/YamlConfigurationReader.java | 32 +++++++++++++++++- .../io/yaml/YamlConfigurationReaderTest.java | 33 +++++++++++++++++++ .../all/src/test/resources/identities.yaml | 11 +++++++ pom.xml | 7 ---- server/rest/pom.xml | 5 --- .../rest/resources/CacheResourceV2Test.java | 18 ++++++---- 9 files changed, 98 insertions(+), 30 deletions(-) create mode 100644 commons/all/src/test/resources/identities.yaml diff --git a/cli/pom.xml b/cli/pom.xml index 0359c68404fa..731afeec3230 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -48,11 +48,6 @@ infinispan-core true - - org.yaml - snakeyaml - compile - org.apache.logging.log4j log4j-api diff --git a/cli/src/main/java/org/infinispan/cli/commands/kubernetes/Kube.java b/cli/src/main/java/org/infinispan/cli/commands/kubernetes/Kube.java index 7a53bb6cd236..e8e41606e6e2 100644 --- a/cli/src/main/java/org/infinispan/cli/commands/kubernetes/Kube.java +++ b/cli/src/main/java/org/infinispan/cli/commands/kubernetes/Kube.java @@ -1,11 +1,13 @@ package org.infinispan.cli.commands.kubernetes; +import java.io.StringReader; import java.util.Base64; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Properties; import org.aesh.command.Command; import org.aesh.command.CommandResult; @@ -13,7 +15,10 @@ import org.aesh.command.invocation.CommandInvocation; import org.infinispan.cli.commands.Version; import org.infinispan.cli.logging.Messages; -import org.yaml.snakeyaml.Yaml; +import org.infinispan.commons.configuration.io.NamingStrategy; +import org.infinispan.commons.configuration.io.PropertyReplacer; +import org.infinispan.commons.configuration.io.URLConfigurationResourceResolver; +import org.infinispan.commons.configuration.io.yaml.YamlConfigurationReader; import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.Namespace; @@ -127,10 +132,10 @@ static Map decodeOpaqueSecrets(Secret secret) { return Collections.emptyMap(); } String opaqueIdentities = secret.getData().get("identities.yaml"); - String identitiesYaml = new String(Base64.getDecoder().decode(opaqueIdentities)); - Yaml yaml = new Yaml(); - Map identities = yaml.load(identitiesYaml); - List> credentialsList = identities.get("credentials"); + String yaml = new String(Base64.getDecoder().decode(opaqueIdentities)); + YamlConfigurationReader reader = new YamlConfigurationReader(new StringReader(yaml), new URLConfigurationResourceResolver(null), new Properties(), PropertyReplacer.DEFAULT, NamingStrategy.KEBAB_CASE); + Map identities = reader.asMap(); + List> credentialsList = (List>) identities.get("credentials"); Map res = new LinkedHashMap<>(identities.size()); for (Map credentials : credentialsList) { res.put(credentials.get("username"), credentials.get("password")); diff --git a/cli/src/main/java/org/infinispan/cli/util/Utils.java b/cli/src/main/java/org/infinispan/cli/util/Utils.java index 3857de0089d6..519192e7d8fc 100644 --- a/cli/src/main/java/org/infinispan/cli/util/Utils.java +++ b/cli/src/main/java/org/infinispan/cli/util/Utils.java @@ -90,6 +90,6 @@ public static Path downloadFile(URL url, Path dest, boolean verbose, boolean for public static String getFilenameFromURL(URL url) { String urlPath = url.getPath(); - return urlPath.substring(urlPath.lastIndexOf('/') + 1); + return urlPath.substring(urlPath.lastIndexOf('/') + 1); } } diff --git a/commons/all/src/main/java/org/infinispan/commons/configuration/io/yaml/YamlConfigurationReader.java b/commons/all/src/main/java/org/infinispan/commons/configuration/io/yaml/YamlConfigurationReader.java index e79e7c2f0f91..667ac7475421 100644 --- a/commons/all/src/main/java/org/infinispan/commons/configuration/io/yaml/YamlConfigurationReader.java +++ b/commons/all/src/main/java/org/infinispan/commons/configuration/io/yaml/YamlConfigurationReader.java @@ -7,8 +7,10 @@ import java.io.StringWriter; import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Collections; import java.util.Deque; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; @@ -102,7 +104,7 @@ Node addSibling(Node sibling) { } Node next() { - if (children != null && !children.isEmpty()) { + if (hasChildren()) { return children.remove(0); } else { if (parent == null) { @@ -116,6 +118,10 @@ Node next() { public String toString() { return parsed.toString(); } + + boolean hasChildren() { + return children != null && !children.isEmpty(); + } } private void loadTree() { @@ -578,6 +584,30 @@ public void setAttributeValue(String namespace, String name, String value) { this.attributeValues.add(replaceProperties(value)); } + public Map asMap() { + return Collections.singletonMap(lines.parsed.name, asMap(lines)); + } + + private Object asMap(Node node) { + if (node.hasChildren()) { + if (node.children.get(0).parsed.listItem) { + List children = new ArrayList<>(node.children.size()); + for (Node child : node.children) { + children.add(asMap(child)); + } + return children; + } else { + Map children = new LinkedHashMap<>(node.children.size()); + for (Node child : node.children) { + children.put(child.parsed.name, asMap(child)); + } + return children; + } + } else { + return node.parsed.value; + } + } + public static class Parsed { final int row; int indent; diff --git a/commons/all/src/test/java/org/infinispan/commons/configuration/io/yaml/YamlConfigurationReaderTest.java b/commons/all/src/test/java/org/infinispan/commons/configuration/io/yaml/YamlConfigurationReaderTest.java index bc1e8f248012..784048c778a9 100644 --- a/commons/all/src/test/java/org/infinispan/commons/configuration/io/yaml/YamlConfigurationReaderTest.java +++ b/commons/all/src/test/java/org/infinispan/commons/configuration/io/yaml/YamlConfigurationReaderTest.java @@ -1,6 +1,8 @@ package org.infinispan.commons.configuration.io.yaml; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -9,6 +11,9 @@ import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.Properties; import org.infinispan.commons.configuration.io.ConfigurationReader; @@ -171,4 +176,32 @@ private void assertAttribute(YamlConfigurationReader yaml, String name, String v } fail("Could not find attribute '" + name + " in element '" + yaml.getLocalName() + "'"); } + + @Test + public void testYamlMapper() throws IOException { + try (Reader r = new InputStreamReader(YamlConfigurationReaderTest.class.getResourceAsStream("/identities.yaml"))) { + YamlConfigurationReader yaml = new YamlConfigurationReader(r, new URLConfigurationResourceResolver(null), new Properties(), PropertyReplacer.DEFAULT, NamingStrategy.KEBAB_CASE); + Map identities = yaml.asMap(); + assertEquals(1, identities.size()); + List credentials = (List) identities.get("credentials"); + assertNotNull(credentials); + assertEquals(3, credentials.size()); + for (Object o : credentials) { + Map credential = (Map) o; + assertTrue(credential.containsKey("username")); + assertTrue(credential.containsKey("password")); + assertEquals("changeme", credential.get("password")); + if ("my-user-1".equals(credential.get("username"))) { + assertTrue(credential.containsKey("roles")); + assertEquals(Collections.singletonList("admin"), credential.get("roles")); + } else if ("my-user-2".equals(credential.get("username"))) { + assertTrue(credential.containsKey("roles")); + assertEquals(Collections.singletonList("monitor"), credential.get("roles")); + } else { + assertEquals("admin", credential.get("username")); + assertFalse(credential.containsKey("roles")); + } + } + } + } } diff --git a/commons/all/src/test/resources/identities.yaml b/commons/all/src/test/resources/identities.yaml new file mode 100644 index 000000000000..2a702f6a63ad --- /dev/null +++ b/commons/all/src/test/resources/identities.yaml @@ -0,0 +1,11 @@ +credentials: + - username: admin + password: changeme + - username: my-user-1 + password: changeme + roles: + - admin + - username: my-user-2 + password: changeme + roles: + - monitor diff --git a/pom.xml b/pom.xml index 02312a02e441..0e1b1291c4af 100644 --- a/pom.xml +++ b/pom.xml @@ -422,7 +422,6 @@ ${version.org.wildfly.openssl.natives.windows_x86_64} ${version.org.wildfly.elytron} 3.36.0.1 - 1.31 1.0.2 jdk @@ -1974,12 +1973,6 @@ ${versionx.org.xerial} test - - org.yaml - snakeyaml - ${versionx.org.yaml.snakeyaml} - test - software.amazon.ion ion-java diff --git a/server/rest/pom.xml b/server/rest/pom.xml index 1356cd795001..cd82007ffcf1 100644 --- a/server/rest/pom.xml +++ b/server/rest/pom.xml @@ -200,11 +200,6 @@ opentelemetry-sdk-testing test - - org.yaml - snakeyaml - test - diff --git a/server/rest/src/test/java/org/infinispan/rest/resources/CacheResourceV2Test.java b/server/rest/src/test/java/org/infinispan/rest/resources/CacheResourceV2Test.java index c1129b28fb17..fca5d9f9e80c 100644 --- a/server/rest/src/test/java/org/infinispan/rest/resources/CacheResourceV2Test.java +++ b/server/rest/src/test/java/org/infinispan/rest/resources/CacheResourceV2Test.java @@ -32,6 +32,7 @@ import java.io.ByteArrayInputStream; import java.io.Closeable; import java.io.IOException; +import java.io.StringReader; import java.nio.charset.StandardCharsets; import java.nio.file.Paths; import java.util.Collection; @@ -39,6 +40,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; @@ -55,6 +57,10 @@ import org.infinispan.client.rest.RestEntity; import org.infinispan.client.rest.RestRawClient; import org.infinispan.client.rest.RestResponse; +import org.infinispan.commons.configuration.io.NamingStrategy; +import org.infinispan.commons.configuration.io.PropertyReplacer; +import org.infinispan.commons.configuration.io.URLConfigurationResourceResolver; +import org.infinispan.commons.configuration.io.yaml.YamlConfigurationReader; import org.infinispan.commons.dataconversion.MediaType; import org.infinispan.commons.dataconversion.internal.Json; import org.infinispan.commons.marshall.ProtoStreamMarshaller; @@ -80,7 +86,6 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; -import org.yaml.snakeyaml.Yaml; @Test(groups = "functional", testName = "rest.CacheResourceV2Test") public class CacheResourceV2Test extends AbstractRestResourceTest { @@ -1051,11 +1056,12 @@ private void checkXML(CompletionStage response) throws Exception { } private void checkYaml(CompletionStage response, String name) { - Yaml yaml = new Yaml(); - Map config = yaml.load(join(response).getBody()); - assertEquals("SYNC", getYamlProperty(config, name, "distributedCache", "mode")); - assertEquals("OBJECT", getYamlProperty(config, name, "distributedCache", "memory", "storage")); - assertEquals("20", getYamlProperty(config, name, "distributedCache", "memory", "maxCount")); + try (YamlConfigurationReader yaml = new YamlConfigurationReader(new StringReader(join(response).getBody()), new URLConfigurationResourceResolver(null), new Properties(), PropertyReplacer.DEFAULT, NamingStrategy.KEBAB_CASE)) { + Map config = yaml.asMap(); + assertEquals("SYNC", getYamlProperty(config, name, "distributedCache", "mode")); + assertEquals("OBJECT", getYamlProperty(config, name, "distributedCache", "memory", "storage")); + assertEquals("20", getYamlProperty(config, name, "distributedCache", "memory", "maxCount")); + } } public static T getYamlProperty(Map yaml, String... names) {