mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 10:48:00 +00:00
Support for nested folders that store constructed decks - part 1 of ≈3
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -15193,6 +15193,7 @@ src/main/java/forge/util/package-info.java -text
|
|||||||
src/main/java/forge/util/storage/IStorage.java -text
|
src/main/java/forge/util/storage/IStorage.java -text
|
||||||
src/main/java/forge/util/storage/StorageBase.java -text
|
src/main/java/forge/util/storage/StorageBase.java -text
|
||||||
src/main/java/forge/util/storage/StorageImmediatelySerialized.java svneol=native#text/plain
|
src/main/java/forge/util/storage/StorageImmediatelySerialized.java svneol=native#text/plain
|
||||||
|
src/main/java/forge/util/storage/StorageReaderBase.java -text
|
||||||
src/main/java/forge/util/storage/StorageReaderFile.java -text
|
src/main/java/forge/util/storage/StorageReaderFile.java -text
|
||||||
src/main/java/forge/util/storage/StorageReaderFileSections.java -text
|
src/main/java/forge/util/storage/StorageReaderFileSections.java -text
|
||||||
src/main/java/forge/util/storage/StorageReaderFolder.java -text
|
src/main/java/forge/util/storage/StorageReaderFolder.java -text
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import com.google.common.collect.Lists;
|
|||||||
|
|
||||||
import forge.util.IItemReader;
|
import forge.util.IItemReader;
|
||||||
import forge.util.storage.StorageBase;
|
import forge.util.storage.StorageBase;
|
||||||
|
import forge.util.storage.StorageReaderBase;
|
||||||
|
|
||||||
public final class EditionCollection extends StorageBase<CardEdition> {
|
public final class EditionCollection extends StorageBase<CardEdition> {
|
||||||
|
|
||||||
@@ -107,7 +108,7 @@ public final class EditionCollection extends StorageBase<CardEdition> {
|
|||||||
*/
|
*/
|
||||||
public IItemReader<SealedProductTemplate> getBoosterGenerator() {
|
public IItemReader<SealedProductTemplate> getBoosterGenerator() {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
return new IItemReader<SealedProductTemplate>() {
|
return new StorageReaderBase<SealedProductTemplate>(null) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, SealedProductTemplate> readAll() {
|
public Map<String, SealedProductTemplate> readAll() {
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.deck.DeckGroup;
|
import forge.deck.DeckGroup;
|
||||||
import forge.util.FileUtil;
|
import forge.util.FileUtil;
|
||||||
@@ -111,7 +113,7 @@ public class DeckGroupSerializer extends StorageReaderFolder<DeckGroup> implemen
|
|||||||
* @return the file
|
* @return the file
|
||||||
*/
|
*/
|
||||||
public File makeFileFor(final DeckGroup decks) {
|
public File makeFileFor(final DeckGroup decks) {
|
||||||
return new File(this.getDirectory(), decks.getBestFileName());
|
return new File(this.directory, decks.getBestFileName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -134,4 +136,10 @@ public class DeckGroupSerializer extends StorageReaderFolder<DeckGroup> implemen
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<File> getSubFolders() {
|
||||||
|
// Sealed decks are kept in separate folders, no further drilling possible
|
||||||
|
return ImmutableList.of();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import forge.properties.NewConstants;
|
|||||||
import forge.util.FileSection;
|
import forge.util.FileSection;
|
||||||
import forge.util.FileSectionManual;
|
import forge.util.FileSectionManual;
|
||||||
import forge.util.FileUtil;
|
import forge.util.FileUtil;
|
||||||
|
import forge.util.IItemReader;
|
||||||
import forge.util.IItemSerializer;
|
import forge.util.IItemSerializer;
|
||||||
import forge.util.storage.StorageReaderFolder;
|
import forge.util.storage.StorageReaderFolder;
|
||||||
import freemarker.template.Configuration;
|
import freemarker.template.Configuration;
|
||||||
@@ -194,7 +195,7 @@ public class DeckSerializer extends StorageReaderFolder<Deck> implements IItemSe
|
|||||||
}
|
}
|
||||||
|
|
||||||
public File makeFileFor(final Deck deck) {
|
public File makeFileFor(final Deck deck) {
|
||||||
return new File(this.getDirectory(), deck.getBestFileName() + FILE_EXTENSION);
|
return new File(this.directory, deck.getBestFileName() + FILE_EXTENSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -245,4 +246,14 @@ public class DeckSerializer extends StorageReaderFolder<Deck> implements IItemSe
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.util.storage.StorageReaderBase#getReaderForFolder(java.io.File)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public IItemReader<Deck> getReaderForFolder(File subfolder) {
|
||||||
|
if ( !subfolder.getParentFile().equals(directory) )
|
||||||
|
throw new UnsupportedOperationException("Only child folders of " + directory + " may be processed");
|
||||||
|
return new DeckSerializer(subfolder, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
package forge.util;
|
package forge.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,4 +42,8 @@ public interface IItemReader<T> {
|
|||||||
* @return the item key
|
* @return the item key
|
||||||
*/
|
*/
|
||||||
String getItemKey(T item);
|
String getItemKey(T item);
|
||||||
|
|
||||||
|
Iterable<File> getSubFolders();
|
||||||
|
|
||||||
|
IItemReader<T> getReaderForFolder(File subfolder);
|
||||||
}
|
}
|
||||||
|
|||||||
27
src/main/java/forge/util/storage/StorageReaderBase.java
Normal file
27
src/main/java/forge/util/storage/StorageReaderBase.java
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package forge.util.storage;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
|
import forge.util.IItemReader;
|
||||||
|
|
||||||
|
public abstract class StorageReaderBase<T> implements IItemReader<T> {
|
||||||
|
|
||||||
|
protected final Function<? super T, String> keySelector;
|
||||||
|
public StorageReaderBase(final Function<? super T, String> keySelector0) {
|
||||||
|
keySelector = keySelector0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<File> getSubFolders() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return ImmutableList.of();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IItemReader<T> getReaderForFolder(File subfolder) {
|
||||||
|
throw new UnsupportedOperationException("This reader is not supposed to have nested folders");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,7 +28,6 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
import forge.util.FileUtil;
|
import forge.util.FileUtil;
|
||||||
import forge.util.IItemReader;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class treats every line of a given file as a source for a named object.
|
* This class treats every line of a given file as a source for a named object.
|
||||||
@@ -36,10 +35,10 @@ import forge.util.IItemReader;
|
|||||||
* @param <T>
|
* @param <T>
|
||||||
* the generic type
|
* the generic type
|
||||||
*/
|
*/
|
||||||
public abstract class StorageReaderFile<T> implements IItemReader<T> {
|
public abstract class StorageReaderFile<T> extends StorageReaderBase<T> {
|
||||||
|
|
||||||
private final File file;
|
private final File file;
|
||||||
private final Function<? super T, String> keySelector;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new storage reader file.
|
* Instantiates a new storage reader file.
|
||||||
@@ -58,8 +57,8 @@ public abstract class StorageReaderFile<T> implements IItemReader<T> {
|
|||||||
* @param keySelector0 the key selector0
|
* @param keySelector0 the key selector0
|
||||||
*/
|
*/
|
||||||
public StorageReaderFile(final File file0, final Function<? super T, String> keySelector0) {
|
public StorageReaderFile(final File file0, final Function<? super T, String> keySelector0) {
|
||||||
|
super(keySelector0);
|
||||||
this.file = file0;
|
this.file = file0;
|
||||||
this.keySelector = keySelector0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
@@ -121,5 +120,4 @@ public abstract class StorageReaderFile<T> implements IItemReader<T> {
|
|||||||
public String getItemKey(final T item) {
|
public String getItemKey(final T item) {
|
||||||
return this.keySelector.apply(item);
|
return this.keySelector.apply(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
import forge.util.FileUtil;
|
import forge.util.FileUtil;
|
||||||
import forge.util.IItemReader;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class treats every line of a given file as a source for a named object.
|
* This class treats every line of a given file as a source for a named object.
|
||||||
@@ -38,18 +37,18 @@ import forge.util.IItemReader;
|
|||||||
* @param <T>
|
* @param <T>
|
||||||
* the generic type
|
* the generic type
|
||||||
*/
|
*/
|
||||||
public abstract class StorageReaderFileSections<T> implements IItemReader<T> {
|
public abstract class StorageReaderFileSections<T> extends StorageReaderBase<T> {
|
||||||
|
|
||||||
private final File file;
|
private final File file;
|
||||||
private final Function<? super T, String> keySelector;
|
|
||||||
|
|
||||||
public StorageReaderFileSections(final String pathname, final Function<? super T, String> keySelector0) {
|
public StorageReaderFileSections(final String pathname, final Function<? super T, String> keySelector0) {
|
||||||
this(new File(pathname), keySelector0);
|
this(new File(pathname), keySelector0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public StorageReaderFileSections(final File file0, final Function<? super T, String> keySelector0) {
|
public StorageReaderFileSections(final File file0, final Function<? super T, String> keySelector0) {
|
||||||
|
super(keySelector0);
|
||||||
this.file = file0;
|
this.file = file0;
|
||||||
this.keySelector = keySelector0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|||||||
@@ -18,9 +18,11 @@
|
|||||||
package forge.util.storage;
|
package forge.util.storage;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileFilter;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
@@ -34,7 +36,6 @@ import com.google.common.base.Function;
|
|||||||
|
|
||||||
import forge.deck.io.OldDeckFileFormatException;
|
import forge.deck.io.OldDeckFileFormatException;
|
||||||
import forge.error.BugReporter;
|
import forge.error.BugReporter;
|
||||||
import forge.util.IItemReader;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class treats every file in the given folder as a source for a named
|
* This class treats every file in the given folder as a source for a named
|
||||||
@@ -43,19 +44,9 @@ import forge.util.IItemReader;
|
|||||||
*
|
*
|
||||||
* @param <T> the generic type
|
* @param <T> the generic type
|
||||||
*/
|
*/
|
||||||
public abstract class StorageReaderFolder<T> implements IItemReader<T> {
|
public abstract class StorageReaderFolder<T> extends StorageReaderBase<T> {
|
||||||
|
|
||||||
private final File directory;
|
protected final File directory;
|
||||||
private final Function<? super T, String> keySelector;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the directory.
|
|
||||||
*
|
|
||||||
* @return the directory
|
|
||||||
*/
|
|
||||||
protected final File getDirectory() {
|
|
||||||
return this.directory;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new storage reader folder.
|
* Instantiates a new storage reader folder.
|
||||||
@@ -63,9 +54,9 @@ public abstract class StorageReaderFolder<T> implements IItemReader<T> {
|
|||||||
* @param deckDir0 the deck dir0
|
* @param deckDir0 the deck dir0
|
||||||
*/
|
*/
|
||||||
public StorageReaderFolder(final File deckDir0, Function<? super T, String> keySelector0) {
|
public StorageReaderFolder(final File deckDir0, Function<? super T, String> keySelector0) {
|
||||||
|
super(keySelector0);
|
||||||
|
|
||||||
this.directory = deckDir0;
|
this.directory = deckDir0;
|
||||||
keySelector = keySelector0;
|
|
||||||
|
|
||||||
if (this.directory == null) {
|
if (this.directory == null) {
|
||||||
throw new IllegalArgumentException("No deck directory specified");
|
throw new IllegalArgumentException("No deck directory specified");
|
||||||
@@ -153,5 +144,18 @@ public abstract class StorageReaderFolder<T> implements IItemReader<T> {
|
|||||||
public String getItemKey(T item) {
|
public String getItemKey(T item) {
|
||||||
return keySelector.apply(item);
|
return keySelector.apply(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// methods handling nested folders are provided. It's up to consumer whether to use these or not.
|
||||||
|
@Override
|
||||||
|
public Iterable<File> getSubFolders() {
|
||||||
|
File[] list = this.directory.listFiles(new FileFilter() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean accept(File file) {
|
||||||
|
return file.isDirectory() && !file.isHidden();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return Arrays.asList(list);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user