1 package org.bitrepository.integrityservice.reports;
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.IOException;
6 import java.text.DateFormat;
7 import java.text.SimpleDateFormat;
8 import java.util.Date;
9 import java.util.Map;
10 import java.util.TreeMap;
11
12 public class BasicIntegrityReporter implements IntegrityReporter {
13
14 private final String collectionID;
15 private final String workflowType;
16
17 private final Date reportDate;
18 private static final String DATE_FORMAT = "yyyyMMDD-HHmmss";
19 private Long deletedFilesCount = 0L;
20
21 private final Map<String, Long> missingFiles = new TreeMap<String, Long>();
22 private final Map<String, Long> checksumIssues = new TreeMap<String, Long>();
23 private final Map<String, Long> missingChecksums = new TreeMap<String, Long>();
24 private final Map<String, Long> obsoleteChecksums = new TreeMap<String, Long>();
25 private final IntegrityReportWriter writer;
26
27 public BasicIntegrityReporter(String collectionID, String workflowType, File reportsDir) {
28 this.collectionID = collectionID;
29 this.workflowType = workflowType;
30 reportDate = new Date();
31 DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
32 File collectionReportsDir = new File(reportsDir, collectionID);
33 if(!collectionReportsDir.isDirectory()) {
34 collectionReportsDir.mkdir();
35 }
36 File reportDir = new File(collectionReportsDir, formatter.format(reportDate));
37 reportDir.mkdir();
38 writer = new IntegrityReportWriter(reportDir);
39 }
40
41 @Override
42 public boolean hasIntegrityIssues() {
43 return !(
44 missingFiles.isEmpty() &&
45 checksumIssues.isEmpty() &&
46 missingChecksums.isEmpty() &&
47 obsoleteChecksums.isEmpty()
48 );
49 }
50
51 @Override
52 public boolean hasReport() {
53 String reportPath = writer.getReportFilePath();
54 File report = new File(reportPath);
55 if(report.exists()) {
56 return true;
57 } else {
58 return false;
59 }
60 }
61
62 @Override
63 public File getReport() throws FileNotFoundException {
64 String reportPath = writer.getReportFilePath();
65 File report = new File(reportPath);
66 if(report.exists()) {
67 return report;
68 } else {
69 throw new FileNotFoundException("The report file can't be found on path: " + reportPath);
70 }
71 }
72
73 @Override
74 public void generateReport() throws IOException {
75 String reportHead = "######## " + "Integrity report generated by " + workflowType
76 + " for collection: " + collectionID + " ########";
77 writer.writeReport(reportHead);
78 writer.close();
79 }
80
81 private String generateSummary() {
82 StringBuilder report = new StringBuilder();
83 if(deletedFilesCount != 0L) {
84 report.append("Detected " + deletedFilesCount + " files as removed from the collection.");
85 }
86 for(String pillar : missingFiles.keySet()) {
87 if(missingFiles.get(pillar) != 0) {
88 report.append("\n" + pillar + " is missing " + missingFiles.get(pillar) + " file");
89 if (missingFiles.get(pillar) > 1) report.append("s");
90 report.append(".");
91 }
92 }
93
94 for(String pillar : checksumIssues.keySet()) {
95 if(checksumIssues.get(pillar) != 0) {
96 report.append("\n" + pillar + " has " + checksumIssues.get(pillar) + " potentially corrupt file");
97 if (checksumIssues.get(pillar) > 1) report.append("s");
98 report.append(".");
99 }
100 }
101
102 for(String pillar : missingChecksums.keySet()) {
103 if(missingChecksums.get(pillar) != 0) {
104 report.append("\n" + pillar + " is missing " + missingChecksums.get(pillar) + " checksum");
105 if (missingChecksums.get(pillar) > 1) report.append("s");
106 report.append(".");
107 }
108 }
109
110 for(String pillar : obsoleteChecksums.keySet()) {
111 if(obsoleteChecksums.get(pillar) != 0) {
112 report.append("\n" + pillar + " has " + obsoleteChecksums.get(pillar) + " obsolete checksum");
113 if (obsoleteChecksums.get(pillar) > 1) report.append("s");
114 report.append(".");
115 }
116 }
117 if(report.toString().isEmpty()) {
118 return "No integrity issues found";
119 } else {
120 return report.toString();
121 }
122 }
123
124 @Override
125 public String generateSummaryOfReport() {
126 if(!hasIntegrityIssues()) {
127 return "No integrity issues found";
128 } else {
129 return "The following integrity issues where found:" + generateSummary();
130 }
131 }
132
133 @Override
134 public String getCollectionID() {
135 return collectionID;
136 }
137
138 @Override
139 public void reportDeletedFile(String fileID) throws IOException {
140 deletedFilesCount++;
141 writer.writeDeletedFile(fileID);
142 }
143
144 @Override
145 public void reportMissingFile(String fileID, String pillarID) throws IOException {
146 if(missingFiles.containsKey(pillarID)) {
147 missingFiles.put(pillarID, (missingFiles.get(pillarID) + 1));
148 } else {
149 missingFiles.put(pillarID, 1L);
150 }
151 writer.writeMissingFile(pillarID, fileID);
152 }
153
154 @Override
155 public void reportChecksumIssue(String fileID, String pillarID) throws IOException {
156 if(checksumIssues.containsKey(pillarID)) {
157 checksumIssues.put(pillarID, (checksumIssues.get(pillarID) + 1));
158 } else {
159 checksumIssues.put(pillarID, 1L);
160 }
161 writer.writeChecksumIssue(pillarID, fileID);
162 }
163
164 @Override
165 public void reportMissingChecksum(String fileID, String pillarID) throws IOException {
166 if(missingChecksums.containsKey(pillarID)) {
167 missingChecksums.put(pillarID, (missingChecksums.get(pillarID) + 1));
168 } else {
169 missingChecksums.put(pillarID, 1L);
170 }
171 writer.writeMissingChecksum(pillarID, fileID);
172 }
173
174 @Override
175 public void reportObsoleteChecksum(String fileID, String pillarID) throws IOException {
176 if(obsoleteChecksums.containsKey(pillarID)) {
177 obsoleteChecksums.put(pillarID, (obsoleteChecksums.get(pillarID) + 1));
178 } else {
179 obsoleteChecksums.put(pillarID, 1L);
180 }
181 writer.writeObsoleteChecksum(pillarID, fileID);
182 }
183 }