Decks save/load operations moved to DeckIO class, references updated

This commit is contained in:
Maxmtg
2012-01-27 20:46:27 +00:00
parent fa9f00ca50
commit 2f0d95cf9b
10 changed files with 552 additions and 533 deletions

1
.gitattributes vendored
View File

@@ -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

View File

@@ -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);
}

View File

@@ -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 <code>BDKFileFilter</code>. */
static FilenameFilter bdkFileFilter = new FilenameFilter() {
@Override
public boolean accept(final File dir, final String name) {
return name.endsWith(".bdk");
}
};
/** Constant <code>DCKFileFilter</code>. */
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";
}
};
/**
* <p>
* readDeck.
* </p>
*
* @param deckFile
* a {@link java.io.File} object.
* @return a {@link forge.deck.Deck} object.
*/
public static Deck readDeck(final File deckFile) {
final List<String> lines = FileUtil.readFile(deckFile);
final Map<String, List<String>> 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<String> lines, final Deck d) {
if (lines == null) {
return;
}
final Iterator<String> 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);
}
}
}
}
/**
* <p>
* readDeckOld.
* </p>
*
* @param iterator
* a {@link java.util.ListIterator} object.
* @return a {@link forge.deck.Deck} object.
*/
private static void readDeckOldMetadata(final Iterator<String> 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<String> readCardList(final Iterable<String> lines) {
final List<String> result = new ArrayList<String>();
final Pattern p = Pattern.compile("((\\d+)\\s+)?(.*?)");
if (lines == null) {
return result;
}
final Iterator<String> 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]));
}
}
/**
* <p>
* writeDeck.
* </p>
*
* @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<String> serializeDeck(final Deck d) {
final List<String> out = new ArrayList<String>();
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;
}
/**
* <p>
* writeDeck.
* </p>
*
* @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<String, Object> root = new HashMap<String, Object>();
root.put("title", d.getName());
final List<String> list = new ArrayList<String>();
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<String> nameList = new ArrayList<String>(); for (Card card :
* d.getMain().toForgeCardList().toArray()) {
* //System.out.println(card.getSets().get(card.getSets().size() -
* 1).URL); nameList.add(card.getName()); }
*/
final TreeMap<String, Integer> map = new TreeMap<String, Integer>();
for (final Entry<CardPrinted, Integer> 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<String> writeCardPool(final ItemPoolView<CardPrinted> pool) {
final List<Entry<CardPrinted, Integer>> main2sort = pool.getOrderedList();
Collections.sort(main2sort, TableSorter.BY_NAME_THEN_SET);
final List<String> out = new ArrayList<String>();
for (final Entry<CardPrinted, Integer> 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;
}
/**
* <p>
* writeDeck.
* </p>
*
* @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));
}
/**
* <p>
* Write deck to HTML.
* </p>
*
* @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);
}
}
/**
* <p>
* readAllDecks.
* </p>
* @return
*/
public final static Map<String, Deck> readAllDecks(File deckDir) {
Map<String, Deck> result = new HashMap<String, Deck>();
final List<String> decksThatFailedToLoad = new ArrayList<String>();
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<String, Deck[]> readAllDraftDecks(File deckDir)
{
Map<String, Deck[]> result = new HashMap<String, Deck[]>();
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;
}
}

View File

@@ -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 <code>BDKFileFilter</code>. */
private static FilenameFilter bdkFileFilter = new FilenameFilter() {
@Override
public boolean accept(final File dir, final String name) {
return name.endsWith(".bdk");
}
};
/** Constant <code>DCKFileFilter</code>. */
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<String, Deck> deckMap;
private Map<String, Deck[]> 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<String, Deck>();
this.draftMap = new HashMap<String, Deck[]>();
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;
}
/**
* <p>
* readAllDecks.
* </p>
*/
public final void readAllDecks() {
this.deckMap.clear();
this.draftMap.clear();
File[] files;
final List<String> decksThatFailedToLoad = new ArrayList<String>();
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);
}
}
}
/**
* <p>
* readDeck.
* </p>
*
* @param deckFile
* a {@link java.io.File} object.
* @return a {@link forge.deck.Deck} object.
*/
public static Deck readDeck(final File deckFile) {
final List<String> lines = FileUtil.readFile(deckFile);
final Map<String, List<String>> 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<String> lines, final Deck d) {
if (lines == null) {
return;
}
final Iterator<String> 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);
}
}
}
}
/**
* <p>
* readDeckOld.
* </p>
*
* @param iterator
* a {@link java.util.ListIterator} object.
* @return a {@link forge.deck.Deck} object.
*/
private static void readDeckOldMetadata(final Iterator<String> 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<String> readCardList(final Iterable<String> lines) {
final List<String> result = new ArrayList<String>();
final Pattern p = Pattern.compile("((\\d+)\\s+)?(.*?)");
if (lines == null) {
return result;
}
final Iterator<String> 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]));
}
}
/**
* <p>
* writeDeck.
* </p>
*
* @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<String> serializeDeck(final Deck d) {
final List<String> out = new ArrayList<String>();
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;
}
/**
* <p>
* writeDeck.
* </p>
*
* @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<String, Object> root = new HashMap<String, Object>();
root.put("title", d.getName());
final List<String> list = new ArrayList<String>();
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<String> nameList = new ArrayList<String>(); for (Card card :
* d.getMain().toForgeCardList().toArray()) {
* //System.out.println(card.getSets().get(card.getSets().size() -
* 1).URL); nameList.add(card.getName()); }
*/
final TreeMap<String, Integer> map = new TreeMap<String, Integer>();
for (final Entry<CardPrinted, Integer> 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<String> writeCardPool(final ItemPoolView<CardPrinted> pool) {
final List<Entry<CardPrinted, Integer>> main2sort = pool.getOrderedList();
Collections.sort(main2sort, TableSorter.BY_NAME_THEN_SET);
final List<String> out = new ArrayList<String>();
for (final Entry<CardPrinted, Integer> 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;
}
/**
* <p>
* writeDeck.
* </p>
*
* @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));
}
/**
* <p>
* Write deck to HTML.
* </p>
*
* @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);
}
}
}

View File

@@ -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<String> outDraftData = new ArrayList<String>();
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<String, Float> 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();

View File

@@ -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);

View File

@@ -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();

View File

@@ -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<CardPrinted> cardpool = ItemPool.createFrom(this.questData.getCards().getCardpool(),

View File

@@ -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);

View File

@@ -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();
}