diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/MtgCardsRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/MtgCardsRequestHandler.java index 25eaa729b..43dc74960 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/MtgCardsRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/MtgCardsRequestHandler.java @@ -2,6 +2,7 @@ package com.gempukku.lotro.async.handler; import com.gempukku.lotro.async.ResponseWriter; import com.gempukku.mtg.MtgCardServer; +import com.gempukku.mtg.ProviderNotFoundException; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.handler.codec.http.HttpHeaders; import org.jboss.netty.handler.codec.http.HttpRequest; @@ -27,17 +28,40 @@ public class MtgCardsRequestHandler implements UriRequestHandler { QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri()); String provider = getQueryParameterSafely(queryDecoder, "provider"); - MtgCardServer.CardDatabaseHolder cardDatabaseHolder = _mtgCardServer.getCardDatabaseHolder(provider); - if (cardDatabaseHolder == null || clientHasCurrentVersion(request, cardDatabaseHolder.getUpdateMarker())) { - responseWriter.writeError(304); - return; + if (provider != null) { + processCardListRequest(request, responseWriter, provider); + } else { + processProviderListRequest(responseWriter); } + } + + private void processProviderListRequest(ResponseWriter responseWriter) { + byte[] dataProvidersResponse = _mtgCardServer.getDataProvidersResponse(); Map headers = new HashMap(); headers.put(CONTENT_TYPE, "application/json; charset=UTF-8"); - headers.put(HttpHeaders.Names.ETAG, cardDatabaseHolder.getUpdateMarker()); - responseWriter.writeByteResponse(cardDatabaseHolder.getBytes(), headers); + responseWriter.writeByteResponse(dataProvidersResponse, headers); + } + + private void processCardListRequest(HttpRequest request, ResponseWriter responseWriter, String provider) { + try { + MtgCardServer.CardDatabaseHolder cardDatabaseHolder = _mtgCardServer.getCardDatabaseHolder(provider); + if (cardDatabaseHolder == null) { + responseWriter.writeError(204); + } else if (clientHasCurrentVersion(request, cardDatabaseHolder.getUpdateMarker())) { + responseWriter.writeError(304); + return; + } + + Map headers = new HashMap(); + headers.put(CONTENT_TYPE, "application/json; charset=UTF-8"); + headers.put(HttpHeaders.Names.ETAG, cardDatabaseHolder.getUpdateMarker()); + + responseWriter.writeByteResponse(cardDatabaseHolder.getBytes(), headers); + } catch (ProviderNotFoundException exp) { + responseWriter.writeError(404); + } } private boolean clientHasCurrentVersion(HttpRequest request, String version) { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/CardData.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/CardData.java index ad7f3ff6e..fd30360b0 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/CardData.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/CardData.java @@ -4,10 +4,12 @@ public class CardData { private final String _id; private final String _name; private final int _price; + private final String _link; - public CardData(String id, String name, int price) { - _id = id; + public CardData(String id, String name, int price, String link) { _name = name; + _id = id; + _link = link; _price = price; } @@ -22,4 +24,8 @@ public class CardData { public int getPrice() { return _price; } + + public String getLink() { + return _link; + } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/MtgCardServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/MtgCardServer.java index a8fc9a412..3656d1257 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/MtgCardServer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/MtgCardServer.java @@ -11,6 +11,7 @@ import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; public class MtgCardServer extends AbstractServer { private Map _dataProviders = new HashMap(); @@ -21,10 +22,28 @@ public class MtgCardServer extends AbstractServer { _dataProviders.put("mtgGoldFish", new MtgGoldfishProvider()); } - public CardDatabaseHolder getCardDatabaseHolder(String providerName) { + public CardDatabaseHolder getCardDatabaseHolder(String providerName) throws ProviderNotFoundException { + if (!_dataProviders.containsKey(providerName)) + throw new ProviderNotFoundException(); return _providersData.get(providerName); } + public byte[] getDataProvidersResponse() { + final JSONArray providers = new JSONArray(); + _dataProviders.entrySet().forEach( + new Consumer>() { + @Override + public void accept(Map.Entry stringMtgDataProviderEntry) { + Map provider = new LinkedHashMap(); + provider.put("id", stringMtgDataProviderEntry.getKey()); + provider.put("name", stringMtgDataProviderEntry.getValue().getDisplayName()); + providers.add(provider); + } + }); + + return providers.toJSONString().getBytes(Charset.forName("UTF-8")); + } + @Override protected void cleanup() { for (Map.Entry dataProviderEntry : _dataProviders.entrySet()) { @@ -52,12 +71,18 @@ public class MtgCardServer extends AbstractServer { cardObject.put("id", cardData.getId()); cardObject.put("name", cardData.getName()); cardObject.put("price", cardData.getPrice()); + String link = cardData.getLink(); + if (link != null) + cardObject.put("link", link); setArray.add(cardObject); } Map setObject = new LinkedHashMap(); setObject.put("name", setCardData.getSetName()); setObject.put("cards", setArray); + String setLink = setCardData.getSetLink(); + if (setLink != null) + setObject.put("link", setLink); allSets.add(setObject); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/MtgDataProvider.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/MtgDataProvider.java index 61b51814c..1f632ced2 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/MtgDataProvider.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/MtgDataProvider.java @@ -5,6 +5,8 @@ public interface MtgDataProvider { void update(UpdateCallback updateCallback); + String getDisplayName(); + interface UpdateCallback { void callback(TimestampedCardCollection result); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/ProviderNotFoundException.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/ProviderNotFoundException.java new file mode 100644 index 000000000..dd0913e1c --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/ProviderNotFoundException.java @@ -0,0 +1,4 @@ +package com.gempukku.mtg; + +public class ProviderNotFoundException extends Exception { +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/SetCardData.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/SetCardData.java index 3890363a0..e76b6eb9e 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/SetCardData.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/SetCardData.java @@ -4,10 +4,12 @@ import java.util.List; public class SetCardData { private String _setName; + private String _setLink; private List _allCards; - public SetCardData(String setName, List allCards) { + public SetCardData(String setName, String setLink, List allCards) { _setName = setName; + _setLink = setLink; _allCards = allCards; } @@ -18,4 +20,8 @@ public class SetCardData { public String getSetName() { return _setName; } + + public String getSetLink() { + return _setLink; + } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/provider/mtggoldfish/MtgGoldfishProvider.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/provider/mtggoldfish/MtgGoldfishProvider.java index 7f9ab7b0b..98d2a83ac 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/provider/mtggoldfish/MtgGoldfishProvider.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/mtg/provider/mtggoldfish/MtgGoldfishProvider.java @@ -51,6 +51,11 @@ public class MtgGoldfishProvider implements MtgDataProvider { } } + @Override + public String getDisplayName() { + return "MtgGoldFish.com"; + } + @Override public boolean shouldBeUpdated() { return _nextStart < System.currentTimeMillis(); @@ -142,7 +147,8 @@ public class MtgGoldfishProvider implements MtgDataProvider { } catch (InterruptedException e) { // Ignore } - Document doc = Jsoup.parse(new URL("http://www.mtggoldfish.com/index/" + mtgCardSet.getUrlPostfix()), TIMEOUT); + String link = "http://www.mtggoldfish.com/index/" + mtgCardSet.getUrlPostfix(); + Document doc = Jsoup.parse(new URL(link), TIMEOUT); boolean isInPaper = (doc.select("#priceHistoryTabs [href=#tab-paper]").size() > 0); if (isInPaper) { List allCards = new LinkedList(); @@ -152,14 +158,14 @@ public class MtgGoldfishProvider implements MtgDataProvider { String cardName = cardElement.select("td:nth-of-type(1) a").text(); String cardId = mtgCardSet.getUrlPostfix() + "-" + cardName; float price = Float.parseFloat(cardElement.select("td:nth-of-type(4)").text().replace(",", "")); - allCards.add(new CardData(cardId, cardName, Math.round(price * 100))); + allCards.add(new CardData(cardId, cardName, Math.round(price * 100), null)); } boolean hasFoils = doc.select(".index-price-header-foil-switcher").size() > 0; if (hasFoils) { downloadSet(new MtgGoldfishCardSet(mtgCardSet.getUrlPostfix() + "_F", mtgCardSet.getInfoLine() + " ยท Foil"), result); } - result.add(new SetCardData(mtgCardSet.getInfoLine(), allCards)); + result.add(new SetCardData(mtgCardSet.getInfoLine(), link, allCards)); } }