diff --git a/forge-core/src/main/java/forge/util/storage/IStorage.java b/forge-core/src/main/java/forge/util/storage/IStorage.java index 0ca5897b340..c0f1bd48421 100644 --- a/forge-core/src/main/java/forge/util/storage/IStorage.java +++ b/forge-core/src/main/java/forge/util/storage/IStorage.java @@ -29,21 +29,14 @@ import forge.util.IHasName; * @param the generic type */ public interface IStorage extends Iterable, IHasName { - T get(final String name); - T find(final Predicate condition); - // todo: find(final Predicate condition, boolean recursive). - Collection getItemNames(); - boolean contains(final String name); - int size(); - void add(final T deck); - void delete(final String deckName); - IStorage> getFolders(); + IStorage tryGetFolder(String path); + IStorage getFolderOrCreate(String path); } \ No newline at end of file diff --git a/forge-core/src/main/java/forge/util/storage/StorageBase.java b/forge-core/src/main/java/forge/util/storage/StorageBase.java index 03e5afa3347..06f1e8342ab 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageBase.java +++ b/forge-core/src/main/java/forge/util/storage/StorageBase.java @@ -108,4 +108,14 @@ public class StorageBase implements IStorage { // TODO Auto-generated method stub return name; } + + @Override + public IStorage tryGetFolder(String path) { + throw new UnsupportedOperationException("This storage does not support subfolders"); + } + + @Override + public IStorage getFolderOrCreate(String path) { + throw new UnsupportedOperationException("This storage does not support subfolders"); + } } diff --git a/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java b/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java index ca3ab2a6d7a..52d6fc76b0b 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java +++ b/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java @@ -22,6 +22,7 @@ import java.io.File; import com.google.common.base.Function; import forge.util.IItemSerializer; +import forge.util.TextUtil; /** *

@@ -89,4 +90,40 @@ public class StorageImmediatelySerialized extends StorageBase { public IStorage> getFolders() { return subfolders == null ? super.getFolders() : subfolders; } + + @Override + public IStorage tryGetFolder(String path) { + String[] parts = TextUtil.split(path, '/', 2); + switch( parts.length ) { + case 0: return this; + case 1: return parts[0].equals(".") ? this : getFolders().get(parts[0]); + case 2: + IStorage subFolder = getFolders().get(parts[0]); + return subFolder == null ? null : subFolder.tryGetFolder(parts[1]); + } + // should not reach this unless split is broken + throw new IllegalArgumentException(path); + } + + @Override + public IStorage getFolderOrCreate(String path) { + String[] parts = TextUtil.split(path, '/', 2); + switch( parts.length ) { + case 0: return this; + case 1: return parts[0].equals(".") ? this : getOrCreateSubfolder(parts[0]); + case 2: return getOrCreateSubfolder(parts[0]).getFolderOrCreate(parts[1]); + } + // should not reach this unless split is broken + throw new IllegalArgumentException(path); + } + + private IStorage getOrCreateSubfolder(String name) { + // Have to filter name for incorrect symbols + IStorage storage = getFolders().get(name); + if( null == storage ) { + storage = new StorageImmediatelySerialized<>(name, serializer); + subfolders.add(storage); + } + return storage; + } }