f742a46528aff1a6e72219f201ac343522d0eb53
[aaf/authz.git] / auth / auth-batch / src / main / java / org / onap / aaf / auth / batch / helpers / ExpireRange.java
1 /**
2  * ============LICENSE_START====================================================
3  * org.onap.aaf
4  * ===========================================================================
5  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6  *
7  * Modifications Copyright © 2018 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
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  * 
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====================================================
21  */
22
23 package org.onap.aaf.auth.batch.helpers;
24
25 import java.util.ArrayList;
26 import java.util.Date;
27 import java.util.GregorianCalendar;
28 import java.util.HashMap;
29 import java.util.HashSet;
30 import java.util.List;
31 import java.util.Map;
32 import java.util.Set;
33
34 import org.onap.aaf.auth.org.Organization.Identity;
35 import org.onap.aaf.cadi.Access;
36
37 public class ExpireRange {
38         private static final String DELETE = "Delete";
39         public static final String ONE_MONTH = "OneMonth";
40         public static final String TWO_MONTH = "TwoMonth";
41         public static final String TWO_WEEK = "TwoWeek";
42         public static final String ONE_WEEK = "OneWeek";
43         private static final String AAF_BATCH_RANGE = "aaf_batch_range.";
44         public final Map<String,List<Range>> ranges;
45         private final Map<Integer,Date> intervalDates;
46         private static final Date now = new Date();
47         public final Range approveDelete ;
48
49         private Range delRange;
50         
51         public ExpireRange(final Access access) {
52                 ranges = new HashMap<>();
53                 intervalDates = new HashMap<>();
54                 int i=0;
55                 approveDelete = new Range(DELETE,0,0,0,-1,0,GregorianCalendar.DAY_OF_YEAR,-100);
56                 String prop = access.getProperty(AAF_BATCH_RANGE + i,null);
57                 if(prop==null && i==0) {
58                                 List<Range> lcred = getRangeList("cred");
59                                 List<Range> lur = getRangeList("ur");
60                                 List<Range> lx509 = getRangeList("x509");
61         
62                                 
63                                 /*
64                                    Range(Name, ReportingLevel, PeopleInterval, AppInterval, Start(Type,Qty) End(Type,Qty) )
65                                    Interval of -1 Means "only once"
66                                    Interval of 0 means none
67                                    Interval > 0 means only X number of Days.
68                                 */
69                                 delRange = new Range(DELETE,0,0,0,-1,0,GregorianCalendar.WEEK_OF_MONTH,-2);
70                                 lur.add(delRange);
71                                 lcred.add(delRange);
72                                 lx509.add(delRange);
73                                 
74                                 lcred.add(new Range(ONE_WEEK ,3,-1,1,0,0,GregorianCalendar.WEEK_OF_MONTH,1));
75                                 lcred.add(new Range(TWO_WEEK ,2,-1,-1,GregorianCalendar.WEEK_OF_MONTH,1,GregorianCalendar.WEEK_OF_MONTH,2));
76                                 lcred.add(new Range(ONE_MONTH,1,7,7,GregorianCalendar.WEEK_OF_MONTH,2,GregorianCalendar.MONTH,1));
77                                 lcred.add(new Range(TWO_MONTH,1,-1,-1,GregorianCalendar.MONTH,1,GregorianCalendar.MONTH,2));
78                                 
79                                 lur.add(  new Range(ONE_MONTH,1,-1,-1,0,0,GregorianCalendar.MONTH,1));
80                                 // Comment out until we can get some more clear actions in place for GUI
81                                 // lur.add(  new Range(ONE_MONTH,1,-1,-1,GregorianCalendar.WEEK_OF_MONTH,2,GregorianCalendar.MONTH,1));
82                                 // lur.add(  new Range(ONE_WEEK,2,-1,1,0,0,GregorianCalendar.WEEK_OF_MONTH,1));
83                                 
84                                 lx509.add(new Range(ONE_MONTH,1,-1,-1,GregorianCalendar.WEEK_OF_MONTH,2,GregorianCalendar.MONTH,1));
85                         }
86         }
87         
88         public Range newFutureRange() {
89                 return new Range("Approval",7,7,1,0,0,GregorianCalendar.MONTH,1);
90         }
91         
92         public Set<String> names() {
93                 Set<String> names = new HashSet<>();
94         for(List<Range> lr : ranges.values()) {
95                 for(Range r : lr) {
96                         names.add(r.name);
97                 }
98         }
99
100                 return names;
101         }
102         
103         private synchronized List<Range> getRangeList(final String key) {
104                 List<Range> rv = ranges.get(key);
105                 if(rv==null) {
106                         rv = new ArrayList<>();
107                         ranges.put(key, rv);
108                 }
109                 return rv;
110         }
111         
112         public class Range {
113                 private final String name;
114                 private final int reportingLevel;
115                 private final int peopleInterval; // in Days
116                 private final int appInterval; // in Days
117                 private final Date start;
118                 private final Date end;
119                 private final Date lowerValid;
120                 
121                 public Range(
122                                 final String name, final int reportingLevel, 
123                                 final int peopleInterval, final int appInterval,  
124                                 final int startGCType, final int startQty,  
125                                 final int endGCType,final int endQty) {
126                         this.name = name;
127                         this.reportingLevel = reportingLevel;
128                         this.peopleInterval = peopleInterval;
129                         this.appInterval = appInterval;
130                         GregorianCalendar gc = new GregorianCalendar();
131                         if(startGCType<0) {
132                                 gc.set(GregorianCalendar.YEAR, 1);
133                         } else {
134                                 gc.setTime(now);
135                                 gc.add(startGCType, startQty);
136                         }
137                         start = gc.getTime();
138                         
139                         if(endGCType<0) {
140                                 gc.set(GregorianCalendar.YEAR, 1);
141                         } else {
142                                 gc.setTime(now);
143                                 gc.add(endGCType, endQty);
144                         }
145                         end = gc.getTime();
146                         
147
148                         if(endGCType<0) {
149                                 gc.set(GregorianCalendar.YEAR, -1);
150                         } else {
151                                 gc.setTime(now);
152                                 gc.add(endGCType, endQty * -1);
153                         }
154                         lowerValid = gc.getTime();
155
156                 }
157                 
158                 public String name() {
159                         return name;
160                 }
161                 
162                 public int reportingLevel() {
163                         return reportingLevel;
164                 }
165
166                 public boolean needsContact(Date lnd, Identity identity) {
167                         final int interval;
168                         if(identity==null || identity.isPerson()) {
169                                 interval = peopleInterval;
170                         } else {
171                                 interval = appInterval;
172                         }
173                         if(interval == 0) {
174                                 return false;
175                         } else if(interval < 0) { // "-1 = only once "
176                                 return (lnd==null || lnd.before(lowerValid));
177                         } else {
178                                 Date rv = intervalDates.get(interval);
179                                 if(rv==null) {
180                                         GregorianCalendar gc = new GregorianCalendar();
181                                         gc.setTime(now);
182                                         gc.add(GregorianCalendar.DAY_OF_YEAR, -1*interval);
183                                         rv = gc.getTime();
184                                         intervalDates.put(interval, rv);
185                                 }
186                                 return rv.after(lnd);
187                         }
188                 }
189
190                 public Date getStart() {
191                         return start;
192                 }
193                 
194                 public Date getEnd() {
195                         return end;
196                 }
197                 
198                 public boolean inRange(final Date date) {
199                         if(date==null) {
200                                 return false;
201                         } else {
202                                 return date.getTime()>=start.getTime() && date.before(end);
203                         }
204                 }
205
206         }
207
208         public Range getRange(final String key, final Date date) {
209                 Range rv = null;
210                 if(date!=null) {
211                         List<Range> lr = ranges.get(key);
212                         if(lr==null) {
213                                 return null;
214                         } else {
215                                 for(Range r : lr) {
216                                         if(r.inRange(date)) {
217                                                 rv = r;
218                                                 break;
219                                         }
220                                 }
221                         }
222                 }
223                 return rv;
224         }
225
226         public Date now() {
227                 return now;
228         }
229         
230
231 }