Support for nested folders that store constructed decks - part 1 of ≈3

This commit is contained in:
Maxmtg
2013-08-19 20:48:21 +00:00
parent 8b97275195
commit df6860294d
9 changed files with 81 additions and 27 deletions

1
.gitattributes vendored
View File

@@ -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

View File

@@ -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() {

View File

@@ -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();
}
} }

View File

@@ -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);
}
} }

View File

@@ -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);
} }

View 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");
}
}

View File

@@ -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);
} }
} }

View File

@@ -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)

View File

@@ -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);
}
} }