Adding CollectionRequestHandler.

This commit is contained in:
marcins78
2013-01-09 13:16:05 +00:00
parent 56ec2a04b9
commit 9c085548ec
4 changed files with 330 additions and 14 deletions

View File

@@ -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<String, SetRarity> _rarities;
private LeagueService _leagueService;
private CollectionsManager _collectionsManager;
private PacksStorage _packStorage;
private LotroCardBlueprintLibrary _library;
private LotroFormatLibrary _formatLibrary;
private SortAndFilterCards _sortAndFilterCards;
public CollectionRequestHandler(Map<Type, Object> context) {
super(context);
_rarities = new HashMap<String, SetRarity>();
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<Type, Object> 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<CardCollection.Item> items = collection.getAll().values();
List<CardCollection.Item> 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<CardCollection.Item> 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);
}
}

View File

@@ -18,6 +18,7 @@ public class RootUriRequestHandler implements UriRequestHandler {
private DeckRequestHandler _deckRequestHandler;
private AdminRequestHandler _adminRequestHandler;
private ChatRequestHandler _chatRequestHandler;
private CollectionRequestHandler _collectionRequestHandler;
public RootUriRequestHandler(Map<Type, Object> 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 {

View File

@@ -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);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
@@ -12,7 +6,39 @@ response.setDateHeader ("Expires", -1);
<link rel="stylesheet" type="text/css" href="css/gemp-001/deckBuild.css">
<%@ include file="js.inc" %>
<link rel="stylesheet" type="text/css" href="css/dark-hive/jquery-ui-1.8.16.custom.css">
<link rel="stylesheet" type="text/css" href="css/jquery.contextMenu.css">
<link rel="stylesheet" type="text/css" href="js/jquery/styles/jquery.spinnercontrol.css">
<script type="text/javascript" src="js/jquery/jquery-1.6.2.js"></script>
<script type="text/javascript" src="js/jquery/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery.cookie.js"></script>
<script type="text/javascript" src="js/jquery/jquery.spinnercontrol.js"></script>
<script type="text/javascript" src="js/jquery/jquery.layout.js"></script>
<script type="text/javascript" src="js/jquery/jquery.touchSwipe.js"></script>
<script type="text/javascript" src="js/gemp-015/inheritance.js"></script>
<script type="text/javascript" src="js/gemp-015/common.js"></script>
<script type="text/javascript" src="js/gemp-015/logging.js"></script>
<script type="text/javascript" src="js/gemp-015/chat.js"></script>
<script type="text/javascript" src="js/gemp-015/communication.js"></script>
<script type="text/javascript" src="js/gemp-015/deliveryService.js"></script>
<script type="text/javascript" src="js/gemp-015/commonUi.js"></script>
<script type="text/javascript" src="js/gemp-015/cardFilter.js"></script>
<script type="text/javascript" src="js/gemp-015/jCardGroup.js"></script>
<script type="text/javascript" src="js/gemp-015/jCards.js"></script>
<script type="text/javascript" src="js/gemp-015/hallUi.js"></script>
<script type="text/javascript" src="js/gemp-015/leagueResultsUi.js"></script>
<script type="text/javascript" src="js/gemp-015/tournamentResultsUi.js"></script>
<script type="text/javascript" src="js/gemp-015/statsUi.js"></script>
<script type="text/javascript" src="js/gemp-015/playerStatsUi.js"></script>
<script type="text/javascript" src="js/gemp-015/gameHistoryUi.js"></script>
<script type="text/javascript" src="js/gemp-015/deckBuildingUi.js"></script>
<script type="text/javascript" src="js/gemp-015/gameUi.js"></script>
<script type="text/javascript" src="js/gemp-015/gameAnimations.js"></script>
<script type="text/javascript" src="js/gemp-015/merchantUi.js"></script>
<script type="text/javascript">

View File

@@ -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);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
@@ -12,7 +6,39 @@ response.setDateHeader ("Expires", -1);
<link rel="stylesheet" type="text/css" href="css/gemp-001/merchant.css">
<%@ include file="js.inc" %>
<link rel="stylesheet" type="text/css" href="css/dark-hive/jquery-ui-1.8.16.custom.css">
<link rel="stylesheet" type="text/css" href="css/jquery.contextMenu.css">
<link rel="stylesheet" type="text/css" href="js/jquery/styles/jquery.spinnercontrol.css">
<script type="text/javascript" src="js/jquery/jquery-1.6.2.js"></script>
<script type="text/javascript" src="js/jquery/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery.cookie.js"></script>
<script type="text/javascript" src="js/jquery/jquery.spinnercontrol.js"></script>
<script type="text/javascript" src="js/jquery/jquery.layout.js"></script>
<script type="text/javascript" src="js/jquery/jquery.touchSwipe.js"></script>
<script type="text/javascript" src="js/gemp-015/inheritance.js"></script>
<script type="text/javascript" src="js/gemp-015/common.js"></script>
<script type="text/javascript" src="js/gemp-015/logging.js"></script>
<script type="text/javascript" src="js/gemp-015/chat.js"></script>
<script type="text/javascript" src="js/gemp-015/communication.js"></script>
<script type="text/javascript" src="js/gemp-015/deliveryService.js"></script>
<script type="text/javascript" src="js/gemp-015/commonUi.js"></script>
<script type="text/javascript" src="js/gemp-015/cardFilter.js"></script>
<script type="text/javascript" src="js/gemp-015/jCardGroup.js"></script>
<script type="text/javascript" src="js/gemp-015/jCards.js"></script>
<script type="text/javascript" src="js/gemp-015/hallUi.js"></script>
<script type="text/javascript" src="js/gemp-015/leagueResultsUi.js"></script>
<script type="text/javascript" src="js/gemp-015/tournamentResultsUi.js"></script>
<script type="text/javascript" src="js/gemp-015/statsUi.js"></script>
<script type="text/javascript" src="js/gemp-015/playerStatsUi.js"></script>
<script type="text/javascript" src="js/gemp-015/gameHistoryUi.js"></script>
<script type="text/javascript" src="js/gemp-015/deckBuildingUi.js"></script>
<script type="text/javascript" src="js/gemp-015/gameUi.js"></script>
<script type="text/javascript" src="js/gemp-015/gameAnimations.js"></script>
<script type="text/javascript" src="js/gemp-015/merchantUi.js"></script>
<script type="text/javascript">