X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=auth%2Fauth-batch%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Faaf%2Fauth%2Fbatch%2Fhelpers%2FLastNotified.java;h=d05f38c5ee5e436be55639f267925688e03ac556;hb=d86e3224e6a5af2bd2b713f93bea5e6677d3ebc2;hp=22231f3a88a2867d1c7b30a63ba6d808de390337;hpb=a50007dcded86acc2dcd610810f8afac720a058a;p=aaf%2Fauthz.git diff --git a/auth/auth-batch/src/main/java/org/onap/aaf/auth/batch/helpers/LastNotified.java b/auth/auth-batch/src/main/java/org/onap/aaf/auth/batch/helpers/LastNotified.java index 22231f3a..d05f38c5 100644 --- a/auth/auth-batch/src/main/java/org/onap/aaf/auth/batch/helpers/LastNotified.java +++ b/auth/auth-batch/src/main/java/org/onap/aaf/auth/batch/helpers/LastNotified.java @@ -22,21 +22,33 @@ */ 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 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 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 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 lastNotified, MarkDelete md) { + Date last = null; + Row r; for(Iterator 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 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"); + } + }