diff --git a/src/main/java/forge/deck/Deck.java b/src/main/java/forge/deck/Deck.java index 3db7883be34..3b305eb3218 100644 --- a/src/main/java/forge/deck/Deck.java +++ b/src/main/java/forge/deck/Deck.java @@ -141,6 +141,7 @@ public final class Deck implements Comparable, Serializable { public void addMain(final String cardName) { addMain(CardDb.instance().getCard(cardName)); } public void addMain(final CardPrinted card) { main.add(card); } public void addMain(final ItemPoolView list) { main.addAll(list); } + public void setMain(final Iterable cards) { main = new ItemPool(cards, CardPrinted.class); } public void removeMain(final CardPrinted card) { main.remove(card); } public void removeMain(final CardPrinted card, final int amount) { main.remove(card, amount); } public int countMain() { return main.countAll(); } @@ -154,6 +155,7 @@ public final class Deck implements Comparable, Serializable { public final void addSideboard(final CardPrinted card) { sideboard.add(card); } public final void addSideboard(final CardPrinted card, final int amount) { sideboard.add(card, amount); } public final void addSideboard(final ItemPoolView cards) { sideboard.addAll(cards); } + public final void setSideboard(final Iterable cards) { sideboard = new ItemPool(cards, CardPrinted.class); } /** *

countSideboard.

diff --git a/src/main/java/forge/deck/DeckManager.java b/src/main/java/forge/deck/DeckManager.java index e7c5b937bc1..9033c0e0831 100644 --- a/src/main/java/forge/deck/DeckManager.java +++ b/src/main/java/forge/deck/DeckManager.java @@ -1,6 +1,7 @@ package forge.deck; +import forge.FileUtil; import forge.PlayerType; import forge.error.ErrorViewer; import forge.game.GameType; @@ -291,36 +292,42 @@ public class DeckManager { * @return a {@link forge.deck.Deck} object. */ public static Deck readDeck(File deckFile) { - List lines = new LinkedList(); - - try { - BufferedReader r = new BufferedReader(new FileReader(deckFile)); - - String line; - while ((line = r.readLine()) != null) { - lines.add(line); - } - - r.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - ListIterator lineIterator = lines.listIterator(); - if (!lineIterator.hasNext()) { return null; } - String line = lineIterator.next(); + List lines = FileUtil.readFile(deckFile); + if (lines.isEmpty()) { return null; } - //Old text-based format - if (!line.equals("[metadata]")) { - lineIterator.previous(); - return readDeckOld(lineIterator); - } Deck d = new Deck(); - //read metadata - while (!(line = lineIterator.next()).equals("[main]")) { + String firstLine = lines.get(0); + if (!firstLine.startsWith("[") || firstLine.equalsIgnoreCase("[general]")) { + readDeckOldMetadata(lines.iterator(), d); + } else { + readDeckMetadata(findSection(lines, "metadata"), d); + } + d.setMain(readCardList(findSection(lines, "main"))); + d.setSideboard(readCardList(findSection(lines, "sideboard"))); + + return d; + } + + private static Iterator findSection(final Iterable lines, final String sectionName) + { + Iterator lineIterator = lines.iterator(); + String toSearch = String.format("[%s]", sectionName); + while(lineIterator.hasNext()) { + if (toSearch.equalsIgnoreCase(lineIterator.next())) { break; } + } + + return lineIterator; + } + + private static void readDeckMetadata(final Iterator lineIterator, final Deck d) + { + while (lineIterator.hasNext()) { + String line = lineIterator.next(); + if( line.startsWith("[") ) { break; } + String[] linedata = line.split("=", 2); String field = linedata[0].toLowerCase(); if (NAME.equalsIgnoreCase(field)) { @@ -337,11 +344,6 @@ public class DeckManager { } } } - - addCardList(lineIterator, d); - - return d; - } /** @@ -350,7 +352,7 @@ public class DeckManager { * @param iterator a {@link java.util.ListIterator} object. * @return a {@link forge.deck.Deck} object. */ - private static Deck readDeckOld(final ListIterator iterator) { + private static void readDeckOldMetadata(final Iterator iterator, Deck d) { String line; //readDeck name @@ -369,19 +371,9 @@ public class DeckManager { //readDeck deck type GameType deckType = GameType.smartValueOf(iterator.next()); - Deck d = new Deck(); d.setName(name); d.setComment(comment); d.setDeckType(deckType); - - //go to [main] - while ((line = iterator.next()) != null && !line.equals("[main]")) { - System.err.println("unexpected line: " + line); - } - - addCardList(iterator, d); - - return d; } /** @@ -405,7 +397,7 @@ public class DeckManager { } // Precondition: iterator should point at the first line of cards list - private static List readCardList(final ListIterator lineIterator) { + private static List readCardList(final Iterator lineIterator) { List result = new ArrayList(); Pattern p = Pattern.compile("((\\d+)\\s+)?(.*?)"); diff --git a/src/main/java/forge/item/CardDb.java b/src/main/java/forge/item/CardDb.java index 4e34846a233..33f3fed6fd4 100644 --- a/src/main/java/forge/item/CardDb.java +++ b/src/main/java/forge/item/CardDb.java @@ -153,7 +153,7 @@ public final class CardDb { } // Multiple fetch - public List getCards(final List names) { + public List getCards(final Iterable names) { List result = new ArrayList(); for (String name : names) { result.add(getCard(name)); } return result; diff --git a/src/main/java/forge/item/ItemPool.java b/src/main/java/forge/item/ItemPool.java index 632979d6776..0d79b161972 100644 --- a/src/main/java/forge/item/ItemPool.java +++ b/src/main/java/forge/item/ItemPool.java @@ -15,7 +15,7 @@ public final class ItemPool extends ItemPoolView { public ItemPool(final Class cls) { super(cls); } @SuppressWarnings("unchecked") // conversion here must be safe - public ItemPool(final List names, final Class cls) { super(cls); addAllCards((Iterable) CardDb.instance().getCards(names)); } + public ItemPool(final Iterable names, final Class cls) { super(cls); addAllCards((Iterable) CardDb.instance().getCards(names)); } @SuppressWarnings("unchecked") public static ItemPool