From 510f7a86b614dafa0fa06adbc16175f82c7f8f6f Mon Sep 17 00:00:00 2001 From: Neil Gentleman Date: Sun, 14 Feb 2016 14:33:32 -0800 Subject: [PATCH] download the json at runtime --- .../src/main/java/mage/verify/JsonCard.java | 14 +---- .../src/main/java/mage/verify/JsonSet.java | 14 +---- .../src/main/java/mage/verify/MtgJson.java | 56 ++++++++++++++++++- .../java/mage/verify/VerifyCardDataTest.java | 22 +++++--- 4 files changed, 73 insertions(+), 33 deletions(-) diff --git a/Mage.Verify/src/main/java/mage/verify/JsonCard.java b/Mage.Verify/src/main/java/mage/verify/JsonCard.java index 01ea6884710..ac0c0dc0691 100644 --- a/Mage.Verify/src/main/java/mage/verify/JsonCard.java +++ b/Mage.Verify/src/main/java/mage/verify/JsonCard.java @@ -1,26 +1,15 @@ package mage.verify; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; import java.util.List; -import java.util.Map; class JsonCard { - - static Map loadAll() throws IOException { - return new ObjectMapper().readValue( - JsonCard.class.getResourceAsStream("AllCards.json"), - new TypeReference>() {}); - } - public String layout; public String name; public List names; // flip cards public String manaCost; public int cmc; public List colors; + public List colorIdentity; public String type; public List supertypes; public List types; @@ -33,6 +22,7 @@ class JsonCard { public boolean starter; // only available in boxed sets and not in boosters public int hand; // vanguard public int life; // vanguard + public String mciNumber; // only available in AllSets.json public String artist; diff --git a/Mage.Verify/src/main/java/mage/verify/JsonSet.java b/Mage.Verify/src/main/java/mage/verify/JsonSet.java index 93406447560..4a56a5bd301 100644 --- a/Mage.Verify/src/main/java/mage/verify/JsonSet.java +++ b/Mage.Verify/src/main/java/mage/verify/JsonSet.java @@ -1,20 +1,9 @@ package mage.verify; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; import java.util.List; import java.util.Map; class JsonSet { - - static Map loadAll() throws IOException { - return new ObjectMapper().readValue( - JsonSet.class.getResourceAsStream("AllSets.json"), - new TypeReference>() {}); - } - public String name; public String code; public String oldCode; @@ -28,4 +17,7 @@ class JsonSet { public List cards; public String block; public boolean onlineOnly; + public String mkm_id; + public String mkm_name; + public Map translations; } diff --git a/Mage.Verify/src/main/java/mage/verify/MtgJson.java b/Mage.Verify/src/main/java/mage/verify/MtgJson.java index 930f8e06ba2..04488fdfe66 100644 --- a/Mage.Verify/src/main/java/mage/verify/MtgJson.java +++ b/Mage.Verify/src/main/java/mage/verify/MtgJson.java @@ -1,17 +1,28 @@ package mage.verify; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; import java.text.Normalizer; import java.util.HashMap; import java.util.Map; +import java.util.zip.ZipInputStream; public class MtgJson { + private MtgJson() {} private static class CardHolder { private static final Map cards; static { try { - cards = JsonCard.loadAll(); + cards = loadAllCards(); addAliases(cards); } catch (IOException e) { throw new RuntimeException(e); @@ -19,7 +30,48 @@ public class MtgJson { } } - public static JsonCard find(String name) { + private static class SetHolder { + private static final Map sets; + static { + try { + sets = loadAllSets(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + private static Map loadAllCards() throws IOException { + return readFromZip("AllCards.json.zip", new TypeReference>() {}); + } + + private static Map loadAllSets() throws IOException { + return readFromZip("AllSets.json.zip", new TypeReference>() {}); + } + + private static T readFromZip(String filename, TypeReference ref) throws IOException { + InputStream stream = MtgJson.class.getResourceAsStream(filename); + if (stream == null) { + File file = new File(filename); + if (!file.exists()) { + InputStream download = new URL("http://mtgjson.com/json/" + filename).openStream(); + Files.copy(download, file.toPath(), StandardCopyOption.REPLACE_EXISTING); + System.out.println("Downloaded " + filename + " to " + file.getAbsolutePath()); + } else { + System.out.println("Using " + filename + " from " + file.getAbsolutePath()); + } + stream = new FileInputStream(file); + } + ZipInputStream zipInputStream = new ZipInputStream(stream); + zipInputStream.getNextEntry(); + return new ObjectMapper().readValue(zipInputStream, ref); + } + + public static Map sets() { + return SetHolder.sets; + } + + public static JsonCard card(String name) { return findReference(CardHolder.cards, name); } diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index e3469fab3c1..7b0e04fa655 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -23,7 +23,7 @@ public class VerifyCardDataTest { @Test public void verifySets() throws IOException { - Map reference = JsonSet.loadAll(); + Map reference = MtgJson.sets(); for (ExpansionSet set : Sets.getInstance().values()) { JsonSet ref = reference.get(set.getCode()); @@ -102,7 +102,7 @@ public class VerifyCardDataTest { } private void check(Card card, Set tokens) { - JsonCard ref = MtgJson.find(card.getName()); + JsonCard ref = MtgJson.card(card.getName()); if (ref == null) { System.out.println("Missing card reference for " + card); return; @@ -111,7 +111,7 @@ public class VerifyCardDataTest { if (tokens != null) { JsonCard ref2 = null; if (card.isFlipCard()) { - ref2 = MtgJson.find(card.getFlipCardName()); + ref2 = MtgJson.card(card.getFlipCardName()); } for (String token : tokens) { if (!(token.equals(card.getName()) @@ -202,15 +202,21 @@ public class VerifyCardDataTest { } private void checkPT(Card card, JsonCard ref) { - String pt = card.getPower() + "/" + card.getToughness(); - String expected = ref.power + "/" + ref.toughness; - if ("0/0".equals(pt) && ("null/null".equals(expected) || "*/*".equals(expected))) { - // ok - } else if (!Objects.equals(pt, expected.replace("*", "0"))) { + if (!eqPT(card.getPower().toString(), ref.power) || !eqPT(card.getToughness().toString(), ref.toughness)) { + String pt = card.getPower() + "/" + card.getToughness(); + String expected = ref.power + "/" + ref.toughness; System.out.println(pt + " != " + expected + " for " + card); } } + private boolean eqPT(String found, String expected) { + if (expected == null) { + return "0".equals(found); + } else { + return found.equals(expected) || expected.contains("*"); + } + } + private void checkCost(Card card, JsonCard ref) { String expected = ref.manaCost; String cost = join(card.getManaCost().getSymbols());