From e1230fc1073f1d3259f9825739fce5ff941d5573 Mon Sep 17 00:00:00 2001 From: marcins78 Date: Wed, 9 Jan 2013 15:49:44 +0000 Subject: [PATCH] Finished LeagueRequestHandler. --- .../async/handler/LeagueRequestHandler.java | 192 ++++++++++++++++++ .../async/handler/RootUriRequestHandler.java | 8 + 2 files changed, 200 insertions(+) create mode 100644 gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LeagueRequestHandler.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LeagueRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LeagueRequestHandler.java new file mode 100644 index 000000000..a5ba66923 --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LeagueRequestHandler.java @@ -0,0 +1,192 @@ +package com.gempukku.lotro.async.handler; + +import com.gempukku.lotro.DateUtils; +import com.gempukku.lotro.async.HttpProcessingException; +import com.gempukku.lotro.async.ResponseWriter; +import com.gempukku.lotro.competitive.PlayerStanding; +import com.gempukku.lotro.db.vo.League; +import com.gempukku.lotro.db.vo.LeagueMatchResult; +import com.gempukku.lotro.game.Player; +import com.gempukku.lotro.game.formats.LotroFormatLibrary; +import com.gempukku.lotro.league.LeagueData; +import com.gempukku.lotro.league.LeagueSerieData; +import com.gempukku.lotro.league.LeagueService; +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.text.DecimalFormat; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class LeagueRequestHandler extends LotroServerRequestHandler implements UriRequestHandler { + private LeagueService _leagueService; + private LotroFormatLibrary _formatLibrary; + + public LeagueRequestHandler(Map context) { + super(context); + + _leagueService = extractObject(context, LeagueService.class); + _formatLibrary = extractObject(context, LotroFormatLibrary.class); + } + + @Override + public void handleRequest(String uri, HttpRequest request, Map context, ResponseWriter responseWriter, MessageEvent e) throws Exception { + if (uri.equals("") && request.getMethod() == HttpMethod.GET) { + getNonExpiredLeagues(request, responseWriter); + } else if (uri.startsWith("/") && request.getMethod() == HttpMethod.GET) { + getLeagueInformation(request, uri.substring(1), responseWriter); + } else if (uri.startsWith("/") && request.getMethod() == HttpMethod.POST) { + joinLeague(request, uri.substring(1), responseWriter, e); + } else { + responseWriter.writeError(404); + } + } + + private void joinLeague(HttpRequest request, String leagueType, ResponseWriter responseWriter, MessageEvent e) throws Exception { + HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request); + String participantId = getFormParameterSafely(postDecoder, "participantId"); + + Player resourceOwner = getResourceOwnerSafely(request, participantId); + + League league = _leagueService.getLeagueByType(leagueType); + if (league == null) + throw new HttpProcessingException(404); + + if (!_leagueService.playerJoinsLeague(league, resourceOwner, e.getRemoteAddress().toString())) + throw new HttpProcessingException(409); + + responseWriter.writeResponse(null); + } + + private void getLeagueInformation(HttpRequest request, String leagueType, ResponseWriter responseWriter) throws Exception { + QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri()); + String participantId = getQueryParameterSafely(queryDecoder, "participantId"); + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + + Player resourceOwner = getResourceOwnerSafely(request, participantId); + + Document doc = documentBuilder.newDocument(); + + League league = getLeagueByType(leagueType); + + if (league == null) + throw new WebApplicationException(Response.Status.NOT_FOUND); + + final LeagueData leagueData = league.getLeagueData(); + final List series = leagueData.getSeries(); + + int end = series.get(series.size() - 1).getEnd(); + + Element leagueElem = doc.createElement("league"); + boolean inLeague = _leagueService.isPlayerInLeague(league, resourceOwner); + + leagueElem.setAttribute("member", String.valueOf(inLeague)); + leagueElem.setAttribute("joinable", String.valueOf(!inLeague && end >= DateUtils.getCurrentDate())); + leagueElem.setAttribute("type", league.getType()); + leagueElem.setAttribute("name", league.getName()); + leagueElem.setAttribute("cost", String.valueOf(league.getCost())); + leagueElem.setAttribute("start", String.valueOf(series.get(0).getStart())); + leagueElem.setAttribute("end", String.valueOf(end)); + + for (LeagueSerieData serie : series) { + Element serieElem = doc.createElement("serie"); + serieElem.setAttribute("type", serie.getName()); + serieElem.setAttribute("maxMatches", String.valueOf(serie.getMaxMatches())); + serieElem.setAttribute("start", String.valueOf(serie.getStart())); + serieElem.setAttribute("end", String.valueOf(serie.getEnd())); + serieElem.setAttribute("formatType", serie.getFormat()); + serieElem.setAttribute("format", _formatLibrary.getFormat(serie.getFormat()).getName()); + serieElem.setAttribute("collection", serie.getCollectionType().getFullName()); + serieElem.setAttribute("limited", String.valueOf(serie.isLimited())); + + Element matchesElem = doc.createElement("matches"); + Collection playerMatches = _leagueService.getPlayerMatchesInSerie(league, serie, resourceOwner.getName()); + for (LeagueMatchResult playerMatch : playerMatches) { + Element matchElem = doc.createElement("match"); + matchElem.setAttribute("winner", playerMatch.getWinner()); + matchElem.setAttribute("loser", playerMatch.getLoser()); + matchesElem.appendChild(matchElem); + } + serieElem.appendChild(matchesElem); + + final List standings = _leagueService.getLeagueSerieStandings(league, serie); + for (PlayerStanding standing : standings) { + Element standingElem = doc.createElement("standing"); + setStandingAttributes(standing, standingElem); + serieElem.appendChild(standingElem); + } + + leagueElem.appendChild(serieElem); + } + + List leagueStandings = _leagueService.getLeagueStandings(league); + for (PlayerStanding standing : leagueStandings) { + Element standingElem = doc.createElement("leagueStanding"); + setStandingAttributes(standing, standingElem); + leagueElem.appendChild(standingElem); + } + + doc.appendChild(leagueElem); + + responseWriter.writeResponse(doc); + } + + private void getNonExpiredLeagues(HttpRequest request, ResponseWriter responseWriter) throws Exception { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + + Document doc = documentBuilder.newDocument(); + Element leagues = doc.createElement("leagues"); + + for (League league : _leagueService.getActiveLeagues()) { + final LeagueData leagueData = league.getLeagueData(); + final List series = leagueData.getSeries(); + + int end = series.get(series.size() - 1).getEnd(); + + Element leagueElem = doc.createElement("league"); + + leagueElem.setAttribute("type", league.getType()); + leagueElem.setAttribute("name", league.getName()); + leagueElem.setAttribute("start", String.valueOf(series.get(0).getStart())); + leagueElem.setAttribute("end", String.valueOf(end)); + + leagues.appendChild(leagueElem); + } + + doc.appendChild(leagues); + + responseWriter.writeResponse(doc); + } + + public League getLeagueByType(String type) { + for (League league : _leagueService.getActiveLeagues()) { + if (league.getType().equals(type)) + return league; + } + return null; + } + + private void setStandingAttributes(PlayerStanding standing, Element standingElem) { + standingElem.setAttribute("player", standing.getPlayerName()); + standingElem.setAttribute("standing", String.valueOf(standing.getStanding())); + standingElem.setAttribute("points", String.valueOf(standing.getPoints())); + standingElem.setAttribute("gamesPlayed", String.valueOf(standing.getGamesPlayed())); + DecimalFormat format = new DecimalFormat("##0.00%"); + standingElem.setAttribute("opponentWin", format.format(standing.getOpponentWin())); + } + +} 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 8d4505326..7f02c59ce 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 @@ -20,6 +20,8 @@ public class RootUriRequestHandler implements UriRequestHandler { private ChatRequestHandler _chatRequestHandler; private CollectionRequestHandler _collectionRequestHandler; private DeliveryRequestHandler _deliveryRequestHandler; + private GameRequestHandler _gameRequestHandler; + private LeagueRequestHandler _leagueRequestHandler; public RootUriRequestHandler(Map context) { _hallRequestHandler = new HallRequestHandler(context); @@ -30,6 +32,8 @@ public class RootUriRequestHandler implements UriRequestHandler { _chatRequestHandler = new ChatRequestHandler(context); _collectionRequestHandler = new CollectionRequestHandler(context); _deliveryRequestHandler = new DeliveryRequestHandler(context); + _gameRequestHandler = new GameRequestHandler(context); + _leagueRequestHandler = new LeagueRequestHandler(context); } @Override @@ -52,6 +56,10 @@ public class RootUriRequestHandler implements UriRequestHandler { _collectionRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+10), request, context, responseWriter, e); } else if (uri.startsWith(_serverContextPath + "delivery")) { _deliveryRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+8), request, context, responseWriter, e); + } else if (uri.startsWith(_serverContextPath + "game")) { + _gameRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+4), request, context, responseWriter, e); + } else if (uri.startsWith(_serverContextPath + "league")) { + _leagueRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+6), request, context, responseWriter, e); } else if (uri.equals(_serverContextPath)) { _statusRequestHandler.handleRequest(uri.substring(_serverContextPath.length()), request, context, responseWriter, e); } else {