diff --git a/src/main/java/forge/AllZone.java b/src/main/java/forge/AllZone.java
index b1a368f6357..0b82a8fa538 100644
--- a/src/main/java/forge/AllZone.java
+++ b/src/main/java/forge/AllZone.java
@@ -29,7 +29,6 @@ import forge.card.cardfactory.PreloadingCardFactory;
import forge.card.replacement.ReplacementHandler;
import forge.card.trigger.TriggerHandler;
import forge.control.input.InputControl;
-import forge.deck.CardCollections;
import forge.game.GameState;
import forge.game.limited.CardRatings;
import forge.properties.ForgeProps;
@@ -87,16 +86,6 @@ public final class AllZone {
/** Constant CARD_RATINGS. */
private static CardRatings cardRatings = new CardRatings();
-
- private static CardCollections collections;
-
- public static final CardCollections getDecks() {
- if (null == collections) {
- collections = new CardCollections(ForgeProps.getFile(NewConstants.NEW_DECKS));
- }
- return collections;
- }
-
/**
*
* getHumanPlayer.
diff --git a/src/main/java/forge/control/home/ControlConstructed.java b/src/main/java/forge/control/home/ControlConstructed.java
index 35276c371c7..ac576fe6a6b 100644
--- a/src/main/java/forge/control/home/ControlConstructed.java
+++ b/src/main/java/forge/control/home/ControlConstructed.java
@@ -13,7 +13,6 @@ import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
-import forge.AllZone;
import forge.CardList;
import forge.Constant;
import forge.PlayerType;
@@ -230,7 +229,7 @@ public class ControlConstructed {
}
// Custom deck
else {
- deck = AllZone.getDecks().getConstructed().get(selection[0]);
+ deck = Singletons.getModel().getDecks().getConstructed().get(selection[0]);
}
return deck;
@@ -323,7 +322,7 @@ public class ControlConstructed {
final List customNames = new ArrayList();
customNames.clear();
- final IFolderMap allDecks = AllZone.getDecks().getConstructed();
+ final IFolderMap allDecks = Singletons.getModel().getDecks().getConstructed();
for (final Deck d : allDecks) { customNames.add(d.getName()); }
return oa2sa(customNames.toArray());
diff --git a/src/main/java/forge/control/home/ControlDraft.java b/src/main/java/forge/control/home/ControlDraft.java
index 011ada633a8..76b7ffeb65d 100644
--- a/src/main/java/forge/control/home/ControlDraft.java
+++ b/src/main/java/forge/control/home/ControlDraft.java
@@ -9,8 +9,8 @@ import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
-import forge.AllZone;
import forge.Constant;
+import forge.Singletons;
import forge.deck.Deck;
import forge.deck.DeckGroup;
import forge.game.GameNew;
@@ -122,7 +122,7 @@ public class ControlDraft {
}
});
- DeckGroup opponentDecks = AllZone.getDecks().getDraft().get(human.getName());
+ DeckGroup opponentDecks = Singletons.getModel().getDecks().getDraft().get(human.getName());
SwingUtilities.invokeLater(new Runnable() {
@Override
@@ -181,7 +181,7 @@ public class ControlDraft {
public void updateHumanDecks() {
List human = new ArrayList();
- for (DeckGroup d : AllZone.getDecks().getDraft()) {
+ for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) {
human.add(d.getHumanDeck());
}
view.getLstHumanDecks().setDecks(human);
diff --git a/src/main/java/forge/control/home/ControlSealed.java b/src/main/java/forge/control/home/ControlSealed.java
index e67db32e512..24f52cd08ed 100644
--- a/src/main/java/forge/control/home/ControlSealed.java
+++ b/src/main/java/forge/control/home/ControlSealed.java
@@ -15,7 +15,6 @@ import net.slightlymagic.braids.util.UtilFunctions;
import org.apache.commons.lang3.StringUtils;
-import forge.AllZone;
import forge.Command;
import forge.Constant;
import forge.Singletons;
@@ -116,7 +115,7 @@ public class ControlSealed {
});
Constant.Runtime.HUMAN_DECK[0] = human;
- Constant.Runtime.COMPUTER_DECK[0] = AllZone.getDecks().getSealed().get(human.getName()).getAiDecks().get(0);
+ Constant.Runtime.COMPUTER_DECK[0] = Singletons.getModel().getDecks().getSealed().get(human.getName()).getAiDecks().get(0);
SwingUtilities.invokeLater(new Runnable() {
@Override
@@ -136,7 +135,7 @@ public class ControlSealed {
// Since AI decks are tied directly to the human choice,
// they're just mapped in a parallel map and grabbed when the game starts.
- for (DeckGroup d : AllZone.getDecks().getSealed()) {
+ for (DeckGroup d : Singletons.getModel().getDecks().getSealed()) {
aiDecks.put(d.getName(), d.getAiDecks().get(0));
humanDecks.add(d.getHumanDeck());
}
@@ -199,7 +198,7 @@ public class ControlSealed {
DeckGroup sealed = new DeckGroup(sDeckName);
sealed.setHumanDeck(deck);
sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList()));
- AllZone.getDecks().getSealed().add(sealed);
+ Singletons.getModel().getDecks().getSealed().add(sealed);
Singletons.getControl().getControlHome().getControlUtilities().showDeckEditor(GameType.Sealed, sealed);
diff --git a/src/main/java/forge/control/home/ControlUtilities.java b/src/main/java/forge/control/home/ControlUtilities.java
index 9adc70a044f..cf11fa1d6c7 100644
--- a/src/main/java/forge/control/home/ControlUtilities.java
+++ b/src/main/java/forge/control/home/ControlUtilities.java
@@ -8,7 +8,6 @@ import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
-import forge.AllZone;
import forge.Command;
import forge.GuiDownloadPicturesLQ;
import forge.GuiDownloadPrices;
@@ -158,12 +157,10 @@ public class ControlUtilities {
DeckEditorBase, T> editor = null;
if (gt0 == GameType.Constructed) {
editor = (DeckEditorBase, T>) new DeckEditorConstructed();
- }
- if (gt0 == GameType.Draft) {
- editor = (DeckEditorBase, T>) new DeckEditorLimited(AllZone.getDecks().getDraft());
- }
- if (gt0 == GameType.Sealed) {
- editor = (DeckEditorBase, T>) new DeckEditorLimited(AllZone.getDecks().getSealed());
+ } else if (gt0 == GameType.Draft) {
+ editor = (DeckEditorBase, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getDraft());
+ } else if (gt0 == GameType.Sealed) {
+ editor = (DeckEditorBase, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
}
diff --git a/src/main/java/forge/deck/CardCollections.java b/src/main/java/forge/deck/CardCollections.java
index 670bdd2a109..0db1733f54c 100644
--- a/src/main/java/forge/deck/CardCollections.java
+++ b/src/main/java/forge/deck/CardCollections.java
@@ -10,8 +10,8 @@ import forge.util.IFolderMap;
/**
- * TODO: Write javadoc for this type.
- *
+ * Holds editable maps of decks saved to disk.
+ * Adding or removing items to(from) such map turns into immediate file update
*/
public class CardCollections {
private final IFolderMap constructed;
diff --git a/src/main/java/forge/deck/io/DeckGroupSerializer.java b/src/main/java/forge/deck/io/DeckGroupSerializer.java
index 9c281c64147..dbb2e13fa49 100644
--- a/src/main/java/forge/deck/io/DeckGroupSerializer.java
+++ b/src/main/java/forge/deck/io/DeckGroupSerializer.java
@@ -34,10 +34,9 @@ import forge.util.IItemSerializer;
*
*/
public class DeckGroupSerializer extends StorageReaderFolder implements IItemSerializer {
- /**
- * TODO: Write javadoc for Constructor.
- * @param deckDir0
- */
+ private final String HUMAN_DECK_FILE = "human.dck";
+
+
public DeckGroupSerializer(File deckDir0) {
super(deckDir0);
}
@@ -55,7 +54,7 @@ public class DeckGroupSerializer extends StorageReaderFolder implemen
public void save(DeckGroup unit) {
final File f = makeFileFor(unit);
f.mkdir();
- FileUtil.writeFile(new File(f, "human.dck"), unit.getHumanDeck().save());
+ FileUtil.writeFile(new File(f, HUMAN_DECK_FILE), unit.getHumanDeck().save());
List aiDecks = unit.getAiDecks();
for (int i = 1; i <= aiDecks.size(); i++) {
FileUtil.writeFile(new File(f, "ai-" + i + ".dck"), aiDecks.get(i - 1).save());
@@ -64,7 +63,7 @@ public class DeckGroupSerializer extends StorageReaderFolder implemen
protected final DeckGroup read(File file) {
- Deck human = Deck.fromFile(new File(file, "human.dck"));
+ Deck human = Deck.fromFile(new File(file, HUMAN_DECK_FILE));
if (null == human) {
return null;
}
@@ -109,7 +108,9 @@ public class DeckGroupSerializer extends StorageReaderFolder implemen
@Override
public boolean accept(File dir, String name) {
- return dir.isDirectory() && !dir.isHidden() && StringUtils.isNotEmpty(name) && !name.startsWith(".");
+ boolean isVisibleFolder = dir.isDirectory() && !dir.isHidden();
+ boolean hasGoodName = StringUtils.isNotEmpty(name) && !name.startsWith(".");
+ return isVisibleFolder && hasGoodName && new File(dir, HUMAN_DECK_FILE).exists();
}
};
}
diff --git a/src/main/java/forge/game/limited/BoosterDraft.java b/src/main/java/forge/game/limited/BoosterDraft.java
index 2e4277891b4..16717fa3ce9 100644
--- a/src/main/java/forge/game/limited/BoosterDraft.java
+++ b/src/main/java/forge/game/limited/BoosterDraft.java
@@ -35,6 +35,7 @@ import forge.AllZone;
import forge.Card;
import forge.CardList;
import forge.Constant;
+import forge.Singletons;
import forge.card.BoosterGenerator;
import forge.card.CardBlock;
import forge.card.CardEdition;
@@ -208,7 +209,7 @@ public final class BoosterDraft implements IBoosterDraft {
for (final String element : dList) {
if (element.endsWith(fileExtension)) {
final List dfData = FileUtil.readFile(lookupFolder + element);
- customs.add(CustomLimited.parse(dfData, AllZone.getDecks().getCubes()));
+ customs.add(CustomLimited.parse(dfData, Singletons.getModel().getDecks().getCubes()));
}
}
return customs;
diff --git a/src/main/java/forge/game/limited/SealedDeck.java b/src/main/java/forge/game/limited/SealedDeck.java
index cfa9959d3a3..d10b6182273 100644
--- a/src/main/java/forge/game/limited/SealedDeck.java
+++ b/src/main/java/forge/game/limited/SealedDeck.java
@@ -31,6 +31,7 @@ import forge.CardList;
import forge.CardListFilter;
import forge.CardListUtil;
import forge.Constant;
+import forge.Singletons;
import forge.card.BoosterGenerator;
import forge.card.CardBlock;
import forge.card.CardEdition;
@@ -138,7 +139,7 @@ public class SealedDeck {
for (final String element : dList) {
if (element.endsWith(".sealed")) {
final ArrayList dfData = FileUtil.readFile("res/sealed/" + element);
- final CustomLimited cs = CustomLimited.parse(dfData, AllZone.getDecks().getCubes());
+ final CustomLimited cs = CustomLimited.parse(dfData, Singletons.getModel().getDecks().getCubes());
customs.add(cs);
}
}
diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorConstructed.java b/src/main/java/forge/gui/deckeditor/DeckEditorConstructed.java
index b4fa960a171..1dfd49f4a22 100644
--- a/src/main/java/forge/gui/deckeditor/DeckEditorConstructed.java
+++ b/src/main/java/forge/gui/deckeditor/DeckEditorConstructed.java
@@ -38,8 +38,8 @@ import javax.swing.JLabel;
import net.miginfocom.swing.MigLayout;
import net.slightlymagic.braids.util.lambda.Lambda0;
import net.slightlymagic.maxmtg.Predicate;
-import forge.AllZone;
import forge.Command;
+import forge.Singletons;
import forge.deck.Deck;
import forge.error.ErrorViewer;
import forge.gui.deckeditor.elements.CardPanelHeavy;
@@ -154,7 +154,7 @@ public final class DeckEditorConstructed extends DeckEditorBase newCreator = new Lambda0() { @Override public Deck apply() { return new Deck(); } };
- controller = new DeckController(AllZone.getDecks().getConstructed(), this, newCreator);
+ controller = new DeckController(Singletons.getModel().getDecks().getConstructed(), this, newCreator);
}
private void jbInit() {
diff --git a/src/main/java/forge/gui/deckeditor/DraftingProcess.java b/src/main/java/forge/gui/deckeditor/DraftingProcess.java
index ebc5ffaaf98..93deef6b9cc 100644
--- a/src/main/java/forge/gui/deckeditor/DraftingProcess.java
+++ b/src/main/java/forge/gui/deckeditor/DraftingProcess.java
@@ -37,7 +37,6 @@ import javax.swing.JTable;
import javax.swing.WindowConstants;
import net.slightlymagic.maxmtg.Predicate;
-import forge.AllZone;
import forge.Command;
import forge.Constant;
import forge.Singletons;
@@ -326,13 +325,13 @@ public class DraftingProcess extends DeckEditorBase {
final Deck human = this.getPlayersDeck();
- final DeckGroup all = new DeckGroup("Draft " + s);
- all.setHumanDeck(human);
- all.addAiDecks(computer);
+ final DeckGroup finishedDraft = new DeckGroup("Draft " + s);
+ finishedDraft.setHumanDeck(human);
+ finishedDraft.addAiDecks(computer);
// DeckManager deckManager = new
// DeckManager(ForgeProps.getFile(NEW_DECKS));
- AllZone.getDecks().getDraft().add(all); // write file right here
+ Singletons.getModel().getDecks().getDraft().add(finishedDraft); // write file right here
// close and open next screen
this.dispose();
diff --git a/src/main/java/forge/model/FModel.java b/src/main/java/forge/model/FModel.java
index a862acac8cf..9adb78fbd69 100644
--- a/src/main/java/forge/model/FModel.java
+++ b/src/main/java/forge/model/FModel.java
@@ -35,6 +35,7 @@ import forge.ConstantStringArrayList;
import forge.GameAction;
import forge.Singletons;
import forge.control.input.InputControl;
+import forge.deck.CardCollections;
import forge.game.GameState;
import forge.game.GameSummary;
import forge.properties.ForgePreferences;
@@ -74,6 +75,9 @@ public enum FModel {
private final QuestEventManager questEventManager;
private final GameState gameState;
private final FMatchState matchState;
+
+ // have to implement lazy initialization - at the moment of FModel.ctor() CardDb is not ready yet.
+ private CardCollections decks;
/**
* Constructor.
@@ -305,6 +309,16 @@ public enum FModel {
return this.questEventManager;
}
+ /**
+ * Returns all player's decks for constructed, sealed and whatever
+ * @return {@link forge.decks.CardCollections}
+ */
+ public final CardCollections getDecks() {
+ if (decks == null)
+ this.decks = new CardCollections(ForgeProps.getFile(NewConstants.NEW_DECKS));
+ return decks;
+ }
+
/**
* Gets the game action model.
*
diff --git a/src/main/java/forge/util/StorageReaderFile.java b/src/main/java/forge/util/StorageReaderFile.java
index e44fadc94c8..f08a8bfe1d7 100644
--- a/src/main/java/forge/util/StorageReaderFile.java
+++ b/src/main/java/forge/util/StorageReaderFile.java
@@ -24,12 +24,10 @@ import java.util.TreeMap;
import javax.swing.JOptionPane;
-import net.slightlymagic.braids.util.lambda.Lambda1;
-
import org.apache.commons.lang3.StringUtils;
/**
- * TODO: Write javadoc for this type.
+ * This class treats every line of a given file as a source for a named object.
*
*/
public abstract class StorageReaderFile implements IItemReader {
@@ -56,17 +54,17 @@ public abstract class StorageReaderFile implements IItemRead
public Map readAll() {
final Map result = new TreeMap();
final ArrayList fData = FileUtil.readFile(file);
- Lambda1 filter = getLineFilter();
+
for (final String s : fData) {
- if (!filter.apply(s)) {
+ if (!lineContainsObject(s)) {
continue;
}
T item = read(s);
if (null == item) {
String msg = "An object stored in " + file.getPath() + " failed to load.\nPlease submit this as a bug with the mentioned file attached.";
- JOptionPane.showMessageDialog(null, msg); // This becomes bugged if uncommented, but i need these messages to debug other peoples decks // Max Mtg
+ JOptionPane.showMessageDialog(null, msg);
continue;
}
@@ -85,14 +83,8 @@ public abstract class StorageReaderFile implements IItemRead
protected abstract T read(String line);
- protected Lambda1 getLineFilter() {
- return new Lambda1() {
-
- @Override
- public Boolean apply(String arg1) {
- return !StringUtils.isBlank(arg1) && !arg1.trim().startsWith("#");
- }
- };
+ protected boolean lineContainsObject(String line) {
+ return !StringUtils.isBlank(line) && !line.trim().startsWith("#");
}
}
diff --git a/src/main/java/forge/util/StorageReaderFolder.java b/src/main/java/forge/util/StorageReaderFolder.java
index c0ec02c2002..a20dfcc8212 100644
--- a/src/main/java/forge/util/StorageReaderFolder.java
+++ b/src/main/java/forge/util/StorageReaderFolder.java
@@ -33,7 +33,9 @@ import org.apache.commons.lang3.StringUtils;
import forge.error.ErrorViewer;
/**
- * TODO: Write javadoc for this type.
+ * This class treats every file in the given folder as a source for a named object.
+ * The descendant should implement read method to deserialize a single item.
+ * So that readAll will return a map of Name => Object as read from disk
*
*/
public abstract class StorageReaderFolder implements IItemReader {
@@ -67,18 +69,6 @@ public abstract class StorageReaderFolder implements IItemRe
}
}
- // only accepts numbers, letters or dashes up to 20 characters in length
- /**
- *
- * Clean deck name.
- *
- * @param in
- * a String
- * @return a String
- */
-
-
-
@Override
public Map readAll() {
final Map result = new TreeMap();
@@ -112,16 +102,16 @@ public abstract class StorageReaderFolder implements IItemRe
/**
- * TODO: Write javadoc for this method.
+ * Read the object from file
* @param file
- * @return
+ * @return the object deserialized by inherited class
*/
protected abstract T read(File file);
/**
* TODO: Write javadoc for this method.
- * @return
+ * @return FilenameFilter to pick only relevant objects for deserialization
*/
protected abstract FilenameFilter getFileFilter();
diff --git a/src/main/java/forge/view/home/ConstructedDeckSelectPanel.java b/src/main/java/forge/view/home/ConstructedDeckSelectPanel.java
index 8a0815915b3..9a0935845ed 100644
--- a/src/main/java/forge/view/home/ConstructedDeckSelectPanel.java
+++ b/src/main/java/forge/view/home/ConstructedDeckSelectPanel.java
@@ -21,7 +21,6 @@ import javax.swing.ListSelectionModel;
import javax.swing.border.LineBorder;
import net.miginfocom.swing.MigLayout;
-import forge.AllZone;
import forge.Command;
import forge.Singletons;
import forge.deck.Deck;
@@ -150,7 +149,7 @@ public class ConstructedDeckSelectPanel extends JPanel {
if (e.getClickCount() == 2 && ((JList) e.getSource()).getName().equals("lstCustom")) {
final String deckName = ((JList) e.getSource()).getSelectedValue().toString();
- showDecklist(AllZone.getDecks().getConstructed().get(deckName));
+ showDecklist(Singletons.getModel().getDecks().getConstructed().get(deckName));
}
else if (e.getClickCount() == 2 && ((JList) e.getSource()).getName().equals("lstQuest")) {
final String deckName = ((JList) e.getSource()).getSelectedValue().toString();
diff --git a/src/main/java/forge/view/toolbox/DeckLister.java b/src/main/java/forge/view/toolbox/DeckLister.java
index 09e0cb6f3ff..1284eafe961 100644
--- a/src/main/java/forge/view/toolbox/DeckLister.java
+++ b/src/main/java/forge/view/toolbox/DeckLister.java
@@ -21,6 +21,7 @@ import forge.AllZone;
import forge.Command;
import forge.Constant;
import forge.Singletons;
+import forge.deck.CardCollections;
import forge.deck.Deck;
import forge.game.GameType;
import forge.gui.deckeditor.DeckEditorConstructed;
@@ -367,13 +368,13 @@ public class DeckLister extends JPanel {
cEditor.setVisible(true);
break;
case Sealed:
- final DeckEditorLimited sEditor = new DeckEditorLimited(AllZone.getDecks().getSealed());
+ final DeckEditorLimited sEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
sEditor.show(cmdEditorExit);
sEditor.getController().load(d0.getName());
sEditor.setVisible(true);
break;
case Draft:
- final DeckEditorLimited dEditor = new DeckEditorLimited(AllZone.getDecks().getDraft());
+ final DeckEditorLimited dEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getDraft());
dEditor.show(cmdEditorExit);
dEditor.getController().load(d0.getName());
dEditor.setVisible(true);
@@ -391,12 +392,14 @@ public class DeckLister extends JPanel {
if (n == JOptionPane.NO_OPTION) {
return;
}
+
+ final CardCollections deckManager = Singletons.getModel().getDecks();
if (gametype.equals(GameType.Draft)) {
- AllZone.getDecks().getDraft().delete(d0.getName());
+ deckManager.getDraft().delete(d0.getName());
}
else if (gametype.equals(GameType.Sealed)) {
- AllZone.getDecks().getSealed().delete(d0.getName());
+ deckManager.getSealed().delete(d0.getName());
}
else if (gametype.equals(GameType.Quest)) {
AllZone.getQuestData().getMyDecks().delete(d0.getName());
@@ -404,7 +407,7 @@ public class DeckLister extends JPanel {
Singletons.getView().getViewHome().getBtnQuest().grabFocus();
}
else {
- AllZone.getDecks().getConstructed().delete(d0.getName());
+ deckManager.getConstructed().delete(d0.getName());
}
this.remove(r0);