2 * ============LICENSE_START====================================================
4 * ===========================================================================
5 * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6 * ===========================================================================
7 * Modifications Copyright (C) 2019 IBM.
8 * ===========================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END====================================================
24 package org.onap.aaf.auth.batch.helpers;
26 import java.util.ArrayList;
27 import java.util.Date;
28 import java.util.LinkedList;
29 import java.util.List;
31 import java.util.SortedMap;
32 import java.util.TreeMap;
33 import java.util.UUID;
35 import org.onap.aaf.auth.dao.cass.ApprovalDAO;
36 import org.onap.aaf.auth.env.AuthzTrans;
37 import org.onap.aaf.auth.layer.Result;
38 import org.onap.aaf.cadi.util.CSV;
39 import org.onap.aaf.misc.env.Env;
40 import org.onap.aaf.misc.env.TimeTaken;
41 import org.onap.aaf.misc.env.Trans;
43 import com.datastax.driver.core.ResultSet;
44 import com.datastax.driver.core.Row;
45 import com.datastax.driver.core.Session;
46 import com.datastax.driver.core.SimpleStatement;
47 import com.datastax.driver.core.Statement;
49 public class Approval implements CacheChange.Data {
50 public static final String ADD_USER_TO_ROLE = "Add User [";
51 public static final String RE_APPROVAL_IN_ROLE = "Extend access of User [";
52 public static final String RE_VALIDATE_ADMIN = "Revalidate as Admin of AAF Namespace [";
53 public static final String RE_VALIDATE_OWNER = "Revalidate as Owner of AAF Namespace [";
55 public static final SortedMap<String,List<Approval>> byApprover = new TreeMap<>();
56 public static final SortedMap<String,List<Approval>> byUser = new TreeMap<>();
57 public static final SortedMap<UUID,List<Approval>> byTicket = new TreeMap<>();
58 public static final List<Approval> list = new LinkedList<>();
59 private static final CacheChange<Approval> cache = new CacheChange<>();
61 public final ApprovalDAO.Data add;
64 public static final Creator<Approval> v2_0_17 = new Creator<Approval>() {
66 public Approval create(Row row) {
67 return new Approval(row.getUUID(0), row.getUUID(1), row.getString(2),
68 row.getString(3),row.getString(4),row.getString(5),row.getString(6),row.getString(7),
73 public String select() {
74 return "select id,ticket,approver,user,memo,operation,status,type,WRITETIME(status) from authz.approval";
78 public static final Visitor<Approval> FullLoad = new Visitor<Approval>() {
80 public void visit(Approval app) {
84 String person = app.getApprover();
86 ln = byApprover.get(person);
88 ln = new ArrayList<>();
89 byApprover.put(app.getApprover(), ln);
94 person = app.getUser();
96 ln = byUser.get(person);
98 ln = new ArrayList<>();
99 byUser.put(app.getUser(), ln);
103 UUID ticket = app.getTicket();
105 ln = byTicket.get(ticket);
107 ln = new ArrayList<>();
108 byTicket.put(app.getTicket(), ln);
115 public Approval(UUID id, UUID ticket, String approver,// Date last_notified,
116 String user, String memo, String operation, String status, String type, long updated) {
117 add = new ApprovalDAO.Data();
120 add.approver = approver;
123 add.operation = operation;
126 add.updated = new Date(updated);
127 role = roleFromMemo(memo);
130 public static String roleFromMemo(String memo) {
134 int first = memo.indexOf('[');
136 int second = memo.indexOf(']', ++first);
138 String role = memo.substring(first, second);
139 return getRoleString(role, memo, second);
145 public static String getRoleString(String role, String memo, int second) {
146 if (memo.startsWith(RE_VALIDATE_ADMIN)) {
147 return role + ".admin";
148 } else if (memo.startsWith(RE_VALIDATE_OWNER)) {
149 return role + ".owner";
151 int secondString = memo.indexOf('[',second);
152 if(secondString>=0) {
153 second = memo.indexOf(']', ++secondString);
154 if(second>=0 && (memo.startsWith(RE_APPROVAL_IN_ROLE) ||
155 memo.startsWith(ADD_USER_TO_ROLE))) {
156 return memo.substring(secondString, second);
163 public static int load(Trans trans, Session session, Creator<Approval> creator, Visitor<Approval> visitor) {
166 count += call(trans,session,creator.query(null), creator, visitor);
168 trans.info().log("Found",count,"Approval Records");
173 public static int load(Trans trans, Session session, Creator<Approval> creator ) {
176 count += call(trans,session,creator.query(null), creator, FullLoad);
178 trans.info().log("Found",count,"Approval Records");
183 public static int loadUsers(Trans trans, Session session, Set<String> users, Visitor<Approval> visitor) {
185 for(String user : users) {
186 total += call(trans,session,String.format("%s WHERE user='%s';",v2_0_17.select(), user),v2_0_17,visitor);
191 public static void row(CSV.RowSetter crs, Approval app) {
192 crs.row("approval",app.add.id,app.add.ticket,app.add.user,app.role,app.add.memo);
195 private static int call(Trans trans, Session session, String query, Creator<Approval> creator, Visitor<Approval> visitor) {
196 TimeTaken tt = trans.start("DB Query", Env.REMOTE);
199 Statement stmt = new SimpleStatement( query );
200 results = session.execute(stmt);
202 for (Row row : results.all()) {
204 visitor.visit(creator.create(row));
213 public void expunge() {
214 List<Approval> la = byApprover.get(getApprover());
219 la = byUser.get(getUser());
223 UUID ticket = this.add==null?null:this.add.ticket;
225 la = byTicket.get(this.add.ticket);
232 public static void clear() {
237 cache.resetLocalData();
243 public String getStatus() {
247 * @param status the status to set
249 public void setStatus(String status) {
255 public UUID getId() {
261 public UUID getTicket() {
265 * @return the approver
267 public String getApprover() {
273 public String getUser() {
279 public String getMemo() {
283 * @return the operation
285 public String getOperation() {
286 return add.operation;
291 public String getType() {
294 public void lapsed() {
299 public String getRole() {
303 public String toString() {
304 return getUser() + ' ' + getMemo();
307 public void delayDelete(AuthzTrans trans, ApprovalDAO ad, boolean dryRun, String text) {
309 trans.info().log(text,"- Would Delete: Approval",getId(),"on ticket",getTicket(),"for",getApprover());
311 Result<Void> rv = ad.delete(trans, add, false);
313 trans.info().log(text,"- Deleted: Approval",getId(),"on ticket",getTicket(),"for",getApprover());
314 cache.delayedDelete(this);
316 trans.info().log(text,"- Failed to Delete Approval",getId());
322 public static void resetLocalData() {
323 cache.resetLocalData();
326 public static int sizeForDeletion() {
327 return cache.cacheSize();
330 public static void delayDelete(AuthzTrans noAvg, ApprovalDAO apprDAO, boolean dryRun, List<Approval> list, String text) {
332 for (Approval a : list) {
333 a.delayDelete(noAvg, apprDAO, dryRun,text);
338 public static boolean pendingDelete(Approval a) {
339 return cache.contains(a);
342 public static void deleteByIDBatch(StringBuilder sb, String id) {
343 sb.append("DELETE from authz.approval where id=");