DataMigration, other Batch
[aaf/authz.git] / auth / auth-batch / src / main / java / org / onap / aaf / auth / batch / update / Approvals.java
1 /**
2  * ============LICENSE_START====================================================
3  * org.onap.aaf
4  * ===========================================================================
5  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6  * ===========================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END====================================================
19  *
20  */
21
22 package org.onap.aaf.auth.batch.update;
23
24 import java.io.File;
25 import java.io.IOException;
26 import java.text.ParseException;
27 import java.util.ArrayList;
28 import java.util.Date;
29 import java.util.GregorianCalendar;
30 import java.util.List;
31 import java.util.Map;
32 import java.util.Map.Entry;
33 import java.util.TreeMap;
34
35 import org.onap.aaf.auth.batch.Batch;
36 import org.onap.aaf.auth.batch.BatchPrincipal;
37 import org.onap.aaf.auth.batch.approvalsets.ApprovalSet;
38 import org.onap.aaf.auth.batch.approvalsets.Pending;
39 import org.onap.aaf.auth.batch.approvalsets.URApprovalSet;
40 import org.onap.aaf.auth.batch.helpers.BatchDataView;
41 import org.onap.aaf.auth.batch.helpers.NS;
42 import org.onap.aaf.auth.batch.helpers.Notification;
43 import org.onap.aaf.auth.batch.helpers.Role;
44 import org.onap.aaf.auth.batch.helpers.UserRole;
45 import org.onap.aaf.auth.batch.reports.bodies.NotifyPendingApprBody;
46 import org.onap.aaf.auth.dao.cass.UserRoleDAO;
47 import org.onap.aaf.auth.env.AuthzTrans;
48 import org.onap.aaf.auth.layer.Result;
49 import org.onap.aaf.auth.org.OrganizationException;
50 import org.onap.aaf.cadi.CadiException;
51 import org.onap.aaf.cadi.client.Holder;
52 import org.onap.aaf.cadi.util.CSV;
53 import org.onap.aaf.misc.env.APIException;
54 import org.onap.aaf.misc.env.TimeTaken;
55 import org.onap.aaf.misc.env.Trans;
56 import org.onap.aaf.misc.env.util.Chrono;
57
58 public class Approvals extends Batch {
59     private final AuthzTrans noAvg;
60         private BatchDataView dataview;
61         private List<CSV> csvList;
62         private GregorianCalendar now;
63         
64
65     public Approvals(AuthzTrans trans) throws APIException, IOException, OrganizationException {
66         super(trans.env());
67         
68         noAvg = env.newTransNoAvg();
69         noAvg.setUser(new BatchPrincipal("batch:Approvals"));
70         session = cluster.connect();
71         dataview = new BatchDataView(noAvg,session,dryRun);
72         NS.load(trans, session, NS.v2_0_11);
73         Role.load(trans, session);
74         UserRole.load(trans, session, UserRole.v2_0_11);
75
76         now = new GregorianCalendar();
77         
78         csvList = new ArrayList<>();
79         File f;
80         if(args().length>0) {
81                 for(int i=0;i<args().length;++i) {
82                         f = new File(logDir(), args()[i]);
83                         if(f.exists()) {
84                                 csvList.add(new CSV(env.access(),f).processAll());
85                         } else {
86                         trans.error().printf("CSV File %s does not exist",f.getAbsolutePath());
87                         }
88                 }
89         } else {
90                 f = new File(logDir(), "Approvals"+Chrono.dateOnlyStamp()+".csv");
91                 if(f.exists()) {
92                         csvList.add(new CSV(env.access(),f).processAll());
93                         } else {
94                         trans.error().printf("CSV File %s does not exist",f.getAbsolutePath());
95                         }
96         }
97         
98     }
99
100     @Override
101     protected void run(AuthzTrans trans) {
102         Map<String,Pending> mpending = new TreeMap<>();
103                 Holder<Integer> count = new Holder<>(0);
104         for(CSV approveCSV : csvList) {
105                 TimeTaken tt = trans.start("Load Analyzed Reminders",Trans.SUB,approveCSV.name());
106                 try {
107                                 approveCSV.visit(row -> {
108                                         switch(row.get(0)) {
109                                                 case Pending.REMIND:
110                                                         try {
111                                                                 String user = row.get(1);
112                                                                 Pending p = new Pending(row);
113                                                                 Pending mp = mpending.get(user);
114                                                                 if(mp==null) {
115                                                                         mpending.put(user, p);
116                                                                 } else {
117                                                                         mp.inc(p); // FYI, unlikely
118                                                                 }
119                                                                 count.set(count.get()+1);
120                                                         } catch (ParseException e) {
121                                                                 trans.error().log(e);
122                                                         } 
123                                                 break;
124                                         }
125                                 });
126                         } catch (IOException | CadiException e) {
127                                 e.printStackTrace();
128                                 // .... but continue with next row
129                 } finally {
130                         tt.done();
131                 }
132         }
133         trans.info().printf("Processed %d Reminder Rows", count.get());
134
135         count.set(0);
136         for(CSV approveCSV : csvList) {
137                 TimeTaken tt = trans.start("Processing %s's UserRoles",Trans.SUB,approveCSV.name());
138                 try {
139                                 approveCSV.visit(row -> {
140                                         switch(row.get(0)) {
141                                                 case UserRole.APPROVE_UR:
142                                                         UserRoleDAO.Data urdd = UserRole.row(row);
143                                                         // Create an Approval
144                                                         ApprovalSet uras = new URApprovalSet(noAvg, now, dataview, () -> {
145                                                                 return urdd;
146                                                         });
147                                                         Result<Void> rw = uras.write(noAvg);
148                                                         if(rw.isOK()) {
149                                                                 Pending p = new Pending();
150                                                                 Pending mp = mpending.get(urdd.user);
151                                                                 if(mp==null) {
152                                                                         mpending.put(urdd.user, p);
153                                                                 } else {
154                                                                         mp.inc(p);
155                                                                 }
156                                                                 count.set(count.get()+1);
157                                                         } else {
158                                                                 trans.error().log(rw.errorString());
159                                                         }
160                                                         break;
161                                         }
162                                 });
163                                 dataview.flush();
164                         } catch (IOException | CadiException e) {
165                                 e.printStackTrace();
166                                 // .... but continue with next row
167                 } finally {
168                         tt.done();
169                 }
170             trans.info().printf("Processed %d UserRoles", count.get());
171
172             count.set(0);
173                 NotifyPendingApprBody npab;
174                 GregorianCalendar gc = new GregorianCalendar();
175                 gc.add(GregorianCalendar.DAY_OF_MONTH, 7);
176                 Date oneWeek = gc.getTime();
177                 
178                 Pending p;
179                 tt = trans.start("Notify for Pending", Trans.SUB);
180                 try {
181                         for(Entry<String, Pending> es : mpending.entrySet()) {
182                                 p = es.getValue();
183                                 Date earliest = p.earliest();
184                                 if(p.newApprovals() || earliest==null || earliest.before(oneWeek) ) {
185                                         System.out.println("update");
186                                 }
187                         }
188                 } finally {
189                         tt.done();
190                 }
191             trans.info().printf("Created %d Notifications", count.get());
192             }
193     }
194     
195     @Override
196     protected void _close(AuthzTrans trans) {
197         if(session!=null) {
198                 session.close();
199                 session = null;
200         }
201     }
202 }