diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/AdminRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/AdminRequestHandler.java index f4b8cc7cd..1977af126 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/AdminRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/AdminRequestHandler.java @@ -52,23 +52,23 @@ public class AdminRequestHandler extends LotroServerRequestHandler implements Ur @Override public void handleRequest(String uri, HttpRequest request, Map 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); diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/ChatRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/ChatRequestHandler.java new file mode 100644 index 000000000..36cceaf5b --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/ChatRequestHandler.java @@ -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 context) { + super(context); + _chatServer = extractObject(context, ChatServer.class); + } + + @Override + public void handleRequest(String uri, HttpRequest request, Map 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 chatMessages = chatRoom.getPendingMessages(resourceOwner.getName()); + + Collection 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 chatMessages = chatRoom.joinUser(resourceOwner.getName(), resourceOwner.getType().contains("a")); + Collection 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 chatMessages, Collection 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); + } + } +} diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java index 1ff79a87c..fdd82da4c 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java @@ -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())); 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 be6eb3fa4..3bbeb18ce 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 @@ -17,6 +17,7 @@ public class RootUriRequestHandler implements UriRequestHandler { private StatusRequestHandler _statusRequestHandler; private DeckRequestHandler _deckRequestHandler; private AdminRequestHandler _adminRequestHandler; + private ChatRequestHandler _chatRequestHandler; public RootUriRequestHandler(Map 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 {