1 /*******************************************************************************
\r
2 * ============LICENSE_START====================================================
\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
11 * * http://www.apache.org/licenses/LICENSE-2.0
\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
20 * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
\r
22 ******************************************************************************/
\r
23 package org.onap.aaf.dao.aaf.cass;
\r
25 import java.util.Date;
\r
26 import java.util.List;
\r
27 import java.util.UUID;
\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
34 import com.datastax.driver.core.Cluster;
\r
35 import com.datastax.driver.core.Row;
\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
43 private static final String TABLE = "approval";
\r
44 private HistoryDAO historyDAO;
\r
45 private PSInfo psByUser, psByApprover, psByTicket, psByStatus;
\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
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
61 private static final int KEYLIMIT = 1;
\r
62 public static class Data {
\r
66 public String approver;
\r
68 public String status;
\r
70 public String operation;
\r
71 public Date updated;
\r
74 private static class ApprovalLoader extends Loader<Data> {
\r
75 public static final ApprovalLoader deflt = new ApprovalLoader(KEYLIMIT);
\r
77 public ApprovalLoader(int keylimit) {
\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
99 protected void key(Data data, int idx, Object[] obj) {
\r
104 protected void body(Data data, int _idx, Object[] obj) {
\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
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
122 protected void key(Data data, int idx, Object[] obj) {
\r
123 // Overridden because key is the "now()"
\r
125 },writeConsistency)
\r
128 psByUser = new PSInfo(trans, SELECT_SP + helpers[FIELD_COMMAS] + ", WRITETIME(status) FROM " + TABLE +
\r
129 " WHERE user = ?", new ApprovalLoader(1) {
\r
131 protected void key(Data data, int idx, Object[] obj) {
\r
132 obj[idx]=data.user;
\r
134 }, readConsistency);
\r
136 psByApprover = new PSInfo(trans, SELECT_SP + helpers[FIELD_COMMAS] + ", WRITETIME(status) FROM " + TABLE +
\r
137 " WHERE approver = ?", new ApprovalLoader(1) {
\r
139 protected void key(Data data, int idx, Object[] obj) {
\r
140 obj[idx]=data.approver;
\r
142 }, readConsistency);
\r
144 psByTicket = new PSInfo(trans, SELECT_SP + helpers[FIELD_COMMAS] + ", WRITETIME(status) FROM " + TABLE +
\r
145 " WHERE ticket = ?", new ApprovalLoader(1) {
\r
147 protected void key(Data data, int idx, Object[] obj) {
\r
148 obj[idx]=data.ticket;
\r
150 }, readConsistency);
\r
152 psByStatus = new PSInfo(trans, SELECT_SP + helpers[FIELD_COMMAS] + ", WRITETIME(status) FROM " + TABLE +
\r
153 " WHERE status = ?", new ApprovalLoader(1) {
\r
155 protected void key(Data data, int idx, Object[] obj) {
\r
156 obj[idx]=data.status;
\r
158 }, readConsistency);
\r
163 public Result<List<ApprovalDAO.Data>> readByUser(AuthzTrans trans, String user) {
\r
164 return psByUser.read(trans, R_TEXT, new Object[]{user});
\r
167 public Result<List<ApprovalDAO.Data>> readByApprover(AuthzTrans trans, String approver) {
\r
168 return psByApprover.read(trans, R_TEXT, new Object[]{approver});
\r
171 public Result<List<ApprovalDAO.Data>> readByTicket(AuthzTrans trans, UUID ticket) {
\r
172 return psByTicket.read(trans, R_TEXT, new Object[]{ticket});
\r
175 public Result<List<ApprovalDAO.Data>> readByStatus(AuthzTrans trans, String status) {
\r
176 return psByStatus.read(trans, R_TEXT, new Object[]{status});
\r
180 * Log Modification statements to History
\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
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
191 HistoryDAO.Data hd = HistoryDAO.newInitedData();
\r
192 hd.user = trans.user();
\r
193 hd.action = modified.name();
\r
195 hd.subject = subject?override[1]:data.user + "|" + data.approver;
\r
197 ? String.format("%s by %s", override[0], hd.user)
\r
198 : (modified.name() + "d approval for " + data.user);
\r
201 if(historyDAO.create(trans, hd).status!=Status.OK) {
\r
202 trans.error().log("Cannot log to History");
\r