Checkstyle fixes for datarouter prov
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / InternalServlet.java
1 /*******************************************************************************
2  * ============LICENSE_START==================================================
3  * * org.onap.dmaap
4  * * ===========================================================================
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * * ===========================================================================
7  * * Licensed under the Apache License, Version 2.0 (the "License");
8  * * you may not use this file except in compliance with the License.
9  * * You may obtain a copy of the License at
10  * *
11  *  *      http://www.apache.org/licenses/LICENSE-2.0
12  * *
13  *  * Unless required by applicable law or agreed to in writing, software
14  * * distributed under the License is distributed on an "AS IS" BASIS,
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * * See the License for the specific language governing permissions and
17  * * limitations under the License.
18  * * ============LICENSE_END====================================================
19  * *
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
21  * *
22  ******************************************************************************/
23
24
25 package org.onap.dmaap.datarouter.provisioning;
26
27 import static org.onap.dmaap.datarouter.provisioning.utils.HttpServletUtils.sendResponseError;
28
29 import com.att.eelf.configuration.EELFLogger;
30 import com.att.eelf.configuration.EELFManager;
31 import java.io.ByteArrayOutputStream;
32 import java.io.File;
33 import java.io.IOException;
34 import java.io.InputStream;
35 import java.nio.file.FileStore;
36 import java.nio.file.FileSystem;
37 import java.nio.file.Files;
38 import java.nio.file.Path;
39 import java.nio.file.Paths;
40 import java.nio.file.StandardCopyOption;
41 import java.util.Properties;
42
43 import javax.servlet.http.HttpServletRequest;
44 import javax.servlet.http.HttpServletResponse;
45
46 import org.json.JSONArray;
47 import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
48 import org.onap.dmaap.datarouter.provisioning.beans.LogRecord;
49 import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
50 import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
51 import org.onap.dmaap.datarouter.provisioning.utils.DB;
52 import org.onap.dmaap.datarouter.provisioning.utils.LogfileLoader;
53 import org.onap.dmaap.datarouter.provisioning.utils.RLEBitSet;
54
55
56
57 /**
58  * <p>
59  * This servlet handles requests to URLs under /internal on the provisioning server. These include:
60  * </p>
61  * <div class="contentContainer">
62  * <table class="packageSummary" border="0" cellpadding="3" cellspacing="0">
63  * <caption><span>URL Path Summary</span><span class="tabEnd">&nbsp;</span></caption>
64  * <tr>
65  * <th class="colFirst" width="15%">URL Path</th>
66  * <th class="colOne">Method</th>
67  * <th class="colLast">Purpose</th>
68  * </tr>
69  * <tr class="altColor">
70  * <td class="colFirst">/internal/prov</td>
71  * <td class="colOne">GET</td>
72  * <td class="colLast">used to GET a full JSON copy of the provisioning data.</td>
73  * </tr>
74  * <tr class="rowColor">
75  * <td class="colFirst">/internal/fetchProv</td>
76  * <td class="colOne">GET</td>
77  * <td class="colLast">used to signal to a standby POD that the provisioning data should be fetched from the active
78  * POD.</td>
79  * </tr>
80  * <tr class="altColor">
81  * <td class="colFirst" rowspan="2">/internal/logs</td>
82  * <td class="colOne">GET</td>
83  * <td class="colLast">used to GET an index of log files and individual logs for this provisioning server.</td>
84  * </tr>
85  * <tr class="altColor">
86  * <td class="colOne">POST</td>
87  * <td class="colLast">used to POST log files from the individual nodes to this provisioning server.</td>
88  * </tr>
89  * <tr class="rowColor">
90  * <td class="colFirst" rowspan="4">/internal/api</td>
91  * <td class="colOne">GET</td>
92  * <td class="colLast">used to GET an individual parameter value. The parameter name is specified by the path after
93  * /api/.</td>
94  * </tr>
95  * <tr class="rowColor">
96  * <td class="colOne">PUT</td>
97  * <td class="colLast">used to set an individual parameter value. The parameter name is specified by the path after
98  * /api/.</td>
99  * </tr>
100  * <tr class="rowColor">
101  * <td class="colOne">DELETE</td>
102  * <td class="colLast">used to remove an individual parameter value. The parameter name is specified by the path after
103  * /api/.</td>
104  * </tr>
105  * <tr class="rowColor">
106  * <td class="colOne">POST</td>
107  * <td class="colLast">used to create a new individual parameter value. The parameter name is specified by the path
108  * after /api/.</td>
109  * </tr>
110  * <tr class="altColor">
111  * <td class="colFirst">/internal/halt</td>
112  * <td class="colOne">GET</td>
113  * <td class="colLast">used to halt the server (must be accessed from 127.0.0.1).</td>
114  * </tr>
115  * <tr class="rowColor">
116  * <td class="colFirst" rowspan="2">/internal/drlogs</td>
117  * <td class="colOne">GET</td>
118  * <td class="colLast">used to get a list of DR log entries available for retrieval.
119  * Note: these are the actual data router log entries sent to the provisioning server by the nodes, not the provisioning
120  * server's internal logs (access via /internal/logs above). The range is returned as a list of record sequence
121  * numbers.</td>
122  * </tr>
123  * <tr class="rowColor">
124  * <td class="colOne">POST</td>
125  * <td class="colLast">used to retrieve specific log entries.
126  * The sequence numbers of the records to fetch are POST-ed; the records matching the sequence numbers are
127  * returned.</td>
128  * </tr>
129  * <tr class="altColor">
130  * <td class="colFirst">/internal/route/*</td>
131  * <td class="colOne">*</td>
132  * <td class="colLast">URLs under this path are handled via the
133  * {@link org.onap.dmaap.datarouter.provisioning.RouteServlet}</td>
134  * </tr>
135  * </table>
136  * </div>
137  * <p>
138  * Authorization to use these URLs is a little different than for other URLs on the provisioning server. For the most
139  * part, the IP address that the request comes from should be either:
140  * </p>
141  * <ol>
142  * <li>an IP address of a provisioning server, or</li>
143  * <li>the IP address of a node (to allow access to /internal/prov), or</li>
144  * <li>an IP address from the "<i>special subnet</i>" which is configured with
145  * the PROV_SPECIAL_SUBNET parameter.
146  * </ol>
147  * <p>
148  * In addition, requests to /internal/halt can ONLY come from localhost (127.0.0.1) on the HTTP port.
149  * </p>
150  * <p>
151  * All DELETE/GET/PUT/POST requests made to /internal/api on this servlet on the standby server are proxied to the
152  * active server (using the {@link ProxyServlet}) if it is up and reachable.
153  * </p>
154  *
155  * @author Robert Eby
156  * @version $Id: InternalServlet.java,v 1.23 2014/03/24 18:47:10 eby Exp $
157  */
158
159 @SuppressWarnings("serial")
160 public class InternalServlet extends ProxyServlet {
161
162
163     private static final Object lock = new Object();
164     private static Integer logseq = 0; // another piece of info to make log spool file names unique
165     //Adding EELF Logger Rally:US664892
166     private static EELFLogger eelfLogger = EELFManager.getInstance()
167         .getLogger(InternalServlet.class);
168
169     /**
170      * Delete a parameter at the address /internal/api/&lt;parameter&gt;. See the <b>Internal API</b> document for
171      * details on how this method should be invoked.
172      */
173     @Override
174     public void doDelete(HttpServletRequest req, HttpServletResponse resp) {
175         setIpFqdnRequestIDandInvocationIDForEelf("doDelete", req);
176         eelfLogger.info(EelfMsgs.ENTRY);
177         try {
178             eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID,
179                     req.getHeader(BEHALF_HEADER), getIdFromPath(req) + "");
180             EventLogRecord elr = new EventLogRecord(req);
181             if (!isAuthorizedForInternal(req)) {
182                 elr.setMessage(UNAUTHORIZED);
183                 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
184                 eventlogger.error(elr.toString());
185                 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, UNAUTHORIZED, eventlogger);
186                 return;
187             }
188
189             String path = req.getPathInfo();
190             if (path.startsWith(API)) {
191                 if (isProxyOK(req) && isProxyServer()) {
192                     super.doDelete(req, resp);
193                     return;
194                 }
195                 String key = path.substring(5);
196                 if (key.length() > 0) {
197                     Parameters param = Parameters.getParameter(key);
198                     if (param != null) {
199                         if (doDelete(param)) {
200                             elr.setResult(HttpServletResponse.SC_OK);
201                             eventlogger.info(elr.toString());
202                             resp.setStatus(HttpServletResponse.SC_OK);
203                             provisioningDataChanged();
204                             provisioningParametersChanged();
205                         } else {
206                             // Something went wrong with the DELETE
207                             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
208                             eventlogger.error(elr.toString());
209                             sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
210                                     DB_PROBLEM_MSG, eventlogger);
211                         }
212                         return;
213                     }
214                 }
215             }
216             sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, BAD_URL, eventlogger);
217         } finally {
218             eelfLogger.info(EelfMsgs.EXIT);
219         }
220     }
221
222     /**
223      * Get some information (such as a parameter) underneath the /internal/ namespace. See the <b>Internal API</b>
224      * document for details on how this method should be invoked.
225      */
226     @Override
227     public void doGet(HttpServletRequest req, HttpServletResponse resp) {
228         setIpFqdnRequestIDandInvocationIDForEelf("doGet",req);
229         eelfLogger.info(EelfMsgs.ENTRY);
230         try {
231             eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID,
232                     req.getHeader(BEHALF_HEADER), getIdFromPath(req) + "");
233             String path = req.getPathInfo();
234             Properties props = (new DB()).getProperties();
235             if ("/halt".equals(path) && !req.isSecure()) {
236                 // request to halt the server - can ONLY come from localhost
237                 String remote = req.getRemoteAddr();
238                 if (remote.equals(props.getProperty("org.onap.dmaap.datarouter.provserver.localhost"))) {
239                     intlogger.info("PROV0009 Request to HALT received.");
240                     resp.setStatus(HttpServletResponse.SC_OK);
241                     Main.shutdown();
242                 } else {
243                     intlogger.info("PROV0010 Disallowed request to HALT received from " + remote);
244                     resp.setStatus(HttpServletResponse.SC_FORBIDDEN);
245                 }
246                 return;
247             }
248
249             EventLogRecord elr = new EventLogRecord(req);
250             if (!isAuthorizedForInternal(req)) {
251                 elr.setMessage(UNAUTHORIZED);
252                 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
253                 eventlogger.error(elr.toString());
254                 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, UNAUTHORIZED, eventlogger);
255                 return;
256             }
257             if ("/fetchProv".equals(path) && !req.isSecure()) {
258                 // if request came from active_pod or standby_pod and it is not us, reload prov data
259                 SynchronizerTask sync = SynchronizerTask.getSynchronizer();
260                 sync.doFetch();
261                 resp.setStatus(HttpServletResponse.SC_OK);
262                 return;
263             }
264             if ("/prov".equals(path)) {
265                 if (isProxyOK(req) && isProxyServer()) {
266                     if (super.doGetWithFallback(req, resp)) {
267                         return;
268                     }
269                     // fall back to returning the local data if the remote is unreachable
270                     intlogger.info("Active server unavailable; falling back to local copy.");
271                 }
272                 Poker pkr = Poker.getPoker();
273                 resp.setStatus(HttpServletResponse.SC_OK);
274                 resp.setContentType(PROVFULL_CONTENT_TYPE2);
275                 try {
276                     resp.getOutputStream().print(pkr.getProvisioningString());
277                 } catch (IOException ioe) {
278                     intlogger.error("PROV0131 InternalServlet.doGet: " + ioe.getMessage(), ioe);
279                 }
280                 return;
281             }
282             if ("/logs".equals(path) || LOGS.equals(path)) {
283                 resp.setStatus(HttpServletResponse.SC_OK);
284                 resp.setContentType("application/json");
285                 try {
286                     resp.getOutputStream().print(generateLogfileList().toString());
287                 } catch (IOException ioe) {
288                     intlogger.error("PROV0132 InternalServlet.doGet: " + ioe.getMessage(), ioe);
289                 }
290                 return;
291             }
292             if (path.startsWith(LOGS)) {
293                 String logdir = props.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir");
294                 String logfile = path.substring(6);
295                 if (logdir != null && logfile != null && logfile.indexOf('/') < 0) {
296                     File log = new File(logdir + "/" + logfile);
297                     if (log.exists() && log.isFile()) {
298                         resp.setStatus(HttpServletResponse.SC_OK);
299                         resp.setContentType(TEXT_CT);
300                         Path logpath = Paths.get(log.getAbsolutePath());
301                         try {
302                             Files.copy(logpath, resp.getOutputStream());
303                         } catch (IOException ioe) {
304                             intlogger.error("PROV0133 InternalServlet.doGet: " + ioe.getMessage(), ioe);
305                         }
306                         return;
307                     }
308                 }
309                 sendResponseError(resp, HttpServletResponse.SC_NO_CONTENT, "No file.", eventlogger);
310                 return;
311             }
312             if (path.startsWith(API)) {
313                 if (isProxyOK(req) && isProxyServer()) {
314                     super.doGet(req, resp);
315                     return;
316                 }
317                 String key = path.substring(5);
318                 if (key.length() > 0) {
319                     Parameters param = Parameters.getParameter(key);
320                     if (param != null) {
321                         resp.setStatus(HttpServletResponse.SC_OK);
322                         resp.setContentType(TEXT_CT);
323                         try {
324                             resp.getOutputStream().print(param.getValue() + "\n");
325                         } catch (IOException ioe) {
326                             intlogger.error("PROV0134 InternalServlet.doGet: " + ioe.getMessage(), ioe);
327                         }
328                         return;
329                     }
330                 }
331             }
332             if ("/drlogs".equals(path) || "/drlogs/".equals(path)) {
333                 // Special POD <=> POD API to determine what log file records are loaded here
334                 LogfileLoader lfl = LogfileLoader.getLoader();
335                 resp.setStatus(HttpServletResponse.SC_OK);
336                 resp.setContentType(TEXT_CT);
337                 try {
338                     resp.getOutputStream().print(lfl.getBitSet().toString());
339                 } catch (IOException ioe) {
340                     intlogger.error("PROV0135 InternalServlet.doGet: " + ioe.getMessage(), ioe);
341                 }
342                 return;
343             }
344             sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, BAD_URL, eventlogger);
345         } finally {
346             eelfLogger.info(EelfMsgs.EXIT);
347         }
348     }
349
350     /**
351      * Modify a parameter at the address /internal/api/&lt;parameter&gt;. See the <b>Internal API</b> document for
352      * details on how this method should be invoked.
353      */
354     @Override
355     public void doPut(HttpServletRequest req, HttpServletResponse resp) {
356         setIpFqdnRequestIDandInvocationIDForEelf("doPut", req);
357         eelfLogger.info(EelfMsgs.ENTRY);
358         try {
359             eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID,
360                     req.getHeader(BEHALF_HEADER), getIdFromPath(req) + "");
361             EventLogRecord elr = new EventLogRecord(req);
362             if (!isAuthorizedForInternal(req)) {
363                 elr.setMessage(UNAUTHORIZED);
364                 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
365                 eventlogger.error(elr.toString());
366                 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, UNAUTHORIZED, eventlogger);
367                 return;
368             }
369             String path = req.getPathInfo();
370             if (path.startsWith(API)) {
371                 if (isProxyOK(req) && isProxyServer()) {
372                     super.doPut(req, resp);
373                     return;
374                 }
375                 String key = path.substring(5);
376                 if (key.length() > 0) {
377                     Parameters param = Parameters.getParameter(key);
378                     if (param != null) {
379                         String str = catValues(req.getParameterValues("val"));
380                         param.setValue(str);
381                         if (doUpdate(param)) {
382                             elr.setResult(HttpServletResponse.SC_OK);
383                             eventlogger.info(elr.toString());
384                             resp.setStatus(HttpServletResponse.SC_OK);
385                             provisioningDataChanged();
386                             provisioningParametersChanged();
387                         } else {
388                             // Something went wrong with the UPDATE
389                             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
390                             eventlogger.error(elr.toString());
391                             sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
392                                     DB_PROBLEM_MSG, eventlogger);
393                         }
394                         return;
395                     }
396                 }
397             }
398             sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, BAD_URL, eventlogger);
399         } finally {
400             eelfLogger.info(EelfMsgs.EXIT);
401         }
402     }
403
404     /**
405      * Create some new information (such as a parameter or log entries) underneath the /internal/ namespace. See the
406      * <b>Internal API</b> document for details on how this method should be invoked.
407      */
408     @SuppressWarnings("resource")
409     @Override
410     public void doPost(HttpServletRequest req, HttpServletResponse resp) {
411         setIpFqdnRequestIDandInvocationIDForEelf("doPost", req);
412         eelfLogger.info(EelfMsgs.ENTRY);
413         try {
414             eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
415             EventLogRecord elr = new EventLogRecord(req);
416             if (!isAuthorizedForInternal(req)) {
417                 elr.setMessage(UNAUTHORIZED);
418                 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
419                 eventlogger.error(elr.toString());
420                 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, UNAUTHORIZED, eventlogger);
421                 return;
422             }
423
424             String path = req.getPathInfo();
425             if (path.startsWith(API)) {
426                 if (isProxyOK(req) && isProxyServer()) {
427                     super.doPost(req, resp);
428                     return;
429                 }
430                 String key = path.substring(5);
431                 if (key.length() > 0) {
432                     Parameters param = Parameters.getParameter(key);
433                     if (param == null) {
434                         String str = catValues(req.getParameterValues("val"));
435                         param = new Parameters(key, str);
436                         if (doInsert(param)) {
437                             elr.setResult(HttpServletResponse.SC_OK);
438                             eventlogger.info(elr.toString());
439                             resp.setStatus(HttpServletResponse.SC_OK);
440                             provisioningDataChanged();
441                             provisioningParametersChanged();
442                         } else {
443                             // Something went wrong with the INSERT
444                             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
445                             eventlogger.error(elr.toString());
446                             sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
447                                     DB_PROBLEM_MSG, eventlogger);
448                         }
449                         return;
450                     }
451                 }
452             }
453
454             if ("/logs".equals(path) || LOGS.equals(path)) {
455                 String ctype = req.getHeader("Content-Type");
456                 if (ctype == null || !TEXT_CT.equals(ctype)) {
457                     elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
458                     elr.setMessage("Bad media type: " + ctype);
459                     resp.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
460                     eventlogger.error(elr.toString());
461                     return;
462                 }
463                 String spooldir =
464                         (new DB()).getProperties().getProperty("org.onap.dmaap.datarouter.provserver.spooldir");
465                 String spoolname = String.format("%d-%d-", System.currentTimeMillis(), Thread.currentThread().getId());
466                 synchronized (lock) {
467                     // perhaps unnecessary, but it helps make the name unique
468                     spoolname += logseq.toString();
469                     logseq++;
470                 }
471                 String encoding = req.getHeader("Content-Encoding");
472                 if (encoding != null) {
473                     if ("gzip".equals(encoding.trim())) {
474                         spoolname += ".gz";
475                     } else {
476                         elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
477                         resp.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
478                         eventlogger.error(elr.toString());
479                         return;
480                     }
481                 }
482                 // Determine space available -- available space must be at least 5%
483                 FileSystem fs = (Paths.get(spooldir)).getFileSystem();
484                 long total = 0;
485                 long avail = 0;
486                 for (FileStore store : fs.getFileStores()) {
487                     try {
488                         total += store.getTotalSpace();
489                         avail += store.getUsableSpace();
490                     } catch (IOException ioe) {
491                         intlogger.error("PROV0136 InternalServlet.doPost: " + ioe.getMessage(), ioe);
492                     }
493                 }
494                 try {
495                     fs.close();
496                 } catch (Exception e) {
497                     intlogger.error("PROV0137 InternalServlet.doPost: " + e.getMessage(), e);
498                 }
499                 if (((avail * 100) / total) < 5) {
500                     elr.setResult(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
501                     resp.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
502                     eventlogger.error(elr.toString());
503                     return;
504                 }
505                 Path tmppath = Paths.get(spooldir, spoolname);
506                 Path donepath = Paths.get(spooldir, "IN." + spoolname);
507                 try {
508                     Files.copy(req.getInputStream(), Paths.get(spooldir, spoolname),
509                             StandardCopyOption.REPLACE_EXISTING);
510                     Files.move(tmppath, donepath, StandardCopyOption.REPLACE_EXISTING);
511                     elr.setResult(HttpServletResponse.SC_CREATED);
512                     resp.setStatus(HttpServletResponse.SC_CREATED);
513                     eventlogger.info(elr.toString());
514                     LogfileLoader.getLoader();    // This starts the logfile loader "task"
515                 } catch (IOException ioe) {
516                     intlogger.error("PROV0138 InternalServlet.doPost: " + ioe.getMessage(), ioe);
517                 }
518                 return;
519             }
520
521             if ("/drlogs".equals(path) || "/drlogs/".equals(path)) {
522                 // Receive post request and generate log entries
523                 String ctype = req.getHeader("Content-Type");
524                 if (ctype == null || !TEXT_CT.equals(ctype)) {
525                     elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
526                     elr.setMessage("Bad media type: " + ctype);
527                     resp.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
528                     eventlogger.error(elr.toString());
529                     return;
530                 }
531                 try {
532                     InputStream is = req.getInputStream();
533                     ByteArrayOutputStream bos = new ByteArrayOutputStream();
534                     int ch;
535                     while ((ch = is.read()) >= 0) {
536                         bos.write(ch);
537                     }
538                     elr.setResult(HttpServletResponse.SC_OK);
539                     resp.setStatus(HttpServletResponse.SC_OK);
540                     resp.setContentType(TEXT_CT);
541                     RLEBitSet bs = new RLEBitSet(bos.toString());    // The set of records to retrieve
542                     LogRecord.printLogRecords(resp.getOutputStream(), bs);
543                     eventlogger.info(elr.toString());
544                 } catch (IOException ioe) {
545                     intlogger.error("PROV0139 InternalServlet.doPost: " + ioe.getMessage(), ioe);
546                 }
547                 return;
548             }
549
550             elr.setResult(HttpServletResponse.SC_NOT_FOUND);
551             sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, BAD_URL, eventlogger);
552             eventlogger.error(elr.toString());
553         } finally {
554             eelfLogger.info(EelfMsgs.EXIT);
555         }
556     }
557
558     private String catValues(String[] val) {
559         StringBuilder sb = new StringBuilder();
560         if (val != null) {
561             String pfx = "";
562             for (String s : val) {
563                 sb.append(pfx);
564                 sb.append(s);
565                 pfx = "|";
566             }
567         }
568         return sb.toString();
569     }
570
571     private JSONArray generateLogfileList() {
572         JSONArray ja = new JSONArray();
573         Properties prop = (new DB()).getProperties();
574         String str = prop.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir");
575         if (str != null) {
576             String[] dirs = str.split(",");
577             for (String dir : dirs) {
578                 File file = new File(dir);
579                 String[] list = file.list();
580                 if (list != null) {
581                     for (String s2 : list) {
582                         if (!s2.startsWith(".")) {
583                             ja.put(s2);
584                         }
585                     }
586                 }
587             }
588         }
589         return ja;
590     }
591 }