Finished AdminRequestHandler.

This commit is contained in:
marcins78
2013-01-09 11:38:41 +00:00
parent f7db3a140a
commit 036a1a2371
11 changed files with 410 additions and 8 deletions

View File

@@ -1,5 +1,6 @@
package com.gempukku.lotro.async;
import com.gempukku.lotro.async.handler.UriRequestHandler;
import org.apache.log4j.Logger;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.*;

View File

@@ -1,5 +1,7 @@
package com.gempukku.lotro.async;
import com.gempukku.lotro.async.handler.RootUriRequestHandler;
import com.gempukku.lotro.async.handler.UriRequestHandler;
import com.gempukku.lotro.packs.PacksStorage;
import com.gempukku.lotro.server.provider.DaoBuilder;
import com.gempukku.lotro.server.provider.PacksStorageBuilder;

View File

@@ -0,0 +1,368 @@
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.cache.CacheManager;
import com.gempukku.lotro.collection.CollectionsManager;
import com.gempukku.lotro.db.LeagueDAO;
import com.gempukku.lotro.db.vo.CollectionType;
import com.gempukku.lotro.game.CardCollection;
import com.gempukku.lotro.game.Player;
import com.gempukku.lotro.game.formats.LotroFormatLibrary;
import com.gempukku.lotro.hall.HallServer;
import com.gempukku.lotro.league.*;
import com.gempukku.lotro.tournament.TournamentService;
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.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class AdminRequestHandler extends LotroServerRequestHandler implements UriRequestHandler {
private LeagueService _leagueService;
private TournamentService _tournamentService;
private CacheManager _cacheManager;
private HallServer _hallServer;
private LotroFormatLibrary _formatLibrary;
private LeagueDAO _leagueDao;
private CollectionsManager _collectionManager;
public AdminRequestHandler(Map<Type, Object> context) {
super(context);
_leagueService = extractObject(context, LeagueService.class);
_tournamentService = extractObject(context, TournamentService.class);
_cacheManager = extractObject(context, CacheManager.class);
_hallServer = extractObject(context, HallServer.class);
_formatLibrary = extractObject(context, LotroFormatLibrary.class);
_leagueDao = extractObject(context, LeagueDAO.class);
_collectionManager = extractObject(context, CollectionsManager.class);
}
@Override
public void handleRequest(String uri, HttpRequest request, Map<Type, Object> context, ResponseWriter responseWriter, MessageEvent e) {
try {
if (uri.equals("clearCache") && request.getMethod() == HttpMethod.GET) {
clearCache(request, responseWriter);
} else if (uri.equals("shutdown") && request.getMethod() == HttpMethod.GET) {
shutdown(request, responseWriter);
} else if (uri.equals("setMotd") && request.getMethod() == HttpMethod.POST) {
setMotd(request, responseWriter);
} else if (uri.equals("previewSealedLeague") && request.getMethod() == HttpMethod.POST) {
previewSealedLeague(request, responseWriter);
} else if (uri.equals("addSealedLeague") && request.getMethod() == HttpMethod.POST) {
addSealedLeague(request, responseWriter);
} else if (uri.equals("previewConstructedLeague") && request.getMethod() == HttpMethod.POST) {
previewConstructedLeague(request, responseWriter);
} else if (uri.equals("addConstructedLeague") && request.getMethod() == HttpMethod.POST) {
addConstructedLeague(request, responseWriter);
} else if (uri.equals("addItems") && request.getMethod() == HttpMethod.POST) {
addItems(request, responseWriter);
} else if (uri.equals("addItemsToCollection") && request.getMethod() == HttpMethod.POST) {
addItemsToCollection(request, responseWriter);
} else {
responseWriter.writeError(404);
}
} catch (HttpProcessingException exp) {
responseWriter.writeError(exp.getStatus());
} catch (Exception exp) {
responseWriter.writeError(500);
}
}
private void addItemsToCollection(HttpRequest request, ResponseWriter responseWriter) throws Exception {
validateAdmin(request);
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
String reason = getFormParameterSafely(postDecoder, "reason");
String product = getFormParameterSafely(postDecoder, "product");
String collectionType = getFormParameterSafely(postDecoder, "collectionType");
Collection<CardCollection.Item> productItems = getProductItems(product);
Map<Player,CardCollection> playersCollection = _collectionManager.getPlayersCollection(collectionType);
for (Map.Entry<Player, CardCollection> playerCollection : playersCollection.entrySet())
_collectionManager.addItemsToPlayerCollection(true, reason, playerCollection.getKey(), createCollectionType(collectionType), productItems);
responseWriter.writeHtmlResponse("OK");
}
private void addItems(HttpRequest request, ResponseWriter responseWriter) throws HttpProcessingException, Exception {
validateAdmin(request);
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
String players = getFormParameterSafely(postDecoder, "players");
String product = getFormParameterSafely(postDecoder, "product");
String collectionType = getFormParameterSafely(postDecoder, "collectionType");
Collection<CardCollection.Item> productItems = getProductItems(product);
List<String> playerNames = getItems(players);
for (String playerName : playerNames) {
Player player = _playerDao.getPlayer(playerName);
_collectionManager.addItemsToPlayerCollection(true, "Administrator action", player, createCollectionType(collectionType), productItems);
}
responseWriter.writeHtmlResponse("OK");
}
private List<String> getItems(String values) {
List<String> result = new LinkedList<String>();
for (String pack : values.split("\n")) {
String blueprint = pack.trim();
if (blueprint.length() > 0)
result.add(blueprint);
}
return result;
}
private Collection<CardCollection.Item> getProductItems(String values) {
List<CardCollection.Item> result = new LinkedList<CardCollection.Item>();
for (String item : values.split("\n")) {
item = item.trim();
if (item.length() > 0) {
final String[] itemSplit = item.split("x", 2);
if (itemSplit.length != 2)
throw new RuntimeException("Unable to parse the items");
result.add(CardCollection.Item.createItem(itemSplit[1].trim(), Integer.parseInt(itemSplit[0].trim())));
}
}
return result;
}
private CollectionType createCollectionType(String collectionType) {
if (collectionType.equals("permanent"))
return CollectionType.MY_CARDS;
return _leagueService.getCollectionTypeByCode(collectionType);
}
private void addConstructedLeague(HttpRequest request, ResponseWriter responseWriter) throws Exception {
validateLeagueAdmin(request);
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
String start = getFormParameterSafely(postDecoder, "start");
String collectionType = getFormParameterSafely(postDecoder, "collectionType");
String prizeMultiplier = getFormParameterSafely(postDecoder, "prizeMultiplier");
List<String> formats = getFormMultipleParametersSafely(postDecoder, "format");
List<String> serieDurations = getFormMultipleParametersSafely(postDecoder, "serieDuration");
List<String> maxMatches = getFormMultipleParametersSafely(postDecoder, "maxMatches");
String name = getFormParameterSafely(postDecoder, "name");
int cost = Integer.parseInt(getFormParameterSafely(postDecoder, "cost"));
String code = String.valueOf(System.currentTimeMillis());
StringBuilder sb = new StringBuilder();
sb.append(start + "," + collectionType + "," + prizeMultiplier + "," + formats.size());
for (int i = 0; i < formats.size(); i++)
sb.append("," + formats.get(i) + "," + serieDurations.get(i) + "," + maxMatches.get(i));
String parameters = sb.toString();
LeagueData leagueData = new NewConstructedLeagueData(parameters);
List<LeagueSerieData> series = leagueData.getSeries();
int leagueStart = series.get(0).getStart();
int displayEnd = DateUtils.offsetDate(series.get(series.size() - 1).getEnd(), 2);
_leagueDao.addLeague(cost, name, code, leagueData.getClass().getName(), parameters, leagueStart, displayEnd);
_leagueService.clearCache();
responseWriter.writeHtmlResponse("OK");
}
private void previewConstructedLeague(HttpRequest request, ResponseWriter responseWriter) throws Exception {
validateLeagueAdmin(request);
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
String start = getFormParameterSafely(postDecoder, "start");
String collectionType = getFormParameterSafely(postDecoder, "collectionType");
String prizeMultiplier = getFormParameterSafely(postDecoder, "prizeMultiplier");
List<String> formats = getFormMultipleParametersSafely(postDecoder, "format");
List<String> serieDurations = getFormMultipleParametersSafely(postDecoder, "serieDuration");
List<String> maxMatches = getFormMultipleParametersSafely(postDecoder, "maxMatches");
String name = getFormParameterSafely(postDecoder, "name");
int cost = Integer.parseInt(getFormParameterSafely(postDecoder, "cost"));
StringBuilder sb = new StringBuilder();
sb.append(start + "," + collectionType + "," + prizeMultiplier + "," + formats.size());
for (int i = 0; i < formats.size(); i++)
sb.append("," + formats.get(i) + "," + serieDurations.get(i) + "," + maxMatches.get(i));
String parameters = sb.toString();
LeagueData leagueData = new NewConstructedLeagueData(parameters);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.newDocument();
final List<LeagueSerieData> series = leagueData.getSeries();
int end = series.get(series.size() - 1).getEnd();
Element leagueElem = doc.createElement("league");
leagueElem.setAttribute("name", name);
leagueElem.setAttribute("cost", String.valueOf(cost));
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("format", _formatLibrary.getFormat(serie.getFormat()).getName());
serieElem.setAttribute("collection", serie.getCollectionType().getFullName());
serieElem.setAttribute("limited", String.valueOf(serie.isLimited()));
leagueElem.appendChild(serieElem);
}
doc.appendChild(leagueElem);
responseWriter.writeResponse(doc);
}
private void addSealedLeague(HttpRequest request, ResponseWriter responseWriter) throws Exception {
validateLeagueAdmin(request);
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
String format = getFormParameterSafely(postDecoder, "format");
String start = getFormParameterSafely(postDecoder, "start");
String serieDuration = getFormParameterSafely(postDecoder, "serieDuration");
String maxMatches = getFormParameterSafely(postDecoder, "maxMatches");
String name = getFormParameterSafely(postDecoder, "name");
int cost = Integer.parseInt(getFormParameterSafely(postDecoder, "cost"));
String code = String.valueOf(System.currentTimeMillis());
String parameters = format + "," + start + "," + serieDuration + "," + maxMatches + "," + code + "," + name;
LeagueData leagueData = new NewSealedLeagueData(parameters);
List<LeagueSerieData> series = leagueData.getSeries();
int leagueStart = series.get(0).getStart();
int displayEnd = DateUtils.offsetDate(series.get(series.size() - 1).getEnd(), 2);
_leagueDao.addLeague(cost, name, code, leagueData.getClass().getName(), parameters, leagueStart, displayEnd);
_leagueService.clearCache();
responseWriter.writeHtmlResponse("OK");
}
private void previewSealedLeague(HttpRequest request, ResponseWriter responseWriter) throws Exception {
validateLeagueAdmin(request);
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
String format = getFormParameterSafely(postDecoder, "format");
String start = getFormParameterSafely(postDecoder, "start");
String serieDuration = getFormParameterSafely(postDecoder, "serieDuration");
String maxMatches = getFormParameterSafely(postDecoder, "maxMatches");
String name = getFormParameterSafely(postDecoder, "name");
int cost = Integer.parseInt(getFormParameterSafely(postDecoder, "cost"));
String code = String.valueOf(System.currentTimeMillis());
String parameters = format + "," + start + "," + serieDuration + "," + maxMatches + "," + code + "," + name;
LeagueData leagueData = new NewSealedLeagueData(parameters);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.newDocument();
final List<LeagueSerieData> series = leagueData.getSeries();
int end = series.get(series.size() - 1).getEnd();
Element leagueElem = doc.createElement("league");
leagueElem.setAttribute("name", name);
leagueElem.setAttribute("cost", String.valueOf(cost));
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("format", _formatLibrary.getFormat(serie.getFormat()).getName());
serieElem.setAttribute("collection", serie.getCollectionType().getFullName());
serieElem.setAttribute("limited", String.valueOf(serie.isLimited()));
leagueElem.appendChild(serieElem);
}
doc.appendChild(leagueElem);
responseWriter.writeResponse(doc);
}
private void setMotd(HttpRequest request, ResponseWriter responseWriter) throws HttpProcessingException, Exception {
validateAdmin(request);
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
String motd = getFormParameterSafely(postDecoder, "motd");
_hallServer.setMOTD(motd);
responseWriter.writeHtmlResponse("OK");
}
private void shutdown(HttpRequest request, ResponseWriter responseWriter) throws HttpProcessingException {
validateAdmin(request);
QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri());
boolean shutdown = Boolean.valueOf(getQueryParameterSafely(queryDecoder, "shutdown"));
_hallServer.setShutdown(shutdown);
responseWriter.writeHtmlResponse("OK");
}
private void clearCache(HttpRequest request, ResponseWriter responseWriter) throws HttpProcessingException {
validateAdmin(request);
_leagueService.clearCache();
_tournamentService.clearCache();
int before = _cacheManager.getTotalCount();
_cacheManager.clearCaches();
int after = _cacheManager.getTotalCount();
responseWriter.writeHtmlResponse("Before: " + before + "<br>OK<br>After: " + after);
}
private void validateAdmin(HttpRequest request) throws HttpProcessingException {
Player player = getResourceOwnerSafely(request, null);
if (!player.getType().contains("a"))
throw new HttpProcessingException(403);
}
private void validateLeagueAdmin(HttpRequest request) throws HttpProcessingException {
Player player = getResourceOwnerSafely(request, null);
if (!player.getType().contains("l"))
throw new HttpProcessingException(403);
}
}

View File

@@ -1,5 +1,6 @@
package com.gempukku.lotro.async;
package com.gempukku.lotro.async.handler;
import com.gempukku.lotro.async.ResponseWriter;
import com.gempukku.lotro.db.DeckDAO;
import com.gempukku.lotro.game.Player;
import org.jboss.netty.channel.MessageEvent;

View File

@@ -1,7 +1,9 @@
package com.gempukku.lotro.async;
package com.gempukku.lotro.async.handler;
import com.gempukku.lotro.SubscriptionConflictException;
import com.gempukku.lotro.SubscriptionExpiredException;
import com.gempukku.lotro.async.HttpProcessingException;
import com.gempukku.lotro.async.ResponseWriter;
import com.gempukku.lotro.collection.CollectionsManager;
import com.gempukku.lotro.db.vo.League;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary;

View File

@@ -1,5 +1,6 @@
package com.gempukku.lotro.async;
package com.gempukku.lotro.async.handler;
import com.gempukku.lotro.async.ResponseWriter;
import com.gempukku.lotro.game.Player;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.handler.codec.http.CookieEncoder;

View File

@@ -1,5 +1,7 @@
package com.gempukku.lotro.async;
package com.gempukku.lotro.async.handler;
import com.gempukku.lotro.async.HttpProcessingException;
import com.gempukku.lotro.async.LoggedUserHolder;
import com.gempukku.lotro.db.PlayerDAO;
import com.gempukku.lotro.game.Player;
import org.jboss.netty.handler.codec.http.HttpRequest;
@@ -10,6 +12,8 @@ import org.jboss.netty.handler.codec.http.multipart.InterfaceHttpData;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -55,6 +59,21 @@ public class LotroServerRequestHandler {
return null;
}
protected List<String> getFormMultipleParametersSafely(HttpPostRequestDecoder postRequestDecoder, String parameterName) throws HttpPostRequestDecoder.NotEnoughDataDecoderException, IOException {
List<String> result = new LinkedList<String>();
List<InterfaceHttpData> datas = postRequestDecoder.getBodyHttpDatas(parameterName);
if (datas == null)
return Collections.emptyList();
for (InterfaceHttpData data : datas) {
if (data.getHttpDataType() == InterfaceHttpData.HttpDataType.Attribute) {
Attribute attribute = (Attribute) data;
result.add(attribute.getValue());
}
}
return result;
}
protected String getFormParameterSafely(HttpPostRequestDecoder postRequestDecoder, String parameterName) throws IOException, HttpPostRequestDecoder.NotEnoughDataDecoderException {
InterfaceHttpData data = postRequestDecoder.getBodyHttpData(parameterName);
if (data == null)

View File

@@ -1,5 +1,6 @@
package com.gempukku.lotro.async;
package com.gempukku.lotro.async.handler;
import com.gempukku.lotro.async.ResponseWriter;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.handler.codec.http.HttpRequest;
@@ -15,12 +16,14 @@ public class RootUriRequestHandler implements UriRequestHandler {
private LoginRequestHandler _loginRequestHandler;
private StatusRequestHandler _statusRequestHandler;
private DeckRequestHandler _deckRequestHandler;
private AdminRequestHandler _adminRequestHandler;
public RootUriRequestHandler(Map<Type, Object> context) {
_hallRequestHandler = new HallRequestHandler(context);
_deckRequestHandler = new DeckRequestHandler(context);
_loginRequestHandler = new LoginRequestHandler(context);
_statusRequestHandler = new StatusRequestHandler(context);
_adminRequestHandler = new AdminRequestHandler(context);
}
@Override
@@ -35,6 +38,8 @@ public class RootUriRequestHandler implements UriRequestHandler {
_deckRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+4), request, context, responseWriter, e);
} else if (uri.startsWith(_serverContextPath+"login")) {
_loginRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+5), request, context, responseWriter, e);
} else if (uri.startsWith(_serverContextPath+"admin")) {
_adminRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+5), request, context, responseWriter, e);
} else if (uri.equals(_serverContextPath)) {
_statusRequestHandler.handleRequest(uri.substring(_serverContextPath.length()), request, context, responseWriter, e);
} else {

View File

@@ -1,5 +1,6 @@
package com.gempukku.lotro.async;
package com.gempukku.lotro.async.handler;
import com.gempukku.lotro.async.ResponseWriter;
import com.gempukku.lotro.chat.ChatServer;
import com.gempukku.lotro.game.GameHistoryService;
import com.gempukku.lotro.hall.HallServer;

View File

@@ -1,5 +1,6 @@
package com.gempukku.lotro.async;
package com.gempukku.lotro.async.handler;
import com.gempukku.lotro.async.ResponseWriter;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.handler.codec.http.HttpRequest;

View File

@@ -1,5 +1,6 @@
package com.gempukku.lotro.async;
package com.gempukku.lotro.async.handler;
import com.gempukku.lotro.async.ResponseWriter;
import com.gempukku.lotro.common.ApplicationConfiguration;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.handler.codec.http.HttpRequest;