Added support for card/set links. Added call that returns a list of supported providers.
This commit is contained in:
@@ -2,6 +2,7 @@ package com.gempukku.lotro.async.handler;
|
|||||||
|
|
||||||
import com.gempukku.lotro.async.ResponseWriter;
|
import com.gempukku.lotro.async.ResponseWriter;
|
||||||
import com.gempukku.mtg.MtgCardServer;
|
import com.gempukku.mtg.MtgCardServer;
|
||||||
|
import com.gempukku.mtg.ProviderNotFoundException;
|
||||||
import org.jboss.netty.channel.MessageEvent;
|
import org.jboss.netty.channel.MessageEvent;
|
||||||
import org.jboss.netty.handler.codec.http.HttpHeaders;
|
import org.jboss.netty.handler.codec.http.HttpHeaders;
|
||||||
import org.jboss.netty.handler.codec.http.HttpRequest;
|
import org.jboss.netty.handler.codec.http.HttpRequest;
|
||||||
@@ -27,17 +28,40 @@ public class MtgCardsRequestHandler implements UriRequestHandler {
|
|||||||
QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri());
|
QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri());
|
||||||
String provider = getQueryParameterSafely(queryDecoder, "provider");
|
String provider = getQueryParameterSafely(queryDecoder, "provider");
|
||||||
|
|
||||||
MtgCardServer.CardDatabaseHolder cardDatabaseHolder = _mtgCardServer.getCardDatabaseHolder(provider);
|
if (provider != null) {
|
||||||
if (cardDatabaseHolder == null || clientHasCurrentVersion(request, cardDatabaseHolder.getUpdateMarker())) {
|
processCardListRequest(request, responseWriter, provider);
|
||||||
responseWriter.writeError(304);
|
} else {
|
||||||
return;
|
processProviderListRequest(responseWriter);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processProviderListRequest(ResponseWriter responseWriter) {
|
||||||
|
byte[] dataProvidersResponse = _mtgCardServer.getDataProvidersResponse();
|
||||||
|
|
||||||
Map<String, String> headers = new HashMap<String, String>();
|
Map<String, String> headers = new HashMap<String, String>();
|
||||||
headers.put(CONTENT_TYPE, "application/json; charset=UTF-8");
|
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<String, String> headers = new HashMap<String, String>();
|
||||||
|
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) {
|
private boolean clientHasCurrentVersion(HttpRequest request, String version) {
|
||||||
|
|||||||
@@ -4,10 +4,12 @@ public class CardData {
|
|||||||
private final String _id;
|
private final String _id;
|
||||||
private final String _name;
|
private final String _name;
|
||||||
private final int _price;
|
private final int _price;
|
||||||
|
private final String _link;
|
||||||
|
|
||||||
public CardData(String id, String name, int price) {
|
public CardData(String id, String name, int price, String link) {
|
||||||
_id = id;
|
|
||||||
_name = name;
|
_name = name;
|
||||||
|
_id = id;
|
||||||
|
_link = link;
|
||||||
_price = price;
|
_price = price;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,4 +24,8 @@ public class CardData {
|
|||||||
public int getPrice() {
|
public int getPrice() {
|
||||||
return _price;
|
return _price;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getLink() {
|
||||||
|
return _link;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class MtgCardServer extends AbstractServer {
|
public class MtgCardServer extends AbstractServer {
|
||||||
private Map<String, MtgDataProvider> _dataProviders = new HashMap<String, MtgDataProvider>();
|
private Map<String, MtgDataProvider> _dataProviders = new HashMap<String, MtgDataProvider>();
|
||||||
@@ -21,10 +22,28 @@ public class MtgCardServer extends AbstractServer {
|
|||||||
_dataProviders.put("mtgGoldFish", new MtgGoldfishProvider());
|
_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);
|
return _providersData.get(providerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte[] getDataProvidersResponse() {
|
||||||
|
final JSONArray providers = new JSONArray();
|
||||||
|
_dataProviders.entrySet().forEach(
|
||||||
|
new Consumer<Map.Entry<String, MtgDataProvider>>() {
|
||||||
|
@Override
|
||||||
|
public void accept(Map.Entry<String, MtgDataProvider> stringMtgDataProviderEntry) {
|
||||||
|
Map<String, Object> provider = new LinkedHashMap<String, Object>();
|
||||||
|
provider.put("id", stringMtgDataProviderEntry.getKey());
|
||||||
|
provider.put("name", stringMtgDataProviderEntry.getValue().getDisplayName());
|
||||||
|
providers.add(provider);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return providers.toJSONString().getBytes(Charset.forName("UTF-8"));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void cleanup() {
|
protected void cleanup() {
|
||||||
for (Map.Entry<String, MtgDataProvider> dataProviderEntry : _dataProviders.entrySet()) {
|
for (Map.Entry<String, MtgDataProvider> dataProviderEntry : _dataProviders.entrySet()) {
|
||||||
@@ -52,12 +71,18 @@ public class MtgCardServer extends AbstractServer {
|
|||||||
cardObject.put("id", cardData.getId());
|
cardObject.put("id", cardData.getId());
|
||||||
cardObject.put("name", cardData.getName());
|
cardObject.put("name", cardData.getName());
|
||||||
cardObject.put("price", cardData.getPrice());
|
cardObject.put("price", cardData.getPrice());
|
||||||
|
String link = cardData.getLink();
|
||||||
|
if (link != null)
|
||||||
|
cardObject.put("link", link);
|
||||||
setArray.add(cardObject);
|
setArray.add(cardObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, Object> setObject = new LinkedHashMap<String, Object>();
|
Map<String, Object> setObject = new LinkedHashMap<String, Object>();
|
||||||
setObject.put("name", setCardData.getSetName());
|
setObject.put("name", setCardData.getSetName());
|
||||||
setObject.put("cards", setArray);
|
setObject.put("cards", setArray);
|
||||||
|
String setLink = setCardData.getSetLink();
|
||||||
|
if (setLink != null)
|
||||||
|
setObject.put("link", setLink);
|
||||||
|
|
||||||
allSets.add(setObject);
|
allSets.add(setObject);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ public interface MtgDataProvider {
|
|||||||
|
|
||||||
void update(UpdateCallback updateCallback);
|
void update(UpdateCallback updateCallback);
|
||||||
|
|
||||||
|
String getDisplayName();
|
||||||
|
|
||||||
interface UpdateCallback {
|
interface UpdateCallback {
|
||||||
void callback(TimestampedCardCollection result);
|
void callback(TimestampedCardCollection result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package com.gempukku.mtg;
|
||||||
|
|
||||||
|
public class ProviderNotFoundException extends Exception {
|
||||||
|
}
|
||||||
@@ -4,10 +4,12 @@ import java.util.List;
|
|||||||
|
|
||||||
public class SetCardData {
|
public class SetCardData {
|
||||||
private String _setName;
|
private String _setName;
|
||||||
|
private String _setLink;
|
||||||
private List<CardData> _allCards;
|
private List<CardData> _allCards;
|
||||||
|
|
||||||
public SetCardData(String setName, List<CardData> allCards) {
|
public SetCardData(String setName, String setLink, List<CardData> allCards) {
|
||||||
_setName = setName;
|
_setName = setName;
|
||||||
|
_setLink = setLink;
|
||||||
_allCards = allCards;
|
_allCards = allCards;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -18,4 +20,8 @@ public class SetCardData {
|
|||||||
public String getSetName() {
|
public String getSetName() {
|
||||||
return _setName;
|
return _setName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getSetLink() {
|
||||||
|
return _setLink;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,11 @@ public class MtgGoldfishProvider implements MtgDataProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDisplayName() {
|
||||||
|
return "MtgGoldFish.com";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldBeUpdated() {
|
public boolean shouldBeUpdated() {
|
||||||
return _nextStart < System.currentTimeMillis();
|
return _nextStart < System.currentTimeMillis();
|
||||||
@@ -142,7 +147,8 @@ public class MtgGoldfishProvider implements MtgDataProvider {
|
|||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
// Ignore
|
// 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);
|
boolean isInPaper = (doc.select("#priceHistoryTabs [href=#tab-paper]").size() > 0);
|
||||||
if (isInPaper) {
|
if (isInPaper) {
|
||||||
List<CardData> allCards = new LinkedList<CardData>();
|
List<CardData> allCards = new LinkedList<CardData>();
|
||||||
@@ -152,14 +158,14 @@ public class MtgGoldfishProvider implements MtgDataProvider {
|
|||||||
String cardName = cardElement.select("td:nth-of-type(1) a").text();
|
String cardName = cardElement.select("td:nth-of-type(1) a").text();
|
||||||
String cardId = mtgCardSet.getUrlPostfix() + "-" + cardName;
|
String cardId = mtgCardSet.getUrlPostfix() + "-" + cardName;
|
||||||
float price = Float.parseFloat(cardElement.select("td:nth-of-type(4)").text().replace(",", ""));
|
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;
|
boolean hasFoils = doc.select(".index-price-header-foil-switcher").size() > 0;
|
||||||
if (hasFoils) {
|
if (hasFoils) {
|
||||||
downloadSet(new MtgGoldfishCardSet(mtgCardSet.getUrlPostfix() + "_F", mtgCardSet.getInfoLine() + " · Foil"), result);
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user