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.FileInputStream;
26 import java.io.IOException;
27 import java.net.URL;
28 import java.util.Date;
29 import java.util.HashMap;
30 import java.util.Map;
31 import java.util.Timer;
32 import java.util.TimerTask;
33
34 import org.bitrepository.audittrails.store.AuditTrailStore;
35 import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE;
36 import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE;
37 import org.bitrepository.client.eventhandler.EventHandler;
38 import org.bitrepository.common.ArgumentValidator;
39 import org.bitrepository.common.exceptions.OperationFailedException;
40 import org.bitrepository.common.settings.Settings;
41 import org.bitrepository.common.utils.Base16Utils;
42 import org.bitrepository.common.utils.CalendarUtils;
43 import org.bitrepository.common.utils.ChecksumUtils;
44 import org.bitrepository.common.utils.FileUtils;
45 import org.bitrepository.common.utils.SettingsUtils;
46 import org.bitrepository.common.utils.TimeUtils;
47 import org.bitrepository.modify.putfile.BlockingPutFileClient;
48 import org.bitrepository.modify.putfile.PutFileClient;
49 import org.bitrepository.protocol.CoordinationLayerException;
50 import org.bitrepository.protocol.FileExchange;
51 import org.bitrepository.settings.referencesettings.AuditTrailPreservation;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55
56
57
58
59 public class LocalAuditTrailPreserver implements AuditTrailPreserver {
60
61 private Logger log = LoggerFactory.getLogger(getClass());
62
63 private final AuditTrailStore store;
64
65 private final BlockingPutFileClient client;
66
67
68 private Timer timer;
69
70 private AuditPreservationTimerTask auditTask = null;
71
72 Map<String, AuditPacker> auditPackers = new HashMap<String, AuditPacker>();
73
74 private final AuditTrailPreservation preservationSettings;
75
76 private final Settings settings;
77
78 private final FileExchange exchange;
79
80
81
82
83
84
85
86 public LocalAuditTrailPreserver(Settings settings, AuditTrailStore store, PutFileClient client,
87 FileExchange exchange) {
88 ArgumentValidator.checkNotNull(settings, "Settings preservationSettings");
89 ArgumentValidator.checkNotNull(store, "AuditTrailStore store");
90 ArgumentValidator.checkNotNull(client, "PutFileClient client");
91
92 this.settings = settings;
93 this.preservationSettings = settings.getReferenceSettings().getAuditTrailServiceSettings().getAuditTrailPreservation();
94 this.store = store;
95 this.client = new BlockingPutFileClient(client);
96 this.exchange = exchange;
97 for(String collectionID : SettingsUtils.getAllCollectionsIDs()) {
98 this.auditPackers.put(collectionID, new AuditPacker(store, preservationSettings, collectionID));
99 }
100 }
101
102 @Override
103 public void start() {
104 if(timer != null) {
105 log.debug("Cancelling old timer.");
106 timer.cancel();
107 }
108 long preservationInterval = preservationSettings.getAuditTrailPreservationInterval();
109 long timerCheckInterval = preservationInterval/10;
110 log.info("Instantiating the preservation of audit trails every " +
111 TimeUtils.millisecondsToHuman(preservationInterval) + ", starting in " +
112 TimeUtils.millisecondsToHuman(timerCheckInterval));
113 timer = new Timer();
114 auditTask = new AuditPreservationTimerTask(preservationInterval);
115 timer.scheduleAtFixedRate(auditTask, timerCheckInterval, timerCheckInterval);
116 }
117
118 @Override
119 public void close() {
120 if(timer != null) {
121 timer.cancel();
122 }
123 }
124
125 @Override
126 public void preserveRepositoryAuditTrails() {
127 if(auditTask == null) {
128 log.info("preserving the audit trails ");
129 } else {
130 auditTask.resetTime();
131 }
132 for(String collectionID : SettingsUtils.getAllCollectionsIDs()) {
133 performAuditTrailPreservation(collectionID);
134 }
135 }
136
137
138
139
140
141
142
143
144
145 private synchronized void performAuditTrailPreservation(String collectionId) {
146 try {
147 File auditPackage = auditPackers.get(collectionId).createNewPackage();
148 URL url = uploadFile(auditPackage);
149 log.info("Uploaded the file '" + auditPackage + "' to '" + url.toExternalForm() + "'");
150
151 ChecksumDataForFileTYPE checksumData = getValidationChecksumDataForFile(auditPackage);
152
153 EventHandler eventHandler = new AuditPreservationEventHandler(
154 auditPackers.get(collectionId).getSequenceNumbersReached(), store, collectionId);
155 client.putFile(preservationSettings.getAuditTrailPreservationCollection(), url,
156 auditPackage.getName(), auditPackage.length(), checksumData, null, eventHandler,
157 "Preservation of audit trails from the AuditTrail service.");
158
159 log.debug("Cleanup of the uploaded audit trail package.");
160 FileUtils.delete(auditPackage);
161 } catch (IOException e) {
162 throw new CoordinationLayerException("Cannot perform the preservation of audit trails.", e);
163 } catch (OperationFailedException e) {
164 throw new CoordinationLayerException("Failed to put the packed audit trails.", e);
165 }
166 }
167
168
169
170
171 private ChecksumDataForFileTYPE getValidationChecksumDataForFile(File file) {
172 ChecksumSpecTYPE csSpec = ChecksumUtils.getDefault(settings);
173 String checksum = ChecksumUtils.generateChecksum(file, csSpec);
174
175 ChecksumDataForFileTYPE res = new ChecksumDataForFileTYPE();
176 res.setCalculationTimestamp(CalendarUtils.getNow());
177 res.setChecksumSpec(csSpec);
178 res.setChecksumValue(Base16Utils.encodeBase16(checksum));
179
180 return res;
181 }
182
183
184
185
186
187
188
189 private URL uploadFile(File file) throws IOException {
190 return exchange.uploadToServer(new FileInputStream(file), file.getName());
191 }
192
193
194
195
196 private class AuditPreservationTimerTask extends TimerTask {
197
198 private final long interval;
199
200 private Date nextRun;
201
202
203
204
205
206 private AuditPreservationTimerTask(long interval) {
207 this.interval = interval;
208 resetTime();
209 }
210
211
212
213
214 private void resetTime() {
215 nextRun = new Date(System.currentTimeMillis() + interval);
216 }
217
218 @Override
219 public void run() {
220 if(nextRun.getTime() < System.currentTimeMillis()) {
221 try {
222 log.debug("Time to preserve the audit trails.");
223 preserveRepositoryAuditTrails();
224 } catch (Exception e) {
225 log.error("Caught exception while attempting to preserve audittrails", e);
226 }
227 resetTime();
228 }
229 }
230 }
231 }