diff options
-rw-r--r-- | pom.xml | 6 | ||||
-rw-r--r-- | src/changes/changes.xml | 3 | ||||
-rw-r--r-- | src/main/java/org/yaml/snakeyaml/constructor/Constructor.java | 6 | ||||
-rw-r--r-- | src/main/java/org/yaml/snakeyaml/env/EnvScalarConstructor.java | 18 | ||||
-rw-r--r-- | src/test/java/org/yaml/snakeyaml/env/ApplicationProperties.java | 32 | ||||
-rw-r--r-- | src/test/java/org/yaml/snakeyaml/env/EnvLombokTest.java | 42 |
6 files changed, 107 insertions, 0 deletions
@@ -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()); + } +} |