Fix simple Sonar Lint issues
[aai/search-data-service.git] / src / main / java / org / onap / aai / sa / searchdbabstraction / util / ElasticSearchPayloadTranslator.java
index 2e97103..d3dd3e1 100644 (file)
  */
 package org.onap.aai.sa.searchdbabstraction.util;
 
+import com.jayway.jsonpath.DocumentContext;
+import com.jayway.jsonpath.JsonPath;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
-
+import java.util.List;
+import java.util.Map;
 import org.apache.commons.io.IOUtils;
 import org.json.JSONArray;
+import org.json.JSONException;
 import org.json.JSONObject;
 import org.onap.aai.cl.api.Logger;
 import org.onap.aai.cl.eelf.LoggerFactory;
@@ -33,51 +37,65 @@ import org.onap.aai.sa.searchdbabstraction.logging.SearchDbMsgs;
 
 
 /**
- * This class as the name suggests is to translate the payload of PUT & POST requests
- * to ElasticSearch (ES) to its compatible syntax, specially compatible with ES v6 or above.
- * 
- * For example, data type such as "string" is now replaced by "text" or "keyword". 
- * 
- * So this class will make those translations reading off from a json configuration file, therefore
- * the configuration can be updated with new translations as and when required without touching the code. 
- * 
+ * This class as the name suggests is to translate the payload of PUT & POST requests to ElasticSearch (ES) to its
+ * compatible syntax, specially compatible with ES v6 or above.
+ *
+ * For example, data type such as "string" is now replaced by "text" or "keyword".
+ *
+ * So this class will make those translations reading off from a json configuration file, therefore the configuration
+ * can be updated with new translations as and when required without touching the code.
+ *
  * @author EDWINL
  *
  */
 public class ElasticSearchPayloadTranslator {
 
-       private static Logger logger = LoggerFactory.getInstance().getLogger(ElasticSearchPayloadTranslator.class.getName());
-       private static final String CONFIG_DIRECTORY = System.getProperty("CONFIG_HOME");
-       private static final String ES_PAYLOAD_TRANSLATION_FILE = "es-payload-translation.json";
+    private static Logger logger =
+            LoggerFactory.getInstance().getLogger(ElasticSearchPayloadTranslator.class.getName());
+    private static final String CONFIG_DIRECTORY = System.getProperty("CONFIG_HOME");
+    private static final String ES_PAYLOAD_TRANSLATION_FILE = "es-payload-translation.json";
 
+    private ElasticSearchPayloadTranslator() { // Do not instantiate
+    }
 
-       /**
-        *  Using String replacement to translate the payload to ES compatible version
-        * 
-        * @param source
-        * @return translated payload in String
-        * @throws IOException
-        */
-       public static String translateESPayload(String source) throws IOException {
-               logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "translateESPayload, method-params[ source=" + source + "]");
-               String pathToTranslationFile = CONFIG_DIRECTORY + File.separator + ES_PAYLOAD_TRANSLATION_FILE;
-               
-               String translatedPayload = source.replaceAll("\\s+", ""); // removing whitespaces
-               JSONObject translationConfigPayload = new JSONObject(IOUtils.toString(
-                               new FileInputStream(new File(pathToTranslationFile)), "UTF-8"));
+    /**
+     * Using JSON Path query to filter objects to translate the payload to ES compatible version The filter queries and
+     * the replacement attributes are configured in the es-payload-translation.json file.
+     *
+     * @param source
+     * @return translated payload in String
+     * @throws IOException
+     */
+    public static String translateESPayload(String source) throws IOException {
+        logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "translateESPayload, method-params[ source=" + source + "]",
+                "(unknown)");
+        String pathToTranslationFile = CONFIG_DIRECTORY + File.separator + ES_PAYLOAD_TRANSLATION_FILE;
 
-               JSONArray attrTranslations = translationConfigPayload.getJSONArray("attr-translations");
+        try {
+            JSONObject translationConfigPayload =
+                    new JSONObject(IOUtils.toString(new FileInputStream(new File(pathToTranslationFile)), "UTF-8"));
+            JSONArray attrTranslations = translationConfigPayload.getJSONArray("attr-translations");
+            DocumentContext payloadToTranslate = JsonPath.parse(source);
 
-               for(Object obj : attrTranslations) {
-                       JSONObject jsonObj = ((JSONObject)obj);
-                       String from = jsonObj.get("from").toString();
-                       String to = jsonObj.get("to").toString();
-                       if(translatedPayload.indexOf(from) > 0) {
-                               translatedPayload = translatedPayload.replaceAll(from, to);
-                       }
-               }
+            for (Object obj : attrTranslations) {
+                JSONObject jsonObj = ((JSONObject) obj);
+                String query = jsonObj.get("query").toString();
+                JSONObject attrToUpdate = (JSONObject) jsonObj.get("update");
+                List<Map<String, Object>> filteredObjects = payloadToTranslate.read(query);
+                for (Map<String, Object> objMap : filteredObjects) {
+                    objMap.putAll(attrToUpdate.toMap());
+                }
+            }
 
-               logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "Payload after translation: "+translatedPayload);
-               return translatedPayload;
-       }
+            logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY,
+                    "Payload after translation: " + payloadToTranslate.jsonString());
+            return payloadToTranslate.jsonString();
+        } catch (JSONException ex) {
+            logger.error(SearchDbMsgs.FILTERS_CONFIG_FAILURE, ex, ES_PAYLOAD_TRANSLATION_FILE, ex.getMessage());
+            throw new IOException("Payload translation configuration looks corrupted. Please correct!", ex);
+        } catch (IOException ex) {
+            logger.error(SearchDbMsgs.FILTERS_CONFIG_FAILURE, ex, ES_PAYLOAD_TRANSLATION_FILE, ex.getMessage());
+            throw new IOException("Error in configuring payload translation file. Please check if it exists.", ex);
+        }
+    }
 }