Jeg oppdaget en svakhet med Nikitas lagring av filer. I dag synteseres stien til selve filen basert på andre felter, hvilket vil gi et problem hvis algoritmen for å syntesere denne stien endres. Jeg er i gang med å se på å endre denne stien slik at den ikke får '>' som del av filnavnet når jeg kjører 'import-email --mbox testdata/nikita-noark.mbox', men før den tid bør det sikres at en ikke får filer uten tilkobling til databasen.
Jeg foreslår en endring ala endringen under, som introduserer et nytt databasefelt i dokumentobjekt, lagrer plasseringen i dette feltet etter opplasting, og bruker dette feltet når en fil deles ut igjen. Merk, endringen er ikke testet. Det bør sikre at enhver fil lagret på disken beholder sin kobling i databasen, uavhengig av hvordan fremtidige filnavn vil endres over tid.
Det kan være interessant å alltid bytte navn på filer på disken når algoritmen endres, men det vil ha betydelig ytelseskonsekvens med store arkiv, så jeg tror det kan være mer fornuftig å la gamle filer beholde sine opprinnelige navn. En ulempe er at det kan føre til uventede navnekollisjoner hvis en fremtidig plasseringsalgoritme gir samme sti som en tidligere algoritme for to ikke-identiske filer.
diff --git a/src/main/java/app/domain/noark5/DocumentObject.java b/src/main/java/app/domain/noark5/DocumentObject.java index 05016c4ba..99420c5f3 100644 --- a/src/main/java/app/domain/noark5/DocumentObject.java +++ b/src/main/java/app/domain/noark5/DocumentObject.java @@ -136,6 +136,10 @@ public class DocumentObject @OneToOne(mappedBy = REFERENCE_DOCUMENT_OBJECT_DB, fetch = LAZY, cascade = ALL) private ElectronicSignature referenceElectronicSignature;
+ // Location in storage for the file + private String storagePath; + + public Integer getVersionNumber() { return versionNumber; } @@ -192,6 +196,14 @@ public class DocumentObject this.referenceDocumentFile = referenceDocumentFile; }
+ public String getStoragePath() { + return storagePath; + } + + public void setStoragePath(String storagepath) { + this.storagePath = storagePath; + } + public String getChecksum() { return checksum; } diff --git a/src/main/java/app/service/noark5/DocumentObjectService.java b/src/main/java/app/service/noark5/DocumentObjectService.java index 98f33a51f..d38531cce 100644 --- a/src/main/java/app/service/noark5/DocumentObjectService.java +++ b/src/main/java/app/service/noark5/DocumentObjectService.java @@ -239,7 +239,7 @@ public class DocumentObjectService HttpServletResponse response = getResponse(); // First make sure the file exist try { - Path file = getToFile(documentObject); + Path file = documentObject.getStoragePath(); Resource resource = new UrlResource(file.toUri()); if (!resource.exists() && !resource.isReadable()) { throw new StorageFileNotFoundException( @@ -981,6 +981,7 @@ public class DocumentObjectService Path toFile = getToFile(documentObject);
Files.move(incoming, toFile); + documentObject.setStoragePAth(toFile); }
private void setGeneratedDocumentFilename(DocumentObject documentObject) {