You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ol...@apache.org on 2019/01/03 13:38:04 UTC

[ambari-logsearch] branch master updated: AMBARI-25083. Fallback to use dynamic field 'ws_*' if new field name contains whitespace (#65)

This is an automated email from the ASF dual-hosted git repository.

oleewere pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ambari-logsearch.git


The following commit(s) were added to refs/heads/master by this push:
     new fc0edf5  AMBARI-25083. Fallback to use dynamic field 'ws_*' if new field name contains whitespace (#65)
fc0edf5 is described below

commit fc0edf50198f5ee8e24aeeffef84cfbdcaa024f7
Author: Olivér Sz <ol...@gmail.com>
AuthorDate: Thu Jan 3 14:37:58 2019 +0100

    AMBARI-25083. Fallback to use dynamic field 'ws_*' if new field name contains whitespace (#65)
    
    * AMBARI-25083. Fallback to use dynamic field 'ws_*' if new field name contains whitespace
    
    * Remove replace all
---
 .../ambari/logfeeder/plugin/filter/Filter.java     | 48 ++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/ambari-logsearch-logfeeder-plugin-api/src/main/java/org/apache/ambari/logfeeder/plugin/filter/Filter.java b/ambari-logsearch-logfeeder-plugin-api/src/main/java/org/apache/ambari/logfeeder/plugin/filter/Filter.java
index b0c02a6..1547c1a 100644
--- a/ambari-logsearch-logfeeder-plugin-api/src/main/java/org/apache/ambari/logfeeder/plugin/filter/Filter.java
+++ b/ambari-logsearch-logfeeder-plugin-api/src/main/java/org/apache/ambari/logfeeder/plugin/filter/Filter.java
@@ -34,8 +34,10 @@ import org.apache.logging.log4j.Logger;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Represents the filter in Log Feeder shipper input configurations.
@@ -120,6 +122,7 @@ public abstract class Filter<PROP_TYPE extends LogFeederProperties> extends Conf
         }
       }
     }
+    fallbackFieldNames(jsonObj);
     if (nextFilter != null) {
       nextFilter.apply(jsonObj, inputMarker);
     } else {
@@ -200,4 +203,49 @@ public abstract class Filter<PROP_TYPE extends LogFeederProperties> extends Conf
   public Object clone() throws CloneNotSupportedException {
     return super.clone();
   }
+
+  /**
+   * Fallback field names to use _ instead of spaces and use lowercase names with ws suffixes, built-in max: 100 characters - if the name is too big, probably it won't be valid anyway
+   * @param jsonObj field / value pairs to process
+   */
+  protected void fallbackFieldNames(Map<String, Object> jsonObj) {
+    final Set<String> fieldsToRemove = new HashSet<>();
+    final Map<String, Object> fieldValuePairsToAdd = new HashMap<>();
+    for (Map.Entry<String, Object> entry : jsonObj.entrySet()) {
+      String name = entry.getKey();
+      if (containsWhitespace(name) && name.length() < 100) {
+        fieldsToRemove.add(name);
+        name = "ws_" + name.toLowerCase().replaceAll(" ", "_");
+        if (!jsonObj.containsKey(name)) {
+          fieldValuePairsToAdd.put(name, entry.getValue());
+        }
+      }
+    }
+    for (String fieldToRemove : fieldsToRemove) {
+      jsonObj.remove(fieldToRemove);
+    }
+    for (Map.Entry<String, Object> entry : fieldValuePairsToAdd.entrySet()) {
+      jsonObj.put(entry.getKey(), entry.getValue());
+    }
+  }
+
+  /**
+   * Check that string contains whitespaces or not - similar as StringUtils function in order to not include it as a dependency
+   * @param seq character sequence
+   * @return character sequence contains whitespace or not
+   */
+  private boolean containsWhitespace(CharSequence seq) {
+    if (seq == null || seq.length() == 0) {
+      return false;
+    } else {
+      int strLen = seq.length();
+
+      for(int i = 0; i < strLen; ++i) {
+        if (Character.isWhitespace(seq.charAt(i))) {
+          return true;
+        }
+      }
+      return false;
+    }
+  }
 }