aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Somov <public.somov@gmail.com>2021-12-29 10:32:41 +0400
committerAndrey Somov <public.somov@gmail.com>2021-12-29 10:32:41 +0400
commiteae60928010118d153d1333480ab1736f7130a57 (patch)
treebdf485841aa19cd24f857414528a1d14e8ab3e4f
parent28b244b7e03d0a4a510255ae3115dfc2607679c4 (diff)
downloadsnakeyaml-eae60928010118d153d1333480ab1736f7130a57.tar.gz
Provide example with Lombok and ENV variable substitution
-rw-r--r--pom.xml6
-rw-r--r--src/changes/changes.xml3
-rw-r--r--src/main/java/org/yaml/snakeyaml/constructor/Constructor.java6
-rw-r--r--src/main/java/org/yaml/snakeyaml/env/EnvScalarConstructor.java18
-rw-r--r--src/test/java/org/yaml/snakeyaml/env/ApplicationProperties.java32
-rw-r--r--src/test/java/org/yaml/snakeyaml/env/EnvLombokTest.java42
6 files changed, 107 insertions, 0 deletions
diff --git a/pom.xml b/pom.xml
index 19d7b4fe..a044d0ef 100644
--- a/pom.xml
+++ b/pom.xml
@@ -78,6 +78,12 @@
<version>2.10.1</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <version>1.18.22</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<distributionManagement>
<repository>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 25e0dad4..92c1aae2 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -6,6 +6,9 @@
</properties>
<body>
<release version="1.31" date="in Git" description="Maintenance">
+ <action dev="asomov" type="add">
+ Add an example with Lombok and ENV variable substitution (2021-12-29)
+ </action>
<action dev="asomov" type="update">
Fix issues with comments
</action>
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
index 9eb5976e..f04b470c 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
@@ -88,6 +88,12 @@ public class Constructor extends SafeConstructor {
this(theRoot, moreTDs, new LoaderOptions());
}
+ /**
+ * Create with all possible arguments
+ * @param theRoot - the class (usually JavaBean) to be constructed
+ * @param moreTDs - collection of classes used by the root class
+ * @param loadingConfig - configuration
+ */
public Constructor(TypeDescription theRoot, Collection<TypeDescription> moreTDs, LoaderOptions loadingConfig) {
super(loadingConfig);
if (theRoot == null) {
diff --git a/src/main/java/org/yaml/snakeyaml/env/EnvScalarConstructor.java b/src/main/java/org/yaml/snakeyaml/env/EnvScalarConstructor.java
index 3c6a4144..2473170a 100644
--- a/src/main/java/org/yaml/snakeyaml/env/EnvScalarConstructor.java
+++ b/src/main/java/org/yaml/snakeyaml/env/EnvScalarConstructor.java
@@ -15,6 +15,8 @@
*/
package org.yaml.snakeyaml.env;
+import org.yaml.snakeyaml.LoaderOptions;
+import org.yaml.snakeyaml.TypeDescription;
import org.yaml.snakeyaml.constructor.AbstractConstruct;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.error.MissingEnvironmentVariableException;
@@ -22,11 +24,13 @@ import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.ScalarNode;
import org.yaml.snakeyaml.nodes.Tag;
+import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Construct scalar for format ${VARIABLE} replacing the template with the value from environment.
+ * It can also be used to create JavaBeans when the all the arguments are provided.
* @see <a href="https://bitbucket.org/snakeyaml/snakeyaml/wiki/Variable%20substitution">Variable substitution</a>
* @see <a href="https://docs.docker.com/compose/compose-file/#variable-substitution">Variable substitution</a>
*/
@@ -36,10 +40,24 @@ public class EnvScalarConstructor extends Constructor {
// value can be any non-space -> \S+
public static final Pattern ENV_FORMAT = Pattern.compile("^\\$\\{\\s*((?<name>\\w+)((?<separator>:?(-|\\?))(?<value>\\S+)?)?)\\s*\\}$");
+ /**
+ * For simple cases when no JavaBeans are needed
+ */
public EnvScalarConstructor() {
this.yamlConstructors.put(ENV_TAG, new ConstructEnv());
}
+ /**
+ * Create EnvScalarConstructor which can create JavaBeans with variable substitution
+ * @param theRoot - the class (usually JavaBean) to be constructed
+ * @param moreTDs - collection of classes used by the root class
+ * @param loadingConfig - configuration
+ */
+ public EnvScalarConstructor(TypeDescription theRoot, Collection<TypeDescription> moreTDs, LoaderOptions loadingConfig) {
+ super(theRoot, moreTDs, loadingConfig);
+ this.yamlConstructors.put(ENV_TAG, new ConstructEnv());
+ }
+
private class ConstructEnv extends AbstractConstruct {
public Object construct(Node node) {
String val = constructScalar((ScalarNode) node);
diff --git a/src/test/java/org/yaml/snakeyaml/env/ApplicationProperties.java b/src/test/java/org/yaml/snakeyaml/env/ApplicationProperties.java
new file mode 100644
index 00000000..7200b791
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/env/ApplicationProperties.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2008, SnakeYAML
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.yaml.snakeyaml.env;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ApplicationProperties {
+ private String kafkaBrokers;
+ private String kafkaTopicName;
+ private String kafkaGroupIdConfig;
+ private Integer workers;
+}
diff --git a/src/test/java/org/yaml/snakeyaml/env/EnvLombokTest.java b/src/test/java/org/yaml/snakeyaml/env/EnvLombokTest.java
new file mode 100644
index 00000000..32ba83ad
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/env/EnvLombokTest.java
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2008, SnakeYAML
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.yaml.snakeyaml.env;
+
+import junit.framework.TestCase;
+import org.yaml.snakeyaml.LoaderOptions;
+import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.Yaml;
+
+import java.util.ArrayList;
+
+import static org.yaml.snakeyaml.env.EnvScalarConstructor.ENV_FORMAT;
+import static org.yaml.snakeyaml.env.EnvScalarConstructor.ENV_TAG;
+
+public class EnvLombokTest extends TestCase {
+ public void testEnvConstructor() {
+ Yaml yaml = new Yaml(new EnvScalarConstructor(new TypeDescription(ApplicationProperties.class), new ArrayList<TypeDescription>(), new LoaderOptions()));
+ yaml.addImplicitResolver(ENV_TAG, ENV_FORMAT, "$");
+ String yamlData = "kafkaBrokers: ${KAFKA_URL:-kafka:9092}\n" +
+ "kafkaGroupIdConfig: keycloak_group_id\n" +
+ "workers: 17\n" +
+ "kafkaTopicName: ${TOPIC_NAME:-keycloakTestTopic}\n";
+ ApplicationProperties props = yaml.load(yamlData);
+ assertEquals("kafka:9092", props.getKafkaBrokers());
+ assertEquals("keycloakTestTopic", props.getKafkaTopicName());
+ assertEquals("keycloak_group_id", props.getKafkaGroupIdConfig());
+ assertEquals(Integer.valueOf(17), props.getWorkers());
+ }
+}