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 editor = null; if (gt0 == GameType.Constructed) { editor = (DeckEditorBase) new DeckEditorConstructed(); - } - if (gt0 == GameType.Draft) { - editor = (DeckEditorBase) new DeckEditorLimited(AllZone.getDecks().getDraft()); - } - if (gt0 == GameType.Sealed) { - editor = (DeckEditorBase) new DeckEditorLimited(AllZone.getDecks().getSealed()); + } else if (gt0 == GameType.Draft) { + editor = (DeckEditorBase) new DeckEditorLimited(Singletons.getModel().getDecks().getDraft()); + } else if (gt0 == GameType.Sealed) { + editor = (DeckEditorBase) 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);