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