magarena/src/magic/data/UnimplementedParser.java

128 lines
5.0 KiB
Java

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<String> errorList = new ArrayList<>();
private static final List<MagicCardDefinition> allUnimplementedCardDefs = new ArrayList<>();
private static final List<MagicCardDefinition> parsedCards = new ArrayList<>();
private static final List<MagicCardDefinition> 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<MagicCardDefinition> getUnimplementedCardDefs() {
return allUnimplementedCardDefs;
}
private static void saveParsedCardsList(List<MagicCardDefinition> 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<String> 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);
}
}