From 77e502bdcd2a44bc66fe4778861df2c9b3c0a568 Mon Sep 17 00:00:00 2001 From: a2geek Date: Mon, 5 Oct 2026 19:16:58 -0500 Subject: [PATCH] Made Directory a CapabilitiesProvider. WritableDirectory now extends the Directory interface. --- .../archive/shrinkit/ShrinkitDirectory.java | 6 +++ .../archive/zip/ZipDirectory.java | 6 +++ .../applecommander/filestore/Directory.java | 42 ++++++++----------- .../filestore/WritableDirectory.java | 28 +++++++++++-- .../os/gamedos/GamedosDirectory.java | 8 ++++ 5 files changed, 62 insertions(+), 28 deletions(-) diff --git a/lib/ac-api/src/main/java/org/applecommander/archive/shrinkit/ShrinkitDirectory.java b/lib/ac-api/src/main/java/org/applecommander/archive/shrinkit/ShrinkitDirectory.java index b744ac37..1d5180c7 100644 --- a/lib/ac-api/src/main/java/org/applecommander/archive/shrinkit/ShrinkitDirectory.java +++ b/lib/ac-api/src/main/java/org/applecommander/archive/shrinkit/ShrinkitDirectory.java @@ -19,6 +19,7 @@ */ package org.applecommander.archive.shrinkit; +import org.applecommander.capability.Capability; import org.applecommander.filestore.Directory; import org.applecommander.filestore.FileEntry; @@ -34,6 +35,11 @@ public class ShrinkitDirectory implements Directory { this.files = files; } + @Override + public boolean can(Capability capability) { + return false; + } + @Override public Optional getParent() { return Optional.empty(); diff --git a/lib/ac-api/src/main/java/org/applecommander/archive/zip/ZipDirectory.java b/lib/ac-api/src/main/java/org/applecommander/archive/zip/ZipDirectory.java index cac90532..550f8039 100644 --- a/lib/ac-api/src/main/java/org/applecommander/archive/zip/ZipDirectory.java +++ b/lib/ac-api/src/main/java/org/applecommander/archive/zip/ZipDirectory.java @@ -19,6 +19,7 @@ */ package org.applecommander.archive.zip; +import org.applecommander.capability.Capability; import org.applecommander.filestore.Directory; import org.applecommander.filestore.FileEntry; import org.applecommander.filestore.FileStore; @@ -39,6 +40,11 @@ public class ZipDirectory implements Directory { this.entries = entries; } + @Override + public boolean can(Capability capability) { + return false; + } + @Override public Optional getParent() { return Optional.empty(); diff --git a/lib/ac-api/src/main/java/org/applecommander/filestore/Directory.java b/lib/ac-api/src/main/java/org/applecommander/filestore/Directory.java index 1892b496..4a6f2664 100644 --- a/lib/ac-api/src/main/java/org/applecommander/filestore/Directory.java +++ b/lib/ac-api/src/main/java/org/applecommander/filestore/Directory.java @@ -19,35 +19,30 @@ */ package org.applecommander.filestore; +import org.applecommander.capability.CapabilityProvider; + import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -/** - * A Directory represents a directory in a FileStore. Note that even - * FileStores that don't naturally support a directory do contain a root directory, - * so there will be a directory associated to each FileStore. - */ -public interface Directory { - /** - * Get the parent directory. If this is the root directory, it returns empty. - */ +/// A `Directory` represents a directory in a `FileStore`. Note that even +/// file stores that don't naturally support a directory do contain a root directory, +/// so there will be a directory associated to each `FileStore`. +public interface Directory extends CapabilityProvider { + + /// Get the parent directory. If this is the root directory, it returns empty. Optional getParent(); - /** - * Returns the FileStore that this Directory belongs to. - */ + + /// Returns the FileStore that this Directory belongs to. FileStore getFileStore(); - /** - * Returns the name of this directory. - */ + + /// Returns the name of this directory. String getName(); - /** - * Return all entries that are stored in this directory. - */ + + /// Return all entries that are stored in this directory. List getFiles(); - /** - * Filter out the DirectoryEntry entries in this directory. - */ + + /// Filter out the `DirectoryEntry` entries in this directory. default List getDirectories() { return getFiles().stream() .map(fileEntry -> fileEntry.get(Directory.class)) @@ -55,9 +50,8 @@ public interface Directory { .map(Optional::get) .collect(Collectors.toList()); } - /** - * Locate a given file of the given name recursively on the disk. - */ + + /// Locate a given file of the given name recursively on the disk. default Optional findFile(String name) { for (FileEntry fileEntry : getFiles()) { if (name.equalsIgnoreCase(fileEntry.getName())) { diff --git a/lib/ac-api/src/main/java/org/applecommander/filestore/WritableDirectory.java b/lib/ac-api/src/main/java/org/applecommander/filestore/WritableDirectory.java index a8cc1564..923103d7 100644 --- a/lib/ac-api/src/main/java/org/applecommander/filestore/WritableDirectory.java +++ b/lib/ac-api/src/main/java/org/applecommander/filestore/WritableDirectory.java @@ -19,8 +19,28 @@ */ package org.applecommander.filestore; -/// A WritableDirectory is a Directory that allows file creation. -public interface WritableDirectory { - /// Create a file. By definition, any file created is a WritableFileEntry. - WritableFileEntry createFile(); +import org.applecommander.capability.Capability; + +/// A WritableDirectory is a Directory that allows general directory modification. +/// Since not all directories can perform all tasks, check the capability first, +/// otherwise an exception will be generated. +public interface WritableDirectory extends Directory { + + /// Create a file. By definition, any file created is a `WritableFileEntry`. + /// @see Capability#CREATE_FILES + default WritableFileEntry createFile(String fileName) { + throw new UnsupportedOperationException("unable to create files"); + } + + /// Create a directory. By definition, any directory create is a `WritableDirectory`. + /// @see Capability#CREATE_DIRECTORIES + default WritableDirectory createDirectory(String directoryName) { + throw new UnsupportedOperationException("unable to create directories"); + } + + /// Delete a file. + /// @see Capability#DELETE_FILES + default void deleteFile(FileEntry fileEntry) { + throw new UnsupportedOperationException("unable to delete files"); + } } diff --git a/lib/ac-api/src/main/java/org/applecommander/os/gamedos/GamedosDirectory.java b/lib/ac-api/src/main/java/org/applecommander/os/gamedos/GamedosDirectory.java index e2594cc7..6f20811b 100644 --- a/lib/ac-api/src/main/java/org/applecommander/os/gamedos/GamedosDirectory.java +++ b/lib/ac-api/src/main/java/org/applecommander/os/gamedos/GamedosDirectory.java @@ -19,6 +19,7 @@ */ package org.applecommander.os.gamedos; +import org.applecommander.capability.Capability; import org.applecommander.device.TrackSectorDevice; import org.applecommander.filestore.Directory; import org.applecommander.filestore.FileEntry; @@ -28,8 +29,10 @@ import org.applecommander.util.DataBuffer; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.Set; public class GamedosDirectory implements Directory, GamedosConstants { + private static final Set CAPABILITIES = Set.of(Capability.WRITE_FILES, Capability.CREATE_FILES); private final GamedosFileStore fileStore; private final TrackSectorDevice device; @@ -38,6 +41,11 @@ public class GamedosDirectory implements Directory, GamedosConstants { this.device = fileStore.get(TrackSectorDevice.class).orElseThrow(); } + @Override + public boolean can(Capability capability) { + return CAPABILITIES.contains(capability); + } + @Override public Optional getParent() { return Optional.empty();