diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/CollectionRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/CollectionRequestHandler.java new file mode 100644 index 000000000..30d5456a8 --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/CollectionRequestHandler.java @@ -0,0 +1,260 @@ +package com.gempukku.lotro.async.handler; + +import com.gempukku.lotro.async.HttpProcessingException; +import com.gempukku.lotro.async.ResponseWriter; +import com.gempukku.lotro.cards.packs.RarityReader; +import com.gempukku.lotro.cards.packs.SetRarity; +import com.gempukku.lotro.collection.CollectionsManager; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Side; +import com.gempukku.lotro.db.vo.CollectionType; +import com.gempukku.lotro.db.vo.League; +import com.gempukku.lotro.game.*; +import com.gempukku.lotro.game.formats.LotroFormatLibrary; +import com.gempukku.lotro.league.LeagueSerieData; +import com.gempukku.lotro.league.LeagueService; +import com.gempukku.lotro.packs.PacksStorage; +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 java.lang.reflect.Type; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CollectionRequestHandler extends LotroServerRequestHandler implements UriRequestHandler { + private HashMap _rarities; + private LeagueService _leagueService; + private CollectionsManager _collectionsManager; + private PacksStorage _packStorage; + private LotroCardBlueprintLibrary _library; + private LotroFormatLibrary _formatLibrary; + private SortAndFilterCards _sortAndFilterCards; + + public CollectionRequestHandler(Map context) { + super(context); + _rarities = new HashMap(); + RarityReader reader = new RarityReader(); + _rarities.put("0", reader.getSetRarity("0")); + _rarities.put("1", reader.getSetRarity("1")); + _rarities.put("2", reader.getSetRarity("2")); + _rarities.put("3", reader.getSetRarity("3")); + _rarities.put("4", reader.getSetRarity("4")); + _rarities.put("5", reader.getSetRarity("5")); + _rarities.put("6", reader.getSetRarity("6")); + _rarities.put("7", reader.getSetRarity("7")); + _rarities.put("8", reader.getSetRarity("8")); + _rarities.put("9", reader.getSetRarity("9")); + _rarities.put("10", reader.getSetRarity("10")); + _rarities.put("11", reader.getSetRarity("11")); + _rarities.put("12", reader.getSetRarity("12")); + _rarities.put("13", reader.getSetRarity("13")); + _rarities.put("14", reader.getSetRarity("14")); + _rarities.put("15", reader.getSetRarity("15")); + _rarities.put("16", reader.getSetRarity("16")); + _rarities.put("17", reader.getSetRarity("17")); + _rarities.put("18", reader.getSetRarity("18")); + _rarities.put("19", reader.getSetRarity("19")); + + _leagueService = extractObject(context, LeagueService.class); + _collectionsManager = extractObject(context, CollectionsManager.class); + _packStorage = extractObject(context, PacksStorage.class); + _library = extractObject(context, LotroCardBlueprintLibrary.class); + _formatLibrary = extractObject(context, LotroFormatLibrary.class); + _sortAndFilterCards = new SortAndFilterCards(); + } + + @Override + public void handleRequest(String uri, HttpRequest request, Map context, ResponseWriter responseWriter, MessageEvent e) { + try { + if (uri.equals("") && request.getMethod() == HttpMethod.GET) { + getCollectionTypes(request, responseWriter); + } else if (uri.startsWith("/") && request.getMethod() == HttpMethod.POST) { + openPack(request, uri.substring(1), responseWriter); + } else if (uri.startsWith("/") && request.getMethod() == HttpMethod.GET) { + getCollection(request, uri.substring(1), responseWriter); + } else { + responseWriter.writeError(404); + } + } catch (HttpProcessingException exp) { + responseWriter.writeError(exp.getStatus()); + } catch (Exception exp) { + responseWriter.writeError(500); + } + } + + private void getCollection(HttpRequest request, String collectionType, ResponseWriter responseWriter) throws Exception { + QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri()); + String participantId = getQueryParameterSafely(queryDecoder, "participantId"); + String filter = getQueryParameterSafely(queryDecoder, "filter"); + int start = Integer.parseInt(getQueryParameterSafely(queryDecoder, "start")); + int count = Integer.parseInt(getQueryParameterSafely(queryDecoder, "count")); + + Player resourceOwner = getResourceOwnerSafely(request, participantId); + + CardCollection collection = constructCollection(resourceOwner, collectionType); + + if (collection == null) + throw new WebApplicationException(Response.Status.NOT_FOUND); + + Collection items = collection.getAll().values(); + List filteredResult = _sortAndFilterCards.process(filter, items, _library, _formatLibrary, _rarities); + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + + Document doc = documentBuilder.newDocument(); + + Element collectionElem = doc.createElement("collection"); + collectionElem.setAttribute("count", String.valueOf(filteredResult.size())); + doc.appendChild(collectionElem); + + for (int i = start; i < start + count; i++) { + if (i >= 0 && i < filteredResult.size()) { + CardCollection.Item item = filteredResult.get(i); + String blueprintId = item.getBlueprintId(); + if (item.getType() == CardCollection.Item.Type.CARD) { + Element card = doc.createElement("card"); + card.setAttribute("count", String.valueOf(item.getCount())); + card.setAttribute("blueprintId", blueprintId); + LotroCardBlueprint blueprint = _library.getLotroCardBlueprint(blueprintId); + appendCardSide(card, blueprint); + appendCardGroup(card, blueprint); + collectionElem.appendChild(card); + } else { + Element pack = doc.createElement("pack"); + pack.setAttribute("count", String.valueOf(item.getCount())); + pack.setAttribute("blueprintId", blueprintId); + if (item.getType() == CardCollection.Item.Type.SELECTION) { + List contents = _packStorage.openPack(blueprintId); + StringBuilder contentsStr = new StringBuilder(); + for (CardCollection.Item content : contents) + contentsStr.append(content.getBlueprintId()).append("|"); + contentsStr.delete(contentsStr.length() - 1, contentsStr.length()); + pack.setAttribute("contents", contentsStr.toString()); + } + collectionElem.appendChild(pack); + } + } + } + + responseWriter.writeResponse(doc); + } + + private CardCollection constructCollection(Player player, String collectionType) { + return _collectionsManager.getPlayerCollection(player, collectionType); + } + + private void openPack(HttpRequest request, String collectionType, ResponseWriter responseWriter) throws Exception { + HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request); + String participantId = getFormParameterSafely(postDecoder, "participantId"); + String selection = getFormParameterSafely(postDecoder, "selection"); + String packId = getFormParameterSafely(postDecoder, "pack"); + + Player resourceOwner = getResourceOwnerSafely(request, participantId); + + CollectionType collectionTypeObj = createCollectionType(collectionType); + CardCollection packContents = _collectionsManager.openPackInPlayerCollection(resourceOwner, collectionTypeObj, selection, _packStorage, packId); + + if (packContents == null) + throw new WebApplicationException(Response.Status.NOT_FOUND); + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + + Document doc = documentBuilder.newDocument(); + + Element collectionElem = doc.createElement("pack"); + doc.appendChild(collectionElem); + + for (CardCollection.Item item : packContents.getAll().values()) { + String blueprintId = item.getBlueprintId(); + if (item.getType() == CardCollection.Item.Type.CARD) { + Element card = doc.createElement("card"); + card.setAttribute("count", String.valueOf(item.getCount())); + card.setAttribute("blueprintId", blueprintId); + appendCardSide(card, _library.getLotroCardBlueprint(blueprintId)); + collectionElem.appendChild(card); + } else { + Element pack = doc.createElement("pack"); + pack.setAttribute("count", String.valueOf(item.getCount())); + pack.setAttribute("blueprintId", blueprintId); + collectionElem.appendChild(pack); + } + } + + responseWriter.writeResponse(doc); + } + + private void getCollectionTypes(HttpRequest request, ResponseWriter responseWriter) throws Exception { + QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri()); + String participantId = getQueryParameterSafely(queryDecoder, "participantId"); + + Player resourceOwner = getResourceOwnerSafely(request, participantId); + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + + Document doc = documentBuilder.newDocument(); + + Element collectionsElem = doc.createElement("collections"); + + for (League league : _leagueService.getActiveLeagues()) { + LeagueSerieData serie = _leagueService.getCurrentLeagueSerie(league); + if (serie != null && serie.isLimited() && _leagueService.isPlayerInLeague(league, resourceOwner)) { + CollectionType collectionType = serie.getCollectionType(); + Element collectionElem = doc.createElement("collection"); + collectionElem.setAttribute("type", collectionType.getCode()); + collectionElem.setAttribute("name", collectionType.getFullName()); + collectionsElem.appendChild(collectionElem); + } + } + + doc.appendChild(collectionsElem); + + responseWriter.writeResponse(doc); + } + + private CollectionType createCollectionType(String collectionType) { + if (collectionType.equals("permanent")) + return CollectionType.MY_CARDS; + + return _leagueService.getCollectionTypeByCode(collectionType); + } + + private void appendCardSide(Element card, LotroCardBlueprint blueprint) { + Side side = blueprint.getSide(); + if (side != null) + card.setAttribute("side", side.toString()); + } + + private void appendCardGroup(Element card, LotroCardBlueprint blueprint) { + String group; + if (blueprint.getCardType() == CardType.THE_ONE_RING) + group="ring"; + else if (blueprint.getCardType() == CardType.SITE) + group="site"; + else if (blueprint.hasKeyword(Keyword.CAN_START_WITH_RING)) + group="ringBearer"; + else if (blueprint.getSide() == Side.FREE_PEOPLE) + group="fp"; + else if (blueprint.getSide() == Side.SHADOW) + group="shadow"; + else + group = null; + if (group != null) + card.setAttribute("group", group); + } + +} diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/RootUriRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/RootUriRequestHandler.java index 3bbeb18ce..0bb7bf771 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/RootUriRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/RootUriRequestHandler.java @@ -18,6 +18,7 @@ public class RootUriRequestHandler implements UriRequestHandler { private DeckRequestHandler _deckRequestHandler; private AdminRequestHandler _adminRequestHandler; private ChatRequestHandler _chatRequestHandler; + private CollectionRequestHandler _collectionRequestHandler; public RootUriRequestHandler(Map context) { _hallRequestHandler = new HallRequestHandler(context); @@ -26,6 +27,7 @@ public class RootUriRequestHandler implements UriRequestHandler { _statusRequestHandler = new StatusRequestHandler(context); _adminRequestHandler = new AdminRequestHandler(context); _chatRequestHandler = new ChatRequestHandler(context); + _collectionRequestHandler = new CollectionRequestHandler(context); } @Override @@ -44,6 +46,8 @@ public class RootUriRequestHandler implements UriRequestHandler { _adminRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+5), request, context, responseWriter, e); } else if (uri.startsWith(_serverContextPath + "chat")) { _chatRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+4), request, context, responseWriter, e); + } else if (uri.startsWith(_serverContextPath + "collection")) { + _collectionRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+10), request, context, responseWriter, e); } else if (uri.equals(_serverContextPath)) { _statusRequestHandler.handleRequest(uri.substring(_serverContextPath.length()), request, context, responseWriter, e); } else { diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/deckBuild.html b/gemp-lotr/gemp-lotr-web/src/main/webapp/deckBuild.html index 7c71af804..9e0a0df22 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/deckBuild.html +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/deckBuild.html @@ -1,9 +1,3 @@ -<%@ page contentType="text/html; charset=UTF-8"%> -<% -response.setHeader("Cache-Control","no-cache"); -response.setHeader("Pragma","no-cache"); -response.setDateHeader ("Expires", -1); -%> @@ -12,7 +6,39 @@ response.setDateHeader ("Expires", -1); - <%@ include file="js.inc" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +