Batch, Remove unneeded Classes, refine, etc
[aaf/authz.git] / auth / auth-batch / src / main / java / org / onap / aaf / auth / batch / helpers / LastNotified.java
index 22231f3..d05f38c 100644 (file)
  */
 package org.onap.aaf.auth.batch.helpers;
 
+import java.security.cert.X509Certificate;
 import java.util.Date;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 
-import org.onap.aaf.auth.batch.helpers.Notification.TYPE;
+import org.onap.aaf.auth.batch.helpers.Cred.Instance;
+import org.onap.aaf.auth.batch.helpers.ExpireRange.Range;
+import org.onap.aaf.cadi.util.CSV;
+import org.onap.aaf.misc.env.Env;
+import org.onap.aaf.misc.env.TimeTaken;
+import org.onap.aaf.misc.env.Trans;
+import org.onap.aaf.misc.env.util.Split;
 
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
 import com.datastax.driver.core.Session;
+import com.datastax.driver.core.SimpleStatement;
+import com.datastax.driver.core.Statement;
 
 public class LastNotified {
        private Map<String,Date> lastNotified = new TreeMap<>();
        private Session session;
+       private static final Date never = new Date(0);
+       private static final String SELECT = "SELECT user,target,key,last FROM authz.notified";
        
        public LastNotified(Session session) {
                this.session = session;
@@ -44,7 +56,7 @@ public class LastNotified {
        
        public void add(Set<String> users) {
                StringBuilder query = new StringBuilder();
-               startNotifyQuery(query);
+               startQuery(query);
                int cnt = 0;
        for(String user : users) {
                if(++cnt>1) {
@@ -54,37 +66,129 @@ public class LastNotified {
                query.append(user);
                query.append('\'');
                if(cnt>=30) {
-                       endNotifyQuery(query, Notification.TYPE.OA);
-                       add(session.execute(query.toString()),lastNotified);
+                       endQuery(query);
+                       add(session.execute(query.toString()),lastNotified, (x,y) -> false);
                        query.setLength(0);
-                       startNotifyQuery(query);
+                       startQuery(query);
                        cnt=0;
                }
        }
        if(cnt>0) {
-               endNotifyQuery(query, Notification.TYPE.OA);
-                       add(session.execute(query.toString()),lastNotified);
+               endQuery(query);
+                       add(session.execute(query.toString()),lastNotified, (x,y) -> false);
        }
        }
 
-       public Date lastNotified(String user) {
-               return lastNotified.get(user);
+       /**
+        * Note: target_key CAN also contain a Pipe.
+        * 
+        * @param user
+        * @param target
+        * @param target_key
+        * @return
+        */
+       public Date lastNotified(String user, String target, String target_key) {
+               String key = user + '|' + target + '|' + target_key;
+               return lastNotified(key);
        }
        
-       private void add(ResultSet result, Map<String, Date> lastNotified) {
+       public Date lastNotified(String key) {
+               Date rv = lastNotified.get(key);
+               if(rv==null) {
+                       rv = never;
+                       lastNotified.put(key, rv);
+               }
+               return rv;
+       }
+       
+       private Date add(ResultSet result, Map<String, Date> lastNotified, MarkDelete md) {
+               Date last = null;
+               Row r;
        for(Iterator<Row> iter = result.iterator(); iter.hasNext();) {
-               Row r = iter.next();
-               lastNotified.put(r.getString(0), r.getTimestamp(1));
+               r = iter.next();
+               String ttKey = r.getString(1) + '|' +
+                                          r.getString(2);
+               String fullKey = r.getString(0) + '|' +
+                                        ttKey;
+               last=r.getTimestamp(3);
+               if(!md.process(fullKey, last)) {
+                       lastNotified.put(fullKey, last);
+                       Date d = lastNotified.get(ttKey);
+                       if(d==null || d.after(last)) { // put most recent, if different
+                               lastNotified.put(ttKey, last);
+                       }
+               }
        }
+       return last;
+       }
+       
+       private interface MarkDelete {
+               public boolean process(String fullKey, Date last);
+       };
+
+       private void startQuery(StringBuilder query) {
+               query.append(SELECT + " WHERE user in (");
+       }
+
+       private void endQuery(StringBuilder query) {
+               query.append(");");
        }
 
-       private void startNotifyQuery(StringBuilder query) {
-               query.append("SELECT user,last FROM authz.notify WHERE user in (");
+       public void update(StringBuilder query,String user, String target, String key) {
+               query.append("UPDATE authz.notified SET last=dateof(now()) WHERE user='");
+               query.append(user);
+               query.append("' AND target='");
+               query.append(target);
+               query.append("' AND key='");
+               query.append(key);
+               query.append("';\n");
        }
-    
-    private void endNotifyQuery(StringBuilder query, TYPE oa) {
-       query.append(") AND type=");
-       query.append(oa.idx());
-       query.append(';');
+
+    public LastNotified loadAll(Trans trans, final Range delRange, final CSV.Writer cw) {
+        trans.debug().log( "query: ",SELECT );
+        TimeTaken tt = trans.start("Read all LastNotified", Env.REMOTE);
+
+        ResultSet results;
+        try {
+            Statement stmt = new SimpleStatement( SELECT );
+            results = session.execute(stmt);
+            add(results,lastNotified, (fullKey, last) ->  {
+               if(delRange.inRange(last)) {
+                       String[] params = Split.splitTrim('|', fullKey,3);
+                       if(params.length==3) {
+                               cw.row("notified",params[0],params[1],params[2]);
+                               return true;
+                       }
+               }
+               return false;
+            });
+        } finally {
+            tt.done();
+        }
+        return this;
     }
+
+       public static String newKey(UserRole ur) {
+               return "ur|" + ur.user() + '|'+ur.role();
+       }
+
+       public static String newKey(Cred cred, Instance inst) {
+               return "cred|" + cred.id + '|' + inst.type + '|' + inst.tag;
+       }
+
+       public static String newKey(X509 x509, X509Certificate x509Cert) {
+               return "x509|" + x509.id + '|' + x509Cert.getSerialNumber().toString();
+       }
+
+       public static void delete(StringBuilder query, List<String> row) {
+               query.append("DELETE FROM authz.notified WHERE user='");
+               query.append(row.get(1));
+               query.append("' AND target='");
+               query.append(row.get(2));
+               query.append("' AND key='");
+               query.append(row.get(3));
+               query.append("';\n");
+       }
+
 }