AT&T 2.0.19 Code drop, stage 4
[aaf/authz.git] / authz-service / src / main / java / org / onap / aaf / authz / service / api / API_History.java
1 /*******************************************************************************\r
2  * ============LICENSE_START====================================================\r
3  * * org.onap.aaf\r
4  * * ===========================================================================\r
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * * ===========================================================================\r
7  * * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * * you may not use this file except in compliance with the License.\r
9  * * You may obtain a copy of the License at\r
10  * * \r
11  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * * \r
13  *  * Unless required by applicable law or agreed to in writing, software\r
14  * * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * * See the License for the specific language governing permissions and\r
17  * * limitations under the License.\r
18  * * ============LICENSE_END====================================================\r
19  * *\r
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
21  * *\r
22  ******************************************************************************/\r
23 package org.onap.aaf.authz.service.api;\r
24 \r
25 import static org.onap.aaf.authz.layer.Result.OK;\r
26 import static org.onap.aaf.cssa.rserv.HttpMethods.GET;\r
27 \r
28 import java.text.SimpleDateFormat;\r
29 import java.util.ArrayList;\r
30 import java.util.Collections;\r
31 import java.util.Date;\r
32 import java.util.GregorianCalendar;\r
33 \r
34 import javax.servlet.http.HttpServletRequest;\r
35 import javax.servlet.http.HttpServletResponse;\r
36 \r
37 import org.onap.aaf.authz.env.AuthzTrans;\r
38 import org.onap.aaf.authz.facade.AuthzFacade;\r
39 import org.onap.aaf.authz.layer.Result;\r
40 import org.onap.aaf.authz.service.AuthAPI;\r
41 import org.onap.aaf.authz.service.Code;\r
42 import org.onap.aaf.authz.service.mapper.Mapper.API;\r
43 import org.onap.aaf.dao.aaf.cass.Status;\r
44 \r
45 import com.att.aft.dme2.internal.jetty.http.HttpStatus;\r
46 \r
47 /**\r
48  * Pull certain types of History Info\r
49  * \r
50  * Specify yyyymm as \r
51  *      single - 201504\r
52  *  commas 201503,201504\r
53  *  ranges 201501-201504\r
54  *  combinations 201301,201401,201501-201504\r
55  *  \r
56  *\r
57  */\r
58 public class API_History {\r
59         /**\r
60          * Normal Init level APIs\r
61          * \r
62          * @param authzAPI\r
63          * @param facade\r
64          * @throws Exception\r
65          */\r
66         public static void init(AuthAPI authzAPI, AuthzFacade facade) throws Exception {\r
67                 /**\r
68                  * Get History\r
69                  */\r
70                 authzAPI.route(GET,"/authz/hist/user/:user",API.HISTORY,new Code(facade,"Get History by User", true) {\r
71                         @Override\r
72                         public void handle(AuthzTrans trans, HttpServletRequest req, HttpServletResponse resp) throws Exception {\r
73                                 int[] years;\r
74                                 int descend;\r
75                                 try {\r
76                                         years = getYears(req);\r
77                                         descend = decending(req);\r
78                                 } catch(Exception e) {\r
79                                         context.error(trans, resp, Result.err(Status.ERR_BadData, e.getMessage()));\r
80                                         return;\r
81                                 }\r
82 \r
83                                 Result<Void> r = context.getHistoryByUser(trans, resp, pathParam(req,":user"),years,descend);\r
84                                 switch(r.status) {\r
85                                         case OK:\r
86                                                 resp.setStatus(HttpStatus.OK_200); \r
87                                                 break;\r
88                                         default:\r
89                                                 context.error(trans,resp,r);\r
90                                 }\r
91                         }\r
92                 });\r
93 \r
94                 /**\r
95                  * Get History by NS\r
96                  */\r
97                 authzAPI.route(GET,"/authz/hist/ns/:ns",API.HISTORY,new Code(facade,"Get History by Namespace", true) {\r
98                         @Override\r
99                         public void handle(AuthzTrans trans, HttpServletRequest req, HttpServletResponse resp) throws Exception {\r
100                                 int[] years;\r
101                                 int descend;\r
102                                 try {\r
103                                         years = getYears(req);\r
104                                         descend = decending(req);\r
105                                 } catch(Exception e) {\r
106                                         context.error(trans, resp, Result.err(Status.ERR_BadData, e.getMessage()));\r
107                                         return;\r
108                                 }\r
109                                 \r
110                                 Result<Void> r = context.getHistoryByNS(trans, resp, pathParam(req,":ns"),years,descend);\r
111                                 switch(r.status) {\r
112                                         case OK:\r
113                                                 resp.setStatus(HttpStatus.OK_200); \r
114                                                 break;\r
115                                         default:\r
116                                                 context.error(trans,resp,r);\r
117                                 }\r
118                         }\r
119                 });\r
120 \r
121                 /**\r
122                  * Get History by Role\r
123                  */\r
124                 authzAPI.route(GET,"/authz/hist/role/:role",API.HISTORY,new Code(facade,"Get History by Role", true) {\r
125                         @Override\r
126                         public void handle(AuthzTrans trans, HttpServletRequest req, HttpServletResponse resp) throws Exception {\r
127                                 int[] years;\r
128                                 int descend;\r
129                                 try {\r
130                                         years = getYears(req);\r
131                                         descend = decending(req);\r
132                                 } catch(Exception e) {\r
133                                         context.error(trans, resp, Result.err(Status.ERR_BadData, e.getMessage()));\r
134                                         return;\r
135                                 }\r
136 \r
137                                 Result<Void> r = context.getHistoryByRole(trans, resp, pathParam(req,":role"),years,descend);\r
138                                 switch(r.status) {\r
139                                         case OK:\r
140                                                 resp.setStatus(HttpStatus.OK_200); \r
141                                                 break;\r
142                                         default:\r
143                                                 context.error(trans,resp,r);\r
144                                 }\r
145                         }\r
146                 });\r
147 \r
148                 /**\r
149                  * Get History by Perm Type\r
150                  */\r
151                 authzAPI.route(GET,"/authz/hist/perm/:type",API.HISTORY,new Code(facade,"Get History by Perm Type", true) {\r
152                         @Override\r
153                         public void handle(AuthzTrans trans, HttpServletRequest req, HttpServletResponse resp) throws Exception {\r
154                                 int[] years;\r
155                                 int descend;\r
156                                 try {\r
157                                         years = getYears(req);\r
158                                         descend = decending(req);\r
159                                 } catch(Exception e) {\r
160                                         context.error(trans, resp, Result.err(Status.ERR_BadData, e.getMessage()));\r
161                                         return;\r
162                                 }\r
163                                 \r
164                                 Result<Void> r = context.getHistoryByPerm(trans, resp, pathParam(req,":type"),years,descend);\r
165                                 switch(r.status) {\r
166                                         case OK:\r
167                                                 resp.setStatus(HttpStatus.OK_200); \r
168                                                 break;\r
169                                         default:\r
170                                                 context.error(trans,resp,r);\r
171                                 }\r
172                         }\r
173                 });\r
174         }\r
175 \r
176         // Check if Ascending\r
177         private static int decending(HttpServletRequest req) {\r
178                 if("true".equalsIgnoreCase(req.getParameter("desc")))return -1;\r
179                 if("true".equalsIgnoreCase(req.getParameter("asc")))return 1;\r
180                 return 0;\r
181         }\r
182         \r
183         // Get Common "yyyymm" parameter, or none\r
184         private static final SimpleDateFormat FMT = new SimpleDateFormat("yyyyMM");\r
185         \r
186         private static int[] getYears(HttpServletRequest req) throws NumberFormatException {\r
187                 String yyyymm = req.getParameter("yyyymm");\r
188                 ArrayList<Integer> ai= new ArrayList<Integer>();\r
189                 if(yyyymm==null) {\r
190                         GregorianCalendar gc = new GregorianCalendar();\r
191                         // three months is the default\r
192                         for(int i=0;i<3;++i) {\r
193                                 ai.add(Integer.parseInt(FMT.format(gc.getTime())));\r
194                                 gc.add(GregorianCalendar.MONTH, -1);\r
195                         }\r
196                 } else {\r
197                         for(String ym : yyyymm.split(",")) {\r
198                                 String range[] = ym.split("\\s*-\\s*");\r
199                                 switch(range.length) {\r
200                                         case 0:\r
201                                                 break;\r
202                                         case 1:\r
203                                                 if(!ym.endsWith("-")) {\r
204                                                         ai.add(getNum(ym));\r
205                                                         break;\r
206                                                 } else {\r
207                                                         range=new String[] {ym.substring(0, 6),FMT.format(new Date())};\r
208                                                 }\r
209                                         default:\r
210                                                 GregorianCalendar gc = new GregorianCalendar();\r
211                                                 gc.set(GregorianCalendar.MONTH, Integer.parseInt(range[1].substring(4,6))-1);\r
212                                                 gc.set(GregorianCalendar.YEAR, Integer.parseInt(range[1].substring(0,4)));\r
213                                                 int end = getNum(FMT.format(gc.getTime())); \r
214                                                 \r
215                                                 gc.set(GregorianCalendar.MONTH, Integer.parseInt(range[0].substring(4,6))-1);\r
216                                                 gc.set(GregorianCalendar.YEAR, Integer.parseInt(range[0].substring(0,4)));\r
217                                                 for(int i=getNum(FMT.format(gc.getTime()));i<=end;gc.add(GregorianCalendar.MONTH, 1),i=getNum(FMT.format(gc.getTime()))) {\r
218                                                         ai.add(i);\r
219                                                 }\r
220 \r
221                                 }\r
222                         }\r
223                 }\r
224                 if(ai.size()==0) {\r
225                         throw new NumberFormatException(yyyymm + " is an invalid number or range");\r
226                 }\r
227                 Collections.sort(ai);\r
228                 int ym[] = new int[ai.size()];\r
229                 for(int i=0;i<ym.length;++i) {\r
230                         ym[i]=ai.get(i);\r
231                 }\r
232                 return ym;\r
233         }\r
234         \r
235         private static int getNum(String n) {\r
236                 if(n==null || n.length()!=6) throw new NumberFormatException(n + " is not in YYYYMM format");\r
237                 return Integer.parseInt(n);\r
238         }\r
239 }\r