diff --git a/bitrepository-client/src/main/java/org/bitrepository/client/conversation/GeneralConversationState.java b/bitrepository-client/src/main/java/org/bitrepository/client/conversation/GeneralConversationState.java index 40a4121a5..33b2477eb 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/client/conversation/GeneralConversationState.java +++ b/bitrepository-client/src/main/java/org/bitrepository/client/conversation/GeneralConversationState.java @@ -75,7 +75,7 @@ public void start() { if (!responseStatus.getOutstandingComponents().isEmpty()) { if (getTimeoutValue().compareTo(Duration.ZERO) > 0) { // TODO From Java 18 use: getTimeoutValue().isPositive() CountAndTimeUnit delay = TimeUtils.durationToCountAndTimeUnit(getTimeoutValue()); - scheduledTimeout = timer.schedule(new TimeoutHandler(), delay.getCount(), delay.getUnit()); + scheduledTimeout = timer.schedule(new TimeoutHandler(), delay.count(), delay.unit()); } sendRequest(); } else { diff --git a/bitrepository-client/src/main/java/org/bitrepository/client/conversation/selector/SelectedComponentInfo.java b/bitrepository-client/src/main/java/org/bitrepository/client/conversation/selector/SelectedComponentInfo.java index de61b6302..1c8c54219 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/client/conversation/selector/SelectedComponentInfo.java +++ b/bitrepository-client/src/main/java/org/bitrepository/client/conversation/selector/SelectedComponentInfo.java @@ -24,46 +24,23 @@ */ package org.bitrepository.client.conversation.selector; +import org.jetbrains.annotations.NotNull; + /** - * Container for information about a pillar which as been identified and are marked as selected for a request. + * Container for information about a pillar which has been identified and marked as selected for a request. */ -public class SelectedComponentInfo { - /** - * The ID of the selected pillar - */ - protected final String componentID; - /** - * The topic for communication with the selected pillar - */ - protected final String componentTopic; - - /** - * @param componentID The ID of the pillar - * @param componentTopic the topic for communication with the selected pillar - */ - public SelectedComponentInfo(String componentID, String componentTopic) { - super(); - this.componentID = componentID; - this.componentTopic = componentTopic; - } +public record SelectedComponentInfo(String componentID, String componentTopic) { - /** - * @return The ID of the pillar chosen by this selector if finished. If unfinished null is returned - */ public String getID() { return componentID; } - /** - * @return If finished return the topic for sending messages to the pillar chosen by this selector. - * If unfinished null is returned - */ public String getDestination() { return componentTopic; } @Override - public String toString() { - return getClass().getSimpleName() + ": componentID=" + componentID + ", componentTopic=" + componentTopic; + public @NotNull String toString() { + return "SelectedComponentInfo: componentID=" + componentID + ", componentTopic=" + componentTopic; } } diff --git a/bitrepository-client/src/main/java/org/bitrepository/commandline/eventhandler/CompleteEventAwaiter.java b/bitrepository-client/src/main/java/org/bitrepository/commandline/eventhandler/CompleteEventAwaiter.java index c8916195a..73f652ac8 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/eventhandler/CompleteEventAwaiter.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/eventhandler/CompleteEventAwaiter.java @@ -56,7 +56,7 @@ public abstract class CompleteEventAwaiter implements EventHandler { * @param settings The settings. * @param outputHandler The {@link OutputHandler} for handling outputting results */ - public CompleteEventAwaiter(Settings settings, OutputHandler outputHandler) { + protected CompleteEventAwaiter(Settings settings, OutputHandler outputHandler) { this.timeout = settings.getIdentificationTimeout().plus(settings.getOperationTimeout()); this.output = outputHandler; } @@ -88,7 +88,7 @@ public void handleEvent(OperationEvent event) { public OperationEvent getFinish() { try { CountAndTimeUnit pollTimeout = TimeUtils.durationToCountAndTimeUnit(timeout); - return finalEventQueue.poll(pollTimeout.getCount(), pollTimeout.getUnit()); + return finalEventQueue.poll(pollTimeout.count(), pollTimeout.unit()); } catch (InterruptedException e) { throw new IllegalStateException("Interrupted while waiting for the final response.", e); } diff --git a/bitrepository-client/src/main/java/org/bitrepository/commandline/eventhandler/PagingEventHandler.java b/bitrepository-client/src/main/java/org/bitrepository/commandline/eventhandler/PagingEventHandler.java index 903898dc0..30822db27 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/eventhandler/PagingEventHandler.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/eventhandler/PagingEventHandler.java @@ -73,7 +73,7 @@ public void handleEvent(OperationEvent event) { public OperationEvent getFinish() { try { CountAndTimeUnit pollTimeout = TimeUtils.durationToCountAndTimeUnit(timeout); - return finalEventQueue.poll(pollTimeout.getCount(), pollTimeout.getUnit()); + return finalEventQueue.poll(pollTimeout.count(), pollTimeout.unit()); } catch (InterruptedException e) { throw new IllegalStateException("Interrupted while waiting for the final response.", e); } diff --git a/bitrepository-core/src/main/java/org/bitrepository/common/filestore/DefaultFileInfo.java b/bitrepository-core/src/main/java/org/bitrepository/common/filestore/DefaultFileInfo.java index 6b84c8f57..f80a42a0e 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/common/filestore/DefaultFileInfo.java +++ b/bitrepository-core/src/main/java/org/bitrepository/common/filestore/DefaultFileInfo.java @@ -29,12 +29,7 @@ /** * File info for the files of a default file system. */ -public class DefaultFileInfo implements FileInfo { - private final File file; - - public DefaultFileInfo(File file) { - this.file = file; - } +public record DefaultFileInfo(File file) implements FileInfo { @Override public String getFileID() { @@ -55,8 +50,4 @@ public Long getLastModifiedDate() { public long getSize() { return file.length(); } - - public File getFile() { - return file; - } } diff --git a/bitrepository-core/src/main/java/org/bitrepository/common/utils/CountAndTimeUnit.java b/bitrepository-core/src/main/java/org/bitrepository/common/utils/CountAndTimeUnit.java index c88f8065d..526ede1ba 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/common/utils/CountAndTimeUnit.java +++ b/bitrepository-core/src/main/java/org/bitrepository/common/utils/CountAndTimeUnit.java @@ -3,33 +3,8 @@ import java.util.Objects; import java.util.concurrent.TimeUnit; -public class CountAndTimeUnit { - private final long count; - private final TimeUnit unit; - - public CountAndTimeUnit(long count, TimeUnit unit) { - this.count = count; - this.unit = Objects.requireNonNull(unit, "unit"); - } - - public long getCount() { - return count; - } - - public TimeUnit getUnit() { - return unit; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CountAndTimeUnit that = (CountAndTimeUnit) o; - return count == that.count && unit == that.unit; - } - - @Override - public int hashCode() { - return Objects.hash(count, unit); +public record CountAndTimeUnit(long count, TimeUnit unit) { + public CountAndTimeUnit { + Objects.requireNonNull(unit, "unit"); } } diff --git a/bitrepository-core/src/main/java/org/bitrepository/protocol/MessageContext.java b/bitrepository-core/src/main/java/org/bitrepository/protocol/MessageContext.java index a556a456e..4edd5647b 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/protocol/MessageContext.java +++ b/bitrepository-core/src/main/java/org/bitrepository/protocol/MessageContext.java @@ -24,14 +24,4 @@ /** * Contains information about the message, not contained in the message itself. */ -public class MessageContext { - private final String certificateFingerprint; - - public MessageContext(String certificateFingerprint) { - this.certificateFingerprint = certificateFingerprint; - } - - public String getCertificateFingerprint() { - return certificateFingerprint; - } -} +public record MessageContext(String certificateFingerprint) {} diff --git a/bitrepository-core/src/main/java/org/bitrepository/protocol/security/CertificateID.java b/bitrepository-core/src/main/java/org/bitrepository/protocol/security/CertificateID.java index 25e1bbdc3..d844690d7 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/protocol/security/CertificateID.java +++ b/bitrepository-core/src/main/java/org/bitrepository/protocol/security/CertificateID.java @@ -28,80 +28,19 @@ import java.math.BigInteger; /** - * Class to be used as an identifier of certificates. - * Identification is based on the issuer (X500Principal) and the certificates serial number. - * Those combined should provide a unique ID, and the information can be extracted from a signature. + * Identifies a certificate by issuer (X500Principal) and serial number. + * Those combined provide a unique ID extractable from a signature. */ -public class CertificateID { - private final X500Principal issuer; - private final BigInteger serial; +public record CertificateID(X500Principal issuer, BigInteger serial) { /** - * @param issuer The X500Principal object that identifies the certificate issuer. - * Can be extracted from a SignerID and a X509Certificate - * @param serialNumber The certificates SerialNumber, ca be extracted from a SignerID and a X509Certificate + * Creates a CertificateID from an X500Name issuer, converting it to X500Principal. */ - public CertificateID(X500Principal issuer, BigInteger serialNumber) { - this.issuer = issuer; - this.serial = serialNumber; - } - - public CertificateID(X500Name issuer, BigInteger serialNumber) { + public static CertificateID of(X500Name issuer, BigInteger serialNumber) { try { - this.issuer = new X500Principal(issuer.getEncoded()); + return new CertificateID(new X500Principal(issuer.getEncoded()), serialNumber); } catch (IOException e) { throw new RuntimeException("Failed to create X500Principal from X500Name", e); } - this.serial = serialNumber; } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((issuer == null) ? 0 : issuer.hashCode()); - result = prime * result + ((serial == null) ? 0 : serial.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - CertificateID other = (CertificateID) obj; - if (issuer == null) { - if (other.issuer != null) - return false; - } else if (!issuer.equals(other.issuer)) - return false; - if (serial == null) { - return other.serial == null; - } else return serial.equals(other.serial); - } - - @Override - public String toString() { - return "CertificateID [issuer=" + issuer + ", serial=" + serial + "]"; - } - - /** - * @return Identifying object of the issuer of a certificate - * @see CertificateID constructor - */ - public X500Principal getIssuer() { - return issuer; - } - - /** - * @return The serial number of a certificate (unique within an issuer) - * @see CertificateID constructor - */ - public BigInteger getSerial() { - return serial; - } - } diff --git a/bitrepository-core/src/main/java/org/bitrepository/protocol/security/PermissionStore.java b/bitrepository-core/src/main/java/org/bitrepository/protocol/security/PermissionStore.java index cc43384e7..fb4395edb 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/protocol/security/PermissionStore.java +++ b/bitrepository-core/src/main/java/org/bitrepository/protocol/security/PermissionStore.java @@ -133,7 +133,7 @@ public void loadPermissions(PermissionSet permissions, String componentID) { * @throws PermissionStoreException if no certificate can be found based on the SignerId */ public X509Certificate getCertificate(SignerId signer) throws PermissionStoreException { - CertificateID certificateID = new CertificateID(signer.getIssuer(), signer.getSerialNumber()); + CertificateID certificateID = CertificateID.of(signer.getIssuer(), signer.getSerialNumber()); CertificatePermission permission = permissionMap.get(certificateID); if (permission != null) { return permission.getCertificate(); @@ -150,7 +150,7 @@ public X509Certificate getCertificate(SignerId signer) throws PermissionStoreExc * @throws PermissionStoreException in case no certificate has been registered for the given signerId */ public boolean checkCertificateUser(SignerId signer, String certificateUser) throws PermissionStoreException { - CertificateID certificateID = new CertificateID(signer.getIssuer(), signer.getSerialNumber()); + CertificateID certificateID = CertificateID.of(signer.getIssuer(), signer.getSerialNumber()); CertificatePermission certificatePermission = permissionMap.get(certificateID); if (certificatePermission == null) { throw new PermissionStoreException("Failed to find certificate and permissions for the requested signer: " + certificateID); @@ -165,7 +165,7 @@ public boolean checkCertificateUser(SignerId signer, String certificateUser) thr * @throws UnregisteredPermissionException No finger-print could be found for the indicated signer. */ public String getCertificateFingerprint(SignerId signer) throws UnregisteredPermissionException { - CertificateID certificateID = new CertificateID(signer.getIssuer(), signer.getSerialNumber()); + CertificateID certificateID = CertificateID.of(signer.getIssuer(), signer.getSerialNumber()); CertificatePermission certificatePermission = permissionMap.get(certificateID); if (certificatePermission != null) { return certificatePermission.getFingerprint(); @@ -185,7 +185,7 @@ public String getCertificateFingerprint(SignerId signer) throws UnregisteredPerm * @throws PermissionStoreException in case no certificate and permission set can be found for the provided signer. */ public boolean checkPermission(SignerId signer, Operation permission, String collectionID) throws PermissionStoreException { - CertificateID certificateID = new CertificateID(signer.getIssuer(), signer.getSerialNumber()); + CertificateID certificateID = CertificateID.of(signer.getIssuer(), signer.getSerialNumber()); CertificatePermission certificatePermission = permissionMap.get(certificateID); if (certificatePermission == null) { throw new PermissionStoreException("Failed to find certificate and permissions for the requested signer: " + certificateID); diff --git a/bitrepository-core/src/test/java/org/bitrepository/common/utils/TimeUtilsTest.java b/bitrepository-core/src/test/java/org/bitrepository/common/utils/TimeUtilsTest.java index 8175a9c14..29504c526 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/common/utils/TimeUtilsTest.java +++ b/bitrepository-core/src/test/java/org/bitrepository/common/utils/TimeUtilsTest.java @@ -243,8 +243,8 @@ void rejectsNegativeDuration() { @Tag("regressiontest") void convertsDurationToCountAndTimeUnit() { CountAndTimeUnit expectedZero = TimeUtils.durationToCountAndTimeUnit(Duration.ZERO); - Assertions.assertEquals(0, expectedZero.getCount()); - Assertions.assertNotNull(expectedZero.getUnit()); + Assertions.assertEquals(0, expectedZero.count()); + Assertions.assertNotNull(expectedZero.unit()); Assertions.assertEquals(new CountAndTimeUnit(1, TimeUnit.NANOSECONDS), TimeUtils.durationToCountAndTimeUnit(Duration.ofNanos(1))); diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/security/CertificateIDTest.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/security/CertificateIDTest.java index 7e7fcb48e..c5ba8fedb 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/security/CertificateIDTest.java +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/security/CertificateIDTest.java @@ -58,7 +58,7 @@ void positiveCertificateIdentificationTest() throws Exception { CMSSignedData s = new CMSSignedData(new CMSProcessableByteArray( SecurityTestConstants.getTestData().getBytes(SecurityModuleConstants.defaultEncodingType)), decodeSig); SignerInformation signer = s.getSignerInfos().getSigners().iterator().next(); - CertificateID certificateIDFromSignature = new CertificateID(signer.getSID().getIssuer(), signer.getSID().getSerialNumber()); + CertificateID certificateIDFromSignature = CertificateID.of(signer.getSID().getIssuer(), signer.getSID().getSerialNumber()); addStep("Assert that the two CertificateID objects are equal", "Assert succeeds"); Assertions.assertEquals(certificateIDfromCertificate, certificateIDFromSignature); @@ -81,7 +81,7 @@ void negativeCertificateIdentificationTest() throws Exception { CMSSignedData s = new CMSSignedData(new CMSProcessableByteArray( SecurityTestConstants.getTestData().getBytes(SecurityModuleConstants.defaultEncodingType)), decodeSig); SignerInformation signer = s.getSignerInfos().getSigners().iterator().next(); - CertificateID certificateIDFromSignature = new CertificateID(signer.getSID().getIssuer(), signer.getSID().getSerialNumber()); + CertificateID certificateIDFromSignature = CertificateID.of(signer.getSID().getIssuer(), signer.getSID().getSerialNumber()); addStep("Assert that the two CertificateID objects are not equal", "Assert succeeds"); Assertions.assertNotSame(certificateIDFromCertificate, certificateIDFromSignature); @@ -100,8 +100,8 @@ void equalTest() throws Exception { CertificateID certificateID1 = new CertificateID(issuer, serial); addStep("Validate the content of the certificateID", "Should be same as x509Certificate"); - Assertions.assertEquals(issuer, certificateID1.getIssuer()); - Assertions.assertEquals(serial, certificateID1.getSerial()); + Assertions.assertEquals(issuer, certificateID1.issuer()); + Assertions.assertEquals(serial, certificateID1.serial()); addStep("Test whether it equals it self", "should give positive result"); Assertions.assertEquals(certificateID1, certificateID1); diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/PillarCollectionMetric.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/PillarCollectionMetric.java index 43d3f2dd1..b298860b6 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/PillarCollectionMetric.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/PillarCollectionMetric.java @@ -3,42 +3,18 @@ import java.time.Instant; /** - * Class to carry information of collection specific pillar metrics. - * The class exists as java is not able to handle simple tuples, - * so the class is meant to carry data in a specific context. + * Carries collection-specific pillar metrics. * * @see org.bitrepository.integrityservice.cache.database.IntegrityDAO#getPillarCollectionMetrics(String) */ -public class PillarCollectionMetric { - - /** - * The summed size of the files in a collection on the pillar. - */ - private final long pillarCollectionSize; - - /** - * The count of files present in a collection on a pillar - */ - private final long pillarFileCount; - - /** Timestamp of the oldest checksum on the pillar or null if no checksums yet */ - private final Instant oldestChecksumTimestamp; +public record PillarCollectionMetric(long pillarCollectionSize, long pillarFileCount, Instant oldestChecksumTimestamp) { + /** Convenience constructor that treats null sizes/counts as zero. */ public PillarCollectionMetric(Long pillarCollectionSize, Long pillarFileCount, Instant oldestChecksumTimestamp) { - this.pillarCollectionSize = pillarCollectionSize == null ? 0 : pillarCollectionSize; - this.pillarFileCount = pillarFileCount == null ? 0 : pillarFileCount; - this.oldestChecksumTimestamp = oldestChecksumTimestamp; - } - - public long getPillarCollectionSize() { - return pillarCollectionSize; - } - - public long getPillarFileCount() { - return pillarFileCount; - } - - public Instant getOldestChecksumTimestamp() { - return oldestChecksumTimestamp; + this( + pillarCollectionSize == null ? 0L : pillarCollectionSize, + pillarFileCount == null ? 0L : pillarFileCount, + oldestChecksumTimestamp + ); } } diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/checking/MaxChecksumAgeProvider.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/checking/MaxChecksumAgeProvider.java index bdff3cfa2..7940a5ccb 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/checking/MaxChecksumAgeProvider.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/checking/MaxChecksumAgeProvider.java @@ -34,13 +34,10 @@ /** * Provide easy access to the MaxChecksumAge for individual pillars. */ -public class MaxChecksumAgeProvider { - private final Duration defaultMaxAge; - private final ObsoleteChecksumSettings settings; +public record MaxChecksumAgeProvider(Duration defaultMaxAge, ObsoleteChecksumSettings settings) { - public MaxChecksumAgeProvider(Duration defaultMaxAge, ObsoleteChecksumSettings settings) { - this.defaultMaxAge = Objects.requireNonNull(defaultMaxAge, "defaultMaxAge"); - this.settings = settings; + public MaxChecksumAgeProvider { + Objects.requireNonNull(defaultMaxAge, "defaultMaxAge"); } /** diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/IntegrityCollectorEventHandler.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/IntegrityCollectorEventHandler.java index 6af80d6a0..2adb7cd1c 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/IntegrityCollectorEventHandler.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/IntegrityCollectorEventHandler.java @@ -94,7 +94,7 @@ public void handleEvent(OperationEvent event) { */ public OperationEvent getFinish() throws InterruptedException { CountAndTimeUnit pollTimeout = TimeUtils.durationToCountAndTimeUnit(timeout); - return finalEventQueue.poll(pollTimeout.getCount(), pollTimeout.getUnit()); + return finalEventQueue.poll(pollTimeout.count(), pollTimeout.unit()); } /** diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/IntegrityEventCompleteAwaiter.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/IntegrityEventCompleteAwaiter.java index cf0784b27..cc753649e 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/IntegrityEventCompleteAwaiter.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/IntegrityEventCompleteAwaiter.java @@ -79,7 +79,7 @@ public void handleEvent(OperationEvent event) { public OperationEvent getFinish() { try { CountAndTimeUnit pollTimeout = TimeUtils.durationToCountAndTimeUnit(timeout); - return finalEventQueue.poll(pollTimeout.getCount(), pollTimeout.getUnit()); + return finalEventQueue.poll(pollTimeout.count(), pollTimeout.unit()); } catch (InterruptedException e) { throw new IllegalStateException("Interrupted while waiting for the final response.", e); } diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/SimpleChecksumEventHandler.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/SimpleChecksumEventHandler.java index 22f600306..f10139af3 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/SimpleChecksumEventHandler.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/collector/SimpleChecksumEventHandler.java @@ -90,7 +90,7 @@ public void handleEvent(OperationEvent event) { */ public OperationEvent getFinish() throws InterruptedException { CountAndTimeUnit pollTimeout = TimeUtils.durationToCountAndTimeUnit(timeout); - return finalEventQueue.poll(pollTimeout.getCount(), pollTimeout.getUnit()); + return finalEventQueue.poll(pollTimeout.count(), pollTimeout.unit()); } /** diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java index 951416002..51afafe2c 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java @@ -311,7 +311,7 @@ public String getWorkflowSetup(@QueryParam("collectionID") String collectionID) public List getWorkflowList(@QueryParam("collectionID") String collectionID) { List workflowIDs = new ArrayList<>(); for (JobID workflowID : workflowManager.getWorkflows(collectionID)) { - workflowIDs.add(workflowID.getWorkflowName()); + workflowIDs.add(workflowID.workflowName()); } return workflowIDs; } @@ -595,7 +595,7 @@ private void writeWorkflowSetupObject(JobID workflowID, JsonGenerator jg) throws Workflow workflow = workflowManager.getWorkflow(workflowID); WorkflowStatistic lastRunStatistic = workflowManager.getLastCompleteStatistics(workflowID); jg.writeStartObject(); - jg.writeObjectField("workflowID", workflowID.getWorkflowName()); + jg.writeObjectField("workflowID", workflowID.workflowName()); jg.writeObjectField("workflowDescription", workflow.getDescription()); Instant nextScheduledRun = workflowManager.getNextScheduledRunInstant(workflowID); if (nextScheduledRun == null) { diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/CompleteIntegrityCheck.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/CompleteIntegrityCheck.java index adfb3d1cd..2bb09532a 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/CompleteIntegrityCheck.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/CompleteIntegrityCheck.java @@ -46,15 +46,15 @@ public String getDescription() { @Override protected UpdateFileIDsStep getUpdateFileIDsStep() { - return new FullUpdateFileIDsStep(context.getCollector(), context.getStore(), context.getAlerter(), - context.getSettings(), collectionID, integrityContributors); + return new FullUpdateFileIDsStep(context.collector(), context.store(), context.alerter(), + context.settings(), collectionID, integrityContributors); } @Override protected UpdateChecksumsStep getUpdateChecksumsStep() { - return new FullUpdateChecksumsStep(context.getCollector(), context.getStore(), context.getAlerter(), - ChecksumUtils.getDefault(context.getSettings()), context.getSettings(), collectionID, + return new FullUpdateChecksumsStep(context.collector(), context.store(), context.alerter(), + ChecksumUtils.getDefault(context.settings()), context.settings(), collectionID, integrityContributors); } diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IncrementalIntegrityCheck.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IncrementalIntegrityCheck.java index 7d55e7458..a4891ea81 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IncrementalIntegrityCheck.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IncrementalIntegrityCheck.java @@ -45,14 +45,14 @@ public String getDescription() { @Override protected UpdateFileIDsStep getUpdateFileIDsStep() { - return new IncrementalUpdateFileIDsStep(context.getCollector(), context.getStore(), context.getAlerter(), context.getSettings(), + return new IncrementalUpdateFileIDsStep(context.collector(), context.store(), context.alerter(), context.settings(), collectionID, integrityContributors); } @Override protected UpdateChecksumsStep getUpdateChecksumsStep() { - return new IncrementalUpdateChecksumsStep(context.getCollector(), context.getStore(), context.getAlerter(), - ChecksumUtils.getDefault(context.getSettings()), context.getSettings(), collectionID, integrityContributors); + return new IncrementalUpdateChecksumsStep(context.collector(), context.store(), context.alerter(), + ChecksumUtils.getDefault(context.settings()), context.settings(), collectionID, integrityContributors); } @Override diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityCheckWorkflow.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityCheckWorkflow.java index 595901a8b..ae27f73c0 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityCheckWorkflow.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityCheckWorkflow.java @@ -66,7 +66,7 @@ public abstract class IntegrityCheckWorkflow extends Workflow { /** * Remember to call the initialise method needs to be called before the start method. */ - public IntegrityCheckWorkflow() {} + protected IntegrityCheckWorkflow() {} @Override public void initialise(WorkflowContext context, String collectionID) { @@ -84,20 +84,20 @@ public void initialise(WorkflowContext context, String collectionID) { protected abstract Instant getChecksumUpdateCutoffDate(); @Override - public void start() { + public synchronized void start() { workflowStart = Instant.now(); if (context == null) { throw new IllegalStateException( "The workflow can not be started before the initialise method has been " + "called."); } - IntegrityReporter reporter = new BasicIntegrityReporter(jobID.getCollectionID(), jobID.getWorkflowName(), + IntegrityReporter reporter = new BasicIntegrityReporter(jobID.collectionID(), jobID.workflowName(), IntegrityServiceManager.getIntegrityReportStorageDir()); super.start(); try { StatisticsCollector statisticsCollector = new StatisticsCollector(collectionID); - Integer maxRetries = context.getSettings().getReferenceSettings().getIntegrityServiceSettings() + Integer maxRetries = context.settings().getReferenceSettings().getIntegrityServiceSettings() .getComponentRetries(); integrityContributors = new IntegrityContributors(SettingsUtils.getPillarIDsForCollection(collectionID), maxRetries == null ? DEFAULT_MAX_RETRIES : maxRetries); @@ -111,38 +111,38 @@ public void start() { performStep(updateChecksumStep); if (cleanDeletedFiles()) { - HandleDeletedFilesStep handleDeletedFilesStep = new HandleDeletedFilesStep(context.getStore(), reporter, + HandleDeletedFilesStep handleDeletedFilesStep = new HandleDeletedFilesStep(context.store(), reporter, workflowStart, integrityContributors.getFinishedContributors()); performStep(handleDeletedFilesStep); } statisticsCollector.getCollectionStat().setStatsTime(Instant.now()); - javax.xml.datatype.Duration timeBeforeMissingFileCheck = context.getSettings().getReferenceSettings() + javax.xml.datatype.Duration timeBeforeMissingFileCheck = context.settings().getReferenceSettings() .getIntegrityServiceSettings().getTimeBeforeMissingFileCheck(); Duration missingFileGracePeriod = XmlUtils.xmlDurationToDuration(timeBeforeMissingFileCheck); - HandleMissingFilesStep handleMissingFilesStep = new HandleMissingFilesStep(context.getStore(), reporter, + HandleMissingFilesStep handleMissingFilesStep = new HandleMissingFilesStep(context.store(), reporter, statisticsCollector, missingFileGracePeriod); performStep(handleMissingFilesStep); HandleChecksumValidationStep handleChecksumValidationStep = new HandleChecksumValidationStep( - context.getStore(), context.getAuditManager(), reporter, statisticsCollector); + context.store(), context.auditManager(), reporter, statisticsCollector); performStep(handleChecksumValidationStep); - HandleMissingChecksumsStep handleMissingChecksumsStep = new HandleMissingChecksumsStep(context.getStore(), + HandleMissingChecksumsStep handleMissingChecksumsStep = new HandleMissingChecksumsStep(context.store(), reporter, statisticsCollector, getChecksumUpdateCutoffDate()); performStep(handleMissingChecksumsStep); HandleObsoleteChecksumsStep handleObsoleteChecksumsStep = new HandleObsoleteChecksumsStep( - context.getSettings(), context.getStore(), reporter, statisticsCollector); + context.settings(), context.store(), reporter, statisticsCollector); performStep(handleObsoleteChecksumsStep); - CreateStatisticsEntryStep createStatistics = new CreateStatisticsEntryStep(context.getStore(), collectionID, + CreateStatisticsEntryStep createStatistics = new CreateStatisticsEntryStep(context.store(), collectionID, statisticsCollector); performStep(createStatistics); if (currentState() != WorkflowState.ABORTED) { if (reporter.hasIntegrityIssues()) { - context.getAlerter().integrityFailed(reporter.generateSummaryOfReport(), collectionID); + context.alerter().integrityFailed(reporter.generateSummaryOfReport(), collectionID); } try { reporter.generateReport(); @@ -150,7 +150,7 @@ public void start() { .setLatestReport(collectionID, reporter.getReportDir()); } catch (IOException e) { log.error("Failed to generate integrity report", e); - context.getAlerter().integrityComponentFailure("Failed to generate integrity report", collectionID); + context.alerter().integrityComponentFailure("Failed to generate integrity report", collectionID); } } } finally { diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityWorkflowContext.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityWorkflowContext.java index 424055aa4..1133201fc 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityWorkflowContext.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityWorkflowContext.java @@ -30,64 +30,12 @@ import org.bitrepository.service.workflow.WorkflowContext; /** - * Contains the general data needed by a integrity workflow. The class wraps a number of objects normally - * needed by integrity workflows. This avoids complicated methods with lots a arguments. + * Contains the general data needed by an integrity workflow, avoiding methods with many arguments. */ -public class IntegrityWorkflowContext implements WorkflowContext { - private final Settings settings; - private final IntegrityInformationCollector collector; - private final IntegrityModel store; - private final IntegrityAlerter alerter; - private final AuditTrailManager auditManager; - - /** - * @param settings The Settings to use in the workflow. - * @param collector The IntegrityInformationCollector to use in the workflow. - * @param store The IntegrityModel to use in the workflow. - * @param alerter The IntegrityAlerter to use in the workflow. - * @param auditManager The AuditTrailManager to use in the workflow. - */ - public IntegrityWorkflowContext(Settings settings, - IntegrityInformationCollector collector, - IntegrityModel store, - IntegrityAlerter alerter, - AuditTrailManager auditManager) { - this.settings = settings; - this.collector = collector; - this.store = store; - this.alerter = alerter; - this.auditManager = auditManager; - - } - - public Settings getSettings() { - return settings; - } - - public IntegrityInformationCollector getCollector() { - return collector; - } - - public IntegrityModel getStore() { - return store; - } - - public IntegrityAlerter getAlerter() { - return alerter; - } - - public AuditTrailManager getAuditManager() { - return auditManager; - } - - @Override - public String toString() { - return "IntegrityWorkflowContext{" + - "settings=" + settings + - ", collector=" + collector + - ", store=" + store + - ", alerter=" + alerter + - ", auditManager=" + auditManager + '\'' + - '}'; - } -} +public record IntegrityWorkflowContext( + Settings settings, + IntegrityInformationCollector collector, + IntegrityModel store, + IntegrityAlerter alerter, + AuditTrailManager auditManager +) implements WorkflowContext {} diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityWorkflowManager.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityWorkflowManager.java index 526b7d549..005df7f66 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityWorkflowManager.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/IntegrityWorkflowManager.java @@ -43,7 +43,7 @@ public class IntegrityWorkflowManager extends WorkflowManager { public static final long HOURLY = 3_600_000; public IntegrityWorkflowManager(IntegrityWorkflowContext context, JobScheduler scheduler) { - super(context, getWorkflowSettings(context.getSettings()), scheduler); + super(context, getWorkflowSettings(context.settings()), scheduler); } private static WorkflowSettings getWorkflowSettings(Settings settings) { diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/RepairMissingFilesWorkflow.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/RepairMissingFilesWorkflow.java index 0067d2f47..966d45c25 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/RepairMissingFilesWorkflow.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/RepairMissingFilesWorkflow.java @@ -96,7 +96,7 @@ public void start() { */ private void repairMissingFiles(List pillarIDs) { List filesNotRepaired = new ArrayList<>(); - try (IntegrityIssueIterator iterator = context.getStore() + try (IntegrityIssueIterator iterator = context.store() .findFilesWithMissingCopies(collectionID, pillarIDs.size(), 0L, MAX_RESULTS)) { String fileId; @@ -121,7 +121,7 @@ private void repairMissingFiles(List pillarIDs) { } } if (!filesNotRepaired.isEmpty()) { - context.getAlerter().operationFailed("Failed to repair the files '" + filesNotRepaired + "'.", collectionID); + context.alerter().operationFailed("Failed to repair the files '" + filesNotRepaired + "'.", collectionID); } } @@ -134,7 +134,7 @@ private void repairMissingFiles(List pillarIDs) { */ private String getChecksumForFile(String fileId) { String res = null; - for (FileInfo fi : context.getStore().getFileInfos(fileId, collectionID)) { + for (FileInfo fi : context.store().getFileInfos(fileId, collectionID)) { if (res == null) { res = fi.getChecksum(); } else { @@ -159,7 +159,7 @@ private String getChecksumForFile(String fileId) { * @throws MalformedURLException If a well-formed URL cannot be created. */ private URL createURL(String fileId) throws MalformedURLException { - FileExchange fe = ProtocolComponentFactory.getInstance().getFileExchange(context.getSettings()); + FileExchange fe = ProtocolComponentFactory.getInstance().getFileExchange(context.settings()); return fe.getURL(fileId); } @@ -201,7 +201,7 @@ private void putFileStep(String fileId, URL url, String checksum) { * @throws URISyntaxException If the URL is invalid. */ private void deleteUrl(URL url) throws URISyntaxException { - FileExchange fe = ProtocolComponentFactory.getInstance().getFileExchange(context.getSettings()); + FileExchange fe = ProtocolComponentFactory.getInstance().getFileExchange(context.settings()); try { fe.deleteFile(url); } catch (IOException e) { diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflow.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflow.java index dba165562..ff0291398 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflow.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflow.java @@ -92,7 +92,7 @@ public void start() { Map checksums = requestSaltedChecksumForFileStep(); validateChecksums(checksums); } catch (IllegalStateException e) { - context.getAlerter().integrityFailed("Failed trying to check salted checksum: " + e.getMessage(), + context.alerter().integrityFailed("Failed trying to check salted checksum: " + e.getMessage(), collectionID); } finally { finish(); @@ -108,7 +108,7 @@ public void start() { */ private ChecksumSpecTYPE getChecksumSpecWithRandomSalt() throws IllegalArgumentException { ChecksumType defaultChecksum = ChecksumType.valueOf( - context.getSettings().getRepositorySettings().getProtocolSettings().getDefaultChecksumType()); + context.settings().getRepositorySettings().getProtocolSettings().getDefaultChecksumType()); ChecksumSpecTYPE res = new ChecksumSpecTYPE(); switch (defaultChecksum) { case SHA1: @@ -144,12 +144,12 @@ private ChecksumSpecTYPE getChecksumSpecWithRandomSalt() throws IllegalArgumentE * @return The randomly found FileID. */ private String getRandomFileId() { - long numberOfFiles = context.getStore().getNumberOfFilesInCollection(collectionID); + long numberOfFiles = context.store().getNumberOfFilesInCollection(collectionID); if (numberOfFiles <= 0L) { throw new IllegalStateException("No files in collection '" + collectionID + "'."); } long randomFileIndex = ThreadLocalRandom.current().nextLong(numberOfFiles); - return context.getStore().getFileIDAtPosition(collectionID, randomFileIndex); + return context.store().getFileIDAtPosition(collectionID, randomFileIndex); } /** @@ -159,8 +159,8 @@ private String getRandomFileId() { */ private Map requestSaltedChecksumForFileStep() { log.info("Request the file '{}' with the checksumSpecTYPE '{}'", currentFileID, currentChecksumSpec); - GetChecksumForFileStep step = new GetChecksumForFileStep(context.getCollector(), context.getAlerter(), - currentChecksumSpec, currentFileID, context.getSettings(), collectionID, integrityContributors); + GetChecksumForFileStep step = new GetChecksumForFileStep(context.collector(), context.alerter(), + currentChecksumSpec, currentFileID, context.settings(), collectionID, integrityContributors); performStep(step); return step.getResults(); } @@ -193,7 +193,7 @@ private void validateChecksums(Map checksums) { Base16Utils.decodeBase16(currentChecksumSpec.getChecksumSalt()) + "' for pillars: " + checksums.keySet(); log.info(audit); - context.getAuditManager() + context.auditManager() .addAuditEvent(collectionID, currentFileID, "IntegrityServiceWorkflow: " + getClass().getName(), audit, "Integrity salted checksum check", FileAction.INTEGRITY_CHECK, null, null); } @@ -206,10 +206,10 @@ private void validateChecksums(Map checksums) { */ private void sendFailure(String failureMessage) { log.warn("Failure in checksum salted checksum: {}", failureMessage); - context.getAuditManager() + context.auditManager() .addAuditEvent(collectionID, currentFileID, "IntegrityServiceWorkflow: " + getClass().getName(), failureMessage,"Integrity salted checksum check", FileAction.INTEGRITY_CHECK, null, null); - context.getAlerter().integrityFailed(failureMessage, collectionID); + context.alerter().integrityFailed(failureMessage, collectionID); } @Override diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/CreateStatisticsEntryStep.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/CreateStatisticsEntryStep.java index 26f35e617..933a348ec 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/CreateStatisticsEntryStep.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/CreateStatisticsEntryStep.java @@ -63,14 +63,14 @@ public synchronized void performStep() { sc.getPillarCollectionStat(pillar).setDataSize(0L); sc.getPillarCollectionStat(pillar).setOldestChecksumTimestamp(null); } else { - sc.getPillarCollectionStat(pillar).setFileCount(metric.getPillarFileCount()); - sc.getPillarCollectionStat(pillar).setDataSize(metric.getPillarCollectionSize()); - sc.getPillarCollectionStat(pillar).setOldestChecksumTimestamp(metric.getOldestChecksumTimestamp()); + sc.getPillarCollectionStat(pillar).setFileCount(metric.pillarFileCount()); + sc.getPillarCollectionStat(pillar).setDataSize(metric.pillarCollectionSize()); + sc.getPillarCollectionStat(pillar).setOldestChecksumTimestamp(metric.oldestChecksumTimestamp()); } } sc.getCollectionStat().setFileCount(store.getNumberOfFilesInCollection(collectionID)); sc.getCollectionStat().setDataSize(store.getCollectionFileSize(collectionID)); - sc.getCollectionStat().setLatestFileTime(store.getDateForNewestFileEntryForCollection(collectionID)); + sc.getCollectionStat().setLatestFileTime(store.getDateForNewestFileEntryForCollectionInstant(collectionID)); store.createStatistics(collectionID, sc); } diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/GetFileStep.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/GetFileStep.java index 22df765e9..d310a5210 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/GetFileStep.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/GetFileStep.java @@ -58,8 +58,8 @@ public String getName() { @Override public void performStep() { - IntegrityEventCompleteAwaiter eventHandler = new IntegrityEventCompleteAwaiter(context.getSettings()); - context.getCollector().getFile(collectionId, fileId, uploadUrl, eventHandler, "IntegrityService: " + IntegrityEventCompleteAwaiter eventHandler = new IntegrityEventCompleteAwaiter(context.settings()); + context.collector().getFile(collectionId, fileId, uploadUrl, eventHandler, "IntegrityService: " + getName()); OperationEvent event = eventHandler.getFinish(); diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/PutFileStep.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/PutFileStep.java index 49918f8b0..a947bc8f1 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/PutFileStep.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/PutFileStep.java @@ -69,11 +69,11 @@ public String getName() { @Override public void performStep() { - IntegrityEventCompleteAwaiter eventHandler = new IntegrityEventCompleteAwaiter(context.getSettings()); + IntegrityEventCompleteAwaiter eventHandler = new IntegrityEventCompleteAwaiter(context.settings()); ChecksumDataForFileTYPE checksumValidationData = new ChecksumDataForFileTYPE(); checksumValidationData.setCalculationTimestamp(CalendarUtils.getNow()); - checksumValidationData.setChecksumSpec(ChecksumUtils.getDefault(context.getSettings())); + checksumValidationData.setChecksumSpec(ChecksumUtils.getDefault(context.settings())); try { checksumValidationData.setChecksumValue(Base16Utils.encodeBase16(checksum)); } catch (DecoderException e) { @@ -81,7 +81,7 @@ public void performStep() { } - context.getCollector() + context.collector() .putFile(collectionId, fileId, uploadUrl, checksumValidationData, eventHandler, "IntegrityService: " + getName()); OperationEvent event = eventHandler.getFinish(); diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDAOTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDAOTest.java index 9efe5283f..a863512a0 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDAOTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDAOTest.java @@ -634,8 +634,8 @@ void testExtractingAllMissingFiles() { "The collection should have two files, the first pillar two, the second one"); Assertions.assertEquals(2, (long) cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); Map metrics = cache.getPillarCollectionMetrics(TEST_COLLECTIONID); - Assertions.assertEquals(2, metrics.get(TEST_PILLAR_1).getPillarFileCount()); - Assertions.assertEquals(1, metrics.get(TEST_PILLAR_2).getPillarFileCount()); + Assertions.assertEquals(2, metrics.get(TEST_PILLAR_1).pillarFileCount()); + Assertions.assertEquals(1, metrics.get(TEST_PILLAR_2).pillarFileCount()); addStep("Extract missing files", "one file should be missing"); List missingFiles @@ -760,10 +760,10 @@ void testExtractCollectionFileSize() { Map metrics = cache.getPillarCollectionMetrics(TEST_COLLECTIONID); addStep("Check the reported size of the first pillar in the collection", "The reported size matches the precalculated"); - Assertions.assertEquals(pillar1Size, metrics.get(TEST_PILLAR_1).getPillarCollectionSize()); + Assertions.assertEquals(pillar1Size, metrics.get(TEST_PILLAR_1).pillarCollectionSize()); addStep("Check the reported size of the second pillar in the collection", "The reported size matches the precalculated"); - Assertions.assertEquals(pillar2Size, metrics.get(TEST_PILLAR_2).getPillarCollectionSize()); + Assertions.assertEquals(pillar2Size, metrics.get(TEST_PILLAR_2).pillarCollectionSize()); addStep("Check the reported size of the whole collection", "The reported size matches the precalculated"); Assertions.assertEquals(collectionSize, cache.getCollectionSize(TEST_COLLECTIONID)); diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/integrationtest/MissingChecksumTests.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/integrationtest/MissingChecksumTests.java index f5411dbd9..b364b7d58 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/integrationtest/MissingChecksumTests.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/integrationtest/MissingChecksumTests.java @@ -176,8 +176,8 @@ void testMissingChecksumForFirstGetChecksums() throws WorkflowAbortedException { addStep("Check whether checksum is missing", "Should be missing at pillar two only."); Map metrics = model.getPillarCollectionMetrics(TEST_COLLECTION); - Assertions.assertEquals(1, metrics.get(PILLAR_1).getPillarFileCount()); - Assertions.assertEquals(1, metrics.get(PILLAR_2).getPillarFileCount()); + Assertions.assertEquals(1, metrics.get(PILLAR_1).pillarFileCount()); + Assertions.assertEquals(1, metrics.get(PILLAR_2).pillarFileCount()); List missingChecksumsPillar1 = getIssuesFromIterator(model.findFilesWithMissingChecksum(TEST_COLLECTION, PILLAR_1, testStart)); @@ -229,8 +229,8 @@ void testMissingChecksumDuringSecondIngest() throws WorkflowAbortedException { addStep("Check whether checksum is missing", "Should be missing at pillar two only."); Map metrics = model.getPillarCollectionMetrics(TEST_COLLECTION); - Assertions.assertEquals(1, metrics.get(PILLAR_1).getPillarFileCount()); - Assertions.assertEquals(1, metrics.get(PILLAR_2).getPillarFileCount()); + Assertions.assertEquals(1, metrics.get(PILLAR_1).pillarFileCount()); + Assertions.assertEquals(1, metrics.get(PILLAR_2).pillarFileCount()); for (String pillar : Arrays.asList(PILLAR_1, PILLAR_2)) { List missingChecksums @@ -263,8 +263,8 @@ void testMissingChecksumDuringSecondIngest() throws WorkflowAbortedException { addStep("Check whether checksum is missing", "Should be missing at pillar one, and not on pillar two."); metrics = model.getPillarCollectionMetrics(TEST_COLLECTION); - Assertions.assertEquals(1, metrics.get(PILLAR_1).getPillarFileCount()); - Assertions.assertEquals(1, metrics.get(PILLAR_2).getPillarFileCount()); + Assertions.assertEquals(1, metrics.get(PILLAR_1).pillarFileCount()); + Assertions.assertEquals(1, metrics.get(PILLAR_2).pillarFileCount()); List missingChecksumsPillar1 = getIssuesFromIterator(model.findFilesWithMissingChecksum(TEST_COLLECTION, PILLAR_1, secondUpdate)); diff --git a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/DeleteFileRequestHandler.java b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/DeleteFileRequestHandler.java index 7b9bc91fc..89957de7b 100644 --- a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/DeleteFileRequestHandler.java +++ b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/DeleteFileRequestHandler.java @@ -136,7 +136,7 @@ protected void performOperation(DeleteFileRequest request, MessageContext reques deleteTheFile(request); getAuditManager().addAuditEvent(request.getCollectionID(), request.getFileID(), request.getFrom(), "Deleting the file.", request.getAuditTrailInformation(), FileAction.DELETE_FILE, - request.getCorrelationID(), requestContext.getCertificateFingerprint()); + request.getCorrelationID(), requestContext.certificateFingerprint()); sendFinalResponse(request, resultingChecksum); } diff --git a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetFileRequestHandler.java b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetFileRequestHandler.java index 9c2973697..f87d81084 100644 --- a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetFileRequestHandler.java +++ b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetFileRequestHandler.java @@ -106,7 +106,7 @@ protected void performOperation(GetFileRequest request, MessageContext requestCo uploadToClient(request); getAuditManager().addAuditEvent(request.getCollectionID(), request.getFileID(), request.getFrom(), "Failed identifying pillar.", request.getAuditTrailInformation(), FileAction.GET_FILE, - request.getCorrelationID(), requestContext.getCertificateFingerprint()); + request.getCorrelationID(), requestContext.certificateFingerprint()); sendFinalResponse(request); } diff --git a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/PutFileRequestHandler.java b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/PutFileRequestHandler.java index 3fc061df4..65d43bec9 100644 --- a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/PutFileRequestHandler.java +++ b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/PutFileRequestHandler.java @@ -104,7 +104,7 @@ protected void performOperation(PutFileRequest request, MessageContext requestCo retrieveFile(request); getAuditManager().addAuditEvent(request.getCollectionID(), request.getFileID(), request.getFrom(), "Add file to archive.", request.getAuditTrailInformation(), FileAction.PUT_FILE, - request.getCorrelationID(), requestContext.getCertificateFingerprint()); + request.getCorrelationID(), requestContext.certificateFingerprint()); sendFinalResponse(request); } finally { getPillarModel().ensureFileNotInTmpDir(request.getFileID(), request.getCollectionID()); diff --git a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/ReplaceFileRequestHandler.java b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/ReplaceFileRequestHandler.java index 560999c15..d3f0e8799 100644 --- a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/ReplaceFileRequestHandler.java +++ b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/ReplaceFileRequestHandler.java @@ -122,7 +122,7 @@ protected void performOperation(ReplaceFileRequest request, MessageContext reque replaceFile(request); getAuditManager().addAuditEvent(request.getCollectionID(), request.getFileID(), request.getFrom(), "Replacing the file.", request.getAuditTrailInformation(), FileAction.REPLACE_FILE, - request.getCorrelationID(), requestContext.getCertificateFingerprint()); + request.getCorrelationID(), requestContext.certificateFingerprint()); ChecksumDataForFileTYPE requestedNewChecksum = calculateChecksumOnNewFile(request); sendFinalResponse(request, requestedOldChecksum, requestedNewChecksum); diff --git a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/checksumdatabase/ChecksumEntry.java b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/checksumdatabase/ChecksumEntry.java index e504437ca..114805774 100644 --- a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/checksumdatabase/ChecksumEntry.java +++ b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/checksumdatabase/ChecksumEntry.java @@ -29,22 +29,10 @@ /** * Container for the information about the checksum of a file. */ -public class ChecksumEntry { - protected final String fileID; - protected final String checksum; - protected final Instant calculationDate; +public record ChecksumEntry(String fileID, String checksum, Instant calculationInstant) { - /** - * @param fileID The id of the file. - * @param checksum The checksum of the file. - * @param calculationDate The calculation date for the checksum of the file. - */ - public ChecksumEntry(String fileID, String checksum, Instant calculationDate) { + public ChecksumEntry { ArgumentValidator.checkNotNullOrEmpty(fileID, "String fileID"); - - this.fileID = fileID; - this.checksum = checksum; - this.calculationDate = calculationDate; } /** @@ -58,30 +46,23 @@ public ChecksumEntry(String fileID, String checksum, Date calculationDate) { this(fileID, checksum, calculationDate != null ? calculationDate.toInstant() : null); } - /** - * @return The id of the file. - */ public String getFileId() { return fileID; } - /** - * @return The checksum of the file. - */ public String getChecksum() { return checksum; } + public Instant getCalculationInstant() { + return calculationInstant; + } + /** - * @return The calculation date for the checksum of the file. * @deprecated Use {@link #getCalculationInstant()} instead */ @Deprecated(forRemoval = true) public Date getCalculationDate() { - return calculationDate != null ? Date.from(calculationDate) : null; - } - - public Instant getCalculationInstant() { - return calculationDate; + return calculationInstant != null ? Date.from(calculationInstant) : null; } } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/checksumcache/ChecksumEntryTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/checksumcache/ChecksumEntryTest.java index 391d4fc75..9c6045913 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/checksumcache/ChecksumEntryTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/checksumcache/ChecksumEntryTest.java @@ -47,4 +47,31 @@ void testExtendedTestCase() { Assertions.assertEquals(CE_CHECKSUM, ce.getChecksum()); Assertions.assertEquals(CE_DATE, ce.getCalculationInstant()); } + + @Test + @Tag("regressiontest") + @Tag("pillartest") + void compactConstructorRejectsNullFileID() { + addDescription("The compact constructor must reject a null fileID"); + Assertions.assertThrows(Exception.class, () -> new ChecksumEntry(null, CE_CHECKSUM, CE_DATE)); + } + + @Test + @Tag("regressiontest") + @Tag("pillartest") + void compactConstructorRejectsEmptyFileID() { + addDescription("The compact constructor must reject an empty fileID"); + Assertions.assertThrows(Exception.class, () -> new ChecksumEntry("", CE_CHECKSUM, CE_DATE)); + } + + @Test + @Tag("regressiontest") + @Tag("pillartest") + void equalityIsComponentBased() { + addDescription("Two ChecksumEntries with identical components must be equal"); + ChecksumEntry a = new ChecksumEntry(CE_FILE, CE_CHECKSUM, CE_DATE); + ChecksumEntry b = new ChecksumEntry(CE_FILE, CE_CHECKSUM, CE_DATE); + Assertions.assertEquals(a, b); + Assertions.assertEquals(a.hashCode(), b.hashCode()); + } } diff --git a/bitrepository-service/src/main/java/org/bitrepository/service/workflow/JobID.java b/bitrepository-service/src/main/java/org/bitrepository/service/workflow/JobID.java index 66d7618a2..b0e58d314 100644 --- a/bitrepository-service/src/main/java/org/bitrepository/service/workflow/JobID.java +++ b/bitrepository-service/src/main/java/org/bitrepository/service/workflow/JobID.java @@ -24,53 +24,7 @@ /** * Class to identify a workflow instance, based on the collection it belongs to and the workflow name/type. */ -public class JobID { - private final String collectionID; - private final String workflowName; - - public JobID(String workflowName, String collectionID) { - this.collectionID = collectionID; - this.workflowName = workflowName; - } - - public String getWorkflowName() { - return workflowName; - } - - public String getCollectionID() { - return collectionID; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((collectionID == null) ? 0 : collectionID.hashCode()); - result = prime * result - + ((workflowName == null) ? 0 : workflowName.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - JobID other = (JobID) obj; - if (collectionID == null) { - if (other.collectionID != null) - return false; - } else if (!collectionID.equals(other.collectionID)) - return false; - if (workflowName == null) { - return other.workflowName == null; - } else return workflowName.equals(other.workflowName); - } - +public record JobID(String workflowName, String collectionID) { @Override public String toString() { return workflowName + "-" + collectionID;