package magic.data; import static java.nio.charset.StandardCharsets.UTF_8; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Properties; import magic.model.MagicCardDefinition; import magic.utility.FileIO; import magic.utility.MagicFileSystem; import magic.utility.MagicFileSystem.DataPath; import magic.utility.ProgressReporter; public class UnimplementedParser { private static final File SCRIPTS_MISSING_DIRECTORY = MagicFileSystem.getDataPath(DataPath.SCRIPTS_MISSING).toFile(); private static final List errorList = new ArrayList<>(); private static final List allUnimplementedCardDefs = new ArrayList<>(); private static final List parsedCards = new ArrayList<>(); private static final List errorCards = new ArrayList<>(); public static void parseScriptsMissing(final ProgressReporter reporter) { reporter.setMessage("Initializing scripts missing folder..."); final File[] scriptFiles = MagicFileSystem.getSortedScriptFiles(SCRIPTS_MISSING_DIRECTORY); reporter.setMessage("Parsing missing scripts..."); for (final File file : scriptFiles) { parseCardDefinition(file); } } private static void parseCardDefinition(final File file) { try { final MagicCardDefinition cdef = prop2carddef(file); cdef.validate(); addParsedDefinition(cdef); parsedCards.add(cdef); } catch (final Throwable cause) { errorList.add("ERROR file: " + file + " cause: " + cause.getMessage()); } } private static MagicCardDefinition prop2carddef(final File scriptFile) { final Properties content = FileIO.toProp(scriptFile); final MagicCardDefinition cardDefinition = new MagicCardDefinition(); for (final String key : content.stringPropertyNames()) { try { setProperty(cardDefinition, key, content.getProperty(key)); } catch (Exception e) { throw new RuntimeException(e); } } return cardDefinition; } private static void setProperty(final MagicCardDefinition card, final String property, final String value) { try { CardProperty.valueOf(property.toUpperCase(Locale.ENGLISH)).setProperty(card, value); } catch (IllegalArgumentException e) { throw new RuntimeException("unknown card property value \"" + property + "\" = \"" + value + "\"", e); } } private static void addParsedDefinition(final MagicCardDefinition cardDefinition) { allUnimplementedCardDefs.add(cardDefinition); } public static void parseCardAbilities() { for (final MagicCardDefinition cdef : getUnimplementedCardDefs()) { try { cdef.loadAbilities(); if (!parsedCards.contains(cdef)){ parsedCards.add(cdef); } } catch (Throwable cause) { errorList.add("ERROR: " + cause.getMessage() + " " + cdef); errorCards.add(cdef); } } exportParseResults(); } public static List getUnimplementedCardDefs() { return allUnimplementedCardDefs; } private static void saveParsedCardsList(List cardList, String filename) { final Path LOGS_PATH = MagicFileSystem.getDataPath(DataPath.LOGS); final File LOG_FILE = LOGS_PATH.resolve(filename + ".log").toFile(); try (final PrintWriter writer = new PrintWriter(LOG_FILE, UTF_8.name())) { for (MagicCardDefinition card : cardList) { final String cardName = card.getName(); writer.println(cardName); } } catch (FileNotFoundException|UnsupportedEncodingException ex) { System.err.println("Failed to save " + LOG_FILE + " - " + ex); } } private static void saveParseErrorLog(final List error) { final Path LOGS_PATH = MagicFileSystem.getDataPath(DataPath.LOGS); final File LOG_FILE = LOGS_PATH.resolve("parse_errors.log").toFile(); try (final PrintWriter writer = new PrintWriter(LOG_FILE, UTF_8.name())) { for (String errorMessage : error) { writer.println(errorMessage); } } catch (FileNotFoundException|UnsupportedEncodingException ex) { System.err.println("Failed to save " + LOG_FILE + " - " + ex); } } private static void exportParseResults() { parsedCards.removeAll(errorCards); Collections.sort(errorList); saveParsedCardsList(errorCards, "errorCards"); saveParsedCardsList(parsedCards, "parsedCards"); saveParseErrorLog(errorList); } }