Finished LeagueRequestHandler.

This commit is contained in:
marcins78
2013-01-09 15:49:44 +00:00
parent ff218a2ca3
commit e1230fc107
2 changed files with 200 additions and 0 deletions

View File

@@ -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<Type, Object> context) {
super(context);
_leagueService = extractObject(context, LeagueService.class);
_formatLibrary = extractObject(context, LotroFormatLibrary.class);
}
@Override
public void handleRequest(String uri, HttpRequest request, Map<Type, Object> 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<LeagueSerieData> 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<LeagueMatchResult> 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<PlayerStanding> standings = _leagueService.getLeagueSerieStandings(league, serie);
for (PlayerStanding standing : standings) {
Element standingElem = doc.createElement("standing");
setStandingAttributes(standing, standingElem);
serieElem.appendChild(standingElem);
}
leagueElem.appendChild(serieElem);
}
List<PlayerStanding> 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<LeagueSerieData> 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()));
}
}

View File

@@ -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<Type, Object> 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 {