Refactor DmaapPropertyReader 15/50315/6
authorkoblosz <sandra.koblosz@nokia.com>
Tue, 22 May 2018 15:13:35 +0000 (17:13 +0200)
committerkoblosz <sandra.koblosz@nokia.com>
Mon, 18 Jun 2018 14:07:48 +0000 (16:07 +0200)
Issue-ID: DCAEGEN2-522
Signed-off-by: KOBLOSZ SANDRA <sandra.koblosz@nokia.com>
Change-Id: I2d9928ff3ffeda0e204480f13e8c8bf91bddf912

src/main/java/org/onap/dcae/commonFunction/AnyNode.java [new file with mode: 0644]
src/main/java/org/onap/dcae/commonFunction/CambriaPublisherFactory.java
src/main/java/org/onap/dcae/commonFunction/DmaapPropertyReader.java
src/test/java/org/onap/dcae/vestest/AnyNodeTest.java [new file with mode: 0644]
src/test/java/org/onap/dcae/vestest/DmaapPropertyReaderTest.java [new file with mode: 0644]
src/test/java/org/onap/dcae/vestest/TestDmaapPropertyReader.java [deleted file]
src/test/resources/testFullDmaapConfig_channels.json [new file with mode: 0644]
src/test/resources/testFullDmaapConfig_gen2.json [new file with mode: 0644]
src/test/resources/test_anynode_class.json [new file with mode: 0644]

diff --git a/src/main/java/org/onap/dcae/commonFunction/AnyNode.java b/src/main/java/org/onap/dcae/commonFunction/AnyNode.java
new file mode 100644 (file)
index 0000000..b09a17a
--- /dev/null
@@ -0,0 +1,188 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * Copyright (C) 2018 Nokia Networks Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.commonFunction;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+/**
+ * This class is a wrapper for 2 most used entities of org.json lib: JSONArray and JSONObject and
+ * comprises utility methods for fast access of json structures without need to explicitly coerce between them.
+ * While using this, bear in mind it does not contain exception handling - it is assumed that when using, the parsed json structure is known.
+ *
+ * @author koblosz
+ */
+public class AnyNode {
+    private static final Logger LOGGER = LoggerFactory.getLogger(AnyNode.class);
+    private Object obj;
+
+    /**
+     * @param filePath
+     * @return
+     * @throws IOException
+     */
+    public static AnyNode parse(String filePath) throws IOException {
+        try (FileReader fr = new FileReader(filePath)) {
+            JSONTokener tokener = new JSONTokener(fr);
+            return new AnyNode(new JSONObject(tokener));
+        } catch (FileNotFoundException | JSONException e1) {
+            LOGGER.error("Could not find or parse file under path %s due to: %s", filePath, e1.toString());
+            e1.printStackTrace();
+            throw e1;
+        }
+    }
+
+    /**
+     * Returns keyset of underlying object. It is assumed that underlying object is of type org.json.JSONObject.
+     *
+     * @return Set of string keys present in underlying JSONObject
+     */
+    public Set<String> getKeys() {
+        return asJsonObject().keySet();
+    }
+
+    /**
+     * Returns value associated with specified key wrapped with AnyValue object. It is assumed that this is of type org.json.JSONObject.
+     *
+     * @param key A key string
+     * @return The AnyNode object associated with given key.
+     */
+    public AnyNode get(String key) {
+        return new AnyNode(asJsonObject().get(key));
+    }
+
+    /**
+     * Returns value under specified index wrapped with AnyValue object. It is assumed that this is of type org.json.JSONArray.
+     *
+     * @param idx An index of JSONArray
+     * @return The AnyNode object associated with given index.
+     */
+    public AnyNode get(int idx) {
+        return new AnyNode(asJsonArray().get(idx));
+    }
+
+    /**
+     * Returns int assuming this can be coerced to int.
+     */
+    public int asInt() {
+        return (int) this.obj;
+    }
+
+    /**
+     * Returns string representation of this. If it happens to have null, the value is treated as org.json.JSONObject.NULL and "null" string is returned then.
+     *
+     * @return A String
+     */
+    public String asString() {
+        return this.obj != JSONObject.NULL ? (String) this.obj : JSONObject.NULL.toString();
+    }
+
+    public String toString() {
+        return this.obj.toString();
+    }
+
+    /**
+     * Converts underlying object to String-to-Object map. It is assumed that underlying object is of type org.json.JSONObject.
+     *
+     * @return A map.
+     */
+    public Map<String, Object> asRawMap() {
+        return asJsonObject().toMap();
+    }
+
+    /**
+     * Returns optional of object under specified key, wrapped with AnyNode object. If underlying object is not of type org.json.JSONObject, then Optional.empty will be returned.
+     *
+     * @param key A key string
+     */
+    public Optional<AnyNode> getAsOptional(String key) {
+        AnyNode result = null;
+        try {
+            result = get(key);
+        } catch (JSONException ex) {
+        }
+        return Optional.ofNullable(result);
+    }
+
+    public JSONObject asJsonObject() {
+        return (JSONObject) this.obj;
+    }
+
+    /**
+     * Converts underlying object to map representation with map values wrapped with AnyNode object. It is assumed that underlying object is of type org.json.JSONObject.
+     */
+    public Map<String, AnyNode> asMap() {
+        Map<String, AnyNode> map = new HashMap<>();
+        getKeys().forEach(key -> map.put(key, get(key)));
+        return map;
+    }
+
+    /**
+     * Converts underlying object to map representation with map values wrapped with AnyNode object. It is assumed that underlying object is of type org.json.JSONObject.
+     */
+    public java.util.List<AnyNode> asList() {
+        return asStream().collect(Collectors.toList());
+    }
+
+    /**
+     * Converts this object to stream of underlying objects wrapped with AnyNode class. It is assumed that this is of type JSONArray.
+     */
+    public Stream<AnyNode> asStream() {
+        return StreamSupport.stream(((JSONArray) this.obj).spliterator(), false).map(AnyNode::new);
+    }
+
+    /**
+     * Checks if specified key is present in this. It is assumed that this is of type JSONObject.
+     */
+    public boolean hasKey(String key) {
+        return getAsOptional(key).isPresent();
+    }
+
+    /**
+     * Returns empty AnyNode (with null inside)
+     */
+    public static AnyNode nullValue() {
+        return new AnyNode(JSONObject.NULL.toString());
+    }
+
+    private JSONArray asJsonArray() {
+        return (JSONArray) this.obj;
+    }
+
+    private AnyNode(Object object) {
+        this.obj = object;
+    }
+
+}
index 35d3e31..41230a1 100644 (file)
@@ -23,6 +23,8 @@ import com.att.nsa.cambria.client.CambriaBatchingPublisher;
 import com.att.nsa.cambria.client.CambriaClientBuilders;
 import java.net.MalformedURLException;
 import java.security.GeneralSecurityException;
+import java.util.Map;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,21 +35,18 @@ class CambriaPublisherFactory {
     public CambriaBatchingPublisher createCambriaPublisher(String streamId)
             throws MalformedURLException, GeneralSecurityException {
         String authpwd = null;
-        String ueburl = DmaapPropertyReader.getInstance(CommonStartup.cambriaConfigFile).dmaap_hash
-                .get(streamId + ".cambria.url");
+        DmaapPropertyReader reader = DmaapPropertyReader.getInstance(CommonStartup.cambriaConfigFile);
+        Map<String, String> dmaapProperties  = reader.getDmaapProperties();
+        String ueburl = dmaapProperties.get(streamId + ".cambria.url");
 
         if (ueburl == null) {
-            ueburl = DmaapPropertyReader.getInstance(CommonStartup.cambriaConfigFile).dmaap_hash
-                    .get(streamId + ".cambria.hosts");
+            ueburl = dmaapProperties.get(streamId + ".cambria.hosts");
         }
-        String topic = DmaapPropertyReader.getInstance(CommonStartup.cambriaConfigFile)
-                .getKeyValue(streamId + ".cambria.topic");
-        String authuser = DmaapPropertyReader.getInstance(CommonStartup.cambriaConfigFile)
-                .getKeyValue(streamId + ".basicAuthUsername");
+        String topic = reader.getKeyValue(streamId + ".cambria.topic");
+        String authuser = reader.getKeyValue(streamId + ".basicAuthUsername");
 
         if (authuser != null) {
-            authpwd = DmaapPropertyReader.getInstance(CommonStartup.cambriaConfigFile).dmaap_hash
-                    .get(streamId + ".basicAuthPassword");
+            authpwd = dmaapProperties.get(streamId + ".basicAuthPassword");
         }
 
         if ((authuser != null) && (authpwd != null)) {
index dabd2b1..c0659aa 100644 (file)
 
 package org.onap.dcae.commonFunction;
 
-import java.io.FileNotFoundException;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import java.io.FileReader;
+
 import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
-import java.util.Set;
-
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonIOException;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.gson.JsonSyntaxException;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 public class DmaapPropertyReader {
 
-       private static final String HOST_URL = " HOST-URL:";
-       private static final String TOPIC = "TOPIC:";
-       private static final String CAMBRIA_URL = "cambria.url";
-       private static final String CAMBRIA_HOSTS = "cambria.hosts";
-       private static final String PWD = " PWD:";
-       private static final String USER = " USER:";
-       private static final String BASIC_AUTH_PASSWORD = "basicAuthPassword";
-       private static final String BASIC_AUTH_USER_NAME = "basicAuthUsername";
-       private static DmaapPropertyReader instance = null;
-
-       private static final Logger log = LoggerFactory.getLogger(DmaapPropertyReader.class);
-
-       public HashMap<String, String> dmaap_hash = new HashMap<>();
-
-       public DmaapPropertyReader(String CambriaConfigFile) {
-
-               FileReader fr = null;
-               try {
-                       JsonElement root = null;
-                       fr = new FileReader(CambriaConfigFile);
-                       root = new JsonParser().parse(fr);
-
-                       // Check if dmaap config is handled by legacy controller/service
-                       // manager
-                       if (root.getAsJsonObject().has("channels")) {
-                               JsonArray jsonObject = (JsonArray) root.getAsJsonObject().get("channels");
-
-                               for (int i = 0; i < jsonObject.size(); i++) {
-                                       log.debug(TOPIC + jsonObject.get(i).getAsJsonObject().get("cambria.topic") + HOST_URL
-                                                       + jsonObject.get(i).getAsJsonObject().get(CAMBRIA_URL) + " HOSTS:"
-                                                       + jsonObject.get(i).getAsJsonObject().get(CAMBRIA_HOSTS) + PWD
-                                                       + jsonObject.get(i).getAsJsonObject().get(BASIC_AUTH_PASSWORD) + USER
-                                                       + jsonObject.get(i).getAsJsonObject().get(BASIC_AUTH_USER_NAME) + " NAME:"
-                                                       + jsonObject.get(i).getAsJsonObject().get("name"));
-
-                                       String convertedname = jsonObject.get(i).getAsJsonObject().get("name").toString().replace("\"", "");
-                                       dmaap_hash.put(convertedname + ".cambria.topic",
-                                                       jsonObject.get(i).getAsJsonObject().get("cambria.topic").toString().replace("\"", ""));
-
-                                       if (jsonObject.get(i).getAsJsonObject().get(CAMBRIA_HOSTS) != null) {
-                                               dmaap_hash.put(convertedname + ".cambria.hosts",
-                                                               jsonObject.get(i).getAsJsonObject().get(CAMBRIA_HOSTS).toString().replace("\"", ""));
-                                       }
-                                       if (jsonObject.get(i).getAsJsonObject().get(CAMBRIA_URL) != null) {
-                                               dmaap_hash.put(convertedname + ".cambria.url",
-                                                               jsonObject.get(i).getAsJsonObject().get(CAMBRIA_URL).toString().replace("\"", ""));
-                                       }
-                                       if (jsonObject.get(i).getAsJsonObject().get(BASIC_AUTH_PASSWORD) != null) {
-                                               dmaap_hash.put(convertedname + ".basicAuthPassword", jsonObject.get(i).getAsJsonObject()
-                                                               .get(BASIC_AUTH_PASSWORD).toString().replace("\"", ""));
-                                       }
-                                       if (jsonObject.get(i).getAsJsonObject().get(BASIC_AUTH_USER_NAME) != null) {
-                                               dmaap_hash.put(convertedname + ".basicAuthUsername", jsonObject.get(i).getAsJsonObject()
-                                                               .get(BASIC_AUTH_USER_NAME).toString().replace("\"", ""));
-                                       }
-
-                               }
-                       } else {
-
-                               // Handing new format from controllergen2/config_binding_service
-                               JsonObject jsonObject = root.getAsJsonObject();
-                               Set<Map.Entry<String, JsonElement>> entries = jsonObject.entrySet();
-
-                               for (Map.Entry<String, JsonElement> entry : entries) {
-
-                                       JsonElement topicurl = entry.getValue().getAsJsonObject().get("dmaap_info").getAsJsonObject()
-                                                       .get("topic_url");
-                                       String[] urlParts = dmaapUrlSplit(topicurl.toString().replace("\"", ""));
-
-                                       String mrTopic = null;
-                                       String mrUrl = null;
-                                       String[] hostport = null;
-                                       String username = null;
-                                       String userpwd = null;
-
-                                       try {
-
-                                               if (null != urlParts) {
-                                                       mrUrl = urlParts[2];
-
-                                                       // DCAE internal dmaap topic convention
-                                                       if ("events".equals(urlParts[3])) {
-                                                               mrTopic = urlParts[4];
-                                                       } else {
-                                                               // ONAP dmaap topic convention
-                                                               mrTopic = urlParts[3];
-                                                               hostport = mrUrl.split(":");
-                                                       }
-
-                                               }
-                                       } catch (NullPointerException e) {
-                                               System.out.println("NullPointerException");
-                                               e.getMessage();
-                                       }
-
-                                       if (entry.getValue().getAsJsonObject().has("aaf_username")) {
-                                               username = entry.getValue().getAsJsonObject().get("aaf_username").toString().replace("\"", "");
-                                       }
-                                       if (entry.getValue().getAsJsonObject().has("aaf_password")) {
-                                               userpwd = entry.getValue().getAsJsonObject().get("aaf_password").toString().replace("\"", "");
-                                       }
-                                       if (hostport == null) {
-                                               log.debug(TOPIC + mrTopic + HOST_URL + mrUrl + PWD + userpwd + USER + username);
-                                       } else {
-                                               log.debug(TOPIC + mrTopic + HOST_URL + mrUrl + " HOSTS:" + hostport[0] + PWD
-                                                               + userpwd + USER + username + " NAME:" + entry.getKey());
-                                       }
-
-                                       dmaap_hash.put(entry.getKey() + ".cambria.topic", mrTopic);
-
-                                       if (!(hostport == null)) {
-                                               dmaap_hash.put(entry.getKey() + ".cambria.hosts", hostport[0]);
-                                       }
-
-                                       if (!(mrUrl == null)) {
-                                               dmaap_hash.put(entry.getKey() + ".cambria.url", mrUrl);
-                                       }
-
-                                       if (!(username == null)) {
-                                               dmaap_hash.put(entry.getKey() + ".basicAuthUsername", username);
-                                       }
-
-                                       if (!(userpwd == null)) {
-                                               dmaap_hash.put(entry.getKey() + ".basicAuthPassword", userpwd);
-                                       }
-
-                               }
-
-                       }
-
-               } catch (JsonIOException | JsonSyntaxException |
-
-                               FileNotFoundException e1) {
-                       e1.printStackTrace();
-                       log.error("Problem loading Dmaap Channel configuration file: " + e1.toString());
-               } finally {
-                       if (fr != null) {
-                               try {
-                                       fr.close();
-                               } catch (IOException e) {
-                                       log.error("Error closing file reader stream : " + e.toString());
-                               }
-                       }
-               }
-
-       }
-
-       /***
-        * Dmaap url structure pub - https://<dmaaphostname>:<port>/events/
-        * <namespace>.<dmaapcluster>.<topic>, sub - https://<dmaaphostname>:
-        * <port>/events/<namespace>.<dmaapcluster>.<topic>/G1/u1";
-        *
-        * Onap url structure pub - http://<dmaaphostname>:<port>/<unauthenticated>.
-        * <topic>,
-        */
-
-       private String[] dmaapUrlSplit(String dmUrl) {
-               String[] multUrls = dmUrl.split(",");
-
-               StringBuffer newUrls = new StringBuffer();
-               String[] urlParts = null;
-               for (int i = 0; i < multUrls.length; i++) {
-                       urlParts = multUrls[i].split("/");
-                       if (i == 0) {
-                               newUrls = newUrls.append(urlParts[2]);
-                       } else {
-                               newUrls = newUrls.append(",").append(urlParts[2]);
-                       }
-               }
-               return urlParts;
-       }
-
-       public static synchronized DmaapPropertyReader getInstance(String channelConfig) {
-               if (instance == null) {
-                       instance = new DmaapPropertyReader(channelConfig);
-               }
-               return instance;
-       }
-
-       public String getKeyValue(String hashKey) {
-               return this.dmaap_hash.get(hashKey);
-       }
-}
+
+    private static final Logger log = LoggerFactory.getLogger(DmaapPropertyReader.class);
+    private static final String CAMBRIA_TOPIC_KEY = "cambria.topic";
+    private static final String CAMBRIA_HOSTS_KEY = "cambria.hosts";
+    private static final String CAMBRIA_URL_KEY = "cambria.url";
+    private static final List<String> LEGACY_CHANNEL_MANDATORY_PARAMS = Lists.newArrayList(CAMBRIA_TOPIC_KEY, CAMBRIA_HOSTS_KEY, CAMBRIA_URL_KEY, "basicAuthPassword", "basicAuthUsername");
+    private static DmaapPropertyReader instance = null;
+    private final Map<String, String> dmaapProperties;
+
+    public DmaapPropertyReader(String cambriaConfigFilePath) {
+        this.dmaapProperties = DmaapPropertyReader.getProcessedDmaapProperties(cambriaConfigFilePath);
+    }
+
+    public Map<String, String> getDmaapProperties() {
+        return dmaapProperties;
+    }
+
+    public static synchronized DmaapPropertyReader getInstance(String channelConfig) {
+        if (instance == null) {
+            instance = new DmaapPropertyReader(channelConfig);
+        }
+        return instance;
+    }
+
+    public String getKeyValue(String hashKey) {
+        return dmaapProperties.get(hashKey);
+    }
+
+    private static Map<String, String> getProcessedDmaapProperties(String configFilePath) {
+        Map<String, String> transformedDmaapProperties = new HashMap<>();
+        try {
+            AnyNode root = AnyNode.parse(configFilePath);
+            if (root.hasKey("channels")) { // Check if dmaap config is handled by legacy controller/service/manager
+                transformedDmaapProperties = getLegacyDmaapPropertiesWithChannels(root.get("channels"));
+            } else {//Handing new format from controllergen2/config_binding_service
+                transformedDmaapProperties = getDmaapPropertiesWithInfoData(root);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return transformedDmaapProperties;
+    }
+
+    private static Map<String, String> getLegacyDmaapPropertiesWithChannels(AnyNode channelsNode) {
+        return channelsNode.asList().stream()
+                .map(DmaapPropertyReader::getTransformedMandatoryChannelProperties)
+                .flatMap(m -> m.entrySet().stream())
+                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+    }
+
+    private static Map<String, String> getTransformedMandatoryChannelProperties(AnyNode channel) {
+        String prefix = channel.get("name").asString() + ".";
+        return channel.asMap().entrySet().stream().filter(el -> LEGACY_CHANNEL_MANDATORY_PARAMS.contains(el.getKey()) && !Objects.equals(el.getKey(), "name"))
+                .collect(Collectors.toMap(k -> prefix + k.getKey(), v -> v.getValue().asString().replace("\"", "")));
+    }
+
+    private static Map<String, String> getDmaapPropertiesWithInfoData(AnyNode root) {
+        return root.asMap().entrySet().stream()
+                .map(DmaapPropertyReader::getTransformedMandatoryInfoProperties).flatMap(m -> m.entrySet().stream())
+                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+    }
+
+    private static Map<String, String> getTransformedMandatoryInfoProperties(Map.Entry<String, AnyNode> el) {
+        String prefix = el.getKey() + ".";
+        AnyNode val = el.getValue();
+        Map<String, String> map = Maps.newHashMap();
+        map.put(prefix + "basicAuthUsername", val.getAsOptional("aaf_username").orElse(AnyNode.nullValue()).asString().replace("\"", ""));
+        map.put(prefix + "basicAuthPassword", val.getAsOptional("aaf_password").orElse(AnyNode.nullValue()).asString().replace("\"", ""));
+        map.putAll(getParamsFromDmaapInfoTopicUrl(prefix, val.get("dmaap_info").get("topic_url").asString().replace("\"", "")));
+        return map;
+    }
+
+    /***
+     * Dmaap url structure pub - https://<dmaaphostname>:<port>/events/
+     * <namespace>.<dmaapcluster>.<topic>, sub - https://<dmaaphostname>:
+     * <port>/events/<namespace>.<dmaapcluster>.<topic>/G1/u1";
+     *
+     * Onap url structure pub - http://<dmaaphostname>:<port>/<unauthenticated>.
+     * <topic>,
+     */
+    private static Map<String, String> getParamsFromDmaapInfoTopicUrl(String keyPrefix, String topicUrl) {
+        Map<String, String> topicUrlParts = Maps.newHashMap();
+        try {
+            URL url = new URL(topicUrl);
+            topicUrlParts.put(keyPrefix + CAMBRIA_URL_KEY, url.getAuthority());
+            String[] pathParts = url.getPath().split("/");
+            if (pathParts.length > 2 && "events".equals(pathParts[1])) {
+                // DCAE internal dmaap topic convention
+                topicUrlParts.put(keyPrefix + CAMBRIA_TOPIC_KEY, pathParts[2]);
+            } else {
+                // ONAP dmaap topic convention
+                topicUrlParts.put(keyPrefix + CAMBRIA_TOPIC_KEY, pathParts[2]);
+                topicUrlParts.put(keyPrefix + CAMBRIA_HOSTS_KEY, url.getHost());
+            }
+        } catch (MalformedURLException e) {
+            log.error("Invalid URL found under topic_url key!", e);
+            e.printStackTrace();
+        }
+        return topicUrlParts;
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/vestest/AnyNodeTest.java b/src/test/java/org/onap/dcae/vestest/AnyNodeTest.java
new file mode 100644 (file)
index 0000000..1613465
--- /dev/null
@@ -0,0 +1,107 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * Copyright (C) 2018 Nokia Networks Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.vestest;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+import org.json.JSONObject;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.dcae.commonFunction.AnyNode;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Created by koblosz on 07.06.18.
+ */
+public class AnyNodeTest {
+
+    private static final String SAMPLE_JSON_FILEPATH = "src/test/resources/test_anynode_class.json";
+    private static final Map<String, Object> EXPECTED_RAW_MAP = ImmutableMap.<String, Object>builder().put("a", 1).put("b", 2).build();
+    private static final Set<String> EXPECTED_JSON_KEYS = Sets.newHashSet("channels", "sampleStrList", "sampleNestedObject", "sampleInt", "sampleString", "sampleNull");
+    private static AnyNode node;
+
+
+    @BeforeClass
+    public static void setUpClass() throws IOException {
+        node = AnyNode.parse(SAMPLE_JSON_FILEPATH);
+    }
+
+    @Test(expected = IOException.class)
+    public void testShouldRethrowExceptionWhenFileNotFound() throws IOException {
+        AnyNode.parse("not/existng/path");
+    }
+
+    @Test
+    public void testShouldReturnJsonObjectKeySet() {
+        assertThat(node.getKeys()).containsOnlyElementsOf(EXPECTED_JSON_KEYS);
+    }
+
+    @Test
+    public void testShouldGetElementAsString() {
+        assertThat(node.get("sampleStrList").get(0).asString()).isEqualTo("1");
+    }
+
+    @Test
+    public void testShouldGetElementAsInt() {
+        assertThat(node.get("sampleInt").asInt()).isSameAs(1);
+    }
+
+    @Test
+    public void testWhenNullValuePresentShouldReturnJsonObjectNullAsString() {
+        assertThat(node.get("sampleNull").asString()).isSameAs(JSONObject.NULL.toString());
+    }
+
+    @Test
+    public void testShouldGetJsonObjectAsStringToObjectMap() {
+        assertThat(node.get("sampleNestedObject").asRawMap()).containsAllEntriesOf(EXPECTED_RAW_MAP);
+    }
+
+    @Test
+    public void testShouldGetAsMap() {
+        assertThat(node.asMap().keySet()).containsOnlyElementsOf(EXPECTED_JSON_KEYS);
+    }
+
+    @Test
+    public void testShouldGetAsList() {
+        assertThat(node.get("sampleStrList").asList().stream().map(AnyNode::asString).collect(Collectors.toList())).containsExactly("1", "2", "3", "4", "5");
+    }
+
+    @Test
+    public void testShouldGetAsOptional() {
+        assertThat(node.getAsOptional("absentKey")).isNotPresent();
+    }
+
+    @Test
+    public void testWhenChainMethodsShouldReturnValue() {
+        assertThat(node.get("channels").get(0).get("two").asString()).isEqualTo("number2");
+    }
+
+
+    @Test(expected = ClassCastException.class)
+    public void whenInvokedOnJsonObjInsteadOfJsonArrShouldRaiseRuntimeEx() {
+        node.asList();
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/vestest/DmaapPropertyReaderTest.java b/src/test/java/org/onap/dcae/vestest/DmaapPropertyReaderTest.java
new file mode 100644 (file)
index 0000000..eadf62f
--- /dev/null
@@ -0,0 +1,121 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * org.onap.dcaegen2.collectors.ves\r
+ * ================================================================================\r
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.\r
+ * Copyright (C) 2018 Nokia. All rights reserved.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END=========================================================\r
+ */\r
+package org.onap.dcae.vestest;\r
+\r
+import com.google.common.collect.ImmutableMap;\r
+import org.junit.Test;\r
+import org.onap.dcae.commonFunction.DmaapPropertyReader;\r
+\r
+import java.net.MalformedURLException;\r
+import java.util.Map;\r
+\r
+import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;\r
+\r
+public class DmaapPropertyReaderTest {\r
+\r
+\r
+    private static final String legacyConfigFilePath = "src/test/resources/testDmaapConfig_ip.json";\r
+    private static final String dmaapInputConfigFilePath = "src/test/resources/testDmaapConfig_gen2.json";\r
+    private static final String fullDmaapConfigWithChannels = "src/test/resources/testFullDmaapConfig_channels.json";\r
+    private static final String fullGen2DmaapConfig = "src/test/resources/testFullDmaapConfig_gen2.json";\r
+\r
+    private static final String FAULT_UEB_KEY_PREFIX = "sec_fault_ueb";\r
+    private static final String VES_ALERT_SND_KEY_PREFIX = "ves-thresholdCrossingAlert-secondary";\r
+    private static final String VES_FAULT_SECONDARY = "ves-fault-secondary";\r
+\r
+    private static final String FAULT_BASIC_AUTH_USERNAME_KEY = VES_FAULT_SECONDARY + ".basicAuthUsername";\r
+    private static final String ALERT_BASIC_AUTH_PWD_KEY = VES_ALERT_SND_KEY_PREFIX + ".basicAuthPassword";\r
+\r
+    private static final String VES_ALERT_CAMBRIA_TOPIC_KEY = VES_ALERT_SND_KEY_PREFIX + ".cambria.topic";\r
+    private static final String VES_ALERT_CAMBRIA_URL_KEY = VES_ALERT_SND_KEY_PREFIX + ".cambria.url";\r
+    private static final String VES_FAULT_SND_CAMBRIA_URL_KEY = VES_FAULT_SECONDARY + ".cambria.url";\r
+    private static final String VES_FAULT_SND_AUTH_PWD_KEY = VES_FAULT_SECONDARY + ".basicAuthPassword";\r
+    private static final String VES_FAULT_SND_CAMBRIA_TOPIC_KEY = VES_FAULT_SECONDARY + ".cambria.topic";\r
+    private static final String FAULT_UEB_CAMBRIA_HOSTS_KEY = FAULT_UEB_KEY_PREFIX + ".cambria.hosts";\r
+    private static final String FAULT_UEB_CAMBRIA_TOPIC_KEY = FAULT_UEB_KEY_PREFIX + ".cambria.topic";\r
+    private static final String VES_ALERT_SND_AUTH_USERNAME_KEY = VES_ALERT_SND_KEY_PREFIX + ".basicAuthUsername";\r
+\r
+    public static final String NULL_TOSTRING = "null";\r
+\r
+    private static final Map<String, String> expectedCompleteGen2DmaapConfig = ImmutableMap.<String, String>builder()\r
+            .put(ALERT_BASIC_AUTH_PWD_KEY, "SamplePassWD2")\r
+            .put(VES_ALERT_CAMBRIA_TOPIC_KEY, "DCAE-SE-COLLECTOR-EVENTS-DEV")\r
+            .put(FAULT_BASIC_AUTH_USERNAME_KEY, "sampleUsername")\r
+            .put(VES_ALERT_CAMBRIA_URL_KEY, "UEBHOST:3904")\r
+            .put(VES_FAULT_SND_CAMBRIA_URL_KEY, "UEBHOST:3904")\r
+            .put(VES_FAULT_SND_AUTH_PWD_KEY, "SamplePasswd")\r
+            .put(VES_FAULT_SND_CAMBRIA_TOPIC_KEY, "DCAE-SE-COLLECTOR-EVENTS-DEV")\r
+            .put(VES_ALERT_SND_AUTH_USERNAME_KEY, "sampleUsername2")\r
+            .build();\r
+\r
+    private static final Map<String, String> expectedIncompleteGen2DmaapConfig = ImmutableMap.<String, String>builder()\r
+            .put(VES_ALERT_SND_AUTH_USERNAME_KEY, NULL_TOSTRING)\r
+            .put(FAULT_BASIC_AUTH_USERNAME_KEY, NULL_TOSTRING)\r
+            .put(VES_ALERT_CAMBRIA_TOPIC_KEY, "DCAE-SE-COLLECTOR-EVENTS-DEV")\r
+            .put(VES_ALERT_CAMBRIA_URL_KEY, "UEBHOST:3904")\r
+            .put(VES_FAULT_SND_CAMBRIA_URL_KEY, "UEBHOST:3904")\r
+            .put(ALERT_BASIC_AUTH_PWD_KEY, NULL_TOSTRING)\r
+            .put(VES_FAULT_SND_AUTH_PWD_KEY, NULL_TOSTRING)\r
+            .put(VES_FAULT_SND_CAMBRIA_TOPIC_KEY, "DCAE-SE-COLLECTOR-EVENTS-DEV")\r
+            .build();\r
+\r
+    private static final Map<String, String> expectedCompleteChannelsDmaapConfig = ImmutableMap.<String, String>builder()\r
+            .put(FAULT_UEB_CAMBRIA_HOSTS_KEY, "uebsb91kcdc.it.att.com,uebsb92kcdc.it.att.com,uebsb93kcdc.it.att.com")\r
+            .put(FAULT_UEB_CAMBRIA_TOPIC_KEY, "DCAE-SE-COLLECTOR-EVENTS-DEV")\r
+            .put(FAULT_UEB_KEY_PREFIX + ".basicAuthPassword", "S0mEPassWD")\r
+            .put(FAULT_UEB_KEY_PREFIX + ".basicAuthUsername", "sampleUser")\r
+            .put(FAULT_UEB_KEY_PREFIX + ".cambria.url", "127.0.0.1:3904")\r
+            .build();\r
+\r
+    private static final Map<String, String> expectedIncompleteChannelsDmaapConfig = ImmutableMap.<String, String>builder()\r
+            .put(FAULT_UEB_CAMBRIA_HOSTS_KEY, "uebsb91kcdc.it.att.com,uebsb92kcdc.it.att.com,uebsb93kcdc.it.att.com")\r
+            .put(FAULT_UEB_CAMBRIA_TOPIC_KEY, "DCAE-SE-COLLECTOR-EVENTS-DEV")\r
+            .build();\r
+\r
+    @Test\r
+    public void testShouldCreateReaderWithAbsentParamsOmittedBasedOnChannelDmaapConfig() {\r
+        assertReaderPreservedAllEntriesAfterTransformation(legacyConfigFilePath, expectedIncompleteChannelsDmaapConfig);\r
+    }\r
+\r
+    @Test\r
+    public void testShouldCreateReaderWithAbsentParamsOmittedBasedOnGen2DmaapConfig() {\r
+        assertReaderPreservedAllEntriesAfterTransformation(dmaapInputConfigFilePath, expectedIncompleteGen2DmaapConfig);\r
+    }\r
+\r
+    @Test\r
+    public void shouldCreateReaderWithCompleteChannelDmaapConfig() {\r
+        assertReaderPreservedAllEntriesAfterTransformation(fullDmaapConfigWithChannels, expectedCompleteChannelsDmaapConfig);\r
+    }\r
+\r
+    @Test\r
+    public void shouldCreateReaderWithCompleteGen2DmaapConfig() throws MalformedURLException {\r
+        assertReaderPreservedAllEntriesAfterTransformation(fullGen2DmaapConfig, expectedCompleteGen2DmaapConfig);\r
+    }\r
+\r
+    private void assertReaderPreservedAllEntriesAfterTransformation(String dmaapConfigFilePath, Map<String, String> expectedMap) {\r
+        DmaapPropertyReader reader = new DmaapPropertyReader(dmaapConfigFilePath);\r
+\r
+        assertThat(reader.getDmaapProperties()).containsAllEntriesOf(expectedMap);\r
+        assertThat(expectedMap).containsAllEntriesOf(reader.getDmaapProperties());\r
+    }\r
+\r
+}\r
+\r
diff --git a/src/test/java/org/onap/dcae/vestest/TestDmaapPropertyReader.java b/src/test/java/org/onap/dcae/vestest/TestDmaapPropertyReader.java
deleted file mode 100644 (file)
index 1a7d9f7..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*-\r
- * ============LICENSE_START=======================================================\r
- * org.onap.dcaegen2.collectors.ves\r
- * ================================================================================\r
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.\r
- * Copyright (C) 2018 Nokia. All rights reserved.\r
- * ================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *      http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ============LICENSE_END=========================================================\r
- */\r
-package org.onap.dcae.vestest;\r
-\r
-import static org.junit.Assert.assertEquals;\r
-\r
-import java.util.HashMap;\r
-import org.junit.Test;\r
-import org.onap.dcae.commonFunction.DmaapPropertyReader;\r
-\r
-public class TestDmaapPropertyReader {\r
-\r
-    @Test\r
-    public void shouldReadDMaaPHashes() {\r
-        DmaapPropertyReader dmaapPropertyReader = new DmaapPropertyReader("src/test/resources/testDmaapConfig_ip.json");\r
-        HashMap<String, String> dmaapHash = dmaapPropertyReader.dmaap_hash;\r
-        assertEquals(dmaapHash.get("sec_fault_ueb.cambria.hosts"),\r
-            "uebsb91kcdc.it.att.com,uebsb92kcdc.it.att.com,uebsb93kcdc.it.att.com");\r
-        assertEquals(dmaapHash.get("sec_fault_ueb.cambria.topic"), "DCAE-SE-COLLECTOR-EVENTS-DEV");\r
-    }\r
-\r
-    @Test\r
-    public void shouldReadDMaaPHashesForSecondGeneration() {\r
-        DmaapPropertyReader dmaapPropertyReader = new DmaapPropertyReader(\r
-            "src/test/resources/testDmaapConfig_gen2.json");\r
-        HashMap<String, String> dmaapHash = dmaapPropertyReader.dmaap_hash;\r
-        assertEquals(dmaapHash.get("ves-thresholdCrossingAlert-secondary.cambria.topic"),\r
-            "DCAE-SE-COLLECTOR-EVENTS-DEV");\r
-        assertEquals(dmaapHash.get("ves-thresholdCrossingAlert-secondary.cambria.url"), "UEBHOST:3904");\r
-        assertEquals(dmaapHash.get("ves-fault-secondary.cambria.url"), "UEBHOST:3904");\r
-        assertEquals(dmaapHash.get("ves-fault-secondary.cambria.topic"), "DCAE-SE-COLLECTOR-EVENTS-DEV");\r
-    }\r
-\r
-}\r
-\r
diff --git a/src/test/resources/testFullDmaapConfig_channels.json b/src/test/resources/testFullDmaapConfig_channels.json
new file mode 100644 (file)
index 0000000..e2bc033
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "channels": [
+    {
+      "name": "sec_fault_ueb",
+      "cambria.url": "127.0.0.1:3904",
+      "cambria.hosts": "uebsb91kcdc.it.att.com,uebsb92kcdc.it.att.com,uebsb93kcdc.it.att.com",
+      "cambria.topic": "DCAE-SE-COLLECTOR-EVENTS-DEV",
+      "basicAuthPassword": "S0mEPassWD",
+      "basicAuthUsername": "sampleUser",
+      "stripHpId": "true"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/test/resources/testFullDmaapConfig_gen2.json b/src/test/resources/testFullDmaapConfig_gen2.json
new file mode 100644 (file)
index 0000000..6880466
--- /dev/null
@@ -0,0 +1,24 @@
+{
+  "ves-fault-secondary": {
+    "aaf_username": "sampleUsername",
+    "dmaap_info": {
+      "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV",
+      "location": "mtl5",
+      "client_id": null,
+      "client_role": null
+    },
+    "type": "message_router",
+    "aaf_password": "SamplePasswd"
+  },
+  "ves-thresholdCrossingAlert-secondary": {
+    "aaf_username": "sampleUsername2",
+    "dmaap_info": {
+      "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV",
+      "location": "mtl5",
+      "client_id": null,
+      "client_role": null
+    },
+    "type": "message_router",
+    "aaf_password": "SamplePassWD2"
+  }
+}
\ No newline at end of file
diff --git a/src/test/resources/test_anynode_class.json b/src/test/resources/test_anynode_class.json
new file mode 100644 (file)
index 0000000..0d34945
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "channels": [{
+    "one": "number1", "two": "number2", "three": "number3"}],
+  "sampleStrList": ["1", "2", "3", "4", "5"],
+  "sampleNestedObject": {"a": 1, "b": 2},
+  "sampleInt": 1,
+  "sampleString": "str",
+  "sampleNull": null
+}