Adding more DR-Node unit tests
[dmaap/datarouter.git] / datarouter-node / src / main / java / org / onap / dmaap / datarouter / node / RedirManager.java
index 7e4078f..b4a3f0a 100644 (file)
 
 package org.onap.dmaap.datarouter.node;
 
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
 import java.io.BufferedReader;
 import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.OutputStream;
-import java.util.Hashtable;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Timer;
 
 /**
- * Track redirections of subscriptions
+ * Track redirections of subscriptions.
  */
-public class RedirManager {
+class RedirManager {
 
-    private Hashtable<String, String> sid2primary = new Hashtable<String, String>();
-    private Hashtable<String, String> sid2secondary = new Hashtable<String, String>();
+    private static EELFLogger eelfLogger = EELFManager.getInstance().getLogger(RedirManager.class);
+    private RateLimitedOperation op;
+    private HashMap<String, String> sid2primary = new HashMap<>();
+    private HashMap<String, String> sid2secondary = new HashMap<>();
     private String redirfile;
-    RateLimitedOperation op;
 
     /**
      * Create a mechanism for maintaining subscription redirections.
      *
      * @param redirfile The file to store the redirection information.
-     * @param mininterval The minimum number of milliseconds between writes to the redirection
-     * information file.
+     * @param mininterval The minimum number of milliseconds between writes to the redirection information file.
      * @param timer The timer thread used to run delayed file writes.
      */
-    public RedirManager(String redirfile, long mininterval, Timer timer) {
+    RedirManager(String redirfile, long mininterval, Timer timer) {
         this.redirfile = redirfile;
         op = new RateLimitedOperation(mininterval, timer) {
             public void run() {
                 try {
-                    StringBuffer sb = new StringBuffer();
-                    for (String s : sid2primary.keySet()) {
-                        sb.append(s).append(' ').append(sid2primary.get(s)).append(' ')
-                            .append(sid2secondary.get(s)).append('\n');
+                    StringBuilder sb = new StringBuilder();
+                    for (Map.Entry<String, String> entry : sid2primary.entrySet()) {
+                        String key = entry.getKey();
+                        String value = entry.getValue();
+                        sb.append(key).append(' ').append(value).append(' ')
+                                .append(sid2secondary.get(key)).append('\n');
                     }
                     try (OutputStream os = new FileOutputStream(RedirManager.this.redirfile)) {
                         os.write(sb.toString().getBytes());
                     }
                 } catch (Exception e) {
+                    eelfLogger.error("Exception", e);
                 }
             }
         };
         try {
-            String s;
+            String line;
             try (BufferedReader br = new BufferedReader(new FileReader(redirfile))) {
-                while ((s = br.readLine()) != null) {
-                    s = s.trim();
-                    String[] sx = s.split(" ");
-                    if (s.startsWith("#") || sx.length != 3) {
-                        continue;
-                    }
-                    sid2primary.put(sx[0], sx[1]);
-                    sid2secondary.put(sx[0], sx[2]);
+                while ((line = br.readLine()) != null) {
+                    addSubRedirInfo(line);
                 }
             }
         } catch (Exception e) {
-            // missing file is normal
+            eelfLogger.debug("Missing file is normal", e);
         }
     }
 
     /**
-     * Set up redirection.  If a request is to be sent to subscription ID sid, and that is
-     * configured to go to URL primary, instead, go to secondary.
+     * Set up redirection.  If a request is to be sent to subscription ID sid, and that is configured to go to URL
+     * primary, instead, go to secondary.
      *
      * @param sid The subscription ID to be redirected
      * @param primary The URL associated with that subscription ID
      * @param secondary The replacement URL to use instead
      */
-    public synchronized void redirect(String sid, String primary, String secondary) {
+    synchronized void redirect(String sid, String primary, String secondary) {
         sid2primary.put(sid, primary);
         sid2secondary.put(sid, secondary);
         op.request();
     }
 
     /**
-     * Cancel redirection.  If a request is to be sent to subscription ID sid, send it to its
-     * primary URL.
+     * Cancel redirection.  If a request is to be sent to subscription ID sid, send it to its primary URL.
      *
      * @param sid The subscription ID to remove from the table.
      */
-    public synchronized void forget(String sid) {
+    synchronized void forget(String sid) {
         sid2primary.remove(sid);
         sid2secondary.remove(sid);
         op.request();
     }
 
     /**
-     * Look up where to send a subscription.  If the primary has changed or there is no redirection,
-     * use the primary.  Otherwise, redirect to the secondary URL.
+     * Look up where to send a subscription.  If the primary has changed or there is no redirection, use the primary.
+     * Otherwise, redirect to the secondary URL.
      *
      * @param sid The subscription ID to look up.
      * @param primary The configured primary URL.
      * @return The destination URL to really use.
      */
-    public synchronized String lookup(String sid, String primary) {
+    synchronized String lookup(String sid, String primary) {
         String oprim = sid2primary.get(sid);
         if (primary.equals(oprim)) {
             return (sid2secondary.get(sid));
@@ -129,9 +128,19 @@ public class RedirManager {
     }
 
     /**
-     * Is a subscription redirected?
+     * Is a subscription redirected.
      */
-    public synchronized boolean isRedirected(String sid) {
+    synchronized boolean isRedirected(String sid) {
         return (sid != null && sid2secondary.get(sid) != null);
     }
+
+    private void addSubRedirInfo(String subRedirInfo) {
+        subRedirInfo = subRedirInfo.trim();
+        String[] sx = subRedirInfo.split(" ");
+        if (subRedirInfo.startsWith("#") || sx.length != 3) {
+            return;
+        }
+        sid2primary.put(sx[0], sx[1]);
+        sid2secondary.put(sx[0], sx[2]);
+    }
 }