View Javadoc

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      /** Date of the report, use for identification and for placing it in time. */
17      private final Date reportDate;
18      private static final String DATE_FORMAT = "yyyyMMDD-HHmmss"; 
19      private Long deletedFilesCount = 0L;
20      //Treemaps ensures alphapetical sorting.
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 }