Finished DeckRequestHandler.
This commit is contained in:
@@ -1,40 +1,226 @@
|
||||
package com.gempukku.lotro.async.handler;
|
||||
|
||||
import com.gempukku.lotro.async.HttpProcessingException;
|
||||
import com.gempukku.lotro.async.ResponseWriter;
|
||||
import com.gempukku.lotro.common.Side;
|
||||
import com.gempukku.lotro.db.DeckDAO;
|
||||
import com.gempukku.lotro.game.Player;
|
||||
import com.gempukku.lotro.game.*;
|
||||
import com.gempukku.lotro.game.formats.LotroFormatLibrary;
|
||||
import com.gempukku.lotro.logic.GameUtils;
|
||||
import com.gempukku.lotro.logic.vo.LotroDeck;
|
||||
import org.apache.commons.lang.StringEscapeUtils;
|
||||
import org.jboss.netty.channel.MessageEvent;
|
||||
import org.jboss.netty.handler.codec.http.HttpMethod;
|
||||
import org.jboss.netty.handler.codec.http.HttpRequest;
|
||||
import org.jboss.netty.handler.codec.http.QueryStringDecoder;
|
||||
import org.jboss.netty.handler.codec.http.multipart.HttpPostRequestDecoder;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
import javax.ws.rs.WebApplicationException;
|
||||
import javax.ws.rs.core.Response;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
public class DeckRequestHandler extends LotroServerRequestHandler implements UriRequestHandler {
|
||||
private DeckDAO _deckDao;
|
||||
private SortAndFilterCards _sortAndFilterCards;
|
||||
private LotroCardBlueprintLibrary _library;
|
||||
private LotroFormatLibrary _formatLibrary;
|
||||
private LotroServer _lotroServer;
|
||||
|
||||
public DeckRequestHandler(Map<Type, Object> context) {
|
||||
super(context);
|
||||
_deckDao = extractObject(context, DeckDAO.class);
|
||||
_sortAndFilterCards = new SortAndFilterCards();
|
||||
_library = extractObject(context, LotroCardBlueprintLibrary.class);
|
||||
_formatLibrary = extractObject(context, LotroFormatLibrary.class);
|
||||
_lotroServer = extractObject(context, LotroServer.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleRequest(String uri, HttpRequest request, Map<Type, Object> context, ResponseWriter responseWriter, MessageEvent e) throws Exception {
|
||||
if (uri.equals("/list") && request.getMethod() == HttpMethod.GET) {
|
||||
listDecks(request, responseWriter);
|
||||
} else if (uri.equals("") && request.getMethod() == HttpMethod.GET) {
|
||||
getDeck(request, responseWriter);
|
||||
} else if (uri.equals("") && request.getMethod() == HttpMethod.POST) {
|
||||
saveDeck(request, responseWriter);
|
||||
} else if (uri.equals("/html") && request.getMethod() == HttpMethod.GET) {
|
||||
getDeckInHtml(request, responseWriter);
|
||||
} else if (uri.equals("/rename") && request.getMethod() == HttpMethod.POST) {
|
||||
renameDeck(request, responseWriter);
|
||||
} else if (uri.equals("/delete") && request.getMethod() == HttpMethod.POST) {
|
||||
deleteDeck(request, responseWriter);
|
||||
} else if (uri.equals("/stats") && request.getMethod() == HttpMethod.POST) {
|
||||
getDeckStats(request, responseWriter);
|
||||
} else {
|
||||
responseWriter.writeError(404);
|
||||
}
|
||||
}
|
||||
|
||||
private void getDeckStats(HttpRequest request, ResponseWriter responseWriter) throws Exception {
|
||||
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
|
||||
String participantId = getFormParameterSafely(postDecoder, "participantId");
|
||||
String contents = getFormParameterSafely(postDecoder, "deckContents");
|
||||
|
||||
Player resourceOwner = getResourceOwnerSafely(request, participantId);
|
||||
|
||||
LotroDeck deck = _lotroServer.createDeckWithValidate("tempDeck", contents);
|
||||
if (deck == null)
|
||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
||||
|
||||
int fpCount = 0;
|
||||
int shadowCount = 0;
|
||||
for (String card : deck.getAdventureCards()) {
|
||||
Side side = _library.getLotroCardBlueprint(card).getSide();
|
||||
if (side == Side.SHADOW)
|
||||
shadowCount++;
|
||||
else if (side == Side.FREE_PEOPLE)
|
||||
fpCount++;
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("<b>Free People</b>: " + fpCount + ", <b>Shadow</b>: " + shadowCount + "<br/>");
|
||||
|
||||
StringBuilder valid = new StringBuilder();
|
||||
StringBuilder invalid = new StringBuilder();
|
||||
for (LotroFormat format : _formatLibrary.getHallFormats().values()) {
|
||||
try {
|
||||
format.validateDeck(deck);
|
||||
valid.append("<b>" + format.getName() + "</b>: <font color='green'>valid</font><br/>");
|
||||
} catch (DeckInvalidException exp) {
|
||||
invalid.append("<b>" + format.getName() + "</b>: <font color='red'>" + exp.getMessage() + "</font><br/>");
|
||||
}
|
||||
}
|
||||
sb.append(valid);
|
||||
sb.append(invalid);
|
||||
|
||||
responseWriter.writeHtmlResponse(sb.toString());
|
||||
}
|
||||
|
||||
private void deleteDeck(HttpRequest request, ResponseWriter responseWriter) throws Exception {
|
||||
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
|
||||
String participantId = getFormParameterSafely(postDecoder, "participantId");
|
||||
String deckName = getFormParameterSafely(postDecoder, "deckName");
|
||||
Player resourceOwner = getResourceOwnerSafely(request, participantId);
|
||||
|
||||
_deckDao.deleteDeckForPlayer(resourceOwner, deckName);
|
||||
|
||||
responseWriter.writeResponse(null);
|
||||
}
|
||||
|
||||
private void renameDeck(HttpRequest request, ResponseWriter responseWriter) throws Exception {
|
||||
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
|
||||
String participantId = getFormParameterSafely(postDecoder, "participantId");
|
||||
String deckName = getFormParameterSafely(postDecoder, "deckName");
|
||||
String oldDeckName = getFormParameterSafely(postDecoder, "oldDeckName");
|
||||
|
||||
Player resourceOwner = getResourceOwnerSafely(request, participantId);
|
||||
|
||||
LotroDeck deck = _deckDao.renameDeck(resourceOwner, oldDeckName, deckName);
|
||||
if (deck == null)
|
||||
throw new HttpProcessingException(404);
|
||||
|
||||
responseWriter.writeResponse(serializeDeck(deck));
|
||||
}
|
||||
|
||||
private void saveDeck(HttpRequest request, ResponseWriter responseWriter) throws Exception {
|
||||
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
|
||||
String participantId = getFormParameterSafely(postDecoder, "participantId");
|
||||
String deckName = getFormParameterSafely(postDecoder, "deckName");
|
||||
String contents = getFormParameterSafely(postDecoder, "deckContents");
|
||||
|
||||
Player resourceOwner = getResourceOwnerSafely(request, participantId);
|
||||
|
||||
LotroDeck lotroDeck = _lotroServer.createDeckWithValidate(deckName, contents);
|
||||
if (lotroDeck == null)
|
||||
throw new HttpProcessingException(400);
|
||||
|
||||
_deckDao.saveDeckForPlayer(resourceOwner, deckName, lotroDeck);
|
||||
|
||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||
|
||||
Document doc = documentBuilder.newDocument();
|
||||
Element deckElem = doc.createElement("ok");
|
||||
doc.appendChild(deckElem);
|
||||
|
||||
responseWriter.writeResponse(doc);
|
||||
}
|
||||
|
||||
private void getDeckInHtml(HttpRequest request, ResponseWriter responseWriter) throws Exception {
|
||||
QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri());
|
||||
String participantId = getQueryParameterSafely(queryDecoder, "participantId");
|
||||
String deckName = getQueryParameterSafely(queryDecoder, "deckName");
|
||||
Player resourceOwner = getResourceOwnerSafely(request, participantId);
|
||||
|
||||
LotroDeck deck = _deckDao.getDeckForPlayer(resourceOwner, deckName);
|
||||
|
||||
if (deck == null)
|
||||
throw new WebApplicationException(Response.Status.NOT_FOUND);
|
||||
|
||||
StringBuilder result = new StringBuilder();
|
||||
result.append("<html><body>");
|
||||
result.append("<h1>" + StringEscapeUtils.escapeHtml(deck.getDeckName()) + "</h1>");
|
||||
String ringBearer = deck.getRingBearer();
|
||||
if (ringBearer != null)
|
||||
result.append("<b>Ring-bearer:</b> " + GameUtils.getFullName(_library.getLotroCardBlueprint(ringBearer)) + "<br/>");
|
||||
String ring = deck.getRing();
|
||||
if (ring != null)
|
||||
result.append("<b>Ring:</b> " + GameUtils.getFullName(_library.getLotroCardBlueprint(ring)) + "<br/>");
|
||||
|
||||
DefaultCardCollection deckCards = new DefaultCardCollection();
|
||||
for (String card : deck.getAdventureCards())
|
||||
deckCards.addItem(_library.getBaseBlueprintId(card), 1);
|
||||
for (String site : deck.getSites())
|
||||
deckCards.addItem(_library.getBaseBlueprintId(site), 1);
|
||||
|
||||
result.append("<br/>");
|
||||
result.append("<b>Adventure deck:</b><br/>");
|
||||
for (CardCollection.Item item : _sortAndFilterCards.process("cardType:SITE sort:siteNumber,twilight", deckCards.getAll().values(), _library, _formatLibrary, null))
|
||||
result.append(GameUtils.getFullName(_library.getLotroCardBlueprint(item.getBlueprintId())) + "<br/>");
|
||||
|
||||
result.append("<br/>");
|
||||
result.append("<b>Free Peoples Draw Deck:</b><br/>");
|
||||
for (CardCollection.Item item : _sortAndFilterCards.process("side:FREE_PEOPLE sort:cardType,culture,name", deckCards.getAll().values(), _library, _formatLibrary, null))
|
||||
result.append(item.getCount() + "x " + GameUtils.getFullName(_library.getLotroCardBlueprint(item.getBlueprintId())) + "<br/>");
|
||||
|
||||
result.append("<br/>");
|
||||
result.append("<b>Shadow Draw Deck:</b><br/>");
|
||||
for (CardCollection.Item item : _sortAndFilterCards.process("side:SHADOW sort:cardType,culture,name", deckCards.getAll().values(), _library, _formatLibrary, null))
|
||||
result.append(item.getCount() + "x " + GameUtils.getFullName(_library.getLotroCardBlueprint(item.getBlueprintId())) + "<br/>");
|
||||
|
||||
result.append("</body></html>");
|
||||
|
||||
responseWriter.writeHtmlResponse(result.toString());
|
||||
}
|
||||
|
||||
private void getDeck(HttpRequest request, ResponseWriter responseWriter) throws Exception {
|
||||
QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri());
|
||||
String participantId = getQueryParameterSafely(queryDecoder, "participantId");
|
||||
String deckName = getQueryParameterSafely(queryDecoder, "deckName");
|
||||
|
||||
Player resourceOwner = getResourceOwnerSafely(request, participantId);
|
||||
|
||||
LotroDeck deck = _deckDao.getDeckForPlayer(resourceOwner, deckName);
|
||||
|
||||
if (deck == null) {
|
||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||
Document doc = documentBuilder.newDocument();
|
||||
Element deckElem = doc.createElement("deck");
|
||||
doc.appendChild(deckElem);
|
||||
|
||||
responseWriter.writeResponse(doc);
|
||||
} else {
|
||||
responseWriter.writeResponse(serializeDeck(deck));
|
||||
}
|
||||
}
|
||||
|
||||
private void listDecks(HttpRequest request, ResponseWriter responseWriter) throws Exception {
|
||||
QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri());
|
||||
String participantId = getQueryParameterSafely(queryDecoder, "participantId");
|
||||
@@ -56,4 +242,61 @@ public class DeckRequestHandler extends LotroServerRequestHandler implements Uri
|
||||
doc.appendChild(decksElem);
|
||||
responseWriter.writeResponse(doc);
|
||||
}
|
||||
|
||||
private Document serializeDeck(LotroDeck deck) throws ParserConfigurationException {
|
||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||
|
||||
Document doc = documentBuilder.newDocument();
|
||||
Element deckElem = doc.createElement("deck");
|
||||
doc.appendChild(deckElem);
|
||||
|
||||
if (deck.getRingBearer() != null) {
|
||||
Element ringBearer = doc.createElement("ringBearer");
|
||||
ringBearer.setAttribute("blueprintId", deck.getRingBearer());
|
||||
deckElem.appendChild(ringBearer);
|
||||
}
|
||||
|
||||
if (deck.getRing() != null) {
|
||||
Element ring = doc.createElement("ring");
|
||||
ring.setAttribute("blueprintId", deck.getRing());
|
||||
deckElem.appendChild(ring);
|
||||
}
|
||||
|
||||
for (CardItem cardItem : _sortAndFilterCards.process("sort:siteNumber,twilight", createCardItems(deck.getSites()), _library, _formatLibrary, null)) {
|
||||
Element site = doc.createElement("site");
|
||||
site.setAttribute("blueprintId", cardItem.getBlueprintId());
|
||||
deckElem.appendChild(site);
|
||||
}
|
||||
|
||||
for (CardItem cardItem : _sortAndFilterCards.process("sort:cardType,culture,name", createCardItems(deck.getAdventureCards()), _library, _formatLibrary, null)) {
|
||||
Element card = doc.createElement("card");
|
||||
card.setAttribute("side", _library.getLotroCardBlueprint(cardItem.getBlueprintId()).getSide().toString());
|
||||
card.setAttribute("blueprintId", cardItem.getBlueprintId());
|
||||
deckElem.appendChild(card);
|
||||
}
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
private List<CardItem> createCardItems(List<String> blueprintIds) {
|
||||
List<CardItem> cardItems = new LinkedList<CardItem>();
|
||||
for (String blueprintId : blueprintIds)
|
||||
cardItems.add(new BasicCardItem(blueprintId));
|
||||
|
||||
return cardItems;
|
||||
}
|
||||
|
||||
private static class BasicCardItem implements CardItem {
|
||||
private String _blueprintId;
|
||||
|
||||
private BasicCardItem(String blueprintId) {
|
||||
_blueprintId = blueprintId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBlueprintId() {
|
||||
return _blueprintId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user