Finished working on ChatRequestHandler.

This commit is contained in:
marcins78
2013-01-09 12:05:40 +00:00
parent 036a1a2371
commit e2dfeba47a
4 changed files with 163 additions and 13 deletions

View File

@@ -52,23 +52,23 @@ public class AdminRequestHandler extends LotroServerRequestHandler implements Ur
@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) {
if (uri.equals("/clearCache") && request.getMethod() == HttpMethod.GET) {
clearCache(request, responseWriter);
} else if (uri.equals("shutdown") && request.getMethod() == HttpMethod.GET) {
} else if (uri.equals("/shutdown") && request.getMethod() == HttpMethod.GET) {
shutdown(request, responseWriter);
} else if (uri.equals("setMotd") && request.getMethod() == HttpMethod.POST) {
} else if (uri.equals("/setMotd") && request.getMethod() == HttpMethod.POST) {
setMotd(request, responseWriter);
} else if (uri.equals("previewSealedLeague") && request.getMethod() == HttpMethod.POST) {
} else if (uri.equals("/previewSealedLeague") && request.getMethod() == HttpMethod.POST) {
previewSealedLeague(request, responseWriter);
} else if (uri.equals("addSealedLeague") && request.getMethod() == HttpMethod.POST) {
} else if (uri.equals("/addSealedLeague") && request.getMethod() == HttpMethod.POST) {
addSealedLeague(request, responseWriter);
} else if (uri.equals("previewConstructedLeague") && request.getMethod() == HttpMethod.POST) {
} else if (uri.equals("/previewConstructedLeague") && request.getMethod() == HttpMethod.POST) {
previewConstructedLeague(request, responseWriter);
} else if (uri.equals("addConstructedLeague") && request.getMethod() == HttpMethod.POST) {
} else if (uri.equals("/addConstructedLeague") && request.getMethod() == HttpMethod.POST) {
addConstructedLeague(request, responseWriter);
} else if (uri.equals("addItems") && request.getMethod() == HttpMethod.POST) {
} else if (uri.equals("/addItems") && request.getMethod() == HttpMethod.POST) {
addItems(request, responseWriter);
} else if (uri.equals("addItemsToCollection") && request.getMethod() == HttpMethod.POST) {
} else if (uri.equals("/addItemsToCollection") && request.getMethod() == HttpMethod.POST) {
addItemsToCollection(request, responseWriter);
} else {
responseWriter.writeError(404);

View File

@@ -0,0 +1,148 @@
package com.gempukku.lotro.async.handler;
import com.gempukku.lotro.PrivateInformationException;
import com.gempukku.lotro.SubscriptionExpiredException;
import com.gempukku.lotro.async.HttpProcessingException;
import com.gempukku.lotro.async.ResponseWriter;
import com.gempukku.lotro.chat.ChatMessage;
import com.gempukku.lotro.chat.ChatRoomMediator;
import com.gempukku.lotro.chat.ChatServer;
import com.gempukku.lotro.game.Player;
import org.apache.commons.lang.StringEscapeUtils;
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.net.URLDecoder;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public class ChatRequestHandler extends LotroServerRequestHandler implements UriRequestHandler {
private long _longPollingLength = 5000;
private long _longPollingInterval = 200;
private ChatServer _chatServer;
public ChatRequestHandler(Map<Type, Object> context) {
super(context);
_chatServer = extractObject(context, ChatServer.class);
}
@Override
public void handleRequest(String uri, HttpRequest request, Map<Type, Object> context, ResponseWriter responseWriter, MessageEvent e) {
try {
if (uri.startsWith("/") && request.getMethod() == HttpMethod.GET) {
getMessages(request, URLDecoder.decode(uri.substring(1)), responseWriter);
} else if (uri.startsWith("/") && request.getMethod() == HttpMethod.POST) {
postMessages(request, URLDecoder.decode(uri.substring(1)), responseWriter);
} else {
responseWriter.writeError(404);
}
} catch (HttpProcessingException exp) {
responseWriter.writeError(exp.getStatus());
} catch (Exception exp) {
responseWriter.writeError(500);
}
}
private void postMessages(HttpRequest request, String room, ResponseWriter responseWriter) throws Exception {
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
String participantId = getFormParameterSafely(postDecoder, "participantId");
String message = getFormParameterSafely(postDecoder, "message");
Player resourceOwner = getResourceOwnerSafely(request, participantId);
ChatRoomMediator chatRoom = _chatServer.getChatRoom(room);
if (chatRoom == null)
throw new HttpProcessingException(404);
try {
if (message != null && message.trim().length() > 0)
chatRoom.sendMessage(resourceOwner.getName(), StringEscapeUtils.escapeHtml(message), resourceOwner.getType().contains("a"));
} catch (PrivateInformationException exp) {
throw new HttpProcessingException(403);
}
try {
// Use long polling
long start = System.currentTimeMillis();
while (System.currentTimeMillis() < start + _longPollingLength && !chatRoom.hasPendingMessages(resourceOwner.getName())) {
try {
Thread.sleep(_longPollingInterval);
} catch (InterruptedException exp) {
}
}
List<ChatMessage> chatMessages = chatRoom.getPendingMessages(resourceOwner.getName());
Collection<String> usersInRoom = chatRoom.getUsersInRoom();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.newDocument();
serializeChatRoomData(room, chatMessages, usersInRoom, doc);
responseWriter.writeResponse(doc);
} catch (SubscriptionExpiredException exp) {
throw new HttpProcessingException(410);
}
}
private void getMessages(HttpRequest request, String room, ResponseWriter responseWriter) throws Exception {
QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri());
String participantId = getQueryParameterSafely(queryDecoder, "participantId");
Player resourceOwner = getResourceOwnerSafely(request, participantId);
ChatRoomMediator chatRoom = _chatServer.getChatRoom(room);
if (chatRoom == null)
throw new HttpProcessingException(404);
try {
List<ChatMessage> chatMessages = chatRoom.joinUser(resourceOwner.getName(), resourceOwner.getType().contains("a"));
Collection<String> usersInRoom = chatRoom.getUsersInRoom();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.newDocument();
serializeChatRoomData(room, chatMessages, usersInRoom, doc);
responseWriter.writeResponse(doc);
} catch (PrivateInformationException exp) {
throw new HttpProcessingException(403);
}
}
private void serializeChatRoomData(String room, List<ChatMessage> chatMessages, Collection<String> usersInRoom, Document doc) {
Element chatElem = doc.createElement("chat");
chatElem.setAttribute("roomName", room);
doc.appendChild(chatElem);
for (ChatMessage chatMessage : chatMessages) {
Element message = doc.createElement("message");
message.setAttribute("from", chatMessage.getFrom());
message.setAttribute("date", String.valueOf(chatMessage.getWhen().getTime()));
message.appendChild(doc.createTextNode(chatMessage.getMessage()));
chatElem.appendChild(message);
}
for (String userInRoom : usersInRoom) {
Element user = doc.createElement("user");
user.appendChild(doc.createTextNode(userInRoom));
chatElem.appendChild(user);
}
}
}

View File

@@ -24,8 +24,6 @@ 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 javax.xml.parsers.ParserConfigurationException;
@@ -326,9 +324,9 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri
}
_hallServer.processHall(resourceOwner, channelNumber, new SerializeHallInfoVisitor(doc, hall));
} catch (SubscriptionExpiredException exp) {
throw new WebApplicationException(Response.Status.GONE);
throw new HttpProcessingException(410);
} catch (SubscriptionConflictException exp) {
throw new WebApplicationException(Response.Status.CONFLICT);
throw new HttpProcessingException(409);
}
hall.setAttribute("currency", String.valueOf(_collectionManager.getPlayerCollection(resourceOwner, "permanent").getCurrency()));

View File

@@ -17,6 +17,7 @@ public class RootUriRequestHandler implements UriRequestHandler {
private StatusRequestHandler _statusRequestHandler;
private DeckRequestHandler _deckRequestHandler;
private AdminRequestHandler _adminRequestHandler;
private ChatRequestHandler _chatRequestHandler;
public RootUriRequestHandler(Map<Type, Object> context) {
_hallRequestHandler = new HallRequestHandler(context);
@@ -24,6 +25,7 @@ public class RootUriRequestHandler implements UriRequestHandler {
_loginRequestHandler = new LoginRequestHandler(context);
_statusRequestHandler = new StatusRequestHandler(context);
_adminRequestHandler = new AdminRequestHandler(context);
_chatRequestHandler = new ChatRequestHandler(context);
}
@Override
@@ -40,6 +42,8 @@ public class RootUriRequestHandler implements UriRequestHandler {
_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.startsWith(_serverContextPath + "chat")) {
_chatRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+4), request, context, responseWriter, e);
} else if (uri.equals(_serverContextPath)) {
_statusRequestHandler.handleRequest(uri.substring(_serverContextPath.length()), request, context, responseWriter, e);
} else {