AT&T 2.0.19 Code drop, stage 4
[aaf/authz.git] / authz-cass / src / main / java / org / onap / aaf / dao / aaf / cass / ApprovalDAO.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.dao.aaf.cass;\r
24 \r
25 import java.util.Date;\r
26 import java.util.List;\r
27 import java.util.UUID;\r
28 \r
29 import org.onap.aaf.authz.env.AuthzTrans;\r
30 import org.onap.aaf.authz.layer.Result;\r
31 import org.onap.aaf.dao.CassDAOImpl;\r
32 import org.onap.aaf.dao.Loader;\r
33 \r
34 import com.datastax.driver.core.Cluster;\r
35 import com.datastax.driver.core.Row;\r
36 \r
37 \r
38 public class ApprovalDAO extends CassDAOImpl<AuthzTrans,ApprovalDAO.Data> {\r
39         public static final String PENDING = "pending";\r
40         public static final String DENIED = "denied";\r
41         public static final String APPROVED = "approved";\r
42         \r
43         private static final String TABLE = "approval";\r
44         private HistoryDAO historyDAO;\r
45         private PSInfo psByUser, psByApprover, psByTicket, psByStatus;\r
46 \r
47         \r
48         public ApprovalDAO(AuthzTrans trans, Cluster cluster, String keyspace) {\r
49                 super(trans, ApprovalDAO.class.getSimpleName(),cluster,keyspace,Data.class,TABLE, readConsistency(trans,TABLE), writeConsistency(trans,TABLE));\r
50         historyDAO = new HistoryDAO(trans, this);\r
51                 init(trans);\r
52         }\r
53 \r
54 \r
55         public ApprovalDAO(AuthzTrans trans, HistoryDAO hDAO) {\r
56                 super(trans, ApprovalDAO.class.getSimpleName(),hDAO,Data.class,TABLE, readConsistency(trans,TABLE), writeConsistency(trans,TABLE));\r
57                 historyDAO=hDAO;\r
58                 init(trans);\r
59         }\r
60 \r
61         private static final int KEYLIMIT = 1;\r
62         public static class Data {\r
63                 public UUID   id;\r
64         public UUID   ticket;\r
65                 public String user;\r
66                 public String approver;\r
67                 public String type;\r
68                 public String status;\r
69                 public String memo;\r
70                 public String operation;\r
71                 public Date updated;\r
72         }\r
73         \r
74         private static class ApprovalLoader extends Loader<Data> {\r
75                 public static final ApprovalLoader deflt = new ApprovalLoader(KEYLIMIT);\r
76                 \r
77                 public ApprovalLoader(int keylimit) {\r
78                         super(keylimit);\r
79                 }\r
80                 \r
81                 @Override\r
82                 public Data load(Data data, Row row) {\r
83                         data.id = row.getUUID(0);\r
84                         data.ticket = row.getUUID(1);\r
85                         data.user = row.getString(2);\r
86                         data.approver = row.getString(3);\r
87                         data.type = row.getString(4);\r
88                         data.status = row.getString(5);\r
89                         data.memo = row.getString(6);\r
90                         data.operation = row.getString(7);\r
91                         if(row.getColumnDefinitions().size()>8) {\r
92                                 // Rows reported in MicroSeconds\r
93                                 data.updated = new Date(row.getLong(8)/1000);\r
94                         }\r
95                         return data;\r
96                 }\r
97 \r
98                 @Override\r
99                 protected void key(Data data, int idx, Object[] obj) {\r
100                         obj[idx]=data.id;\r
101                 }\r
102 \r
103                 @Override\r
104                 protected void body(Data data, int _idx, Object[] obj) {\r
105                         int idx = _idx;\r
106                         obj[idx]=data.ticket;\r
107                         obj[++idx]=data.user;\r
108                         obj[++idx]=data.approver;\r
109                         obj[++idx]=data.type;\r
110                         obj[++idx]=data.status;\r
111                         obj[++idx]=data.memo;\r
112                         obj[++idx]=data.operation;\r
113                 }\r
114         }       \r
115         \r
116         private void init(AuthzTrans trans) {\r
117                 String[] helpers = setCRUD(trans, TABLE, Data.class, ApprovalLoader.deflt,8);\r
118                 // Need a specialty Creator to handle the "now()"\r
119                 replace(CRUD.create, new PSInfo(trans, "INSERT INTO " + TABLE + " (" +  helpers[FIELD_COMMAS] +\r
120                                         ") VALUES(now(),?,?,?,?,?,?,?)",new ApprovalLoader(0) {\r
121                                                 @Override\r
122                                                 protected void key(Data data, int idx, Object[] obj) {\r
123                                                         // Overridden because key is the "now()"\r
124                                                 }\r
125                                         },writeConsistency)\r
126                                 );\r
127 \r
128                 psByUser = new PSInfo(trans, SELECT_SP + helpers[FIELD_COMMAS] + ", WRITETIME(status) FROM " + TABLE + \r
129                                 " WHERE user = ?", new ApprovalLoader(1) {\r
130                         @Override\r
131                         protected void key(Data data, int idx, Object[] obj) {\r
132                                 obj[idx]=data.user;\r
133                         }\r
134                 }, readConsistency);\r
135                 \r
136                 psByApprover = new PSInfo(trans, SELECT_SP + helpers[FIELD_COMMAS] + ", WRITETIME(status) FROM " + TABLE + \r
137                                 " WHERE approver = ?", new ApprovalLoader(1) {\r
138                         @Override\r
139                         protected void key(Data data, int idx, Object[] obj) {\r
140                                 obj[idx]=data.approver;\r
141                         }\r
142                 }, readConsistency);\r
143 \r
144                 psByTicket = new PSInfo(trans, SELECT_SP + helpers[FIELD_COMMAS] + ", WRITETIME(status) FROM " + TABLE + \r
145                                 " WHERE ticket = ?", new ApprovalLoader(1) {\r
146                         @Override\r
147                         protected void key(Data data, int idx, Object[] obj) {\r
148                                 obj[idx]=data.ticket;\r
149                         }\r
150                 }, readConsistency);\r
151 \r
152                 psByStatus = new PSInfo(trans, SELECT_SP + helpers[FIELD_COMMAS] + ", WRITETIME(status) FROM " + TABLE + \r
153                                 " WHERE status = ?", new ApprovalLoader(1) {\r
154                         @Override\r
155                         protected void key(Data data, int idx, Object[] obj) {\r
156                                 obj[idx]=data.status;\r
157                         }\r
158                 }, readConsistency);\r
159 \r
160 \r
161         }\r
162         \r
163         public Result<List<ApprovalDAO.Data>> readByUser(AuthzTrans trans, String user) {\r
164                 return psByUser.read(trans, R_TEXT, new Object[]{user});\r
165         }\r
166 \r
167         public Result<List<ApprovalDAO.Data>> readByApprover(AuthzTrans trans, String approver) {\r
168                 return psByApprover.read(trans, R_TEXT, new Object[]{approver});\r
169         }\r
170 \r
171         public Result<List<ApprovalDAO.Data>> readByTicket(AuthzTrans trans, UUID ticket) {\r
172                 return psByTicket.read(trans, R_TEXT, new Object[]{ticket});\r
173         }\r
174 \r
175         public Result<List<ApprovalDAO.Data>> readByStatus(AuthzTrans trans, String status) {\r
176                 return psByStatus.read(trans, R_TEXT, new Object[]{status});\r
177         }       \r
178 \r
179         /**\r
180      * Log Modification statements to History\r
181      *\r
182      * @param modified        which CRUD action was done\r
183      * @param data            entity data that needs a log entry\r
184      * @param overrideMessage if this is specified, we use it rather than crafting a history message based on data\r
185      */\r
186     @Override\r
187     protected void wasModified(AuthzTrans trans, CRUD modified, Data data, String ... override) {\r
188         boolean memo = override.length>0 && override[0]!=null;\r
189         boolean subject = override.length>1 && override[1]!=null;\r
190 \r
191         HistoryDAO.Data hd = HistoryDAO.newInitedData();\r
192         hd.user = trans.user();\r
193         hd.action = modified.name();\r
194         hd.target = TABLE;\r
195         hd.subject = subject?override[1]:data.user + "|" + data.approver;\r
196         hd.memo = memo\r
197                 ? String.format("%s by %s", override[0], hd.user)\r
198                 : (modified.name() + "d approval for " + data.user);\r
199         // Detail?\r
200         // Reconstruct?\r
201         if(historyDAO.create(trans, hd).status!=Status.OK) {\r
202                 trans.error().log("Cannot log to History");\r
203         }\r
204     }\r
205 \r
206 }\r