Handling of update date for Mtg card database.
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user