You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by pl...@apache.org on 2015/01/06 22:24:08 UTC
incubator-tamaya git commit: TAMAYA-39 Enhenced the functionality of
the property source for JSON.
Repository: incubator-tamaya
Updated Branches:
refs/heads/master 70c9ae457 -> 817dca2c8
TAMAYA-39 Enhenced the functionality of the property source for JSON.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/commit/817dca2c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/tree/817dca2c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/diff/817dca2c
Branch: refs/heads/master
Commit: 817dca2c8517ca3340d146869e190e97b5a0c995
Parents: 70c9ae4
Author: Oliver B. Fischer <pl...@apache.org>
Authored: Tue Jan 6 22:22:58 2015 +0100
Committer: Oliver B. Fischer <pl...@apache.org>
Committed: Tue Jan 6 22:22:58 2015 +0100
----------------------------------------------------------------------
.../tamaya/extras/json/JSONPropertySource.java | 2 +-
.../apache/tamaya/extras/json/JSONVisitor.java | 58 +++++---
.../extras/json/JSONPropertySourceTest.java | 137 +++++++++++++++++++
.../resources/configs/valid/empty-file.json | 0
.../configs/valid/empty-object-config.json | 2 +
.../resources/configs/valid/simple-config.json | 5 -
.../valid/simple-flat-string-only-config.json | 5 +
.../simple-nested-string-only-config-1.json | 9 ++
.../simple-nested-string-only-config-2.json | 8 ++
9 files changed, 202 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/817dca2c/extras/json/src/main/java/org/apache/tamaya/extras/json/JSONPropertySource.java
----------------------------------------------------------------------
diff --git a/extras/json/src/main/java/org/apache/tamaya/extras/json/JSONPropertySource.java b/extras/json/src/main/java/org/apache/tamaya/extras/json/JSONPropertySource.java
index 6950f2c..7e6487c 100644
--- a/extras/json/src/main/java/org/apache/tamaya/extras/json/JSONPropertySource.java
+++ b/extras/json/src/main/java/org/apache/tamaya/extras/json/JSONPropertySource.java
@@ -91,7 +91,7 @@ public class JSONPropertySource
this.values = values;
}
catch (Throwable t) {
- throw new ConfigException(format("Failed to read properties from %s", source.getDescription()));
+ throw new ConfigException(format("Failed to read properties from %s", source.getDescription()), t);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/817dca2c/extras/json/src/main/java/org/apache/tamaya/extras/json/JSONVisitor.java
----------------------------------------------------------------------
diff --git a/extras/json/src/main/java/org/apache/tamaya/extras/json/JSONVisitor.java b/extras/json/src/main/java/org/apache/tamaya/extras/json/JSONVisitor.java
index fc929e1..15bf16b 100644
--- a/extras/json/src/main/java/org/apache/tamaya/extras/json/JSONVisitor.java
+++ b/extras/json/src/main/java/org/apache/tamaya/extras/json/JSONVisitor.java
@@ -35,31 +35,48 @@ public class JSONVisitor {
}
public void run() {
- Queue<VisitingContext> stack = new ArrayDeque<>();
+ Deque<VisitingContext> stack = new ArrayDeque<>();
stack.add(new VisitingContext(rootNode));
-
- while(!stack.peek().completed()) {
- Map.Entry<String, JsonNode> current = stack.peek().nextElement();
-
- if (current.getValue() instanceof ValueNode) {
- System.out.println("I:" + current.getValue().asText());
- } else {
- // @todo
- throw new ConfigException("");
- }
-
- System.out.println(current);
+ boolean goOn = stack.peek().hasNext();
+
+ if (goOn) {
+ do {
+ Map.Entry<String, JsonNode> current = stack.peek().nextElement();
+
+ if (current.getValue() instanceof ValueNode) {
+ String key = stack.peek().getNSPrefix() + current.getKey();
+ String value = current.getValue().asText();
+ targetStore.put(key, value);
+ } else if (current.getValue() instanceof ObjectNode) {
+ String key = stack.peek().getNSPrefix() + current.getKey();
+ ObjectNode node = (ObjectNode) current.getValue();
+ stack.push(new VisitingContext(node, key));
+ } else {
+ throw new ConfigException("Internal failure while processing JSON document.");
+ }
+
+ goOn = stack.peek().hasNext();
+
+ while (!goOn && stack.size() > 0) {
+ stack.remove();
+ goOn = stack.size() > 0 ? stack.peek().hasNext() : false;
+ }
+ } while (goOn);
}
-
-
}
private class VisitingContext {
+ private String namespace;
private final ObjectNode node;
private final Iterator<Map.Entry<String, JsonNode>> elements;
- public VisitingContext(ObjectNode rootNode) {
+ public VisitingContext(ObjectNode node) {
+ this(node, "");
+ }
+
+ public VisitingContext(ObjectNode rootNode, String currentNamespace) {
+ namespace = currentNamespace;
node = rootNode;
elements = node.fields();
}
@@ -69,8 +86,13 @@ public class JSONVisitor {
}
- public boolean completed() {
- return elements.hasNext() == false;
+ public boolean hasNext() {
+ boolean hasNext = elements.hasNext();
+ return hasNext;
+ }
+
+ public String getNSPrefix() {
+ return namespace.isEmpty() ? namespace : namespace + ".";
}
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/817dca2c/extras/json/src/test/java/org/apache/tamaya/extras/json/JSONPropertySourceTest.java
----------------------------------------------------------------------
diff --git a/extras/json/src/test/java/org/apache/tamaya/extras/json/JSONPropertySourceTest.java b/extras/json/src/test/java/org/apache/tamaya/extras/json/JSONPropertySourceTest.java
new file mode 100644
index 0000000..65c709f
--- /dev/null
+++ b/extras/json/src/test/java/org/apache/tamaya/extras/json/JSONPropertySourceTest.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.tamaya.extras.json;
+
+import org.apache.tamaya.ConfigException;
+import org.hamcrest.CoreMatchers;
+import org.junit.Test;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Optional;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasSize;
+
+public class JSONPropertySourceTest {
+
+ @Test(expected = ConfigException.class)
+ public void emptyJSONFileResultsInConfigException() throws Exception {
+ URL configURL = JSONPropertySourceTest.class.getResource("/configs/valid/empty-file.json");
+
+ assertThat(configURL, CoreMatchers.notNullValue());
+
+ File configFile = new File(configURL.toURI());
+
+ JSONPropertySource source = new JSONPropertySource(configFile, 10);
+
+ source.getProperties();
+ }
+
+ @Test
+ public void canHandleEmptyJSONObject() throws Exception {
+ URL configURL = JSONPropertySourceTest.class.getResource("/configs/valid/empty-object-config.json");
+
+ assertThat(configURL, CoreMatchers.notNullValue());
+
+ File configFile = new File(configURL.toURI());
+
+ JSONPropertySource source = new JSONPropertySource(configFile, 10);
+
+ assertThat(source.getProperties().keySet(), hasSize(0));
+ }
+
+ @Test
+ public void canReadFlatStringOnlyJSONConfigFile() throws Exception {
+ URL configURL = JSONPropertySourceTest.class.getResource("/configs/valid/simple-flat-string-only-config.json");
+
+ assertThat(configURL, CoreMatchers.notNullValue());
+
+ File configFile = new File(configURL.toURI());
+
+ JSONPropertySource source = new JSONPropertySource(configFile, 10);
+
+ assertThat(source.getProperties().keySet(), hasSize(3));
+
+ Optional<String> keyA = source.get("a");
+ Optional<String> keyB = source.get("b");
+ Optional<String> keyC = source.get("c");
+
+ assertThat(keyA.isPresent(), is(true));
+ assertThat(keyA.get(), equalTo("A"));
+ assertThat(keyB.isPresent(), is(true));
+ assertThat(keyB.get(), is("B"));
+ assertThat(keyC.isPresent(), is(true));
+ assertThat(keyC.get(), is("C"));
+ }
+
+ @Test
+ public void canReadNestedStringOnlyJSONConfigFile() throws Exception {
+ URL configURL = JSONPropertySourceTest.class.getResource("/configs/valid/simple-nested-string-only-config-1.json");
+
+ assertThat(configURL, CoreMatchers.notNullValue());
+
+ File configFile = new File(configURL.toURI());
+
+ JSONPropertySource source = new JSONPropertySource(configFile, 10);
+
+ assertThat(source.getProperties().keySet(), hasSize(5));
+
+ Optional<String> keyb = source.get("b");
+ Optional<String> keyDO = source.get("d.o");
+ Optional<String> keyDP = source.get("d.p");
+
+ assertThat(keyb.isPresent(), is(true));
+ assertThat(keyb.get(), equalTo("B"));
+ assertThat(keyDO.isPresent(), is(true));
+ assertThat(keyDO.get(), equalTo("O"));
+ assertThat(keyDP.isPresent(), is(true));
+ assertThat(keyDP.get(), is("P"));
+ }
+
+ @Test
+ public void canReadNestedStringOnlyJSONConfigFileWithObjectInTheMiddle()
+ throws Exception {
+ URL configURL = JSONPropertySourceTest.class.getResource("/configs/valid/simple-nested-string-only-config-2.json");
+
+ assertThat(configURL, CoreMatchers.notNullValue());
+
+ File configFile = new File(configURL.toURI());
+
+ JSONPropertySource source = new JSONPropertySource(configFile, 10);
+
+ assertThat(source.getProperties().keySet(), hasSize(4));
+
+ Optional<String> keyA = source.get("a");
+ Optional<String> keyDO = source.get("b.o");
+ Optional<String> keyDP = source.get("b.p");
+ Optional<String> keyC = source.get("c");
+
+ assertThat(keyA.isPresent(), is(true));
+ assertThat(keyA.get(), is("A"));
+ assertThat(keyC.isPresent(), is(true));
+ assertThat(keyC.get(), equalTo("C"));
+ assertThat(keyDO.isPresent(), is(true));
+ assertThat(keyDO.get(), equalTo("O"));
+ assertThat(keyDP.isPresent(), is(true));
+ assertThat(keyDP.get(), is("P"));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/817dca2c/extras/json/src/test/resources/configs/valid/empty-file.json
----------------------------------------------------------------------
diff --git a/extras/json/src/test/resources/configs/valid/empty-file.json b/extras/json/src/test/resources/configs/valid/empty-file.json
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/817dca2c/extras/json/src/test/resources/configs/valid/empty-object-config.json
----------------------------------------------------------------------
diff --git a/extras/json/src/test/resources/configs/valid/empty-object-config.json b/extras/json/src/test/resources/configs/valid/empty-object-config.json
new file mode 100644
index 0000000..7a73a41
--- /dev/null
+++ b/extras/json/src/test/resources/configs/valid/empty-object-config.json
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/817dca2c/extras/json/src/test/resources/configs/valid/simple-config.json
----------------------------------------------------------------------
diff --git a/extras/json/src/test/resources/configs/valid/simple-config.json b/extras/json/src/test/resources/configs/valid/simple-config.json
deleted file mode 100644
index c8ea179..0000000
--- a/extras/json/src/test/resources/configs/valid/simple-config.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "a" : "A",
- "b" : "B",
- "c" : "C"
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/817dca2c/extras/json/src/test/resources/configs/valid/simple-flat-string-only-config.json
----------------------------------------------------------------------
diff --git a/extras/json/src/test/resources/configs/valid/simple-flat-string-only-config.json b/extras/json/src/test/resources/configs/valid/simple-flat-string-only-config.json
new file mode 100644
index 0000000..c8ea179
--- /dev/null
+++ b/extras/json/src/test/resources/configs/valid/simple-flat-string-only-config.json
@@ -0,0 +1,5 @@
+{
+ "a" : "A",
+ "b" : "B",
+ "c" : "C"
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/817dca2c/extras/json/src/test/resources/configs/valid/simple-nested-string-only-config-1.json
----------------------------------------------------------------------
diff --git a/extras/json/src/test/resources/configs/valid/simple-nested-string-only-config-1.json b/extras/json/src/test/resources/configs/valid/simple-nested-string-only-config-1.json
new file mode 100644
index 0000000..89df957
--- /dev/null
+++ b/extras/json/src/test/resources/configs/valid/simple-nested-string-only-config-1.json
@@ -0,0 +1,9 @@
+{
+ "a" : "A",
+ "b" : "B",
+ "c" : "C",
+ "d" : {
+ "o" : "O",
+ "p" : "P"
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/817dca2c/extras/json/src/test/resources/configs/valid/simple-nested-string-only-config-2.json
----------------------------------------------------------------------
diff --git a/extras/json/src/test/resources/configs/valid/simple-nested-string-only-config-2.json b/extras/json/src/test/resources/configs/valid/simple-nested-string-only-config-2.json
new file mode 100644
index 0000000..c275153
--- /dev/null
+++ b/extras/json/src/test/resources/configs/valid/simple-nested-string-only-config-2.json
@@ -0,0 +1,8 @@
+{
+ "a" : "A",
+ "b" : {
+ "o" : "O",
+ "p" : "P"
+ },
+ "c" : "C"
+}