From 5ed08a85c5a41e8c3a69a5853ca1cc0d5d263c64 Mon Sep 17 00:00:00 2001 From: jendave Date: Sat, 6 Aug 2011 22:49:10 +0000 Subject: [PATCH] Decks now store metadata in key-value pairs. New metadata types can be added to the deck without breaking backward compatibility. --- src/forge/deck/Deck.java | 34 ++++++++++++----------- src/forge/deck/DeckManager.java | 49 +++++++++++++++++++++------------ 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/src/forge/deck/Deck.java b/src/forge/deck/Deck.java index e5d01f2c4aa..0963b780bcd 100644 --- a/src/forge/deck/Deck.java +++ b/src/forge/deck/Deck.java @@ -12,8 +12,6 @@ public class Deck implements Comparable{ private List main; private List sideboard; - private transient List mainView; - private transient List sideboardView; public static final String NAME = "Name"; public static final String DECK_TYPE = "Deck Type"; @@ -23,15 +21,9 @@ public class Deck implements Comparable{ //gameType is from Constant.GameType, like Constant.GameType.Regular - public Deck(String gameType) { - setDeckType(gameType); - setName(""); - + public Deck() { main = new ArrayList(); - mainView = Collections.unmodifiableList(main); - sideboard = new ArrayList(); - sideboardView = Collections.unmodifiableList(sideboard); } public Deck(String deckType, List main, List sideboard, String name) { @@ -39,18 +31,20 @@ public class Deck implements Comparable{ setName(name); this.main = main; - mainView = Collections.unmodifiableList(main); + this.sideboard = sideboard; + } - this.sideboard = main; - sideboardView = Collections.unmodifiableList(sideboard); + public Deck(String type) { + this(); + setDeckType(type); } public List getMain() { - return mainView; + return Collections.unmodifiableList(main); } public List getSideboard() { - return sideboardView; + return Collections.unmodifiableList(sideboard); } public String getDeckType() { @@ -58,7 +52,7 @@ public class Deck implements Comparable{ } //can only call this method ONCE - private void setDeckType(String deckType) { + void setDeckType(String deckType) { if (this.getDeckType() != null) { throw new IllegalStateException( "Deck : setDeckType() error, deck type has already been set"); @@ -78,7 +72,7 @@ public class Deck implements Comparable{ public String getName() { return metadata.get(NAME); - }//may return null + } public void setComment(String comment) { metadata.put(COMMENT, comment); @@ -174,4 +168,12 @@ public class Deck implements Comparable{ } return 0; } + + public Set> getMetadata() { + return metadata.entrySet(); + } + + public void addMetaData(String key, String value) { + metadata.put(key, value); + } } \ No newline at end of file diff --git a/src/forge/deck/DeckManager.java b/src/forge/deck/DeckManager.java index f645e548a9c..a933acc15cc 100755 --- a/src/forge/deck/DeckManager.java +++ b/src/forge/deck/DeckManager.java @@ -34,10 +34,6 @@ public class DeckManager { Map deckMap; Map boosterMap; - public DeckManager(String fileName) { - this(new File(fileName)); - } - public DeckManager(File deckDir) { if (deckDir == null) { throw new IllegalArgumentException("No deck directory specified"); @@ -173,15 +169,25 @@ public class DeckManager { ListIterator lineIterator = lines.listIterator(); - String firstLine = lineIterator.next(); + String line = lineIterator.next(); //Old text-based format - if (!firstLine.equals("[Metadata]")) { + if (!line.equals("[metadata]")) { lineIterator.previous(); return readDeckOld(lineIterator); } - return null; + Deck d = new Deck(); + + //read metadata + while(!(line = lineIterator.next()).equals("[main]")){ + String[] linedata = line.split("=",2); + d.addMetaData(linedata[0], linedata[1]); + } + + addCardList(lineIterator, d); + + return d; } @@ -206,19 +212,28 @@ public class DeckManager { //readDeck deck type String deckType = iterator.next(); - Deck d = new Deck(deckType); + 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; + } + + private static void addCardList(ListIterator lineIterator, Deck d) { + String line; + Pattern p = Pattern.compile("\\s*((\\d+)\\s+)?(.*?)\\s*"); //readDeck main deck - while (iterator.hasNext() && !(line = iterator.next()).equals("[sideboard]")) { + while (lineIterator.hasNext() && !(line = lineIterator.next()).equals("[sideboard]")) { Matcher m = p.matcher(line); m.matches(); String s = m.group(2); @@ -230,7 +245,8 @@ public class DeckManager { } //readDeck sideboard - while (iterator.hasNext()) { + while (lineIterator.hasNext()) { + line = lineIterator.next(); Matcher m = p.matcher(line); m.matches(); String s = m.group(2); @@ -239,8 +255,6 @@ public class DeckManager { d.addSideboard(m.group(3)); } } - - return d; } private String deriveFileName(String deckName) { @@ -296,12 +310,13 @@ public class DeckManager { } private void write(Deck d, BufferedWriter out) throws IOException { - out.write(format("%s%n", d.getName())); - if (d.getComment() != null) { - out.write(format("%s%n", d.getComment())); + out.write("[metadata]\n"); + + for (Entry entry : d.getMetadata()) { + if (entry.getValue() != null) + out.write(format("%s=%s%n", entry.getKey(), entry.getValue().replaceAll("\n", ""))); } - out.write(format("%s%n", "[general]")); - out.write(format("%s%n", d.getDeckType())); + out.write(format("%s%n", "[main]")); for (Entry e : count(d.getMain()).entrySet()) { out.write(format("%d %s%n", e.getValue(), e.getKey()));