Handling of update date for Mtg card database.

This commit is contained in:
MarcinSc
2016-02-03 15:09:10 -08:00
parent 49c92bde39
commit febef2da9f
4 changed files with 18 additions and 30 deletions

View File

@@ -14,7 +14,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE; import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE;
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.IF_NONE_MATCH;
public class MtgCardsRequestHandler implements UriRequestHandler { public class MtgCardsRequestHandler implements UriRequestHandler {
private MtgCardServer _mtgCardServer; private MtgCardServer _mtgCardServer;
@@ -27,9 +26,10 @@ public class MtgCardsRequestHandler implements UriRequestHandler {
public void handleRequest(String uri, HttpRequest request, Map<Type, Object> context, ResponseWriter responseWriter, MessageEvent e) throws Exception { public void handleRequest(String uri, HttpRequest request, Map<Type, Object> context, ResponseWriter responseWriter, MessageEvent e) throws Exception {
QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri()); QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri());
String provider = getQueryParameterSafely(queryDecoder, "provider"); String provider = getQueryParameterSafely(queryDecoder, "provider");
String updateMarker = getQueryParameterSafely(queryDecoder, "update");
if (provider != null) { if (provider != null) {
processCardListRequest(request, responseWriter, provider); processCardListRequest(responseWriter, provider, updateMarker);
} else { } else {
processProviderListRequest(responseWriter); processProviderListRequest(responseWriter);
} }
@@ -44,20 +44,20 @@ public class MtgCardsRequestHandler implements UriRequestHandler {
responseWriter.writeByteResponse(dataProvidersResponse, headers); responseWriter.writeByteResponse(dataProvidersResponse, headers);
} }
private void processCardListRequest(HttpRequest request, ResponseWriter responseWriter, String provider) { private void processCardListRequest(ResponseWriter responseWriter, String provider, String updateMarker) {
try { try {
MtgCardServer.CardDatabaseHolder cardDatabaseHolder = _mtgCardServer.getCardDatabaseHolder(provider); MtgCardServer.CardDatabaseHolder cardDatabaseHolder = _mtgCardServer.getCardDatabaseHolder(provider);
if (cardDatabaseHolder == null) { if (cardDatabaseHolder == null) {
responseWriter.writeError(204); responseWriter.writeError(204);
return; return;
} else if (clientHasCurrentVersion(request, cardDatabaseHolder.getUpdateMarker())) { } else if (updateMarker != null && updateMarker.equals(String.valueOf(cardDatabaseHolder.getUpdateDate()))) {
responseWriter.writeError(304); responseWriter.writeError(304);
return; return;
} }
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()); headers.put(HttpHeaders.Names.ETAG, String.valueOf(cardDatabaseHolder.getUpdateDate()));
responseWriter.writeByteResponse(cardDatabaseHolder.getBytes(), headers); responseWriter.writeByteResponse(cardDatabaseHolder.getBytes(), headers);
} catch (ProviderNotFoundException exp) { } catch (ProviderNotFoundException exp) {
@@ -65,18 +65,6 @@ public class MtgCardsRequestHandler implements UriRequestHandler {
} }
} }
private boolean clientHasCurrentVersion(HttpRequest request, String version) {
String ifNoneMatch = request.getHeader(IF_NONE_MATCH);
if (ifNoneMatch != null) {
String[] clientKnownVersions = ifNoneMatch.split(",");
for (String clientKnownVersion : clientKnownVersions) {
if (clientKnownVersion.trim().equals(version))
return true;
}
}
return false;
}
protected String getQueryParameterSafely(QueryStringDecoder queryStringDecoder, String parameterName) { protected String getQueryParameterSafely(QueryStringDecoder queryStringDecoder, String parameterName) {
List<String> parameterValues = queryStringDecoder.getParameters().get(parameterName); List<String> parameterValues = queryStringDecoder.getParameters().get(parameterName);
if (parameterValues != null && parameterValues.size() > 0) if (parameterValues != null && parameterValues.size() > 0)

View File

@@ -49,7 +49,7 @@ public class MtgCardServer extends AbstractServer {
new MtgDataProvider.UpdateCallback() { new MtgDataProvider.UpdateCallback() {
@Override @Override
public void callback(TimestampedCardCollection result) { public void callback(TimestampedCardCollection result) {
_providersData.put(key, new CardDatabaseHolder(marshallData(result.getSetCardDataList()), result.getUpdateMarker())); _providersData.put(key, new CardDatabaseHolder(marshallData(result.getSetCardDataList()), result.getUpdateDate()));
} }
}); });
} }
@@ -86,16 +86,16 @@ public class MtgCardServer extends AbstractServer {
} }
public class CardDatabaseHolder { public class CardDatabaseHolder {
private String _updateMarker; private long _updateDate;
private byte[] _bytes; private byte[] _bytes;
public CardDatabaseHolder(byte[] bytes, String updateMarker) { public CardDatabaseHolder(byte[] bytes, long updateDate) {
_bytes = bytes; _bytes = bytes;
_updateMarker = updateMarker; _updateDate = updateDate;
} }
public String getUpdateMarker() { public long getUpdateDate() {
return _updateMarker; return _updateDate;
} }
public byte[] getBytes() { public byte[] getBytes() {

View File

@@ -3,11 +3,11 @@ package com.gempukku.mtg;
import java.util.List; import java.util.List;
public class TimestampedCardCollection { public class TimestampedCardCollection {
private final String _updateMarker; private final long _updateDate;
private final List<SetCardData> _setCardDataList; private final List<SetCardData> _setCardDataList;
public TimestampedCardCollection(String updateMarker, List<SetCardData> setCardDataList) { public TimestampedCardCollection(long updateDate, List<SetCardData> setCardDataList) {
_updateMarker = updateMarker; _updateDate = updateDate;
_setCardDataList = setCardDataList; _setCardDataList = setCardDataList;
} }
@@ -15,7 +15,7 @@ public class TimestampedCardCollection {
return _setCardDataList; return _setCardDataList;
} }
public String getUpdateMarker() { public long getUpdateDate() {
return _updateMarker; return _updateDate;
} }
} }

View File

@@ -75,7 +75,7 @@ public class MtgGoldfishProvider implements MtgDataProvider {
} }
private TimestampedCardCollection updateDatabase() { private TimestampedCardCollection updateDatabase() {
String updateMarker = String.valueOf(System.currentTimeMillis()); long updateDate = System.currentTimeMillis();
final List<SetCardData> resultArray = new LinkedList<SetCardData>(); final List<SetCardData> resultArray = new LinkedList<SetCardData>();
try { try {
@@ -86,7 +86,7 @@ public class MtgGoldfishProvider implements MtgDataProvider {
} catch (IOException exp) { } catch (IOException exp) {
LOG.error("Unable to download card list", exp); LOG.error("Unable to download card list", exp);
} }
return new TimestampedCardCollection(updateMarker, resultArray); return new TimestampedCardCollection(updateDate, resultArray);
} }
private List<MtgGoldfishCardSet> downloadSetListWithRetry() throws IOException { private List<MtgGoldfishCardSet> downloadSetListWithRetry() throws IOException {