Approval Batch, prep better JUnit
[aaf/authz.git] / auth / auth-cass / src / main / java / org / onap / aaf / auth / dao / cass / FutureDAO.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 (C) 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
24 package org.onap.aaf.auth.dao.cass;
25
26 import java.nio.ByteBuffer;
27 import java.util.Date;
28 import java.util.List;
29 import java.util.UUID;
30
31 import org.onap.aaf.auth.dao.CassDAOImpl;
32 import org.onap.aaf.auth.dao.Loader;
33 import org.onap.aaf.auth.env.AuthzTrans;
34 import org.onap.aaf.auth.layer.Result;
35
36 import com.datastax.driver.core.Cluster;
37 import com.datastax.driver.core.ResultSet;
38 import com.datastax.driver.core.Row;
39
40 /**
41  * FutureDAO stores Construction information to create 
42  * elements at another time.
43  * 
44  * @author Jonathan
45  * 8/20/2013
46  */
47 public class FutureDAO extends CassDAOImpl<AuthzTrans,FutureDAO.Data> {
48     private static final String TABLE = "future";
49     private final HistoryDAO historyDAO;
50     private PSInfo psByStartAndTarget;
51     public static final int KEYLIMIT = 1;
52
53     public FutureDAO(AuthzTrans trans, Cluster cluster, String keyspace) {
54         super(trans, FutureDAO.class.getSimpleName(),cluster, keyspace, Data.class,TABLE, readConsistency(trans,TABLE), writeConsistency(trans,TABLE));
55         historyDAO = new HistoryDAO(trans, this);
56         init(trans);
57     }
58
59     public FutureDAO(AuthzTrans trans, HistoryDAO hDAO) {
60         super(trans, FutureDAO.class.getSimpleName(),hDAO, Data.class,TABLE, readConsistency(trans,TABLE), writeConsistency(trans,TABLE));
61         historyDAO=hDAO;
62         init(trans);
63     }
64
65
66     public static class Data {
67         public UUID         id;
68         public String        target;
69         public String        memo;
70         public Date           start;
71         public Date           expires;
72         public ByteBuffer     construct;  //   this is a blob in cassandra
73     }
74
75     private static class FLoader extends Loader<Data> {
76         public FLoader() {
77             super(KEYLIMIT);
78         }
79
80         public FLoader(int keylimit) {
81             super(keylimit);
82         }
83
84         @Override
85     public Data load(Data data, Row row) {
86             data.id         = row.getUUID(0);
87             data.target        = row.getString(1);
88             data.memo       = row.getString(2);
89             data.start         = row.getTimestamp(3);
90             data.expires     = row.getTimestamp(4);
91             data.construct     = row.getBytes(5);
92             return data;
93         }
94
95         @Override
96         protected void key(Data data, int idx, Object[] obj) {
97             obj[idx] = data.id;
98         }
99
100         @Override
101         protected void body(Data data, int _idx, Object[] obj) {
102         int idx = _idx;
103
104             obj[idx] = data.target;
105             obj[++idx] = data.memo;
106             obj[++idx] = data.start;
107             obj[++idx] = data.expires;
108             obj[++idx] = data.construct;
109         }
110     }
111
112     private void init(AuthzTrans trans) {
113         // Set up sub-DAOs
114         String[] helpers = setCRUD(trans, TABLE, Data.class, new FLoader(KEYLIMIT));
115
116         // Other SELECT style statements... match with a local Method
117         psByStartAndTarget = new PSInfo(trans, SELECT_SP + helpers[FIELD_COMMAS] +
118                 " FROM future WHERE start <= ? and target = ? ALLOW FILTERING", new FLoader(2) {
119             @Override
120             protected void key(Data data, int _idx, Object[] obj) {
121                     int idx = _idx;
122
123                 obj[idx]=data.start;
124                 obj[++idx]=data.target;
125             }
126         },readConsistency);
127     }
128
129     public Result<List<Data>> readByStartAndTarget(AuthzTrans trans, Date start, String target) {
130         return psByStartAndTarget.read(trans, R_TEXT, new Object[]{start, target});
131     }
132
133     /**
134      * Override create to add secondary ID to Subject in History, and create Data.ID, if it is null
135      */
136     public Result<FutureDAO.Data> create(AuthzTrans trans, FutureDAO.Data data, String id) {
137         // If ID is not set (typical), create one.
138         if (data.id==null) {
139             StringBuilder sb = new StringBuilder(trans.user());
140             sb.append(data.target);
141             sb.append(System.currentTimeMillis());
142             data.id = UUID.nameUUIDFromBytes(sb.toString().getBytes());
143         }
144         Result<ResultSet> rs = createPS.exec(trans, C_TEXT, data);
145         if (rs.notOK()) {
146             return Result.err(rs);
147         }
148         wasModified(trans, CRUD.create, data, null, id);
149         return Result.ok(data);    
150     }
151
152     /**
153      * Log Modification statements to History
154      *
155      * @param modified        which CRUD action was done
156      * @param data            entity data that needs a log entry
157      * @param overrideMessage if this is specified, we use it rather than crafting a history message based on data
158      */
159     @Override
160     protected void wasModified(AuthzTrans trans, CRUD modified, Data data, String ... override) {
161         boolean memo = override.length>0 && override[0]!=null;
162         boolean subject = override.length>1 && override[1]!=null;
163         HistoryDAO.Data hd = HistoryDAO.newInitedData();
164         hd.user = trans.user();
165         hd.action = modified.name();
166         hd.target = TABLE;
167         hd.subject = subject?override[1]:"";
168         hd.memo = memo?String.format("%s by %s", override[0], hd.user):data.memo;
169     
170         if (historyDAO.create(trans, hd).status!=Status.OK) {
171             trans.error().log("Cannot log to History");
172         }
173     }
174     
175 }