From 2f0d95cf9bbdf77f85abae1123cc3fd59d702ad2 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 27 Jan 2012 20:46:27 +0000 Subject: [PATCH] Decks save/load operations moved to DeckIO class, references updated --- .gitattributes | 1 + .../forge/control/home/ControlSealed.java | 3 +- src/main/java/forge/deck/DeckIO.java | 518 ++++++++++++++++++ src/main/java/forge/deck/DeckManager.java | 507 +---------------- .../java/forge/game/limited/BoosterDraft.java | 12 +- .../gui/deckeditor/DeckEditorCommonMenu.java | 25 +- .../forge/gui/deckeditor/DeckEditorDraft.java | 3 +- .../gui/deckeditor/DeckEditorQuestMenu.java | 4 +- .../quest/gui/main/QuestEventManager.java | 3 +- .../java/forge/view/toolbox/DeckLister.java | 9 +- 10 files changed, 552 insertions(+), 533 deletions(-) create mode 100644 src/main/java/forge/deck/DeckIO.java diff --git a/.gitattributes b/.gitattributes index c1d60e2c382..02e9b1084e3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11145,6 +11145,7 @@ src/main/java/forge/control/match/package-info.java -text src/main/java/forge/control/package-info.java -text src/main/java/forge/deck/Deck.java svneol=native#text/plain src/main/java/forge/deck/DeckGeneration.java -text +src/main/java/forge/deck/DeckIO.java -text src/main/java/forge/deck/DeckManager.java svneol=native#text/plain src/main/java/forge/deck/DeckRecognizer.java -text src/main/java/forge/deck/generate/Generate2ColorDeck.java svneol=native#text/plain diff --git a/src/main/java/forge/control/home/ControlSealed.java b/src/main/java/forge/control/home/ControlSealed.java index 57f41cdbd2f..db1d3d61cee 100644 --- a/src/main/java/forge/control/home/ControlSealed.java +++ b/src/main/java/forge/control/home/ControlSealed.java @@ -18,6 +18,7 @@ import forge.Constant; import forge.PlayerType; import forge.control.FControl; import forge.deck.Deck; +import forge.deck.DeckIO; import forge.deck.DeckManager; import forge.game.GameType; import forge.game.limited.SealedDeck; @@ -209,7 +210,7 @@ public class ControlSealed { aiDeck.setName("AI_" + sDeckName); aiDeck.setPlayerType(PlayerType.COMPUTER); deckManager.addDeck(aiDeck); - DeckManager.writeDeck(aiDeck, DeckManager.makeFileName(aiDeck)); + DeckIO.writeDeck(aiDeck, DeckIO.makeFileName(aiDeck)); view.getParentView().getUtilitiesController().showDeckEditor(GameType.Sealed, deck); } diff --git a/src/main/java/forge/deck/DeckIO.java b/src/main/java/forge/deck/DeckIO.java new file mode 100644 index 00000000000..7a672398560 --- /dev/null +++ b/src/main/java/forge/deck/DeckIO.java @@ -0,0 +1,518 @@ +package forge.deck; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.NoSuchElementException; +import java.util.TreeMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.swing.JOptionPane; +import javax.swing.filechooser.FileFilter; + +import org.apache.commons.lang3.StringUtils; + +import forge.Card; +import forge.PlayerType; +import forge.game.GameType; +import forge.gui.deckeditor.TableSorter; +import forge.item.CardPrinted; +import forge.item.ItemPoolView; +import forge.properties.ForgeProps; +import forge.properties.NewConstants; +import forge.util.FileUtil; +import forge.util.SectionUtil; +import freemarker.template.Configuration; +import freemarker.template.DefaultObjectWrapper; +import freemarker.template.Template; +import freemarker.template.TemplateException; + +/** + * TODO: Write javadoc for this type. + * + */ +public class DeckIO { + + private static final String NAME = "Name"; + private static final String DECK_TYPE = "Deck Type"; + private static final String COMMENT = "Comment"; + private static final String PLAYER = "Player"; + private static final String CSTM_POOL = "Custom Pool"; + /** Constant BDKFileFilter. */ + static FilenameFilter bdkFileFilter = new FilenameFilter() { + @Override + public boolean accept(final File dir, final String name) { + return name.endsWith(".bdk"); + } + }; + /** Constant DCKFileFilter. */ + public static final FilenameFilter DCK_FILE_FILTER = new FilenameFilter() { + @Override + public boolean accept(final File dir, final String name) { + return name.endsWith(".dck"); + } + }; + /** The Constant DCK_FILTER. */ + public static final FileFilter DCK_FILTER = new FileFilter() { + @Override + public boolean accept(final File f) { + return f.getName().endsWith(".dck") || f.isDirectory(); + } + + @Override + public String getDescription() { + return "Simple Deck File .dck"; + } + }; + /** The Constant HTML_FILTER. */ + public static final FileFilter HTML_FILTER = new FileFilter() { + @Override + public boolean accept(final File f) { + return f.getName().endsWith(".html") || f.isDirectory(); + } + + @Override + public String getDescription() { + return "Simple Deck File .html"; + } + }; + /** + *

+ * readDeck. + *

+ * + * @param deckFile + * a {@link java.io.File} object. + * @return a {@link forge.deck.Deck} object. + */ + public static Deck readDeck(final File deckFile) { + + final List lines = FileUtil.readFile(deckFile); + final Map> sections = SectionUtil.parseSections(lines); + if (sections.isEmpty()) { + return null; + } + + final Deck d = new Deck(); + + final String firstLine = lines.get(0); + if (!firstLine.startsWith("[") || firstLine.equalsIgnoreCase("[general]")) { + readDeckOldMetadata(lines.iterator(), d); + } else { + readDeckMetadata(sections.get("metadata"), d); + } + d.setMain(readCardList(sections.get("main"))); + d.setSideboard(readCardList(sections.get("sideboard"))); + + return d; + } + + private static void readDeckMetadata(final Iterable lines, final Deck d) { + if (lines == null) { + return; + } + final Iterator lineIterator = lines.iterator(); + while (lineIterator.hasNext()) { + final String line = lineIterator.next(); + + final String[] linedata = line.split("=", 2); + final String field = linedata[0].toLowerCase(); + String value = ""; + + if (linedata.length > 1) { + value = linedata[1]; + } + + if (NAME.equalsIgnoreCase(field)) { + d.setName(value); + + } else if (COMMENT.equalsIgnoreCase(field)) { + d.setComment(value); + + } else if (DECK_TYPE.equalsIgnoreCase(field)) { + d.setDeckType(GameType.smartValueOf(value)); + + } else if (CSTM_POOL.equalsIgnoreCase(field)) { + d.setCustomPool(value.equalsIgnoreCase("true")); + + } else if (PLAYER.equalsIgnoreCase(field)) { + if ("human".equalsIgnoreCase(value)) { + d.setPlayerType(PlayerType.HUMAN); + + } else { + d.setPlayerType(PlayerType.COMPUTER); + } + } + } + } + + /** + *

+ * readDeckOld. + *

+ * + * @param iterator + * a {@link java.util.ListIterator} object. + * @return a {@link forge.deck.Deck} object. + */ + private static void readDeckOldMetadata(final Iterator iterator, final Deck d) { + + String line; + // readDeck name + final String name = iterator.next(); + + // readDeck comments + String comment = null; + while (iterator.hasNext()) { + line = iterator.next(); + if ((line != null) && !line.equals("[general")) { + if (comment == null) { + comment = line; + } else { + comment += "\n" + line; + } + } + } + + // readDeck deck type + + final GameType deckType = iterator.hasNext() ? GameType.smartValueOf(iterator.next()) : GameType.Constructed; + + d.setName(name); + d.setComment(comment); + d.setDeckType(deckType); + } + + // Precondition: iterator should point at the first line of cards list + private static List readCardList(final Iterable lines) { + final List result = new ArrayList(); + final Pattern p = Pattern.compile("((\\d+)\\s+)?(.*?)"); + + if (lines == null) { + return result; + } + + final Iterator lineIterator = lines.iterator(); + while (lineIterator.hasNext()) { + final String line = lineIterator.next(); + if (line.startsWith("[")) { + break; + } // there comes another section + + final Matcher m = p.matcher(line.trim()); + m.matches(); + final String sCnt = m.group(2); + final String cardName = m.group(3); + if (StringUtils.isBlank(cardName)) { + continue; + } + + final int count = sCnt == null ? 1 : Integer.parseInt(sCnt); + for (int i = 0; i < count; i++) { + result.add(cardName); + } + } + return result; + } + + private static String deriveFileName(final String deckName) { + // skips all but the listed characters + return deckName.replaceAll("[^-_$#@.{[()]} a-zA-Z0-9]", ""); + } + + // only accepts numbers, letters or dashes up to 20 characters in length + /** + * + * Clean deck name. + * + * @param in + * a String + * @return a String + */ + public static String cleanDeckName(final String in) { + final char[] c = in.toCharArray(); + final StringBuilder sb = new StringBuilder(); + for (int i = 0; (i < c.length) && (i < 20); i++) { + if (Character.isLetterOrDigit(c[i]) || (c[i] == '-')) { + sb.append(c[i]); + } + } + return sb.toString(); + } + + /** + * + * Make file name. + * + * @param deckName + * a String + * @param deckType + * a GameType + * @return a File + */ + public static File makeFileName(final String deckName, final GameType deckType) { + final File path = ForgeProps.getFile(NewConstants.NEW_DECKS); + if (deckType == GameType.Draft) { + return new File(path, deriveFileName(deckName) + ".bdk"); + } else { + return new File(path, deriveFileName(deckName) + ".dck"); + } + } + + /** + * + * Make file name. + * + * @param deck + * a Deck + * @return a File + */ + public static File makeFileName(final Deck deck) { + return makeFileName(deck.getName(), deck.getDeckType()); + } + + /** + * + * Write draft Decks. + * + * @param drafts + * a Deck[] + */ + public static void writeDraftDecks(final Deck[] drafts) { + final File f = makeFileName(drafts[0]); + f.mkdir(); + for (int i = 0; i < drafts.length; i++) { + FileUtil.writeFile(new File(f, i + ".dck"), serializeDeck(drafts[i])); + } + } + + /** + *

+ * writeDeck. + *

+ * + * @param d + * a {@link forge.deck.Deck} object. + * @param out + * a {@link java.io.BufferedWriter} object. + * @throws java.io.IOException + * if any. + */ + private static List serializeDeck(final Deck d) { + final List out = new ArrayList(); + out.add(String.format("[metadata]")); + + out.add(String.format("%s=%s", NAME, d.getName().replaceAll("\n", ""))); + out.add(String.format("%s=%s", DECK_TYPE, d.getDeckType())); + // these are optional + if (d.getComment() != null) { + out.add(String.format("%s=%s", COMMENT, d.getComment().replaceAll("\n", ""))); + } + if (d.getPlayerType() != null) { + out.add(String.format("%s=%s", PLAYER, d.getPlayerType())); + } + + if (d.isCustomPool()) { + out.add(String.format("%s=%s", CSTM_POOL, "true")); + } + + out.add(String.format("%s", "[main]")); + out.addAll(writeCardPool(d.getMain())); + + out.add(String.format("%s", "[sideboard]")); + out.addAll(writeCardPool(d.getSideboard())); + return out; + } + + /** + *

+ * writeDeck. + *

+ * + * @param d + * a {@link forge.deck.Deck} object. + * @param out + * a {@link java.io.BufferedWriter} object. + * @throws java.io.IOException + * if any. + */ + private static void writeDeckHtml(final Deck d, final BufferedWriter out) throws IOException { + Template temp = null; + final int cardBorder = 0; + final int height = 319; + final int width = 222; + + /* Create and adjust the configuration */ + final Configuration cfg = new Configuration(); + try { + cfg.setClassForTemplateLoading(d.getClass(), "/"); + cfg.setObjectWrapper(new DefaultObjectWrapper()); + + /* + * ------------------------------------------------------------------ + * - + */ + /* + * You usually do these for many times in the application + * life-cycle: + */ + + /* Get or create a template */ + temp = cfg.getTemplate("proxy-template.ftl"); + + /* Create a data-model */ + final Map root = new HashMap(); + root.put("title", d.getName()); + final List list = new ArrayList(); + for (final Card card : d.getMain().toForgeCardList().toArray()) { + // System.out.println(card.getSets().get(card.getSets().size() - + // 1).URL); + list.add(card.getSets().get(card.getSets().size() - 1).getUrl()); + } + /* + * List nameList = new ArrayList(); for (Card card : + * d.getMain().toForgeCardList().toArray()) { + * //System.out.println(card.getSets().get(card.getSets().size() - + * 1).URL); nameList.add(card.getName()); } + */ + + final TreeMap map = new TreeMap(); + for (final Entry entry : d.getMain().getOrderedList()) { + map.put(entry.getKey().getName(), entry.getValue()); + // System.out.println(entry.getValue() + " " + + // entry.getKey().getName()); + } + + root.put("urls", list); + root.put("cardBorder", cardBorder); + root.put("height", height); + root.put("width", width); + root.put("cardlistWidth", width - 11); + // root.put("nameList", nameList); + root.put("cardList", map); + + /* Merge data-model with template */ + // StringWriter sw = new StringWriter(); + temp.process(root, out); + out.flush(); + } catch (final IOException e) { + System.out.println(e.toString()); + } catch (final TemplateException e) { + System.out.println(e.toString()); + } + } + + private static List writeCardPool(final ItemPoolView pool) { + final List> main2sort = pool.getOrderedList(); + Collections.sort(main2sort, TableSorter.BY_NAME_THEN_SET); + final List out = new ArrayList(); + for (final Entry e : main2sort) { + final CardPrinted card = e.getKey(); + final boolean hasBadSetInfo = "???".equals(card.getSet()) || StringUtils.isBlank(card.getSet()); + if (hasBadSetInfo) { + out.add(String.format("%d %s", e.getValue(), card.getName())); + } else { + out.add(String.format("%d %s|%s", e.getValue(), card.getName(), card.getSet())); + } + } + return out; + } + + /** + *

+ * writeDeck. + *

+ * + * @param d + * a {@link forge.deck.Deck} object. + * @param f + * a {@link java.io.File} object. + */ + public static void writeDeck(final Deck d, final File f) { + FileUtil.writeFile(f, serializeDeck(d)); + } + + /** + *

+ * Write deck to HTML. + *

+ * + * @param d + * a {@link forge.deck.Deck} object. + * @param f + * a {@link java.io.File} object. + */ + public static void writeDeckHtml(final Deck d, final File f) { + try { + final BufferedWriter writer = new BufferedWriter(new FileWriter(f)); + writeDeckHtml(d, writer); + writer.close(); + } catch (final IOException e) { + throw new RuntimeException(e); + } + } + + /** + *

+ * readAllDecks. + *

+ * @return + */ + public final static Map readAllDecks(File deckDir) { + Map result = new HashMap(); + final List decksThatFailedToLoad = new ArrayList(); + File[] files = deckDir.listFiles(DeckIO.DCK_FILE_FILTER); + for (final File file : files) { + try { + final Deck newDeck = DeckIO.readDeck(file); + result.put(newDeck.getName(), newDeck); + } catch (final NoSuchElementException ex) { + final String message = String.format("%s failed to load because ---- %s", file.getName(), + ex.getMessage()); + decksThatFailedToLoad.add(message); + } + } + + if (!decksThatFailedToLoad.isEmpty()) { + JOptionPane.showMessageDialog(null, + StringUtils.join(decksThatFailedToLoad, System.getProperty("line.separator")), + "Some of your decks were not loaded.", JOptionPane.WARNING_MESSAGE); + } + + return result; + } + + public final static Map readAllDraftDecks(File deckDir) + { + Map result = new HashMap(); + File[] files = deckDir.listFiles(DeckIO.bdkFileFilter); + for (final File file : files) { + final Deck[] d = new Deck[8]; + + boolean gotError = false; + for (int i = 0; i < d.length; i++) { + d[i] = DeckIO.readDeck(new File(file, i + ".dck")); + if (d[i] == null) { + gotError = true; + break; + } + } + + if (!gotError) { + result.put(d[0].getName(), d); + } + } + return result; + } + +} diff --git a/src/main/java/forge/deck/DeckManager.java b/src/main/java/forge/deck/DeckManager.java index 476bd362e40..814772d8c6b 100644 --- a/src/main/java/forge/deck/DeckManager.java +++ b/src/main/java/forge/deck/DeckManager.java @@ -17,44 +17,18 @@ */ package forge.deck; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; -import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.NoSuchElementException; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; -import org.apache.commons.lang3.StringUtils; -import forge.Card; -import forge.PlayerType; import forge.error.ErrorViewer; import forge.game.GameType; -import forge.gui.deckeditor.TableSorter; -import forge.item.CardPrinted; -import forge.item.ItemPoolView; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import forge.util.FileUtil; -import forge.util.SectionUtil; -import freemarker.template.Configuration; -import freemarker.template.DefaultObjectWrapper; -import freemarker.template.Template; -import freemarker.template.TemplateException; //reads and writeDeck Deck objects /** @@ -66,55 +40,6 @@ import freemarker.template.TemplateException; * @version $Id$ */ public class DeckManager { - /** Constant BDKFileFilter. */ - private static FilenameFilter bdkFileFilter = new FilenameFilter() { - @Override - public boolean accept(final File dir, final String name) { - return name.endsWith(".bdk"); - } - }; - - /** Constant DCKFileFilter. */ - public static final FilenameFilter DCK_FILE_FILTER = new FilenameFilter() { - @Override - public boolean accept(final File dir, final String name) { - return name.endsWith(".dck"); - } - }; - - /** The Constant DCK_FILTER. */ - public static final FileFilter DCK_FILTER = new FileFilter() { - @Override - public boolean accept(final File f) { - return f.getName().endsWith(".dck") || f.isDirectory(); - } - - @Override - public String getDescription() { - return "Simple Deck File .dck"; - } - }; - - /** The Constant HTML_FILTER. */ - public static final FileFilter HTML_FILTER = new FileFilter() { - @Override - public boolean accept(final File f) { - return f.getName().endsWith(".html") || f.isDirectory(); - } - - @Override - public String getDescription() { - return "Simple Deck File .html"; - } - }; - - private static final String NAME = "Name"; - private static final String DECK_TYPE = "Deck Type"; - private static final String COMMENT = "Comment"; - private static final String PLAYER = "Player"; - private static final String CSTM_POOL = "Custom Pool"; - - private File deckDir; private Map deckMap; private Map draftMap; @@ -131,8 +56,6 @@ public class DeckManager { throw new IllegalArgumentException("No deck directory specified"); } try { - this.deckDir = deckDir; - if (deckDir.isFile()) { throw new IOException("Not a directory"); } else { @@ -140,9 +63,8 @@ public class DeckManager { if (!deckDir.isDirectory()) { throw new IOException("Directory can't be created"); } - this.deckMap = new HashMap(); - this.draftMap = new HashMap(); - this.readAllDecks(); + this.deckMap = DeckIO.readAllDecks(deckDir); + this.draftMap = DeckIO.readAllDraftDecks(deckDir); } } catch (final IOException ex) { ErrorViewer.showError(ex); @@ -343,429 +265,4 @@ public class DeckManager { Collections.sort(list); return list; } - - /** - *

- * readAllDecks. - *

- */ - public final void readAllDecks() { - this.deckMap.clear(); - this.draftMap.clear(); - - File[] files; - - final List decksThatFailedToLoad = new ArrayList(); - files = this.deckDir.listFiles(DeckManager.DCK_FILE_FILTER); - for (final File file : files) { - try { - final Deck newDeck = DeckManager.readDeck(file); - this.deckMap.put(newDeck.getName(), newDeck); - } catch (final NoSuchElementException ex) { - final String message = String.format("%s failed to load because ---- %s", file.getName(), - ex.getMessage()); - decksThatFailedToLoad.add(message); - } - } - - if (!decksThatFailedToLoad.isEmpty()) { - JOptionPane.showMessageDialog(null, - StringUtils.join(decksThatFailedToLoad, System.getProperty("line.separator")), - "Some of your decks were not loaded.", JOptionPane.WARNING_MESSAGE); - } - - files = this.deckDir.listFiles(DeckManager.bdkFileFilter); - for (final File file : files) { - final Deck[] d = new Deck[8]; - - boolean gotError = false; - for (int i = 0; i < d.length; i++) { - d[i] = DeckManager.readDeck(new File(file, i + ".dck")); - if (d[i] == null) { - gotError = true; - break; - } - } - - if (!gotError) { - this.draftMap.put(d[0].getName(), d); - } - } - } - - /** - *

- * readDeck. - *

- * - * @param deckFile - * a {@link java.io.File} object. - * @return a {@link forge.deck.Deck} object. - */ - public static Deck readDeck(final File deckFile) { - - final List lines = FileUtil.readFile(deckFile); - final Map> sections = SectionUtil.parseSections(lines); - if (sections.isEmpty()) { - return null; - } - - final Deck d = new Deck(); - - final String firstLine = lines.get(0); - if (!firstLine.startsWith("[") || firstLine.equalsIgnoreCase("[general]")) { - DeckManager.readDeckOldMetadata(lines.iterator(), d); - } else { - DeckManager.readDeckMetadata(sections.get("metadata"), d); - } - d.setMain(DeckManager.readCardList(sections.get("main"))); - d.setSideboard(DeckManager.readCardList(sections.get("sideboard"))); - - return d; - } - - private static void readDeckMetadata(final Iterable lines, final Deck d) { - if (lines == null) { - return; - } - final Iterator lineIterator = lines.iterator(); - while (lineIterator.hasNext()) { - final String line = lineIterator.next(); - - final String[] linedata = line.split("=", 2); - final String field = linedata[0].toLowerCase(); - String value = ""; - - if (linedata.length > 1) { - value = linedata[1]; - } - - if (DeckManager.NAME.equalsIgnoreCase(field)) { - d.setName(value); - - } else if (DeckManager.COMMENT.equalsIgnoreCase(field)) { - d.setComment(value); - - } else if (DeckManager.DECK_TYPE.equalsIgnoreCase(field)) { - d.setDeckType(GameType.smartValueOf(value)); - - } else if (DeckManager.CSTM_POOL.equalsIgnoreCase(field)) { - d.setCustomPool(value.equalsIgnoreCase("true")); - - } else if (DeckManager.PLAYER.equalsIgnoreCase(field)) { - if ("human".equalsIgnoreCase(value)) { - d.setPlayerType(PlayerType.HUMAN); - - } else { - d.setPlayerType(PlayerType.COMPUTER); - } - } - } - } - - /** - *

- * readDeckOld. - *

- * - * @param iterator - * a {@link java.util.ListIterator} object. - * @return a {@link forge.deck.Deck} object. - */ - private static void readDeckOldMetadata(final Iterator iterator, final Deck d) { - - String line; - // readDeck name - final String name = iterator.next(); - - // readDeck comments - String comment = null; - while (iterator.hasNext()) { - line = iterator.next(); - if ((line != null) && !line.equals("[general")) { - if (comment == null) { - comment = line; - } else { - comment += "\n" + line; - } - } - } - - // readDeck deck type - - final GameType deckType = iterator.hasNext() ? GameType.smartValueOf(iterator.next()) : GameType.Constructed; - - d.setName(name); - d.setComment(comment); - d.setDeckType(deckType); - } - - // Precondition: iterator should point at the first line of cards list - private static List readCardList(final Iterable lines) { - final List result = new ArrayList(); - final Pattern p = Pattern.compile("((\\d+)\\s+)?(.*?)"); - - if (lines == null) { - return result; - } - - final Iterator lineIterator = lines.iterator(); - while (lineIterator.hasNext()) { - final String line = lineIterator.next(); - if (line.startsWith("[")) { - break; - } // there comes another section - - final Matcher m = p.matcher(line.trim()); - m.matches(); - final String sCnt = m.group(2); - final String cardName = m.group(3); - if (StringUtils.isBlank(cardName)) { - continue; - } - - final int count = sCnt == null ? 1 : Integer.parseInt(sCnt); - for (int i = 0; i < count; i++) { - result.add(cardName); - } - } - return result; - } - - private static String deriveFileName(final String deckName) { - // skips all but the listed characters - return deckName.replaceAll("[^-_$#@.{[()]} a-zA-Z0-9]", ""); - } - - // only accepts numbers, letters or dashes up to 20 characters in length - /** - * - * Clean deck name. - * - * @param in - * a String - * @return a String - */ - public static String cleanDeckName(final String in) { - final char[] c = in.toCharArray(); - final StringBuilder sb = new StringBuilder(); - for (int i = 0; (i < c.length) && (i < 20); i++) { - if (Character.isLetterOrDigit(c[i]) || (c[i] == '-')) { - sb.append(c[i]); - } - } - return sb.toString(); - } - - /** - * - * Make file name. - * - * @param deckName - * a String - * @param deckType - * a GameType - * @return a File - */ - public static File makeFileName(final String deckName, final GameType deckType) { - final File path = ForgeProps.getFile(NewConstants.NEW_DECKS); - if (deckType == GameType.Draft) { - return new File(path, DeckManager.deriveFileName(deckName) + ".bdk"); - } else { - return new File(path, DeckManager.deriveFileName(deckName) + ".dck"); - } - } - - /** - * - * Make file name. - * - * @param deck - * a Deck - * @return a File - */ - public static File makeFileName(final Deck deck) { - return DeckManager.makeFileName(deck.getName(), deck.getDeckType()); - } - - /** - * - * Write draft Decks. - * - * @param drafts - * a Deck[] - */ - public static void writeDraftDecks(final Deck[] drafts) { - final File f = DeckManager.makeFileName(drafts[0]); - f.mkdir(); - for (int i = 0; i < drafts.length; i++) { - FileUtil.writeFile(new File(f, i + ".dck"), DeckManager.serializeDeck(drafts[i])); - } - } - - /** - *

- * writeDeck. - *

- * - * @param d - * a {@link forge.deck.Deck} object. - * @param out - * a {@link java.io.BufferedWriter} object. - * @throws java.io.IOException - * if any. - */ - private static List serializeDeck(final Deck d) { - final List out = new ArrayList(); - out.add(String.format("[metadata]")); - - out.add(String.format("%s=%s", DeckManager.NAME, d.getName().replaceAll("\n", ""))); - out.add(String.format("%s=%s", DeckManager.DECK_TYPE, d.getDeckType())); - // these are optional - if (d.getComment() != null) { - out.add(String.format("%s=%s", DeckManager.COMMENT, d.getComment().replaceAll("\n", ""))); - } - if (d.getPlayerType() != null) { - out.add(String.format("%s=%s", DeckManager.PLAYER, d.getPlayerType())); - } - - if (d.isCustomPool()) { - out.add(String.format("%s=%s", DeckManager.CSTM_POOL, "true")); - } - - out.add(String.format("%s", "[main]")); - out.addAll(DeckManager.writeCardPool(d.getMain())); - - out.add(String.format("%s", "[sideboard]")); - out.addAll(DeckManager.writeCardPool(d.getSideboard())); - return out; - } - - /** - *

- * writeDeck. - *

- * - * @param d - * a {@link forge.deck.Deck} object. - * @param out - * a {@link java.io.BufferedWriter} object. - * @throws java.io.IOException - * if any. - */ - private static void writeDeckHtml(final Deck d, final BufferedWriter out) throws IOException { - Template temp = null; - final int cardBorder = 0; - final int height = 319; - final int width = 222; - - /* Create and adjust the configuration */ - final Configuration cfg = new Configuration(); - try { - cfg.setClassForTemplateLoading(d.getClass(), "/"); - cfg.setObjectWrapper(new DefaultObjectWrapper()); - - /* - * ------------------------------------------------------------------ - * - - */ - /* - * You usually do these for many times in the application - * life-cycle: - */ - - /* Get or create a template */ - temp = cfg.getTemplate("proxy-template.ftl"); - - /* Create a data-model */ - final Map root = new HashMap(); - root.put("title", d.getName()); - final List list = new ArrayList(); - for (final Card card : d.getMain().toForgeCardList().toArray()) { - // System.out.println(card.getSets().get(card.getSets().size() - - // 1).URL); - list.add(card.getSets().get(card.getSets().size() - 1).getUrl()); - } - /* - * List nameList = new ArrayList(); for (Card card : - * d.getMain().toForgeCardList().toArray()) { - * //System.out.println(card.getSets().get(card.getSets().size() - - * 1).URL); nameList.add(card.getName()); } - */ - - final TreeMap map = new TreeMap(); - for (final Entry entry : d.getMain().getOrderedList()) { - map.put(entry.getKey().getName(), entry.getValue()); - // System.out.println(entry.getValue() + " " + - // entry.getKey().getName()); - } - - root.put("urls", list); - root.put("cardBorder", cardBorder); - root.put("height", height); - root.put("width", width); - root.put("cardlistWidth", width - 11); - // root.put("nameList", nameList); - root.put("cardList", map); - - /* Merge data-model with template */ - // StringWriter sw = new StringWriter(); - temp.process(root, out); - out.flush(); - } catch (final IOException e) { - System.out.println(e.toString()); - } catch (final TemplateException e) { - System.out.println(e.toString()); - } - } - - private static List writeCardPool(final ItemPoolView pool) { - final List> main2sort = pool.getOrderedList(); - Collections.sort(main2sort, TableSorter.BY_NAME_THEN_SET); - final List out = new ArrayList(); - for (final Entry e : main2sort) { - final CardPrinted card = e.getKey(); - final boolean hasBadSetInfo = "???".equals(card.getSet()) || StringUtils.isBlank(card.getSet()); - if (hasBadSetInfo) { - out.add(String.format("%d %s", e.getValue(), card.getName())); - } else { - out.add(String.format("%d %s|%s", e.getValue(), card.getName(), card.getSet())); - } - } - return out; - } - - /** - *

- * writeDeck. - *

- * - * @param d - * a {@link forge.deck.Deck} object. - * @param f - * a {@link java.io.File} object. - */ - public static void writeDeck(final Deck d, final File f) { - FileUtil.writeFile(f, DeckManager.serializeDeck(d)); - } - - /** - *

- * Write deck to HTML. - *

- * - * @param d - * a {@link forge.deck.Deck} object. - * @param f - * a {@link java.io.File} object. - */ - public static void writeDeckHtml(final Deck d, final File f) { - try { - final BufferedWriter writer = new BufferedWriter(new FileWriter(f)); - DeckManager.writeDeckHtml(d, writer); - writer.close(); - } catch (final IOException e) { - throw new RuntimeException(e); - } - } } diff --git a/src/main/java/forge/game/limited/BoosterDraft.java b/src/main/java/forge/game/limited/BoosterDraft.java index 9c24ed7655b..8a6deabf842 100644 --- a/src/main/java/forge/game/limited/BoosterDraft.java +++ b/src/main/java/forge/game/limited/BoosterDraft.java @@ -19,8 +19,10 @@ package forge.game.limited; import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.NoSuchElementException; import java.util.TreeMap; @@ -29,8 +31,6 @@ import javax.swing.JOptionPane; import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.maxmtg.Closure1; -import org.apache.commons.lang3.ArrayUtils; - import forge.AllZone; import forge.Card; import forge.CardList; @@ -361,12 +361,10 @@ public final class BoosterDraft implements IBoosterDraft { if (this.draftPicks.size() > 1) { final ArrayList outDraftData = new ArrayList(); - final String[] keys = this.draftPicks.keySet().toArray(ArrayUtils.EMPTY_STRING_ARRAY); - - for (final String key : keys) { - outDraftData.add(key + "|" + this.draftPicks.get(key)); + for (final Entry key : this.draftPicks.entrySet()) { + outDraftData.add(key.getValue() + "|" + key.getKey()); } - + Collections.sort(outDraftData); FileUtil.writeFile("res/draft/tmpDraftData.txt", outDraftData); final HttpUtil poster = new HttpUtil(); diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorCommonMenu.java b/src/main/java/forge/gui/deckeditor/DeckEditorCommonMenu.java index ec4eebddd98..72196a809bd 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorCommonMenu.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorCommonMenu.java @@ -39,6 +39,7 @@ import forge.Card; import forge.CardList; import forge.Command; import forge.deck.Deck; +import forge.deck.DeckIO; import forge.deck.DeckManager; import forge.deck.generate.GenerateConstructedDeck; import forge.error.ErrorViewer; @@ -231,7 +232,7 @@ public final class DeckEditorCommonMenu extends JMenuBar { private File getImportFilename() { final JFileChooser chooser = new JFileChooser(DeckEditorCommonMenu.previousDirectory); - chooser.addChoosableFileFilter(DeckManager.DCK_FILTER); + chooser.addChoosableFileFilter(DeckIO.DCK_FILTER); final int returnVal = chooser.showOpenDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) { @@ -260,7 +261,7 @@ public final class DeckEditorCommonMenu extends JMenuBar { srcChannel.close(); dstChannel.close(); - final Deck newDeck = DeckManager.readDeck(file); + final Deck newDeck = DeckIO.readDeck(file); this.deckManager.addDeck(newDeck); this.showDeck(newDeck, newDeck.getDeckType()); @@ -285,7 +286,7 @@ public final class DeckEditorCommonMenu extends JMenuBar { final Deck deck = this.getDeck(); try { - DeckManager.writeDeck(deck, filename); + DeckIO.writeDeck(deck, filename); } catch (final Exception ex) { ErrorViewer.showError(ex); throw new RuntimeException("Gui_DeckEditor_Menu : exportDeck() error, " + ex); @@ -296,7 +297,7 @@ public final class DeckEditorCommonMenu extends JMenuBar { final JFileChooser save = new JFileChooser(DeckEditorCommonMenu.previousDirectory); save.setDialogTitle("Export Deck Filename"); save.setDialogType(JFileChooser.SAVE_DIALOG); - save.setFileFilter(DeckManager.DCK_FILTER); + save.setFileFilter(DeckIO.DCK_FILTER); if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { final File file = save.getSelectedFile(); @@ -322,7 +323,7 @@ public final class DeckEditorCommonMenu extends JMenuBar { final Deck deck = this.getDeck(); try { - DeckManager.writeDeckHtml(deck, filename); + DeckIO.writeDeckHtml(deck, filename); } catch (final Exception ex) { ErrorViewer.showError(ex); throw new RuntimeException("Gui_DeckEditor_Menu : printProxies() error, " + ex); @@ -333,7 +334,7 @@ public final class DeckEditorCommonMenu extends JMenuBar { final JFileChooser save = new JFileChooser(DeckEditorCommonMenu.previousDirectory); save.setDialogTitle("Proxy HTML Filename"); save.setDialogType(JFileChooser.SAVE_DIALOG); - save.setFileFilter(DeckManager.HTML_FILTER); + save.setFileFilter(DeckIO.HTML_FILTER); if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { final File file = save.getSelectedFile(); @@ -394,11 +395,11 @@ public final class DeckEditorCommonMenu extends JMenuBar { final Deck[] all = this.deckManager.getDraftDeck(this.currentDeckName); all[0] = deck; this.deckManager.addDraftDeck(all); - DeckManager.writeDraftDecks(all); + DeckIO.writeDraftDecks(all); } else { // constructed or sealed this.setDeckData(this.currentDeckName, true); this.deckManager.addDeck(deck); - DeckManager.writeDeck(deck, DeckManager.makeFileName(deck)); + DeckIO.writeDeck(deck, DeckIO.makeFileName(deck)); } this.isDeckSaved = true; } @@ -421,10 +422,10 @@ public final class DeckEditorCommonMenu extends JMenuBar { all[0] = deck; this.deckManager.addDraftDeck(all); - DeckManager.writeDraftDecks(all); + DeckIO.writeDraftDecks(all); } else { // constructed and sealed this.deckManager.addDeck(deck); - DeckManager.writeDeck(deck, DeckManager.makeFileName(deck)); + DeckIO.writeDeck(deck, DeckIO.makeFileName(deck)); } this.isDeckSaved = true; } @@ -480,7 +481,7 @@ public final class DeckEditorCommonMenu extends JMenuBar { final Deck deck = this.getDeck(); deck.setName(this.currentDeckName); - DeckManager.writeDeck(deck, DeckManager.makeFileName(deck)); + DeckIO.writeDeck(deck, DeckIO.makeFileName(deck)); return true; } @@ -531,7 +532,7 @@ public final class DeckEditorCommonMenu extends JMenuBar { return ""; } - final String deckName = DeckManager.cleanDeckName(o.toString()); + final String deckName = DeckIO.cleanDeckName(o.toString()); final boolean isDraft = this.deckDisplay.getGameType() == GameType.Draft; final boolean isUniqueName = isDraft ? this.deckManager.isUniqueDraft(deckName) : this.deckManager .isUnique(deckName); diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorDraft.java b/src/main/java/forge/gui/deckeditor/DeckEditorDraft.java index 917b0cb2921..046b2b58499 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorDraft.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorDraft.java @@ -41,6 +41,7 @@ import forge.AllZone; import forge.Constant; import forge.control.FControl; import forge.deck.Deck; +import forge.deck.DeckIO; import forge.deck.DeckManager; import forge.error.ErrorViewer; import forge.game.GameType; @@ -348,7 +349,7 @@ public class DeckEditorDraft extends DeckEditorBase { deckManager.addDraftDeck(all); // write file - DeckManager.writeDraftDecks(all); + DeckIO.writeDraftDecks(all); // close and open next screen this.dispose(); diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java b/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java index e1e2d82acf5..84367de04f8 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java @@ -42,7 +42,7 @@ import forge.Command; import forge.Constant; import forge.card.CardRules; import forge.deck.Deck; -import forge.deck.DeckManager; +import forge.deck.DeckIO; import forge.error.ErrorViewer; import forge.game.GameType; import forge.gui.GuiUtils; @@ -317,7 +317,7 @@ public class DeckEditorQuestMenu extends JMenuBar { if (file == null) { } else if (file.getName().endsWith(".dck")) { try { - final Deck newDeck = DeckManager.readDeck(file); + final Deck newDeck = DeckIO.readDeck(file); this.questData.addDeck(newDeck); final ItemPool cardpool = ItemPool.createFrom(this.questData.getCards().getCardpool(), diff --git a/src/main/java/forge/quest/gui/main/QuestEventManager.java b/src/main/java/forge/quest/gui/main/QuestEventManager.java index b25345b8ff1..c0f9050c4b4 100644 --- a/src/main/java/forge/quest/gui/main/QuestEventManager.java +++ b/src/main/java/forge/quest/gui/main/QuestEventManager.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Random; import forge.AllZone; +import forge.deck.DeckIO; import forge.deck.DeckManager; import forge.properties.ForgeProps; import forge.properties.NewConstants; @@ -78,7 +79,7 @@ public class QuestEventManager { final DeckManager manager = new DeckManager(file); - final File[] allFiles = ForgeProps.getFile(NewConstants.Quest.DECKS).listFiles(DeckManager.DCK_FILE_FILTER); + final File[] allFiles = ForgeProps.getFile(NewConstants.Quest.DECKS).listFiles(DeckIO.DCK_FILE_FILTER); for (final File f : allFiles) { contents = FileUtil.readFile(f); diff --git a/src/main/java/forge/view/toolbox/DeckLister.java b/src/main/java/forge/view/toolbox/DeckLister.java index abfc9bd49bb..c9f4ce40745 100644 --- a/src/main/java/forge/view/toolbox/DeckLister.java +++ b/src/main/java/forge/view/toolbox/DeckLister.java @@ -20,6 +20,7 @@ import forge.AllZone; import forge.Command; import forge.Singletons; import forge.deck.Deck; +import forge.deck.DeckIO; import forge.deck.DeckManager; import forge.game.GameType; import forge.gui.deckeditor.DeckEditorCommon; @@ -298,7 +299,7 @@ public class DeckLister extends JPanel { deckmanager.deleteDraftDeck(d0.getName()); // Since draft deck files are really directories, must delete all children first. - File dir = DeckManager.makeFileName(d0.getName(), GameType.Draft); + File dir = DeckIO.makeFileName(d0.getName(), GameType.Draft); String[] children = dir.list(); for (int i = 0; i < children.length; i++) { @@ -310,8 +311,8 @@ public class DeckLister extends JPanel { else if (gametype.equals(GameType.Sealed)) { deckmanager.deleteDeck(d0.getName()); - File address1 = DeckManager.makeFileName(d0.getName(), GameType.Sealed); - File address2 = DeckManager.makeFileName("AI_" + d0.getName(), GameType.Sealed); + File address1 = DeckIO.makeFileName(d0.getName(), GameType.Sealed); + File address2 = DeckIO.makeFileName("AI_" + d0.getName(), GameType.Sealed); // not working??!! address1.delete(); @@ -320,7 +321,7 @@ public class DeckLister extends JPanel { else { deckmanager.deleteDeck(d0.getName()); - File address1 = DeckManager.makeFileName(d0.getName(), GameType.Constructed); + File address1 = DeckIO.makeFileName(d0.getName(), GameType.Constructed); address1.delete(); }