a3d37a0ed20e4053748a5972c6bbc496993ce405
[aaf/authz.git] / auth / auth-batch / src / main / java / org / onap / aaf / auth / batch / update / Upload.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 package org.onap.aaf.auth.batch.update;
24
25 import java.io.BufferedReader;
26 import java.io.File;
27 import java.io.FileReader;
28 import java.io.IOException;
29 import java.util.ArrayList;
30 import java.util.List;
31
32 import org.onap.aaf.auth.batch.Batch;
33 import org.onap.aaf.auth.batch.helpers.CQLBatch;
34 import org.onap.aaf.auth.batch.helpers.CQLBatchLoop;
35 import org.onap.aaf.auth.env.AuthzTrans;
36 import org.onap.aaf.auth.org.OrganizationException;
37 import org.onap.aaf.misc.env.APIException;
38 import org.onap.aaf.misc.env.Env;
39 import org.onap.aaf.misc.env.LogTarget;
40 import org.onap.aaf.misc.env.TimeTaken;
41
42 public class Upload extends Batch {
43
44         private CQLBatchLoop cqlBatch;
45
46         // APPROVALS
47         private static final String APPR_INS_FMT="  INSERT INTO authz.approval "
48                         + "(id,approver,last_notified,memo,operation,status,ticket,type,user) "
49                         + "VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s);\n";
50         private static final Boolean[] APPR_QUOTES = new Boolean[]{false,true,true,true,true,true,false,true,true};
51
52         // ARTIFACTS
53         private static final String ARTI_INS_FMT="  INSERT INTO authz.artifact "
54                         + "(mechid,machine,ca,dir,expires,notify,ns,os_user,renewdays,sans,sponsor,type) "
55                         + "VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);\n";
56         private static final Boolean[] ARTI_QUOTES = new Boolean[]
57                         {true,true,true,true,true,true,true,true,false,false,true,false};
58
59         // CREDS
60         private static final String CRED_INS_FMT="  INSERT INTO authz.cred "
61                         + "(id,type,expires,cred,notes,ns,other,prev) "
62                         + "VALUES (%s,%s,%s,%s,%s,%s,%s,%s);\n";
63         private static final Boolean[] CRED_QUOTES = new Boolean[]
64                         {true,false,true,false,true,true,false,false};
65
66         // NS
67         private static final String NS_INS_FMT="  INSERT INTO authz.ns "
68                         + "(name,description,parent,scope,type) "
69                         + "VALUES (%s,%s,%s,%s,%s);\n";
70         private static final Boolean[] NS_QUOTES = new Boolean[]
71                         {true,true,true,false,false};
72
73         // x509
74         private static final String X509_INS_FMT="  INSERT INTO authz.x509 "
75                         + "(ca,serial,id,x500,x509) "
76                         + "VALUES (%s,%s,%s,%s,%s);\n";
77         private static final Boolean[] X509_QUOTES = new Boolean[]
78                         {true,false,true,true,true};
79
80         // ROLE
81         private static final String ROLE_INS_FMT="  INSERT INTO authz.role "
82                         + "(ns,name,description,perms) "
83                         + "VALUES (%s,%s,%s,%s);\n";
84         private static final Boolean[] ROLE_QUOTES = new Boolean[]
85                         {true,true,true,false};
86         // ROLE
87         private static final String PERM_INS_FMT="  INSERT INTO authz.perm "
88                         + "(ns,type,instance,action,description,roles) "
89                         + "VALUES (%s,%s,%s,%s,%s,%s);\n";
90         private static final Boolean[] PERM_QUOTES = new Boolean[]
91                         {true,true,true,true,true,false};
92
93         public Upload(AuthzTrans trans) throws APIException, IOException, OrganizationException {
94                 super(trans.env());
95             trans.info().log("Starting Connection Process");
96             
97             TimeTaken tt0 = trans.start("Cassandra Initialization", Env.SUB);
98             try {
99                         TimeTaken tt = trans.start("Connect to Cluster", Env.REMOTE);
100                         try {
101                                 session = cluster.connect();
102                         } finally {
103                                 tt.done();
104                         }
105                         
106                         cqlBatch = new CQLBatchLoop(new CQLBatch(LogTarget.NULL,session),50,dryRun);
107             } finally {
108                 tt0.done();
109             }
110         }
111
112         @Override
113         protected void run(AuthzTrans trans) {
114                 String line;
115                 StringBuilder sb = new StringBuilder();
116                 List<String> array = new ArrayList<String>();
117                 for(String feed : args()) {
118                         File file;
119                         if(feed.endsWith(".dat")) {
120                                 file = new File(feed);
121                                 feed = file.getName();
122                                 feed = feed.substring(0,feed.length()-4);
123                         } else {
124                                 file = new File(feed+".dat");
125                         }
126                         TimeTaken tt = trans.start(file.getAbsolutePath(), Env.SUB);
127                         String msg = String.format("#### Running %s.dat Feed ####",feed);
128                         trans.info().log(msg);
129                         System.out.println(msg);
130                 BufferedReader br = null;
131                     try {
132                                 if(file.exists()) {
133                                         try {
134                                                 br = new BufferedReader(new FileReader(file));
135                                                 try {
136                                                         while((line=br.readLine())!=null) {
137                                                                 if(line.length()>5000) {
138                                                                         cqlBatch.flush();
139                                                                 }
140                                                                 cqlBatch.preLoop();
141
142                                                                 // Split into fields, first turning Escaped values into something we can convert back from
143                                                                 char c=0;
144                                                                 boolean inQuote = false;
145                                                                 int fldcnt = 0;
146                                                                 for(int i=0;i<line.length();++i) {
147                                                                         switch(c=line.charAt(i)) {
148                                                                                 case '"':
149                                                                                         inQuote = !inQuote;
150                                                                                         break;
151                                                                                 case '|':
152                                                                                         if(inQuote) {
153                                                                                                 sb.append(c);
154                                                                                         } else {
155                                                                                                 addField(feed,fldcnt++,array,sb);
156                                                                                         }
157                                                                                         break;
158                                                                                 default:
159                                                                                         sb.append(c);
160                                                                         }
161                                                                 }
162                                                                 addField(feed,fldcnt,array,sb);
163                                                                 cqlBatch.inc().append(build(feed, array));
164                                                         }
165                                                         cqlBatch.flush();
166                                                 } catch (Exception t) {
167                                                         trans.error().log(t);
168                                                 } finally {
169                                                         br.close();
170                                                 }
171                                         } catch (IOException e) {
172                                                 trans.error().log(e);
173                                         }
174                                 } else {
175                                         trans.error().log("No file found: ", file.getAbsolutePath());
176                                 }
177                         } finally {
178                                 tt.done();
179                                 System.err.flush();
180                                 msg = String.format("\n%d applied in %d batches\n",cqlBatch.total(), cqlBatch.batches());
181                                 trans.info().log(msg);
182                                 System.out.println(msg);
183                         }
184                 }
185
186         }
187
188
189         private String build(String feed, List<String> array) {
190                 String rv;
191                 if(array.size()>0) {
192                         switch(feed) {
193                                 case "approval":
194                                         rv = String.format(APPR_INS_FMT,array.toArray());
195                                         break;
196                                 case "artifact":
197                                         rv = String.format(ARTI_INS_FMT,array.toArray());
198                                         break;
199                                 case "cred":
200                                         rv = String.format(CRED_INS_FMT,array.toArray());
201                                         break;
202                                 case "ns":
203                                         rv = String.format(NS_INS_FMT,array.toArray());
204                                         break;
205                                 case "role":
206                                         rv = String.format(ROLE_INS_FMT,array.toArray());
207                                         break;
208                                 case "perm":
209                                         rv = String.format(PERM_INS_FMT,array.toArray());
210                                         break;
211                                 case "x509":
212                                         rv = String.format(X509_INS_FMT,array.toArray());
213                                         break;
214                                 default:
215                                         rv = "";
216                         }
217                         array.clear();
218                 } else {
219                         rv = ""; 
220                 }
221                 return rv;
222         }
223         
224         private void addField(String feed, int fldcnt, List<String> array, StringBuilder sb) {
225                 Boolean[] ba;
226                 switch(feed) {
227                         case "approval":
228                                 ba = APPR_QUOTES;
229                                 break;
230                         case "artifact":
231                                 ba = ARTI_QUOTES;
232                                 break;
233                         case "cred":
234                                 ba = CRED_QUOTES;
235                                 break;
236                         case "ns":
237                                 ba = NS_QUOTES;
238                                 break;
239                         case "role":
240                                 ba = ROLE_QUOTES;
241                                 break;
242                         case "perm":
243                                 ba = PERM_QUOTES;
244                                 break;
245                         case "x509":
246                                 ba = X509_QUOTES;
247                                 break;
248                         default:
249                                 ba = null;
250                 }
251                 if(ba!=null) {
252                         if(sb.toString().length()==0) {
253                                 array.add("null");
254                         } else {
255                                 if(ba[fldcnt]) {
256                                         String s = null;
257                                         if(sb.indexOf("'")>=0) {
258                                                 s = sb.toString().replace("'","''");
259                                         }
260                                         if(sb.indexOf("\\n")>=0) {
261                                                 if(s==null) {
262                                                         s = sb.toString().replace("\\n","\n");
263                                                 } else {
264                                                         s = s.replace("\\n","\n");
265                                                 }
266                                         }
267                                         if(sb.indexOf("\\t")>=0) {
268                                                 if(s==null) {
269                                                         s = sb.toString().replace("\\t","\t");
270                                                 } else {
271                                                         s = s.replace("\\t","\t");
272                                                 }
273                                         }
274                                         if(s==null) {
275                                                 array.add("'" + sb + '\'');
276                                         } else {
277                                                 array.add("'" + s + '\'');
278                                         }
279                                 } else {
280                                         array.add(sb.toString());
281                                 }
282                         }
283                         sb.setLength(0);
284                 }
285         }
286
287
288         @Override
289         protected void _close(AuthzTrans trans) {
290         session.close();
291         }
292
293 }
294