DeckIOCore.java removed, moved non-game related classes to util

This commit is contained in:
Maxmtg
2012-02-17 23:33:53 +00:00
parent b90ef917d9
commit ec2c5ec37c
32 changed files with 219 additions and 336 deletions

15
.gitattributes vendored
View File

@@ -11206,10 +11206,6 @@ src/main/java/forge/deck/DeckBase.java -text
src/main/java/forge/deck/DeckRecognizer.java -text src/main/java/forge/deck/DeckRecognizer.java -text
src/main/java/forge/deck/DeckSection.java -text src/main/java/forge/deck/DeckSection.java -text
src/main/java/forge/deck/DeckSet.java -text src/main/java/forge/deck/DeckSet.java -text
src/main/java/forge/deck/FolderMap.java svneol=native#text/plain
src/main/java/forge/deck/FolderMapView.java -text
src/main/java/forge/deck/IFolderMap.java -text
src/main/java/forge/deck/IFolderMapView.java -text
src/main/java/forge/deck/OldDeckParser.java -text src/main/java/forge/deck/OldDeckParser.java -text
src/main/java/forge/deck/generate/DeckGenerator.java -text src/main/java/forge/deck/generate/DeckGenerator.java -text
src/main/java/forge/deck/generate/Generate2ColorDeck.java svneol=native#text/plain src/main/java/forge/deck/generate/Generate2ColorDeck.java svneol=native#text/plain
@@ -11222,12 +11218,9 @@ src/main/java/forge/deck/generate/GenerateThemeDeck.java svneol=native#text/plai
src/main/java/forge/deck/generate/package-info.java svneol=native#text/plain src/main/java/forge/deck/generate/package-info.java svneol=native#text/plain
src/main/java/forge/deck/io/CubeSerializer.java -text src/main/java/forge/deck/io/CubeSerializer.java -text
src/main/java/forge/deck/io/DeckFileHeader.java -text src/main/java/forge/deck/io/DeckFileHeader.java -text
src/main/java/forge/deck/io/DeckIOCore.java -text
src/main/java/forge/deck/io/DeckSerializer.java -text src/main/java/forge/deck/io/DeckSerializer.java -text
src/main/java/forge/deck/io/DeckSerializerBase.java -text src/main/java/forge/deck/io/DeckSerializerBase.java -text
src/main/java/forge/deck/io/DeckSetSerializer.java -text src/main/java/forge/deck/io/DeckSetSerializer.java -text
src/main/java/forge/deck/io/IDeckReader.java -text
src/main/java/forge/deck/io/IDeckSerializer.java -text
src/main/java/forge/deck/package-info.java svneol=native#text/plain src/main/java/forge/deck/package-info.java svneol=native#text/plain
src/main/java/forge/error/BugzReporter.java svneol=native#text/plain src/main/java/forge/error/BugzReporter.java svneol=native#text/plain
src/main/java/forge/error/ErrorViewer.java svneol=native#text/plain src/main/java/forge/error/ErrorViewer.java svneol=native#text/plain
@@ -11295,7 +11288,6 @@ src/main/java/forge/item/BoosterPack.java -text
src/main/java/forge/item/CardDb.java -text src/main/java/forge/item/CardDb.java -text
src/main/java/forge/item/CardPrinted.java -text src/main/java/forge/item/CardPrinted.java -text
src/main/java/forge/item/CardPrintedCharacteristics.java -text src/main/java/forge/item/CardPrintedCharacteristics.java -text
src/main/java/forge/item/IHasName.java -text
src/main/java/forge/item/InventoryItem.java -text src/main/java/forge/item/InventoryItem.java -text
src/main/java/forge/item/InventoryItemFromSet.java -text src/main/java/forge/item/InventoryItemFromSet.java -text
src/main/java/forge/item/ItemPool.java -text src/main/java/forge/item/ItemPool.java -text
@@ -11355,7 +11347,14 @@ src/main/java/forge/util/Base64Coder.java svneol=native#text/plain
src/main/java/forge/util/CopyFiles.java svneol=native#text/plain src/main/java/forge/util/CopyFiles.java svneol=native#text/plain
src/main/java/forge/util/FileFinder.java svneol=native#text/plain src/main/java/forge/util/FileFinder.java svneol=native#text/plain
src/main/java/forge/util/FileUtil.java svneol=native#text/plain src/main/java/forge/util/FileUtil.java svneol=native#text/plain
src/main/java/forge/util/FolderMap.java svneol=native#text/plain
src/main/java/forge/util/FolderMapView.java -text
src/main/java/forge/util/HttpUtil.java svneol=native#text/plain src/main/java/forge/util/HttpUtil.java svneol=native#text/plain
src/main/java/forge/util/IFolderMap.java -text
src/main/java/forge/util/IFolderMapView.java -text
src/main/java/forge/util/IHasName.java -text
src/main/java/forge/util/IItemReader.java -text
src/main/java/forge/util/IItemSerializer.java -text
src/main/java/forge/util/MyRandom.java svneol=native#text/plain src/main/java/forge/util/MyRandom.java svneol=native#text/plain
src/main/java/forge/util/SectionUtil.java -text src/main/java/forge/util/SectionUtil.java -text
src/main/java/forge/util/package-info.java -text src/main/java/forge/util/package-info.java -text

View File

@@ -5,6 +5,8 @@ import java.io.File;
import forge.deck.io.CubeSerializer; import forge.deck.io.CubeSerializer;
import forge.deck.io.DeckSerializer; import forge.deck.io.DeckSerializer;
import forge.deck.io.DeckSetSerializer; import forge.deck.io.DeckSetSerializer;
import forge.util.FolderMap;
import forge.util.IFolderMap;
/** /**

View File

@@ -17,11 +17,27 @@
*/ */
package forge.deck; package forge.deck;
import java.io.File;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import forge.deck.io.DeckFileHeader;
import forge.deck.io.DeckSerializer;
import forge.gui.deckeditor.elements.TableSorter;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.item.IHasName;
import forge.item.ItemPoolView; import forge.item.ItemPoolView;
import forge.util.FileUtil;
import forge.util.IHasName;
import forge.util.SectionUtil;
/** /**
* <p> * <p>
@@ -121,4 +137,110 @@ public class Deck extends DeckBase implements Serializable, IHasName {
protected DeckBase newInstance(String name0) { protected DeckBase newInstance(String name0) {
return new Deck(name0); return new Deck(name0);
} }
public static Deck fromFile(final File deckFile) {
return fromLines(FileUtil.readFile(deckFile));
}
public static Deck fromLines(final List<String> deckFileLines) {
return Deck.fromSections(SectionUtil.parseSections(deckFileLines));
}
public static Deck fromSections(Map<String, List<String>> sections) {
if (sections.isEmpty()) {
return null;
}
DeckFileHeader dh = DeckSerializer.readDeckMetadata(sections);
final Deck d = new Deck(dh.getName());
d.setComment(dh.getComment());
d.getMain().set(readCardList(sections.get("main")));
d.getSideboard().set(readCardList(sections.get("sideboard")));
return d;
}
private static List<String> readCardList(final List<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 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 out
* a {@link java.io.BufferedWriter} object.
* @throws java.io.IOException
* if any.
*/
public List<String> save() {
final List<String> out = new ArrayList<String>();
out.add(String.format("[metadata]"));
out.add(String.format("%s=%s", DeckFileHeader.NAME, getName().replaceAll("\n", "")));
// these are optional
if (getComment() != null) {
out.add(String.format("%s=%s", DeckFileHeader.COMMENT, getComment().replaceAll("\n", "")));
}
out.add(String.format("%s", "[main]"));
out.addAll(writeCardPool(getMain()));
out.add(String.format("%s", "[sideboard]"));
out.addAll(writeCardPool(getSideboard()));
return out;
}
} }

View File

@@ -2,8 +2,8 @@ package forge.deck;
import java.io.Serializable; import java.io.Serializable;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.item.IHasName;
import forge.item.ItemPoolView; import forge.item.ItemPoolView;
import forge.util.IHasName;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.

View File

@@ -4,8 +4,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.item.IHasName;
import forge.item.ItemPoolView; import forge.item.ItemPoolView;
import forge.util.IHasName;
/** /**

View File

@@ -15,9 +15,10 @@ import org.apache.commons.lang3.tuple.Pair;
import forge.PlayerType; import forge.PlayerType;
import forge.deck.io.DeckFileHeader; import forge.deck.io.DeckFileHeader;
import forge.deck.io.DeckIOCore; import forge.deck.io.DeckSerializer;
import forge.deck.io.DeckSetSerializer; import forge.deck.io.DeckSetSerializer;
import forge.util.FileUtil; import forge.util.FileUtil;
import forge.util.IFolderMap;
import forge.util.SectionUtil; import forge.util.SectionUtil;
/** /**
@@ -85,13 +86,13 @@ public class OldDeckParser {
for( File f : deckDir.listFiles(bdkFileFilter)) for( File f : deckDir.listFiles(bdkFileFilter))
{ {
boolean gotError = false; boolean gotError = false;
Deck human = DeckIOCore.readDeck(new File(f, "0.dck")); Deck human = Deck.fromFile(new File(f, "0.dck"));
final DeckSet d = new DeckSet(human.getName()); final DeckSet d = new DeckSet(human.getName());
d.setHumanDeck(human); d.setHumanDeck(human);
for (int i = 1; i < DeckSetSerializer.MAX_DRAFT_PLAYERS; i++) { for (int i = 1; i < DeckSetSerializer.MAX_DRAFT_PLAYERS; i++) {
Deck nextAi = DeckIOCore.readDeck(new File(f, i + ".dck")); Deck nextAi = Deck.fromFile(new File(f, i + ".dck"));
if (nextAi == null) { if (nextAi == null) {
gotError = true; gotError = true;
break; break;
@@ -121,20 +122,20 @@ public class OldDeckParser {
boolean allowDeleteUnsupportedConstructed = false; boolean allowDeleteUnsupportedConstructed = false;
Map<String, Pair<DeckSet, MutablePair<File,File>>> sealedDecks = new TreeMap<String, Pair<DeckSet, MutablePair<File,File>>>(String.CASE_INSENSITIVE_ORDER); Map<String, Pair<DeckSet, MutablePair<File,File>>> sealedDecks = new TreeMap<String, Pair<DeckSet, MutablePair<File,File>>>(String.CASE_INSENSITIVE_ORDER);
for( File f : deckDir.listFiles(DeckIOCore.DCK_FILE_FILTER)) for( File f : deckDir.listFiles(DeckSerializer.DCK_FILE_FILTER))
{ {
boolean importedOk = false; boolean importedOk = false;
List<String> fileLines = FileUtil.readFile(f); List<String> fileLines = FileUtil.readFile(f);
Map<String, List<String>> sections = SectionUtil.parseSections(fileLines); Map<String, List<String>> sections = SectionUtil.parseSections(fileLines);
DeckFileHeader dh = DeckIOCore.readDeckMetadata(sections); DeckFileHeader dh = DeckSerializer.readDeckMetadata(sections);
String name = dh.getName(); String name = dh.getName();
if ( dh.isCustomPool() ) { continue; } if ( dh.isCustomPool() ) { continue; }
switch(dh.getDeckType()) { switch(dh.getDeckType()) {
case Constructed: case Constructed:
try { try {
constructed.add(DeckIOCore.readDeck(fileLines)); constructed.add(Deck.fromLines(fileLines));
importedOk = true; importedOk = true;
} catch( NoSuchElementException ex) { } catch( NoSuchElementException ex) {
if( !allowDeleteUnsupportedConstructed ) { if( !allowDeleteUnsupportedConstructed ) {
@@ -154,7 +155,7 @@ public class OldDeckParser {
if( null == stored ) if( null == stored )
stored = ImmutablePair.of(new DeckSet(name), MutablePair.of((File)null, (File)null)); stored = ImmutablePair.of(new DeckSet(name), MutablePair.of((File)null, (File)null));
Deck deck = DeckIOCore.readDeck(fileLines); Deck deck = Deck.fromLines(fileLines);
if( isAi ) { if( isAi ) {
stored.getLeft().addAiDeck(deck); stored.getLeft().addAiDeck(deck);
stored.getRight().setRight(f); stored.getRight().setRight(f);

View File

@@ -61,7 +61,7 @@ public class CubeSerializer extends DeckSerializerBase<CustomLimited> {
* @return a File * @return a File
*/ */
public File makeFileFor(final CustomLimited deck) { public File makeFileFor(final CustomLimited deck) {
return new File(getDirectory(), DeckIOCore.deriveFileName(cleanDeckName(deck.getName())) + ".cub"); return new File(getDirectory(), deriveFileName(cleanDeckName(deck.getName())) + ".cub");
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -11,9 +11,9 @@ import forge.game.GameType;
*/ */
public class DeckFileHeader { public class DeckFileHeader {
private static final String NAME = "Name"; public static final String NAME = "Name";
private static final String DECK_TYPE = "Deck Type"; private static final String DECK_TYPE = "Deck Type";
private static final String COMMENT = "Comment"; public static final String COMMENT = "Comment";
private static final String PLAYER = "Player"; private static final String PLAYER = "Player";
private static final String CSTM_POOL = "Custom Pool"; private static final String CSTM_POOL = "Custom Pool";
private static final String PLAYER_TYPE = "PlayerType"; private static final String PLAYER_TYPE = "PlayerType";

View File

@@ -1,241 +0,0 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Nate
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.deck.io;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.filechooser.FileFilter;
import org.apache.commons.lang3.StringUtils;
import forge.deck.Deck;
import forge.game.GameType;
import forge.gui.deckeditor.elements.TableSorter;
import forge.item.CardPrinted;
import forge.item.ItemPoolView;
import forge.util.FileUtil;
import forge.util.SectionUtil;
/**
* TODO: Write javadoc for this type.
*
*/
public class DeckIOCore {
private static final String NAME = "Name";
private static final String DECK_TYPE = "Deck Type";
private static final String COMMENT = "Comment";
/** 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";
}
};
public static DeckFileHeader readDeckMetadata(final Map<String,List<String>> map) {
List<String> lines = map.get("metadata");
if (lines == null) {
return null;
}
DeckFileHeader d = new DeckFileHeader(SectionUtil.parseKvPairs(lines, "="));
return d;
}
// Precondition: iterator should point at the first line of cards list
public 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;
}
public 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();
}
public 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>
* readDeck.
* </p>
*
* @param deckFile
* a {@link java.io.File} object.
* @return a {@link forge.deck.Deck} object.
*/
public static Deck readDeck(final File deckFile) {
return readDeck(FileUtil.readFile(deckFile));
}
/**
* Read deck.
*
* @param deckFileLines the deck file lines
* @return the deck
*/
public static Deck readDeck(final List<String> deckFileLines) {
final Map<String, List<String>> sections = SectionUtil.parseSections(deckFileLines);
if (sections.isEmpty()) {
return null;
}
DeckFileHeader dh = readDeckMetadata(sections);
final Deck d = new Deck(dh.getName());
d.setComment(dh.getComment());
d.getMain().set(readCardList(sections.get("main")));
d.getSideboard().set(readCardList(sections.get("sideboard")));
return d;
}
/**
* <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.
*/
public static List<String> saveDeck(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", "")));
// these are optional
if (d.getComment() != null) {
out.add(String.format("%s=%s", COMMENT, d.getComment().replaceAll("\n", "")));
}
out.add(String.format("%s", "[main]"));
out.addAll(writeCardPool(d.getMain()));
out.add(String.format("%s", "[sideboard]"));
out.addAll(writeCardPool(d.getSideboard()));
return out;
}
}

View File

@@ -35,6 +35,7 @@ import forge.Card;
import forge.deck.Deck; import forge.deck.Deck;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.util.FileUtil; import forge.util.FileUtil;
import forge.util.SectionUtil;
import freemarker.template.Configuration; import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper; import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template; import freemarker.template.Template;
@@ -174,7 +175,7 @@ public class DeckSerializer extends DeckSerializerBase<Deck> {
* a {@link java.io.File} object. * a {@link java.io.File} object.
*/ */
public static void writeDeck(final Deck d, final File f) { public static void writeDeck(final Deck d, final File f) {
FileUtil.writeFile(f, DeckIOCore.saveDeck(d)); FileUtil.writeFile(f, d.save());
} }
/** /**
@@ -203,7 +204,7 @@ public class DeckSerializer extends DeckSerializerBase<Deck> {
*/ */
@Override @Override
public void save(Deck unit) { public void save(Deck unit) {
FileUtil.writeFile(makeFileFor(unit), DeckIOCore.saveDeck(unit)); FileUtil.writeFile(makeFileFor(unit), unit.save());
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -211,10 +212,9 @@ public class DeckSerializer extends DeckSerializerBase<Deck> {
*/ */
@Override @Override
public void erase(Deck unit) { public void erase(Deck unit) {
makeFileFor(unit).delete();
} }
/** /**
* *
* Make file name. * Make file name.
@@ -226,7 +226,7 @@ public class DeckSerializer extends DeckSerializerBase<Deck> {
* @return a File * @return a File
*/ */
public File makeFileFor(final Deck deck) { public File makeFileFor(final Deck deck) {
return new File(getDirectory(), DeckIOCore.deriveFileName(cleanDeckName(deck.getName())) + ".dck"); return new File(getDirectory(), deriveFileName(cleanDeckName(deck.getName())) + ".dck");
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -234,7 +234,7 @@ public class DeckSerializer extends DeckSerializerBase<Deck> {
*/ */
@Override @Override
protected Deck read(File file) { protected Deck read(File file) {
return DeckIOCore.readDeck(file); return Deck.fromFile(file);
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -245,4 +245,15 @@ public class DeckSerializer extends DeckSerializerBase<Deck> {
return DCK_FILE_FILTER; return DCK_FILE_FILTER;
} }
public static DeckFileHeader readDeckMetadata(final Map<String,List<String>> map) {
List<String> lines = map.get("metadata");
if (lines == null) {
return null;
}
DeckFileHeader d = new DeckFileHeader(SectionUtil.parseKvPairs(lines, "="));
return d;
}
} }

View File

@@ -31,13 +31,14 @@ import javax.swing.JOptionPane;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import forge.error.ErrorViewer; import forge.error.ErrorViewer;
import forge.item.IHasName; import forge.util.IHasName;
import forge.util.IItemSerializer;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
* *
*/ */
public abstract class DeckSerializerBase<T extends IHasName> implements IDeckSerializer<T> { public abstract class DeckSerializerBase<T extends IHasName> implements IItemSerializer<T> {
private final File directory; private final File directory;
@@ -68,6 +69,10 @@ public abstract class DeckSerializerBase<T extends IHasName> implements IDeckSer
} }
} }
public 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 // only accepts numbers, letters or dashes up to 20 characters in length
/** /**

View File

@@ -50,16 +50,16 @@ public class DeckSetSerializer extends DeckSerializerBase<DeckSet> {
public void save(DeckSet unit) { public void save(DeckSet unit) {
final File f = makeFileFor(unit); final File f = makeFileFor(unit);
f.mkdir(); f.mkdir();
FileUtil.writeFile(new File(f, "human.dck"), DeckIOCore.saveDeck(unit.getHumanDeck())); FileUtil.writeFile(new File(f, "human.dck"), unit.getHumanDeck().save());
List<Deck> aiDecks = unit.getAiDecks(); List<Deck> aiDecks = unit.getAiDecks();
for (int i = 1; i <= aiDecks.size(); i++) { for (int i = 1; i <= aiDecks.size(); i++) {
FileUtil.writeFile(new File(f, "ai-" + i + ".dck"), DeckIOCore.saveDeck(aiDecks.get(i-1))); FileUtil.writeFile(new File(f, "ai-" + i + ".dck"), aiDecks.get(i-1).save());
} }
} }
protected final DeckSet read(File file) protected final DeckSet read(File file)
{ {
Deck human = DeckIOCore.readDeck(new File(file, "human.dck")); Deck human = Deck.fromFile(new File(file, "human.dck"));
final DeckSet d = new DeckSet(human.getName()); final DeckSet d = new DeckSet(human.getName());
d.setHumanDeck(human); d.setHumanDeck(human);
for (int i = 1; i < MAX_DRAFT_PLAYERS; i++) { for (int i = 1; i < MAX_DRAFT_PLAYERS; i++) {
@@ -67,7 +67,7 @@ public class DeckSetSerializer extends DeckSerializerBase<DeckSet> {
if( !theFile.exists() ) if( !theFile.exists() )
break; break;
d.addAiDeck(DeckIOCore.readDeck(theFile)); d.addAiDeck(Deck.fromFile(theFile));
} }
return d; return d;
} }
@@ -87,7 +87,7 @@ public class DeckSetSerializer extends DeckSerializerBase<DeckSet> {
} }
public File makeFileFor(final DeckSet decks) { public File makeFileFor(final DeckSet decks) {
return new File(getDirectory(), DeckIOCore.deriveFileName(decks.getName())); return new File(getDirectory(), deriveFileName(cleanDeckName(decks.getName())));
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -1,12 +0,0 @@
package forge.deck.io;
import java.util.Map;
import forge.item.IHasName;
public interface IDeckReader<T extends IHasName> {
Map<String, T> readAll();
//T read(File file);
}

View File

@@ -1,15 +0,0 @@
package forge.deck.io;
import forge.item.IHasName;
/**
* TODO: Write javadoc for this type.
*
*/
public interface IDeckSerializer<T extends IHasName> extends IDeckReader<T> {
void save(T unit);
void erase(T unit);
}

View File

@@ -40,7 +40,6 @@ import net.slightlymagic.maxmtg.Predicate;
import forge.Command; import forge.Command;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckSet; import forge.deck.DeckSet;
import forge.deck.IFolderMap;
import forge.error.ErrorViewer; import forge.error.ErrorViewer;
import forge.gui.deckeditor.elements.CardPanelHeavy; import forge.gui.deckeditor.elements.CardPanelHeavy;
import forge.gui.deckeditor.elements.FilterCheckBoxes; import forge.gui.deckeditor.elements.FilterCheckBoxes;
@@ -50,6 +49,7 @@ import forge.gui.deckeditor.elements.TableColumnInfo;
import forge.gui.deckeditor.elements.TableView; import forge.gui.deckeditor.elements.TableView;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.util.IFolderMap;
/** /**
* <p> * <p>

View File

@@ -27,8 +27,6 @@ import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map.Entry;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;

View File

@@ -7,8 +7,7 @@ import net.slightlymagic.braids.util.lambda.Lambda0;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import forge.deck.DeckBase; import forge.deck.DeckBase;
import forge.deck.FolderMap; import forge.util.IFolderMap;
import forge.deck.IFolderMap;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.

View File

@@ -8,7 +8,6 @@ import java.util.Map;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import forge.deck.Deck; import forge.deck.Deck;
import forge.item.CardPrinted;
import forge.quest.data.QuestData; import forge.quest.data.QuestData;
/** /**

View File

@@ -1,7 +1,6 @@
package forge.gui.deckeditor; package forge.gui.deckeditor;
import java.awt.Component; import java.awt.Component;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**

View File

@@ -31,7 +31,6 @@ import org.apache.commons.lang3.StringUtils;
import forge.Command; import forge.Command;
import forge.deck.DeckBase; import forge.deck.DeckBase;
import forge.deck.io.DeckIOCore;
import forge.error.ErrorViewer; import forge.error.ErrorViewer;
import forge.gui.GuiUtils; import forge.gui.GuiUtils;
@@ -201,7 +200,7 @@ public class MenuBase<T extends DeckBase> extends JMenuBar {
return ""; return "";
} }
final String deckName = DeckIOCore.cleanDeckName(o.toString()); final String deckName = o.toString();
final boolean isGoodName = controller.isGoodName(deckName); final boolean isGoodName = controller.isGoodName(deckName);
if (isGoodName) { if (isGoodName) {

View File

@@ -30,7 +30,6 @@ import forge.CardList;
import forge.Command; import forge.Command;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.generate.GenerateConstructedDeck; import forge.deck.generate.GenerateConstructedDeck;
import forge.deck.io.DeckIOCore;
import forge.deck.io.DeckSerializer; import forge.deck.io.DeckSerializer;
import forge.error.ErrorViewer; import forge.error.ErrorViewer;
@@ -120,7 +119,7 @@ public final class MenuCommon extends MenuBase<Deck> {
if (file == null) { if (file == null) {
} else if (file.getName().endsWith(".dck")) { } else if (file.getName().endsWith(".dck")) {
try { try {
getController().setModel(DeckIOCore.readDeck(file)); getController().setModel(Deck.fromFile(file));
} catch (final Exception ex) { } catch (final Exception ex) {
ErrorViewer.showError(ex); ErrorViewer.showError(ex);

View File

@@ -31,7 +31,6 @@ import javax.swing.JMenuItem;
import forge.Command; import forge.Command;
import forge.Constant; import forge.Constant;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.io.DeckIOCore;
import forge.deck.io.DeckSerializer; import forge.deck.io.DeckSerializer;
import forge.error.ErrorViewer; import forge.error.ErrorViewer;
import forge.gui.ListChooser; import forge.gui.ListChooser;
@@ -85,7 +84,7 @@ public class MenuQuest extends MenuBase<Deck> {
if (file != null && file.getName().endsWith(".dck")) { if (file != null && file.getName().endsWith(".dck")) {
try { try {
final Deck newDeck = DeckIOCore.readDeck(file); final Deck newDeck = Deck.fromFile(file);
getController().importDeck(newDeck); getController().importDeck(newDeck);
} catch (final Exception ex) { } catch (final Exception ex) {
@@ -106,7 +105,7 @@ public class MenuQuest extends MenuBase<Deck> {
private final File getImportFilename() { private final File getImportFilename() {
final JFileChooser chooser = new JFileChooser(MenuQuest.previousDirectory); final JFileChooser chooser = new JFileChooser(MenuQuest.previousDirectory);
chooser.addChoosableFileFilter(DeckIOCore.DCK_FILTER); chooser.addChoosableFileFilter(DeckSerializer.DCK_FILTER);
final int returnVal = chooser.showOpenDialog(null); final int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) { if (returnVal == JFileChooser.APPROVE_OPTION) {

View File

@@ -17,6 +17,8 @@
*/ */
package forge.item; package forge.item;
import forge.util.IHasName;
/** /**
* Interface to define a player's inventory may hold. Should include * Interface to define a player's inventory may hold. Should include
* CardPrinted, Booster, Pets, Plants... etc * CardPrinted, Booster, Pets, Plants... etc

View File

@@ -23,7 +23,6 @@ import java.util.Map;
import forge.SetUtils; import forge.SetUtils;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.io.DeckIOCore;
import forge.quest.SellRules; import forge.quest.SellRules;
import forge.util.FileUtil; import forge.util.FileUtil;
import forge.util.SectionUtil; import forge.util.SectionUtil;
@@ -80,7 +79,7 @@ public class PreconDeck implements InventoryItemFromSet {
public PreconDeck(final File f) { public PreconDeck(final File f) {
final List<String> deckLines = FileUtil.readFile(f); final List<String> deckLines = FileUtil.readFile(f);
final Map<String, List<String>> sections = SectionUtil.parseSections(deckLines); final Map<String, List<String>> sections = SectionUtil.parseSections(deckLines);
this.deck = DeckIOCore.readDeck(deckLines); this.deck = Deck.fromLines(deckLines);
String filenameProxy = null; String filenameProxy = null;
String setProxy = "n/a"; String setProxy = "n/a";

View File

@@ -25,7 +25,7 @@ import java.util.Random;
import forge.AllZone; import forge.AllZone;
import forge.Singletons; import forge.Singletons;
import forge.deck.io.DeckIOCore; import forge.deck.Deck;
import forge.deck.io.DeckSerializer; import forge.deck.io.DeckSerializer;
import forge.properties.ForgeProps; import forge.properties.ForgeProps;
import forge.properties.NewConstants; import forge.properties.NewConstants;
@@ -99,7 +99,7 @@ public class QuestEventManager {
// Assemble metadata (may not be necessary later) and deck object. // Assemble metadata (may not be necessary later) and deck object.
this.assembleEventMetadata(contents, tempEvent); this.assembleEventMetadata(contents, tempEvent);
tempEvent.setEventDeck(DeckIOCore.readDeck(contents)); tempEvent.setEventDeck(Deck.fromLines(contents));
} // End for(allFiles) } // End for(allFiles)
this.assembleDuelDifficultyLists(); this.assembleDuelDifficultyLists();

View File

@@ -15,10 +15,8 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.deck; package forge.util;
import forge.deck.io.IDeckSerializer;
import forge.item.IHasName;
//reads and writeDeck Deck objects //reads and writeDeck Deck objects
/** /**
@@ -31,7 +29,7 @@ import forge.item.IHasName;
*/ */
public class FolderMap<T extends IHasName> extends FolderMapView<T> implements IFolderMap<T> { public class FolderMap<T extends IHasName> extends FolderMapView<T> implements IFolderMap<T> {
private IDeckSerializer<T> serializer; private IItemSerializer<T> serializer;
/** /**
* <p> * <p>
* Constructor for DeckManager. * Constructor for DeckManager.
@@ -40,7 +38,7 @@ public class FolderMap<T extends IHasName> extends FolderMapView<T> implements I
* @param deckDir * @param deckDir
* a {@link java.io.File} object. * a {@link java.io.File} object.
*/ */
public FolderMap(IDeckSerializer<T> io ) { public FolderMap(IItemSerializer<T> io ) {
super(io); super(io);
serializer = io; serializer = io;
} }

View File

@@ -15,15 +15,13 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.deck; package forge.util;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import forge.deck.io.IDeckReader;
import forge.item.IHasName;
//reads and writeDeck Deck objects //reads and writeDeck Deck objects
/** /**
@@ -45,7 +43,7 @@ public class FolderMapView<T extends IHasName> implements Iterable<T>, IFolderMa
* @param deckDir * @param deckDir
* a {@link java.io.File} object. * a {@link java.io.File} object.
*/ */
public FolderMapView(IDeckReader<T> io ) { public FolderMapView(IItemReader<T> io ) {
this.map = io.readAll(); this.map = io.readAll();
} }

View File

@@ -1,6 +1,5 @@
package forge.deck; package forge.util;
import forge.item.IHasName;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.

View File

@@ -1,9 +1,7 @@
package forge.deck; package forge.util;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator;
import forge.item.IHasName;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.

View File

@@ -1,4 +1,4 @@
package forge.item; package forge.util;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.

View File

@@ -0,0 +1,11 @@
package forge.util;
import java.util.Map;
public interface IItemReader<T extends IHasName> {
Map<String, T> readAll();
//T read(File file);
}

View File

@@ -0,0 +1,14 @@
package forge.util;
/**
* TODO: Write javadoc for this type.
*
*/
public interface IItemSerializer<T extends IHasName> extends IItemReader<T> {
void save(T unit);
void erase(T unit);
}