From 4fd32e3e4132b3ca1c130a4be4d93c2cf08fd5e8 Mon Sep 17 00:00:00 2001 From: mozzy11 Date: Tue, 5 Mar 2019 10:39:53 +0300 Subject: [PATCH] REPORT-770 : Add a user interface component that enables viewing and searching logs, Add an automated task to delete these logs after a certain period of time and added Tests --- .../evaluation/DeleteOldLogsTest.java | 69 +++++++++++++++++++ .../report/service/ReportServiceTest.java | 6 ++ .../evaluation/DeleteOldLogFiles.java | 65 +++++++++++++++++ .../report/service/ReportService.java | 8 +++ .../report/service/ReportServiceImpl.java | 9 +++ .../report/service/db/HibernateReportDAO.java | 11 +++ .../report/service/db/ReportDAO.java | 5 ++ api/src/main/resources/messages.properties | 2 + .../web/reports/ReportHistoryController.java | 15 ++++ omod/src/main/resources/config.xml | 9 +++ .../main/webapp/reports/reportHistoryOpen.jsp | 58 ++++++++++++++-- 11 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 api-tests/src/test/java/org/openmrs/module/reporting/evaluation/DeleteOldLogsTest.java create mode 100644 api/src/main/java/org/openmrs/module/reporting/evaluation/DeleteOldLogFiles.java diff --git a/api-tests/src/test/java/org/openmrs/module/reporting/evaluation/DeleteOldLogsTest.java b/api-tests/src/test/java/org/openmrs/module/reporting/evaluation/DeleteOldLogsTest.java new file mode 100644 index 0000000000..d3d49f8494 --- /dev/null +++ b/api-tests/src/test/java/org/openmrs/module/reporting/evaluation/DeleteOldLogsTest.java @@ -0,0 +1,69 @@ +/** + * This Source Code Form is subject to the terms of the Mozilla Public License, + * v. 2.0. If a copy of the MPL was not distributed with this file, You can + * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under + * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. + * + * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS + * graphic logo is a trademark of OpenMRS Inc. + */ +package org.openmrs.module.reporting.evaluation; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.openmrs.module.reporting.ReportingConstants; +import org.openmrs.util.OpenmrsUtil; + +public class DeleteOldLogsTest { + + File baseDir = OpenmrsUtil.getDirectoryInApplicationDataDirectory(ReportingConstants.REPORT_RESULTS_DIRECTORY_NAME); + + Path test= Paths.get(baseDir.getAbsolutePath(),"test.reportlog"); + File test_file = test.toFile(); + + @Before + public void init() throws IOException { + test_file.createNewFile(); + } + + @Test + public void Should_DeleteLogFlesExceedingSevendays() throws IOException { + //Setting the file to exist over seven days + long exceedingDays = 8 ; + test_file.setLastModified(exceedingDays * (24 * 60 * 60 * 1000)); + + // asserting that the file exists befor the servlet DeleteOldLogs is called + Assert.assertTrue(test_file.exists()); + + DeleteOldLogFiles delete = new DeleteOldLogFiles (); + delete.deleteOldLogs(); + + //Asserting that the Log file will be deleted after seven days + Assert.assertFalse(test_file.exists()); + } + + @Test + public void Should_NotDeleteLogFilesBeforeSevenDayPass() throws IOException { + + // asserting that the file exists befor the servlet DeleteOldLogs is called + Assert.assertTrue(test_file.exists()); + + DeleteOldLogFiles delete = new DeleteOldLogFiles (); + delete.deleteOldLogs(); + + //Asserting that the Log file will Not be deleted after seven days + Assert.assertTrue(test_file.exists()); + } + + } + + + + + diff --git a/api-tests/src/test/java/org/openmrs/module/reporting/report/service/ReportServiceTest.java b/api-tests/src/test/java/org/openmrs/module/reporting/report/service/ReportServiceTest.java index fcd90d4f4b..6a74394c4a 100644 --- a/api-tests/src/test/java/org/openmrs/module/reporting/report/service/ReportServiceTest.java +++ b/api-tests/src/test/java/org/openmrs/module/reporting/report/service/ReportServiceTest.java @@ -521,4 +521,10 @@ public void purgeReportDesignsForReportDefinition_shouldDeleteAllAssociatedRepor assertNull(rs.getReportDesignByUuid("d7a82b63-1066-4c1d-9b43-b405851fc467")); assertNull(rs.getReportDesignByUuid("e7a82b63-1066-4c1d-9b43-b405851fc467")); } + + @Test + public void shoild_returnAllReportRequests() { + ReportService rs = Context.getService(ReportService.class); + Assert.assertEquals(3, rs.getAllReportRequests().size()); + } } \ No newline at end of file diff --git a/api/src/main/java/org/openmrs/module/reporting/evaluation/DeleteOldLogFiles.java b/api/src/main/java/org/openmrs/module/reporting/evaluation/DeleteOldLogFiles.java new file mode 100644 index 0000000000..25b9f71f1f --- /dev/null +++ b/api/src/main/java/org/openmrs/module/reporting/evaluation/DeleteOldLogFiles.java @@ -0,0 +1,65 @@ +/** + * This Source Code Form is subject to the terms of the Mozilla Public License, + * v. 2.0. If a copy of the MPL was not distributed with this file, You can + * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under + * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. + * + * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS + * graphic logo is a trademark of OpenMRS Inc. + */ + +package org.openmrs.module.reporting.evaluation; +import java.io.File; +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; + +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.openmrs.module.reporting.ReportingConstants; +import org.openmrs.util.OpenmrsUtil; + + + +public class DeleteOldLogFiles extends HttpServlet { + + private static final long serialVersionUID = 1L; + // Servlet to delete old Logs on module startup + protected static final Log log = LogFactory.getLog(DeleteOldLogFiles.class); + + + public void deleteOldLogs(){ + //maximum number of days to keep log files is 7 + long alloweddays = 7; + File baseDir = OpenmrsUtil.getDirectoryInApplicationDataDirectory(ReportingConstants.REPORT_RESULTS_DIRECTORY_NAME); + File[] fList = baseDir.listFiles(); + + if (fList != null){ + for (File file : fList){ + String fileExt = FilenameUtils.getExtension(file.toString()); + if (file.isFile() && StringUtils.equals(fileExt, "reportlog")){ + + long diff = new Date().getTime() - file.lastModified(); + long maximumTime = (alloweddays * (24 * 60 * 60 * 1000)); + + if (diff > maximumTime) { + file.delete(); + } + + } + } + + } + } + + @Override + public void init() throws ServletException { + deleteOldLogs(); + } + +} + + diff --git a/api/src/main/java/org/openmrs/module/reporting/report/service/ReportService.java b/api/src/main/java/org/openmrs/module/reporting/report/service/ReportService.java index fac343a05a..f25709d16e 100644 --- a/api/src/main/java/org/openmrs/module/reporting/report/service/ReportService.java +++ b/api/src/main/java/org/openmrs/module/reporting/report/service/ReportService.java @@ -133,6 +133,14 @@ public interface ReportService extends OpenmrsService { @Transactional(readOnly = true) public List getReportRequests(ReportDefinition reportDefinition, Date requestOnOrAfter, Date requestOnOrBefore, Status...statuses); + /** + * @return all {@link ReportRequest} in the system + * @should retrieve all report requests + */ + @Transactional(readOnly = true) + public List getAllReportRequests(); + + /** * @return all {@link ReportRequest} in the system that match the passed parameters * @should retrieve report requests by definition diff --git a/api/src/main/java/org/openmrs/module/reporting/report/service/ReportServiceImpl.java b/api/src/main/java/org/openmrs/module/reporting/report/service/ReportServiceImpl.java index 41d9602c06..2a28543f7d 100644 --- a/api/src/main/java/org/openmrs/module/reporting/report/service/ReportServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/reporting/report/service/ReportServiceImpl.java @@ -223,6 +223,15 @@ public List getReportRequests(ReportDefinition reportDefinition, return reportDAO.getReportRequests(reportDefinition, requestOnOrAfter, requestOnOrBefore, mostRecentNum, statuses); } + + /** + * @see ReportService#getReportRequests() + */ + @Transactional(readOnly=true) + public List getAllReportRequests(){ + return reportDAO.getAllReportRequests(); + } + /** * @see ReportService#purgeReportRequest(ReportRequest) */ diff --git a/api/src/main/java/org/openmrs/module/reporting/report/service/db/HibernateReportDAO.java b/api/src/main/java/org/openmrs/module/reporting/report/service/db/HibernateReportDAO.java index aabed07c71..b3ec7561cf 100644 --- a/api/src/main/java/org/openmrs/module/reporting/report/service/db/HibernateReportDAO.java +++ b/api/src/main/java/org/openmrs/module/reporting/report/service/db/HibernateReportDAO.java @@ -255,6 +255,17 @@ public List getReportRequestUuids(String reportDefinitionUuid) { query.setString("uuid", reportDefinitionUuid); return query.list(); } + + /** + * @see ReportDAO#getReportAllRequests() + */ + public List getAllReportRequests(){ + String hql = "from ReportRequest"; + Query query = sessionFactory.getCurrentSession().createQuery(hql); + return query.list(); + + } + //***** PROPERTY ACCESS ***** diff --git a/api/src/main/java/org/openmrs/module/reporting/report/service/db/ReportDAO.java b/api/src/main/java/org/openmrs/module/reporting/report/service/db/ReportDAO.java index c36e465c07..a31a9e4783 100644 --- a/api/src/main/java/org/openmrs/module/reporting/report/service/db/ReportDAO.java +++ b/api/src/main/java/org/openmrs/module/reporting/report/service/db/ReportDAO.java @@ -118,6 +118,11 @@ public List getReportDesigns(ReportDefinition reportDefinition, Cl */ public ReportRequest getReportRequestByUuid(String uuid); + /** + * @returns all the {@link ReportRequestst} + */ + public List getAllReportRequests(); + /** * @return all {@link ReportRequest} in the system that match the passed parameters */ diff --git a/api/src/main/resources/messages.properties b/api/src/main/resources/messages.properties index 54f10da4ad..c4b2e47ff2 100644 --- a/api/src/main/resources/messages.properties +++ b/api/src/main/resources/messages.properties @@ -97,6 +97,8 @@ reporting.status.SCHEDULE_COMPLETED=Schedule Completed reporting.status.SAVED=Completed and Saved reporting.status.FAILED=Failed reporting.viewReportLog=View Log +reporting.searchReportLog= view and search all logs +reporting.viewLogs= All logs reporting.viewError=View Error reporting.viewReport=View Report diff --git a/omod/src/main/java/org/openmrs/module/reporting/web/reports/ReportHistoryController.java b/omod/src/main/java/org/openmrs/module/reporting/web/reports/ReportHistoryController.java index 73e225e098..d363ee094a 100644 --- a/omod/src/main/java/org/openmrs/module/reporting/web/reports/ReportHistoryController.java +++ b/omod/src/main/java/org/openmrs/module/reporting/web/reports/ReportHistoryController.java @@ -157,6 +157,7 @@ public String loadReportStatus(ModelMap model, @RequestParam("uuid") String uuid return "/module/reporting/json"; } + @RequestMapping("/module/reporting/reports/viewErrorDetails") public void viewErrorDetails(HttpServletResponse response, @RequestParam("uuid") String uuid) throws IOException { ReportRequest rr = Context.getService(ReportService.class).getReportRequestByUuid(uuid); @@ -187,7 +188,21 @@ public String openFromHistory(@RequestParam("uuid") String uuid, HttpServletResp req.setRenderingMode(mode); } } + + List requests = rs.getAllReportRequests(); + + List allLogs = new ArrayList(); + for(ReportRequest reqst: requests) { + try { + List logs = rs.loadReportLog(reqst); + allLogs.addAll(logs); + }catch(NullPointerException e) { + } + + } + model.addAttribute("request", req); + model.addAttribute("allLogs", allLogs); if (req.getStatus() == Status.REQUESTED) { model.addAttribute("positionInQueue", rs.getPositionInQueue(req)); diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index fb1b28b210..52ab8f2650 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -168,6 +168,15 @@ ReportRequest.hbm.xml + + + + DeleteOldLogFiles + @MODULE_PACKAGE@.evaluation.DeleteOldLogFiles + 1 + + + /lib/reporting-api-1.9.* diff --git a/omod/src/main/webapp/reports/reportHistoryOpen.jsp b/omod/src/main/webapp/reports/reportHistoryOpen.jsp index b6d5c04447..cdc91ecd52 100644 --- a/omod/src/main/webapp/reports/reportHistoryOpen.jsp +++ b/omod/src/main/webapp/reports/reportHistoryOpen.jsp @@ -29,6 +29,7 @@ }); } + function deleteRequest(uuid) { if (confirm('')) { document.location.href='${pageContext.request.contextPath}/module/reporting/reports/deleteReportRequest.form?uuid='+uuid+'&returnUrl=/module/reporting/dashboard/index.form'; @@ -37,8 +38,7 @@ $j(document).ready(function() { - loadReportStatus(); - + loadReportStatus(); $j("#errorDetailsLink").click(function(event) { showReportingDialog({ title: '', @@ -47,9 +47,26 @@ }); $j(".logDiv").hide(); + $j(".logsDiv").hide(); $j("#viewReportLogLink").click(function(event) { $j(".logDiv").toggle(); }); + + $j("#searchReportLogLink").click(function(event) { + $j(".logsDiv").toggle(); + }); + + $j(".reporting-data-table").dataTable( { + "bPaginate": true, + "iDisplayLength": 15, + "bLengthChange": false, + "bFilter": true, + "bSort": true, + "bInfo": true, + "bAutoWidth": false + } ); + + $j(".reporting-data-table").css({"table-layout":"fixed","width":"1100px"}); } ); @@ -152,12 +169,45 @@ + +