ocfl-java icon indicating copy to clipboard operation
ocfl-java copied to clipboard

A storage root containing only a `.DS_Store` file should be considered empty

Open mderuijter opened this issue 4 years ago • 7 comments

For our project I have been trying to see if we can use this library to implement OCFL, and I ran into a small bug causing:

Exception in thread "main" edu.wisc.library.ocfl.api.exception.RepositoryConfigurationException: OCFL root is missing its namaste file, eg. 0=ocfl_1.0.

I think I traced the cause to DefaultOcflStorageInitializer.java#L92 which will always result to false

mderuijter avatar Dec 06 '21 14:12 mderuijter

@mderuijter Can you give me more details about your situation? Are you using local storage or S3?

Given that exception, my expectation of what's happening is that you're trying to initialize a repository in a directory that is both not empty and not an OCFL storage root.

pwinckles avatar Dec 06 '21 14:12 pwinckles

@pwinckles I'm using local storage and it's pointing to an empty directory. I tried to play with some of the example code(bit modified), which I expect should initialize a new OCFL repo, instead I get the error I described:

Path repoDir = Paths.get("src/test/resources/data/Outbox");
        Path workDir = Paths.get("src/test/resources/data/temp");

        var repo = new OcflRepositoryBuilder()
                .defaultLayoutConfig(new FlatOmitPrefixLayoutConfig().setDelimiter("urn:uuid:"))
                .storage(ocflStorageBuilder -> ocflStorageBuilder.fileSystem(repoDir))
                .workDir(workDir)
                .build();

Full stack trace:

Exception in thread "main" edu.wisc.library.ocfl.api.exception.RepositoryConfigurationException: OCFL root is missing its namaste file, eg. 0=ocfl_1.0.
	at edu.wisc.library.ocfl.core.storage.DefaultOcflStorageInitializer.validateOcflVersion(DefaultOcflStorageInitializer.java:131)
	at edu.wisc.library.ocfl.core.storage.DefaultOcflStorageInitializer.loadAndValidateExistingRepo(DefaultOcflStorageInitializer.java:108)
	at edu.wisc.library.ocfl.core.storage.DefaultOcflStorageInitializer.initializeStorage(DefaultOcflStorageInitializer.java:95)
	at edu.wisc.library.ocfl.core.storage.DefaultOcflStorage.doInitialize(DefaultOcflStorage.java:587)
	at edu.wisc.library.ocfl.core.storage.AbstractOcflStorage.initializeStorage(AbstractOcflStorage.java:62)
	at edu.wisc.library.ocfl.core.storage.CachingOcflStorage.doInitialize(CachingOcflStorage.java:59)
	at edu.wisc.library.ocfl.core.storage.AbstractOcflStorage.initializeStorage(AbstractOcflStorage.java:62)
	at edu.wisc.library.ocfl.core.OcflRepositoryBuilder.buildInternal(OcflRepositoryBuilder.java:399)
	at edu.wisc.library.ocfl.core.OcflRepositoryBuilder.build(OcflRepositoryBuilder.java:380)

mderuijter avatar Dec 06 '21 14:12 mderuijter

@pwinckles also the code link I sent:

if (list("").isEmpty()) {
            layoutExtension = initNewRepo(ocflVersion, layoutConfig);
        } else {
            layoutExtension = loadAndValidateExistingRepo(ocflVersion, layoutConfig);
            // This is only validating currently and does not load anything
            loadRepositoryExtensions(supportEvaluator);
        }

list("").isEmpty() always evaluates to false, so layoutExtension = initNewRepo(ocflVersion, layoutConfig); can never be called

mderuijter avatar Dec 06 '21 14:12 mderuijter

list("").isEmpty() only evaluates to false when there are files in the storage root.

I just copy and pasted your example and it works fine. There must be files in src/test/resources/data/Outbox. Do ls -a src/test/resources/data/Outbox.

pwinckles avatar Dec 06 '21 14:12 pwinckles

okay, clearly i didn't understand that code properly

-> % ls -alh
total 16
drwxr-xr-x  3 menko  staff    96B Nov 17  2020 .
drwxr-xr-x  8 menko  staff   256B Dec  2 14:34 ..
-rw-r--r--@ 1 menko  staff   6.0K Nov 17  2020 .DS_Store

surely the .DS_Store file isn't causing it not to be empty?

mderuijter avatar Dec 06 '21 14:12 mderuijter

@pwinckles removing the .DS_Store file worked... we can close the issue i think. Thanks for pointing that out!

mderuijter avatar Dec 06 '21 14:12 mderuijter

I'm going to leave this open, and will update the repo initialization code to consider a directory containing only a .DS_Store file as empty. God, I wish Macs didn't litter the filesystem with that stuff.

pwinckles avatar Dec 06 '21 14:12 pwinckles