From 054a1410728d3a97d4638ef35ce7a41c2460e95e Mon Sep 17 00:00:00 2001 From: marcins78 Date: Wed, 9 Jan 2013 15:17:52 +0000 Subject: [PATCH] Finished DeckRequestHandler. --- .../async/handler/DeckRequestHandler.java | 253 +++++++++++++++++- 1 file changed, 248 insertions(+), 5 deletions(-) diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java index 563e1c7f0..c0276ad9d 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java @@ -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 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 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("Free People: " + fpCount + ", Shadow: " + shadowCount + "
"); + + StringBuilder valid = new StringBuilder(); + StringBuilder invalid = new StringBuilder(); + for (LotroFormat format : _formatLibrary.getHallFormats().values()) { + try { + format.validateDeck(deck); + valid.append("" + format.getName() + ": valid
"); + } catch (DeckInvalidException exp) { + invalid.append("" + format.getName() + ": " + exp.getMessage() + "
"); + } + } + 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(""); + result.append("

" + StringEscapeUtils.escapeHtml(deck.getDeckName()) + "

"); + String ringBearer = deck.getRingBearer(); + if (ringBearer != null) + result.append("Ring-bearer: " + GameUtils.getFullName(_library.getLotroCardBlueprint(ringBearer)) + "
"); + String ring = deck.getRing(); + if (ring != null) + result.append("Ring: " + GameUtils.getFullName(_library.getLotroCardBlueprint(ring)) + "
"); + + 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("
"); + result.append("Adventure deck:
"); + 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())) + "
"); + + result.append("
"); + result.append("Free Peoples Draw Deck:
"); + 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())) + "
"); + + result.append("
"); + result.append("Shadow Draw Deck:
"); + 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())) + "
"); + + result.append(""); + + 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 createCardItems(List blueprintIds) { + List cardItems = new LinkedList(); + 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; + } + } }