1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.bitrepository.audittrails.preserver;
23
24 import java.io.File;
25 import java.io.FileOutputStream;
26 import java.io.IOException;
27 import java.io.PrintWriter;
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.List;
31 import java.util.Map;
32
33 import org.bitrepository.audittrails.store.AuditEventIterator;
34 import org.bitrepository.audittrails.store.AuditTrailStore;
35 import org.bitrepository.bitrepositoryelements.AuditTrailEvent;
36 import org.bitrepository.common.utils.FileUtils;
37 import org.bitrepository.common.utils.SettingsUtils;
38 import org.bitrepository.settings.referencesettings.AuditTrailPreservation;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42
43
44
45
46
47 public class AuditPacker {
48
49 private Logger log = LoggerFactory.getLogger(getClass());
50
51 private final AuditTrailStore store;
52
53 private final String collectionId;
54
55 private final List<String> contributors = new ArrayList<String>();
56
57 private final File directory;
58
59 private Map<String, Long> seqReached = new HashMap<String, Long>();
60
61
62 private static final boolean APPEND = true;
63
64
65
66
67
68 public AuditPacker(AuditTrailStore store, AuditTrailPreservation settings, String collectionId) {
69 this.store = store;
70 this.collectionId = collectionId;
71 this.directory = FileUtils.retrieveDirectory(settings.getAuditTrailPreservationTemporaryDirectory());
72 this.contributors.addAll(SettingsUtils.getAuditContributorsForCollection(collectionId));
73
74 initialiseReachedSequenceNumbers();
75 }
76
77
78
79
80
81 public Map<String, Long> getSequenceNumbersReached() {
82 return new HashMap<String, Long>(seqReached);
83 }
84
85
86
87
88 private void initialiseReachedSequenceNumbers() {
89 for(String contributor : contributors) {
90 Long seq = store.getPreservationSequenceNumber(contributor, collectionId);
91 seqReached.put(contributor, seq);
92 }
93 }
94
95
96
97
98
99
100
101 public synchronized File createNewPackage() {
102 File container = new File(directory, collectionId + "-audit-trails-" + System.currentTimeMillis());
103 try {
104 container.createNewFile();
105 packContributors(container);
106 return createCompressedFile(container);
107 } catch (IOException e) {
108 throw new IllegalStateException("Cannot package the newest audit trails.", e);
109 } finally {
110
111 if(container.exists()) {
112 FileUtils.delete(container);
113 }
114 }
115 }
116
117
118
119
120
121
122 private void packContributors(File container) throws IOException {
123 PrintWriter writer = null;
124 try {
125 writer = new PrintWriter(new FileOutputStream(container, APPEND));
126 for(String contributor : contributors) {
127 packContributor(contributor, writer);
128 }
129 } finally {
130 if(writer != null) {
131 writer.flush();
132 writer.close();
133 }
134 }
135 }
136
137
138
139
140
141
142
143 private void packContributor(String contributorId, PrintWriter writer) {
144 long nextSeqNumber = store.getPreservationSequenceNumber(contributorId, collectionId);
145 long largestSeqNumber = -1;
146 long numPackedAudits = 0;
147 log.debug("Starting to pack audittrails for contributor: " + contributorId + " for collection: " + collectionId);
148 AuditEventIterator iterator = store.getAuditTrailsByIterator(null, collectionId, contributorId, nextSeqNumber,
149 null, null, null, null, null, null, null);
150 Long timeStart = System.currentTimeMillis();
151 long logInterval = 1000;
152
153 AuditTrailEvent event;
154 log.debug("AuditEventIterator created");
155 while((event = iterator.getNextAuditTrailEvent()) != null) {
156 numPackedAudits++;
157 if(largestSeqNumber < event.getSequenceNumber().longValue()) {
158 largestSeqNumber = event.getSequenceNumber().longValue();
159 }
160 writer.println(event.toString());
161
162 if((numPackedAudits % logInterval) == 0) {
163 log.debug("Packed " + numPackedAudits + " audittrails in: " + (System.currentTimeMillis() - timeStart) + " ms");
164 }
165 }
166 log.debug("Packed a total of: " + numPackedAudits + " audittrails in: " + (System.currentTimeMillis() - timeStart) + " ms");
167 if(numPackedAudits > 0) {
168 seqReached.put(contributorId, largestSeqNumber);
169 }
170 }
171
172
173
174
175
176
177
178
179
180
181 private File createCompressedFile(File fileToCompress) throws IOException {
182 File zippedFile = new File(directory, fileToCompress.getName() + ".zip");
183 FileUtils.zipFile(fileToCompress, zippedFile);
184 return zippedFile;
185 }
186 }