From 5a38ef279c1c3c21be210c2976855384c0d0a2d2 Mon Sep 17 00:00:00 2001 From: bohlski Date: Tue, 28 Jun 2022 10:48:24 +0200 Subject: [PATCH 1/7] Added simple hardcoded preservation info that can be retrieved --- .../webservice/PreservationInfo.java | 52 +++++++++++++++++++ .../webservice/RestAuditTrailService.java | 13 +++++ 2 files changed, 65 insertions(+) create mode 100644 bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/PreservationInfo.java diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/PreservationInfo.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/PreservationInfo.java new file mode 100644 index 000000000..cda437c92 --- /dev/null +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/PreservationInfo.java @@ -0,0 +1,52 @@ +package org.bitrepository.audittrails.webservice; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +public class PreservationInfo { + private String collectionID; + private String lastStart; + private String lastDuration; + private String nextStart; + private long preservedAuditCount; + + public String getCollectionID() { + return collectionID; + } + + public void setCollectionID(String collectionID) { + this.collectionID = collectionID; + } + + public String getLastStart() { + return lastStart; + } + + public void setLastStart(String lastStart) { + this.lastStart = lastStart; + } + + public String getLastDuration() { + return lastDuration; + } + + public void setLastDuration(String lastDuration) { + this.lastDuration = lastDuration; + } + + public String getNextStart() { + return nextStart; + } + + public void setNextStart(String nextStart) { + this.nextStart = nextStart; + } + + public long getPreservedAuditCount() { + return preservedAuditCount; + } + + public void setPreservedAuditCount(long preservedAuditCount) { + this.preservedAuditCount = preservedAuditCount; + } +} diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java index aae6baab9..221a75202 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java @@ -149,6 +149,19 @@ public List getCollectionSchedule() { return service.getCollectorInfos(); } + @GET + @Path("/preservationSchedule") + @Produces(MediaType.APPLICATION_JSON) + public PreservationInfo getPreservationSchedule() { + PreservationInfo info = new PreservationInfo(); + info.setCollectionID("books"); + info.setLastStart("123"); + info.setLastDuration("1"); + info.setNextStart("321"); + info.setPreservedAuditCount(1000); + return info; + } + private void writeAuditResult(AuditTrailEvent event, JsonGenerator jg) throws IOException { jg.writeStartObject(); jg.writeObjectField("fileID", event.getFileID()); From 0d24cace9def102e1904ec01adfc2ab8c83f1d57 Mon Sep 17 00:00:00 2001 From: bohlski Date: Tue, 28 Jun 2022 10:59:11 +0200 Subject: [PATCH 2/7] Html formatting and typos --- .../webservice/RestAuditTrailService.java | 33 +- .../src/main/webapp/audit-trail-service.html | 572 +++++++++--------- 2 files changed, 296 insertions(+), 309 deletions(-) diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java index 221a75202..951b2ceb6 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java @@ -55,7 +55,6 @@ import java.util.TimeZone; @Path("/AuditTrailService") - public class RestAuditTrailService { /** * The log. @@ -73,27 +72,16 @@ public RestAuditTrailService() { @Consumes("application/x-www-form-urlencoded") @Produces("application/json") public StreamingOutput queryAuditTrailEvents( - @FormParam("fromDate") - String fromDate, - @FormParam("toDate") - String toDate, - @FormParam("fileID") - String fileID, - @FormParam("reportingComponent") - String reportingComponent, - @FormParam("actor") - String actor, - @FormParam("action") - String action, - @FormParam("collectionID") - String collectionID, - @FormParam("fingerprint") - String fingerprint, - @FormParam("operationID") - String operationID, - @DefaultValue("1000") - @FormParam("maxAudittrails") - Integer maxResults) { + @FormParam("fromDate") String fromDate, + @FormParam("toDate") String toDate, + @FormParam("fileID") String fileID, + @FormParam("reportingComponent") String reportingComponent, + @FormParam("actor") String actor, + @FormParam("action") String action, + @FormParam("collectionID") String collectionID, + @FormParam("fingerprint") String fingerprint, + @FormParam("operationID") String operationID, + @DefaultValue("1000") @FormParam("maxAuditTrails") Integer maxResults) { Date from = calendarUtils.makeStartDateObject(fromDate); Date to = calendarUtils.makeEndDateObject(toDate); @@ -175,7 +163,6 @@ private void writeAuditResult(AuditTrailEvent event, JsonGenerator jg) throws IO jg.writeObjectField("operationID", contentOrEmptyString(event.getOperationID())); jg.writeEndObject(); jg.flush(); - } @GET diff --git a/bitrepository-webclient/src/main/webapp/audit-trail-service.html b/bitrepository-webclient/src/main/webapp/audit-trail-service.html index a39d1f34f..26c172cc2 100644 --- a/bitrepository-webclient/src/main/webapp/audit-trail-service.html +++ b/bitrepository-webclient/src/main/webapp/audit-trail-service.html @@ -21,318 +21,318 @@ --> - - Bitrepository audit-trail service - - - - - - - -
-
+ + Bitrepository audit-trail service + + + + + + + +
+
+
+
-
-
-
-
-

Audit-trail service

-
-
-

- -

-

-
+
+
+

Audit-trail service

+
+

+ +

+
+
+
-
-
-
- -
-
- - - - - - - - - - - -
Collection IDLast startLast durationLast collected number of auditsNext start
-
-
+
+
+
+ +
+
+ + + + + + + + + + + +
Collection IDLast startLast durationLast collected number of auditsNext start
+
+
-
-
- Audit trails display filters - - - - - - - - - - - -
-
-
- Audit trails -
No request sent yet
-
+
+
+ Audit trails display filters + + + + + + + + + + + +
+
+
+ Audit trails +
No request sent yet
-
- - - - +
+ + + + - - + + From cf5f361f19ddce63c7a4158dd2003d3c1c718672 Mon Sep 17 00:00:00 2001 From: bohlski Date: Fri, 29 Jul 2022 11:57:32 +0200 Subject: [PATCH 3/7] Made preservation work and tonnes of small typo fixes and stuff --- .../audittrails/AuditTrailService.java | 52 ++++++-- .../audittrails/AuditTrailServiceFactory.java | 11 +- .../collector/IncrementalCollector.java | 16 +-- .../audittrails/preserver/AuditPacker.java | 51 +++++--- .../AuditPreservationEventHandler.java | 19 +-- .../preserver/AuditTrailPreserver.java | 8 ++ .../preserver/LocalAuditTrailPreserver.java | 118 +++++++++++++----- .../store/AuditDatabaseExtractor.java | 18 +-- .../audittrails/store/AuditEventIterator.java | 3 +- .../audittrails/store/AuditTrailAdder.java | 4 +- .../store/AuditTrailServiceDAO.java | 71 +++++++---- .../audittrails/store/AuditTrailStore.java | 30 +++-- .../audittrails/store/ExtractModel.java | 18 +-- .../audittrails/webservice/CollectorInfo.java | 10 +- .../webservice/RestAuditTrailService.java | 8 +- .../AuditPreservationEventHandlerTest.java | 2 +- .../preserver/LocalAuditPreservationTest.java | 10 +- .../RepositorySettings.xml | 15 ++- .../src/main/webapp/audit-trail-service.html | 78 ++++++++++-- 19 files changed, 381 insertions(+), 161 deletions(-) diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/AuditTrailService.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/AuditTrailService.java index a4878e94e..cd692d358 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/AuditTrailService.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/AuditTrailService.java @@ -25,9 +25,11 @@ package org.bitrepository.audittrails; import org.bitrepository.audittrails.collector.AuditTrailCollector; +import org.bitrepository.audittrails.preserver.AuditTrailPreserver; import org.bitrepository.audittrails.store.AuditEventIterator; import org.bitrepository.audittrails.store.AuditTrailStore; import org.bitrepository.audittrails.webservice.CollectorInfo; +import org.bitrepository.audittrails.webservice.PreservationInfo; import org.bitrepository.bitrepositoryelements.FileAction; import org.bitrepository.common.ArgumentValidator; import org.bitrepository.common.settings.Settings; @@ -51,20 +53,22 @@ public class AuditTrailService implements LifeCycledService { private final Logger log = LoggerFactory.getLogger(getClass()); private final AuditTrailStore store; private final AuditTrailCollector collector; + private final AuditTrailPreserver preserver; private final ContributorMediator mediator; private final Settings settings; /** + * Constructor for audit trail service. + * * @param store The store for the audit trail data. * @param collector The collector of new audit trail data. + * @param preserver The preserver for saving collected audit trail data to a collection. + * Provide non-null preserver for enabling preservation. * @param mediator The mediator for the communication of this contributor. * @param settings The AuditTrailService settings. */ - public AuditTrailService( - AuditTrailStore store, - AuditTrailCollector collector, - ContributorMediator mediator, - Settings settings) { + public AuditTrailService(AuditTrailStore store, AuditTrailCollector collector, AuditTrailPreserver preserver, + ContributorMediator mediator, Settings settings) { ArgumentValidator.checkNotNull(collector, "AuditTrailCollector collector"); ArgumentValidator.checkNotNull(store, "AuditTrailStore store"); ArgumentValidator.checkNotNull(mediator, "ContributorMediator mediator"); @@ -72,10 +76,23 @@ public AuditTrailService( this.store = store; this.collector = collector; + this.preserver = preserver; this.mediator = mediator; this.settings = settings; + } - mediator.start(); + /** + * Constructor for audit trail service with disabled preservation. + * + * See {@link #AuditTrailService(AuditTrailStore, AuditTrailCollector, AuditTrailPreserver, ContributorMediator, + * Settings)} for param descriptions. + */ + public AuditTrailService( + AuditTrailStore store, + AuditTrailCollector collector, + ContributorMediator mediator, + Settings settings) { + this(store, collector, null, mediator, settings); } /** @@ -89,7 +106,7 @@ public AuditTrailService( * @param reportingComponent Restrict the results to only be reported by this component * @param actor Restrict the results to only be events caused by this actor * @param action Restrict the results to only be about this type of action - * @param fingerprint the fingerprint + * @param fingerprint The fingerprint * @param operationID Restrict the results to only this operationID * @return an iterator to all AuditTrailEvents matching the criteria from the parameters */ @@ -128,6 +145,20 @@ public List getCollectorInfos() { return infos; } + /** + * Get preservation info if preservation of audit trails is enabled. + * + * @return PreservationInfo or null if not enabled. + */ + public PreservationInfo getPreservationInfo() { + PreservationInfo info = null; + if (preserver != null) { + info = preserver.getPreservationInfo(); + // TODO figure out how to indicate not-enabled in settings + } + return info; + } + /** * Get the list of known contributors from the backend. * @@ -139,14 +170,21 @@ public List getContributors() { @Override public void start() { + if (preserver != null) { + preserver.start(); + } mediator.start(); } @Override public void shutdown() { collector.close(); + if (preserver != null) { + preserver.close(); + } store.close(); mediator.close(); + MessageBus messageBus = MessageBusManager.getMessageBus(); if (messageBus != null) { try { diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/AuditTrailServiceFactory.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/AuditTrailServiceFactory.java index fe9ad3db8..c2ef50221 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/AuditTrailServiceFactory.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/AuditTrailServiceFactory.java @@ -116,16 +116,17 @@ public static synchronized AuditTrailService getAuditTrailService() { securityManager, serviceSettings.getID()); AuditTrailCollector collector = new AuditTrailCollector(settings, client, store, alarmDispatcher); - AuditTrailPreserver preserver; + if (serviceSettings.isSetAuditTrailPreservation()) { - preserver = new LocalAuditTrailPreserver( + log.info("Audit trail preservation enabled in configuration. Audit trail service will preserve trails."); + AuditTrailPreserver preserver = new LocalAuditTrailPreserver( settings, store, putClient, ProtocolComponentFactory.getInstance().getFileExchange(settings)); - preserver.start(); + auditTrailService = new AuditTrailService(store, collector, preserver, mediator, settings); } else { log.info("Audit trail preservation disabled, no configuration defined."); + auditTrailService = new AuditTrailService(store, collector, mediator, settings); } - - auditTrailService = new AuditTrailService(store, collector, mediator, settings); + auditTrailService.start(); } return auditTrailService; diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/collector/IncrementalCollector.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/collector/IncrementalCollector.java index e36a9115d..ef25d8c0e 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/collector/IncrementalCollector.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/collector/IncrementalCollector.java @@ -66,12 +66,12 @@ public class IncrementalCollector { private long collectedAudits = 0; /** - * @param collectionID the collection ID + * @param collectionID The collection ID * @param clientID The clientID to use for the requests. * @param client The client to use for the operations. * @param store Where to persist the received results. - * @param maxNumberOfResults A optional limit on the number of audit trail events to request. If not set, {} - * @param alarmDispatcher the alarm dispatcher + * @param maxNumberOfResults An optional limit on the number of audit trail events to request. If not set, {} + * @param alarmDispatcher The alarm dispatcher */ public IncrementalCollector(String collectionID, String clientID, AuditTrailClient client, AuditTrailStore store, int maxNumberOfResults, AlarmDispatcher alarmDispatcher) { @@ -103,7 +103,6 @@ public long getNumberOfCollectedAudits() { /** * Setup and initiates the collection of audit trails through the client. - * Adds one to the sequence number to request only newer audit trails. * * @param contributors the collection of IDs of contributor */ @@ -121,7 +120,8 @@ public void performCollection(Collection contributors) { } /** - * Collect a page of audit trails from the active contributors + * Collect a page of audit trails from the active contributors. + * Adds 1 to the sequence number to only collect newer audit trails. * * @param contributors The contributors to collect from * @return Collection the contributors that have more audits to collect @@ -129,9 +129,9 @@ public void performCollection(Collection contributors) { private Collection collect(Collection contributors) { List queries = new ArrayList<>(); - for (String contributorId : contributors) { - long seq = store.largestSequenceNumber(contributorId, collectionID); - queries.add(new AuditTrailQuery(contributorId, seq + 1, null, maxNumberOfResults)); + for (String contributorID : contributors) { + long seqNum = store.largestSequenceNumber(contributorID, collectionID); + queries.add(new AuditTrailQuery(contributorID, seqNum + 1, null, maxNumberOfResults)); } log.debug("Collecting of AuditTrails for '{}' with ContributorQueries: {}", collectionID, queries); diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditPacker.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditPacker.java index 01edfa8a2..95a54e916 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditPacker.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditPacker.java @@ -58,12 +58,14 @@ public class AuditPacker { /** * Map between the contributor id and the reached preservation sequence number. */ - private final Map seqReached = new HashMap<>(); + private final Map seqNumsReached = new HashMap<>(); /** * Whether the output stream should be appended to the file. */ private static final boolean APPEND = true; + private long packedAuditCount = 0; + /** * Constructor. * @@ -77,7 +79,7 @@ public AuditPacker(AuditTrailStore store, AuditTrailPreservation settings, Strin this.directory = FileUtils.retrieveDirectory(settings.getAuditTrailPreservationTemporaryDirectory()); this.contributors.addAll(SettingsUtils.getAuditContributorsForCollection(collectionID)); - initialiseReachedSequenceNumbers(); + initializeReachedSequenceNumbers(); } /** @@ -86,16 +88,16 @@ public AuditPacker(AuditTrailStore store, AuditTrailPreservation settings, Strin * @return A mapping between the contributor ids and their preservation sequence numbers. */ public Map getSequenceNumbersReached() { - return new HashMap<>(seqReached); + return new HashMap<>(seqNumsReached); } /** * Retrieves the preservation sequence number for each contributor and inserts it into the map. */ - private void initialiseReachedSequenceNumbers() { + private void initializeReachedSequenceNumbers() { for (String contributor : contributors) { - Long seq = store.getPreservationSequenceNumber(contributor, collectionID); - seqReached.put(contributor, seq); + Long seqNum = store.getPreservationSequenceNumber(contributor, collectionID); + seqNumsReached.put(contributor, seqNum); } } @@ -107,6 +109,7 @@ private void initialiseReachedSequenceNumbers() { * @return A compressed file with all the audit trails. */ public synchronized File createNewPackage() { + resetPackedAuditCount(); File container = new File(directory, collectionID + "-audit-trails-" + System.currentTimeMillis()); try { if (container.createNewFile()) { @@ -124,6 +127,14 @@ public synchronized File createNewPackage() { return null; } + /** + * Resets {@link #packedAuditCount}. + * Done before creating a new package to ensure only new packed audits are counted. + */ + private void resetPackedAuditCount() { + packedAuditCount = 0; + } + /** * Packs all newest audit trails from every contributor into the given file. * @@ -148,15 +159,16 @@ private void packContributors(File container) throws IOException { /** * Writes all the newest audit trails for a single contributor to the PrintWriter. * - * @param contributorId The id of the contributor to write the files for. + * @param contributorID The id of the contributor to write the files for. * @param writer The PrinterWriter where the output will be written. */ - private void packContributor(String contributorId, PrintWriter writer) { - long nextSeqNumber = store.getPreservationSequenceNumber(contributorId, collectionID); + private void packContributor(String contributorID, PrintWriter writer) { + long nextSeqNumber = store.getPreservationSequenceNumber(contributorID, collectionID) + 1; long largestSeqNumber = -1; long numPackedAudits = 0; - log.debug("Starting to pack AuditTrails for contributor: " + contributorId + " for collection: " + collectionID); - AuditEventIterator iterator = store.getAuditTrailsByIterator(null, collectionID, contributorId, nextSeqNumber, null, + log.debug("Starting to pack AuditTrails at seq-number {} for contributor: {} for collection: {}", + nextSeqNumber, contributorID, collectionID); + AuditEventIterator iterator = store.getAuditTrailsByIterator(null, collectionID, contributorID, nextSeqNumber, null, null, null, null, null, null, null); long timeStart = System.currentTimeMillis(); long logInterval = 1000; @@ -171,12 +183,14 @@ private void packContributor(String contributorId, PrintWriter writer) { writer.println(event); if ((numPackedAudits % logInterval) == 0) { - log.debug("Packed " + numPackedAudits + " AuditTrails in: " + (System.currentTimeMillis() - timeStart) + " ms"); + log.debug("Packed {} AuditTrails in: {} ms", numPackedAudits, System.currentTimeMillis() - timeStart); } } - log.debug("Packed a total of: " + numPackedAudits + " AuditTrails in: " + (System.currentTimeMillis() - timeStart) + " ms"); + log.debug("Packed a total of: {} AuditTrails in: {} ms", + numPackedAudits, System.currentTimeMillis() - timeStart); + packedAuditCount += numPackedAudits; if (numPackedAudits > 0) { - seqReached.put(contributorId, largestSeqNumber); + seqNumsReached.put(contributorID, largestSeqNumber); } } @@ -194,4 +208,13 @@ private File createCompressedFile(File fileToCompress) throws IOException { FileUtils.zipFile(fileToCompress, zippedFile); return zippedFile; } + + /** + * Get the last count of packed audits i.e. count of new audits from all contributors for the collection. + * + * @return Count of packed audits. + */ + public long getPackedAuditCount() { + return packedAuditCount; + } } diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditPreservationEventHandler.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditPreservationEventHandler.java index 54b1faa77..bd0f4e733 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditPreservationEventHandler.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditPreservationEventHandler.java @@ -44,12 +44,13 @@ public class AuditPreservationEventHandler implements EventHandler { private final String collectionID; /** - * @param preservationSequenceNumber The map between the contributor ids and their respective sequence number. + * @param contributorSequenceNumbers The map between the contributor ids and their respective sequence number. * @param store The store which should be updated with these sequence numbers. * @param collectionID The ID of the collection that needs to have its sequence number updated. */ - public AuditPreservationEventHandler(Map preservationSequenceNumber, AuditTrailStore store, String collectionID) { - this.seqNumbers = preservationSequenceNumber; + public AuditPreservationEventHandler(Map contributorSequenceNumbers, AuditTrailStore store, + String collectionID) { + this.seqNumbers = contributorSequenceNumbers; this.store = store; this.collectionID = collectionID; } @@ -58,8 +59,9 @@ public AuditPreservationEventHandler(Map preservationSequenceNumbe public void handleEvent(OperationEvent event) { if (event.getEventType() == OperationEventType.COMPLETE) { updateStoreWithResults(); + } else { - log.debug("Event for preservation of audit trails: " + event.toString()); + log.debug("Event for preservation of audit trails: {}", event); } } @@ -68,11 +70,12 @@ public void handleEvent(OperationEvent event) { */ private void updateStoreWithResults() { for (Map.Entry entry : seqNumbers.entrySet()) { - if (store.havePreservationKey(entry.getKey(), collectionID)) { - store.setPreservationSequenceNumber(entry.getKey(), collectionID, entry.getValue()); + String contributorID = entry.getKey(); + if (store.hasPreservationKey(contributorID, collectionID)) { + store.setPreservationSequenceNumber(contributorID, collectionID, entry.getValue()); } else { - log.debug("Preservation key for contributor: " + entry.getKey() + " in collection: " + collectionID + - " is not known by the database."); + log.debug("Preservation key for contributor: {} in collection: {} is not known by the database.", + contributorID, collectionID); } } } diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditTrailPreserver.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditTrailPreserver.java index b3d8ae992..9f44f9f90 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditTrailPreserver.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/AuditTrailPreserver.java @@ -21,6 +21,8 @@ */ package org.bitrepository.audittrails.preserver; +import org.bitrepository.audittrails.webservice.PreservationInfo; + /** * Interface for the preservation of audit trails. * This will automatically preserve the audit trails with a given interval. @@ -40,4 +42,10 @@ public interface AuditTrailPreserver { * Stop the preservation of audit trails. */ void close(); + + /** + * Gets the latest preservation info. + * @return Object containing info about the latest preservation. + */ + PreservationInfo getPreservationInfo(); } diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/LocalAuditTrailPreserver.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/LocalAuditTrailPreserver.java index b83ab1204..eee42f19d 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/LocalAuditTrailPreserver.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/LocalAuditTrailPreserver.java @@ -21,7 +21,9 @@ */ package org.bitrepository.audittrails.preserver; +import org.bitrepository.audittrails.collector.CollectionSchedule; import org.bitrepository.audittrails.store.AuditTrailStore; +import org.bitrepository.audittrails.webservice.PreservationInfo; import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.client.eventhandler.EventHandler; @@ -48,6 +50,7 @@ import java.net.URL; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; @@ -66,6 +69,7 @@ public class LocalAuditTrailPreserver implements AuditTrailPreserver { private final AuditTrailPreservation preservationSettings; private final Settings settings; private final FileExchange exchange; + private long preservedAuditCount = 0; /** * @param settings The preservationSettings for the audit trail service. @@ -85,6 +89,22 @@ public LocalAuditTrailPreserver(Settings settings, AuditTrailStore store, PutFil for (String collectionID : SettingsUtils.getAllCollectionsIDs()) { this.auditPackers.put(collectionID, new AuditPacker(store, preservationSettings, collectionID)); } + initializeDatabaseEntries(); + } + + private void initializeDatabaseEntries() { + log.debug("Initializing collections and contributors in db."); + List collections = SettingsUtils.getAllCollectionsIDs(); + for (String collectionID : collections) { + store.addCollection(collectionID); + for (String contributorID : SettingsUtils.getAuditContributorsForCollection(collectionID)) { + store.addContributor(contributorID); + + if (!store.hasPreservationKey(contributorID, collectionID)) { + store.setPreservationSequenceNumber(contributorID, collectionID, 0L); + } + } + } } @Override @@ -95,8 +115,9 @@ public void start() { } long preservationInterval = preservationSettings.getAuditTrailPreservationInterval(); long timerCheckInterval = preservationInterval / 10; - log.info("Instantiating the preservation of audit trails every " + TimeUtils.millisecondsToHuman(preservationInterval)); - timer = new Timer(); + log.info("Instantiating the preservation of audit trails every {}", + TimeUtils.millisecondsToHuman(preservationInterval)); + timer = new Timer(true); auditTask = new AuditPreservationTimerTask(preservationInterval); timer.scheduleAtFixedRate(auditTask, timerCheckInterval, timerCheckInterval); } @@ -110,16 +131,19 @@ public void close() { @Override public void preserveRepositoryAuditTrails() { - if (auditTask == null) { - log.info("preserving the audit trails "); - } else { - auditTask.resetTime(); - } + resetPreservedAuditCount(); for (String collectionID : SettingsUtils.getAllCollectionsIDs()) { performAuditTrailPreservation(collectionID); } } + /** + * Resets the preserved audit trail count so newly preserved audits can be counted. + */ + private void resetPreservedAuditCount() { + preservedAuditCount = 0; + } + /** * Performs the audit trails preservation. * Uses the AuditPacker to pack the audit trails in a file, then uploads the file to the default file-server, and @@ -131,16 +155,20 @@ public void preserveRepositoryAuditTrails() { */ private synchronized void performAuditTrailPreservation(String collectionID) { try { - File auditPackage = auditPackers.get(collectionID).createNewPackage(); + AuditPacker auditPacker = auditPackers.get(collectionID); + File auditPackage = auditPacker.createNewPackage(); URL url = uploadFile(auditPackage); - log.info("Uploaded the file '" + auditPackage + "' to '" + url.toExternalForm() + "'"); + log.info("Uploaded the file '{}' to '{}'", auditPackage, url.toExternalForm()); ChecksumDataForFileTYPE checksumData = getValidationChecksumDataForFile(auditPackage); - EventHandler eventHandler = new AuditPreservationEventHandler(auditPackers.get(collectionID).getSequenceNumbersReached(), store, - collectionID); - client.putFile(preservationSettings.getAuditTrailPreservationCollection(), url, auditPackage.getName(), auditPackage.length(), - checksumData, null, eventHandler, "Preservation of audit trails from the AuditTrail service."); + EventHandler eventHandler = new AuditPreservationEventHandler(auditPacker.getSequenceNumbersReached(), + store, collectionID); + client.putFile(preservationSettings.getAuditTrailPreservationCollection(), url, auditPackage.getName(), + auditPackage.length(), checksumData, null, eventHandler, + "Preservation of audit trails from the AuditTrail service."); + + preservedAuditCount += auditPacker.getPackedAuditCount(); log.debug("Cleanup of the uploaded audit trail package."); FileUtils.delete(auditPackage); @@ -179,38 +207,68 @@ private URL uploadFile(File file) throws IOException { return uploadedFileURL; } + @Override + public PreservationInfo getPreservationInfo() { + PreservationInfo info = new PreservationInfo(); + info.setCollectionID(preservationSettings.getAuditTrailPreservationCollection()); + + Date lastStart = auditTask.getLastPreservationStart(); + Date lastFinish = auditTask.getLastPreservationFinish(); + Date nextStart = auditTask.getNextScheduledRun(); + long lastDurationMS = lastFinish.getTime() - lastStart.getTime(); + + /*if (lastStart != null) { + info.setLastStart(TimeUtils.shortDate(lastStart)); + if (lastFinish != null) { + long duration = lastFinish.getTime() - lastStart.getTime(); + info.setLastDuration(TimeUtils.millisecondsToHuman(duration)); + } else { + info.setLastDuration("Collection has not finished yet"); + } + } else { + info.setLastStart("Audit trail collection have not started"); + info.setLastDuration("Not available"); + }*/ + info.setLastStart(TimeUtils.shortDate(lastStart)); + info.setLastDuration(TimeUtils.millisecondsToHuman(lastDurationMS)); + info.setNextStart(TimeUtils.shortDate(nextStart)); + info.setPreservedAuditCount(preservedAuditCount); + return info; + } + /** * Timer task for keeping track of the automated collecting of audit trails. */ private class AuditPreservationTimerTask extends TimerTask { - private final long interval; - private Date nextRun; + private final Logger log = LoggerFactory.getLogger(getClass()); + private final CollectionSchedule schedule; // TODO refactor /** * @param interval The interval between running this timer task. */ private AuditPreservationTimerTask(long interval) { - this.interval = interval; - resetTime(); + this.schedule = new CollectionSchedule(interval, 0); } - /** - * Resets the date for next run. - */ - private void resetTime() { - nextRun = new Date(System.currentTimeMillis() + interval); + public Date getNextScheduledRun() { + return schedule.getNextRun(); + } + + public Date getLastPreservationStart() { + return schedule.getLastStart(); + } + + public Date getLastPreservationFinish() { + return schedule.getLastFinish(); } @Override public void run() { - if (nextRun.getTime() < System.currentTimeMillis()) { - try { - log.debug("Time to preserve the audit trails."); - preserveRepositoryAuditTrails(); - } catch (Exception e) { - log.error("Caught exception while attempting to preserve AuditTrails", e); - } - resetTime(); + if (getNextScheduledRun().getTime() < System.currentTimeMillis()) { + log.debug("Time to preserve the audit trails."); + schedule.start(); + preserveRepositoryAuditTrails(); + schedule.finish(); } } } diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditDatabaseExtractor.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditDatabaseExtractor.java index 2d800da0c..cc85d6238 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditDatabaseExtractor.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditDatabaseExtractor.java @@ -221,18 +221,18 @@ private String joinWithContributorTable() { private String createRestriction() { StringBuilder res = new StringBuilder(); - if (model.getFileId() != null) { + if (model.getFileID() != null) { nextArgument(res); res.append(FILE_TABLE + "." + FILE_FILE_ID + " = ? "); } - if (model.getCollectionId() != null) { + if (model.getCollectionID() != null) { nextArgument(res); res.append(FILE_TABLE + "." + FILE_COLLECTION_KEY + " = ( SELECT " + COLLECTION_KEY + " FROM " + COLLECTION_TABLE + " WHERE " + COLLECTION_ID + " = ? )"); } - if (model.getContributorId() != null) { + if (model.getContributorID() != null) { nextArgument(res); res.append(AUDIT_TRAIL_TABLE + "." + AUDIT_TRAIL_CONTRIBUTOR_KEY + " = ( SELECT " + CONTRIBUTOR_KEY + " FROM " + CONTRIBUTOR_TABLE + " WHERE " + CONTRIBUTOR_ID + " = ? )"); @@ -301,16 +301,16 @@ private void nextArgument(StringBuilder res) { private Object[] extractArgumentsFromModel() { List res = new ArrayList<>(); - if (model.getFileId() != null) { - res.add(model.getFileId()); + if (model.getFileID() != null) { + res.add(model.getFileID()); } - if (model.getCollectionId() != null) { - res.add(model.getCollectionId()); + if (model.getCollectionID() != null) { + res.add(model.getCollectionID()); } - if (model.getContributorId() != null) { - res.add(model.getContributorId()); + if (model.getContributorID() != null) { + res.add(model.getContributorID()); } if (model.getMinSeqNumber() != null) { diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditEventIterator.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditEventIterator.java index 71de265db..53e2b1503 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditEventIterator.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditEventIterator.java @@ -98,7 +98,8 @@ public AuditTrailEvent getNextAuditTrailEvent() { long tStart = System.currentTimeMillis(); log.debug("Executing query to get AuditTrailEvents ResultSet"); auditResultSet = ps.executeQuery(); - log.debug("Finished executing AuditTrailEvents query, it took: " + (System.currentTimeMillis() - tStart) + "ms"); + log.debug("Finished executing AuditTrailEvents query, it took: {} ms", + System.currentTimeMillis() - tStart); } if (auditResultSet.next()) { event = new AuditTrailEvent(); diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailAdder.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailAdder.java index 8debe7e02..fdd163887 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailAdder.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailAdder.java @@ -103,7 +103,7 @@ public class AuditTrailAdder { + " WHERE actor_name = ?)," + " ?, ?, ?, ?, ?, ? )"; - private final String addLatestSequencesSql = "INSERT INTO collection_progress " + private final String addLatestSequenceSql = "INSERT INTO collection_progress " + "(collectionID, contributorID, latest_sequence_number)" + " ( SELECT collectionID, ?, ? FROM collection" + " WHERE collectionID = ?" @@ -144,7 +144,7 @@ private void init() throws SQLException { addFileIDPs = conn.prepareStatement(addFileIDSql); addAuditTrailPs = conn.prepareStatement(addAuditTrailSql); updateLatestSeqPs = conn.prepareStatement(updateLatestSequenceSql); - addLatestSeqPs = conn.prepareStatement(addLatestSequencesSql); + addLatestSeqPs = conn.prepareStatement(addLatestSequenceSql); } /** diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailServiceDAO.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailServiceDAO.java index 5c8c3f9f6..570f478df 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailServiceDAO.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailServiceDAO.java @@ -49,14 +49,14 @@ public AuditTrailServiceDAO(DatabaseManager databaseManager) { } @Override - public AuditEventIterator getAuditTrailsByIterator(String fileID, String collectionID, String contributorId, + public AuditEventIterator getAuditTrailsByIterator(String fileID, String collectionID, String contributorID, Long minSeqNumber, Long maxSeqNumber, String actorName, FileAction operation, Date startDate, Date endDate, String fingerprint, String operationID) { ExtractModel model = new ExtractModel(); - model.setFileId(fileID); - model.setCollectionId(collectionID); - model.setContributorId(contributorId); + model.setFileID(fileID); + model.setCollectionID(collectionID); + model.setContributorID(contributorID); model.setMinSeqNumber(minSeqNumber); model.setMaxSeqNumber(maxSeqNumber); model.setActorName(actorName); @@ -88,7 +88,7 @@ public List getKnownContributors() { @Override public long largestSequenceNumber(String contributorID, String collectionID) { - ArgumentValidator.checkNotNullOrEmpty(contributorID, "String contributorId"); + ArgumentValidator.checkNotNullOrEmpty(contributorID, "String contributorID"); ArgumentValidator.checkNotNullOrEmpty(collectionID, "String collectionID"); String sql = "SELECT latest_sequence_number FROM collection_progress" @@ -101,8 +101,8 @@ public long largestSequenceNumber(String contributorID, String collectionID) { } @Override - public long getPreservationSequenceNumber(String contributorId, String collectionID) { - ArgumentValidator.checkNotNullOrEmpty(contributorId, "String contributorId"); + public long getPreservationSequenceNumber(String contributorID, String collectionID) { + ArgumentValidator.checkNotNullOrEmpty(contributorID, "String contributorID"); ArgumentValidator.checkNotNullOrEmpty(collectionID, "String collectionID"); String sql = "SELECT preserved_seq_number FROM preservation" @@ -113,19 +113,18 @@ public long getPreservationSequenceNumber(String contributorId, String collectio + " SELECT collection_key FROM collection" + " WHERE collectionid = ? )"; - Long seq = DatabaseUtils.selectLongValue(dbConnector, sql, contributorId, collectionID); - if (seq != null) { - return seq.intValue(); - } - return 0; + Long seq = DatabaseUtils.selectLongValue(dbConnector, sql, contributorID, collectionID); + log.debug("Looked up latest preservation seq number for {} in collection '{}', it was: {}", + contributorID, collectionID, seq); + return (seq != null ? seq : 0L); } @Override - public void setPreservationSequenceNumber(String contributorId, String collectionID, long seqNumber) { - ArgumentValidator.checkNotNullOrEmpty(contributorId, "String contributorId"); + public void setPreservationSequenceNumber(String contributorID, String collectionID, long seqNumber) { + ArgumentValidator.checkNotNullOrEmpty(contributorID, "String contributorID"); ArgumentValidator.checkNotNegative(seqNumber, "int seqNumber"); - long preservationKey = retrievePreservationKey(contributorId, collectionID); - log.debug("Updating preservation sequence number for contributor: " + contributorId + long preservationKey = retrievePreservationKey(contributorID, collectionID); + log.debug("Updating preservation sequence number for contributor: " + contributorID + " in collection: " + collectionID + " to seq: " + seqNumber); String sqlUpdate = "UPDATE preservation SET preserved_seq_number = ?" @@ -134,7 +133,7 @@ public void setPreservationSequenceNumber(String contributorId, String collectio } @Override - public boolean havePreservationKey(String contributorID, String collectionID) { + public boolean hasPreservationKey(String contributorID, String collectionID) { String sql = "SELECT preservation_key FROM preservation" + " WHERE contributor_key = (" + " SELECT contributor_key FROM contributor" @@ -150,11 +149,11 @@ public boolean havePreservationKey(String contributorID, String collectionID) { /** * Retrieves the key of the preservation table entry for the given collection and contributor. * - * @param contributorId The contributor of the preservation table entry. + * @param contributorID The contributor of the preservation table entry. * @param collectionID The collection of the preservation table entry. * @return The key of the entry in the preservation table. */ - private Long retrievePreservationKey(String contributorId, String collectionID) { + private Long retrievePreservationKey(String contributorID, String collectionID) { String sqlRetrieve = "SELECT preservation_key FROM preservation" + " WHERE contributor_key = (" + " SELECT contributor_key FROM contributor" @@ -162,32 +161,52 @@ private Long retrievePreservationKey(String contributorId, String collectionID) + " AND collection_key = (" + " SELECT collection_key FROM collection" + " WHERE collectionid = ? )"; - Long guid = DatabaseUtils.selectLongValue(dbConnector, sqlRetrieve, contributorId, collectionID); + Long guid = DatabaseUtils.selectLongValue(dbConnector, sqlRetrieve, contributorID, collectionID); if (guid == null) { - log.debug("Inserting preservation entry for contributor '" + contributorId + "' and collection '" - + collectionID + "' into the preservation table."); + log.debug("Inserting preservation entry for contributor '{}' and collection '{}'" + + " into the preservation table.", contributorID, collectionID); String sqlInsert = "INSERT INTO preservation ( contributor_key, collection_key)" + " VALUES ( " + "(SELECT contributor_key FROM contributor" + " WHERE contributor_id = ?)" + ", " + "( SELECT collection_key FROM collection" - + " WHERE collectionid" + " = ? )" + + " WHERE collectionid = ? )" + ")"; - DatabaseUtils.executeStatement(dbConnector, sqlInsert, contributorId, collectionID); + DatabaseUtils.executeStatement(dbConnector, sqlInsert, contributorID, collectionID); - guid = DatabaseUtils.selectLongValue(dbConnector, sqlRetrieve, contributorId, collectionID); + guid = DatabaseUtils.selectLongValue(dbConnector, sqlRetrieve, contributorID, collectionID); } if (guid == null) { - throw new IllegalStateException("PreservationKey cannot be obtained for contributor: " + contributorId + + throw new IllegalStateException("PreservationKey cannot be obtained for contributor: " + contributorID + " in collection: " + collectionID); } return guid; } + @Override + public void addCollection(String collectionID) { + log.debug("Inserting collection with ID '{}' into db.", collectionID); + String insertQuery = "INSERT INTO collection ( collectionid )" + + " ( SELECT ? FROM collection" + + " WHERE collectionid = ?" + + " HAVING count(*) = 0 )"; + DatabaseUtils.executeStatement(dbConnector, insertQuery, collectionID, collectionID); + } + + @Override + public void addContributor(String contributorID) { + log.debug("Inserting contributor with ID '{}' into db.", contributorID); + String insertQuery = "INSERT INTO contributor ( contributor_id )" + + " ( SELECT ? FROM contributor" + + " WHERE contributor_id = ?" + + " HAVING count(*) = 0 )"; + DatabaseUtils.executeStatement(dbConnector, insertQuery, contributorID, contributorID); + } + @Override public void close() { try { diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailStore.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailStore.java index 62f457837..ac852ec76 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailStore.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/AuditTrailStore.java @@ -40,7 +40,7 @@ public interface AuditTrailStore { * * @param fileID [OPTIONAL] The id of the file for restricting the extraction. * @param collectionID [OPTIONAL] The id of the collection from which to retrieve audit trails. - * @param contributorId [OPTIONAL] The id of the contributor for restricting the extraction. + * @param contributorID [OPTIONAL] The id of the contributor for restricting the extraction. * @param minSeqNumber [OPTIONAL] The minimum sequence number for restricting the extraction. * @param maxSeqNumber [OPTIONAL] The maximum sequence number for restricting the extraction. * @param actorName [OPTIONAL] The name of the actor for restricting the extraction. @@ -51,7 +51,7 @@ public interface AuditTrailStore { * @param operationID [OPTIONAL] The ID of the operation (conversationID) for the audits * @return The requested audit trails from the store. */ - AuditEventIterator getAuditTrailsByIterator(String fileID, String collectionID, String contributorId, + AuditEventIterator getAuditTrailsByIterator(String fileID, String collectionID, String contributorID, Long minSeqNumber, Long maxSeqNumber, String actorName, FileAction operation, Date startDate, Date endDate, String fingerprint, String operationID); @@ -65,33 +65,45 @@ AuditEventIterator getAuditTrailsByIterator(String fileID, String collectionID, */ void addAuditTrails(AuditTrailEvents auditTrailsEvents, String collectionID, String contributorID); + /** + * Add a collection to the store. + * @param collectionID The collection ID to add. + */ + void addCollection(String collectionID); + + /** + * Add a contributor to the store. + * @param contributorID The contributor ID to add. + */ + void addContributor(String contributorID); + /** * Retrieves the largest sequence number for a given contributor. * - * @param contributorId The id of the contributor to retrieve the largest sequence number from. + * @param contributorID The id of the contributor to retrieve the largest sequence number from. * @param collectionID The id of the collection for the sequence number of the contributor. * @return The largest sequence number. */ - long largestSequenceNumber(String contributorId, String collectionID); + long largestSequenceNumber(String contributorID, String collectionID); /** * Retrieves the preservation sequence number for the given contributor, which tells how far the preservation * of the audit trails has gotten. * - * @param contributorId The id of the contributor. + * @param contributorID The id of the contributor. * @param collectionID The id of the collection for the sequence number of the contributor. * @return The preservation sequence number for the given contributor. */ - long getPreservationSequenceNumber(String contributorId, String collectionID); + long getPreservationSequenceNumber(String contributorID, String collectionID); /** * Set the preservation sequence number for the given contributor. * - * @param contributorId The id of the contributor. + * @param contributorID The id of the contributor. * @param collectionID The id of the collection for the sequence number of the contributor. * @param seqNumber The new preservation sequence number for the given contributor. */ - void setPreservationSequenceNumber(String contributorId, String collectionID, long seqNumber); + void setPreservationSequenceNumber(String contributorID, String collectionID, long seqNumber); /** * Check to see if the database knows a contributor @@ -100,7 +112,7 @@ AuditEventIterator getAuditTrailsByIterator(String fileID, String collectionID, * @param collectionID The ID of the collection; * @return boolean true, if the contributor is known by the database, false otherwise. */ - boolean havePreservationKey(String contributorID, String collectionID); + boolean hasPreservationKey(String contributorID, String collectionID); /** * Get the list of known audit trail contributors. I.e. those contributors which have delivered diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/ExtractModel.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/ExtractModel.java index eb9e9ac9b..ac051866c 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/ExtractModel.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/store/ExtractModel.java @@ -30,15 +30,15 @@ */ class ExtractModel { /** - * @see #getFileId(). + * @see #getFileID(). */ private String fileID; /** - * @see #getCollectionId(). + * @see #getCollectionID(). */ private String collectionID; /** - * @see #getContributorId(). + * @see #getContributorID(). */ private String contributorId; /** @@ -80,42 +80,42 @@ public ExtractModel() { /** * @return The fileID; */ - public String getFileId() { + public String getFileID() { return fileID; } /** * @param fileID The new file id. */ - public void setFileId(String fileID) { + public void setFileID(String fileID) { this.fileID = fileID; } /** * @return The collectionID; */ - public String getCollectionId() { + public String getCollectionID() { return collectionID; } /** * @param collectionID The new collection id. */ - public void setCollectionId(String collectionID) { + public void setCollectionID(String collectionID) { this.collectionID = collectionID; } /** * @return The contributorId; */ - public String getContributorId() { + public String getContributorID() { return contributorId; } /** * @param contributorId The new id of the contributor. */ - public void setContributorId(String contributorId) { + public void setContributorID(String contributorId) { this.contributorId = contributorId; } diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/CollectorInfo.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/CollectorInfo.java index 4da5e144e..63c50fb29 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/CollectorInfo.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/CollectorInfo.java @@ -26,11 +26,11 @@ @XmlRootElement public class CollectorInfo { - String collectionID; - String lastStart; - String lastDuration; - String nextStart; - long collectedAudits; + private String collectionID; + private String lastStart; + private String lastDuration; + private String nextStart; + private long collectedAudits; public String getCollectionID() { return collectionID; diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java index 951b2ceb6..59e5d8390 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java @@ -141,13 +141,7 @@ public List getCollectionSchedule() { @Path("/preservationSchedule") @Produces(MediaType.APPLICATION_JSON) public PreservationInfo getPreservationSchedule() { - PreservationInfo info = new PreservationInfo(); - info.setCollectionID("books"); - info.setLastStart("123"); - info.setLastDuration("1"); - info.setNextStart("321"); - info.setPreservedAuditCount(1000); - return info; + return service.getPreservationInfo(); } private void writeAuditResult(AuditTrailEvent event, JsonGenerator jg) throws IOException { diff --git a/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/preserver/AuditPreservationEventHandlerTest.java b/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/preserver/AuditPreservationEventHandlerTest.java index 8dfff35f3..611e83e11 100644 --- a/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/preserver/AuditPreservationEventHandlerTest.java +++ b/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/preserver/AuditPreservationEventHandlerTest.java @@ -47,7 +47,7 @@ public void auditPreservationEventHandlerTest() throws Exception { Map map = new HashMap<>(); map.put(PILLARID, 1L); AuditTrailStore store = mock(AuditTrailStore.class); - when(store.havePreservationKey(eq(PILLARID), eq(TEST_COLLECTION))).thenReturn(true); + when(store.hasPreservationKey(eq(PILLARID), eq(TEST_COLLECTION))).thenReturn(true); AuditPreservationEventHandler eventHandler = new AuditPreservationEventHandler(map, store, TEST_COLLECTION); diff --git a/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/preserver/LocalAuditPreservationTest.java b/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/preserver/LocalAuditPreservationTest.java index ee0e2df7d..063d3d43e 100644 --- a/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/preserver/LocalAuditPreservationTest.java +++ b/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/preserver/LocalAuditPreservationTest.java @@ -164,10 +164,14 @@ public void auditPreservationIngestTest() throws Exception { FileExchange fileExchange = mock(FileExchange.class); LocalAuditTrailPreserver preserver = new LocalAuditTrailPreserver(settings, store, client, fileExchange); - + + verify(store).addCollection(collectionID); + verify(store).addContributor(PILLARID); verify(store).getPreservationSequenceNumber(PILLARID, collectionID); + verify(store).hasPreservationKey(PILLARID, collectionID); + verify(store).setPreservationSequenceNumber(PILLARID, collectionID, 0); verifyNoMoreInteractions(store); - + addStep("Call the preservation of audit trails now.", "Should make calls to the store, upload the file and call the client"); @@ -184,7 +188,7 @@ public AuditEventIterator answer(InvocationOnMock invocation) { // getPreservationSequenceNumber should be called twice, first to 'initialize' auditpacker, and second to // run the preserver/packer... verify(store, times(2)).getPreservationSequenceNumber(PILLARID, collectionID); - verify(store).getAuditTrailsByIterator(null, collectionID, PILLARID, 0L, + verify(store).getAuditTrailsByIterator(null, collectionID, PILLARID, 1L, null, null, null, null, null, null, null); assertEquals(client.getCallsToPutFile(), 1); diff --git a/bitrepository-core/src/test/resources/settings/xml/bitrepository-devel/RepositorySettings.xml b/bitrepository-core/src/test/resources/settings/xml/bitrepository-devel/RepositorySettings.xml index 1902c9ecb..95e978f64 100644 --- a/bitrepository-core/src/test/resources/settings/xml/bitrepository-devel/RepositorySettings.xml +++ b/bitrepository-core/src/test/resources/settings/xml/bitrepository-devel/RepositorySettings.xml @@ -27,11 +27,18 @@ Development - TwoPillarCollection - Pillar1Pillar2 + + TwoPillarCollection + + Pillar1 + Pillar2 + - SinglePillarCollection - Pillar1 + + SinglePillarCollection + + Pillar1 + diff --git a/bitrepository-webclient/src/main/webapp/audit-trail-service.html b/bitrepository-webclient/src/main/webapp/audit-trail-service.html index 26c172cc2..396074abb 100644 --- a/bitrepository-webclient/src/main/webapp/audit-trail-service.html +++ b/bitrepository-webclient/src/main/webapp/audit-trail-service.html @@ -20,7 +20,7 @@ #L% --> - + Bitrepository audit-trail service @@ -73,6 +73,32 @@

+ +
+
+ +
+
+ + + + + + + + + + + +
Collection IDLast startLast durationLast preserved number of auditsNext start
+
+
+
+
@@ -177,15 +203,17 @@