diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LongPollingResource.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LongPollingResource.java index e84e77701..c2408d27c 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LongPollingResource.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LongPollingResource.java @@ -3,5 +3,5 @@ package com.gempukku.lotro.async; public interface LongPollingResource { public boolean isChanged(); - public void process(); + public void processIfNotProcessed(); } diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LongPollingSystem.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LongPollingSystem.java index 98ac0f534..c3c7061ab 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LongPollingSystem.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LongPollingSystem.java @@ -41,7 +41,7 @@ public class LongPollingSystem { LongPollingResource resource = _waitingActions.poll(); try { if (resource.isChanged()) - resource.process(); + resource.processIfNotProcessed(); else _waitingActions.add(resource); } catch (Exception exp) { @@ -67,8 +67,8 @@ public class LongPollingSystem { } @Override - public void process() { - _longPollingResource.process(); + public void processIfNotProcessed() { + _longPollingResource.processIfNotProcessed(); } } @@ -79,7 +79,7 @@ public class LongPollingSystem { } @Override - public void process() { + public void processIfNotProcessed() { pause(); _waitingActions.add(this); } 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 index b74f8240f..ba87c00cf 100644 --- 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 @@ -68,7 +68,7 @@ public class ChatRequestHandler extends LotroServerRequestHandler implements Uri ChatUpdateLongPollingResource polledResource = new ChatUpdateLongPollingResource(chatRoom, room, resourceOwner.getName(), responseWriter); if (polledResource.isChanged()) - polledResource.process(); + polledResource.processIfNotProcessed(); else _longPollingSystem.appendLongPollingResource(polledResource); } @@ -78,6 +78,7 @@ public class ChatRequestHandler extends LotroServerRequestHandler implements Uri private String _room; private String _playerId; private ResponseWriter _responseWriter; + private boolean _processed; private ChatUpdateLongPollingResource(ChatRoomMediator chatRoom, String room, String playerId, ResponseWriter responseWriter) { _chatRoom = chatRoom; @@ -96,24 +97,27 @@ public class ChatRequestHandler extends LotroServerRequestHandler implements Uri } @Override - public void process() { - try { - List chatMessages = _chatRoom.getChatRoomListener(_playerId).consumeMessages(); + public synchronized void processIfNotProcessed() { + if (!_processed) { + try { + List chatMessages = _chatRoom.getChatRoomListener(_playerId).consumeMessages(); - Collection usersInRoom = _chatRoom.getUsersInRoom(); + Collection usersInRoom = _chatRoom.getUsersInRoom(); - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document doc = documentBuilder.newDocument(); + Document doc = documentBuilder.newDocument(); - serializeChatRoomData(_room, chatMessages, usersInRoom, doc); + serializeChatRoomData(_room, chatMessages, usersInRoom, doc); - _responseWriter.writeXmlResponse(doc); - } catch (SubscriptionExpiredException exp) { - _responseWriter.writeError(410); - } catch (Exception exp) { - _responseWriter.writeError(500); + _responseWriter.writeXmlResponse(doc); + } catch (SubscriptionExpiredException exp) { + _responseWriter.writeError(410); + } catch (Exception exp) { + _responseWriter.writeError(500); + } + _processed = true; } } } diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/GameRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/GameRequestHandler.java index 49bd2762b..29d04af34 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/GameRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/GameRequestHandler.java @@ -88,7 +88,7 @@ public class GameRequestHandler extends LotroServerRequestHandler implements Uri GameUpdateLongPollingResource pollingResource = new GameUpdateLongPollingResource(channelNumber, gameMediator, resourceOwner, responseWriter); if (pollingResource.isChanged()) - pollingResource.process(); + pollingResource.processIfNotProcessed(); else _longPollingSystem.appendLongPollingResource(pollingResource); } @@ -98,6 +98,7 @@ public class GameRequestHandler extends LotroServerRequestHandler implements Uri private Player _resourceOwner; private int _channelNumber; private ResponseWriter _responseWriter; + private boolean _processed; private GameUpdateLongPollingResource(int channelNumber, LotroGameMediator gameMediator, Player resourceOwner, ResponseWriter responseWriter) { _channelNumber = channelNumber; @@ -120,28 +121,31 @@ public class GameRequestHandler extends LotroServerRequestHandler implements Uri } @Override - public void process() { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + public synchronized void processIfNotProcessed() { + if (!_processed) { + try { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document doc = documentBuilder.newDocument(); - Element update = doc.createElement("update"); + Document doc = documentBuilder.newDocument(); + Element update = doc.createElement("update"); - GatheringParticipantCommunicationChannel communicationChannel = _gameMediator.getCommunicationChannel(_resourceOwner, _channelNumber); - _gameMediator.processVisitor(communicationChannel, _channelNumber, _resourceOwner.getName(), new SerializationVisitor(doc, update)); + GatheringParticipantCommunicationChannel communicationChannel = _gameMediator.getCommunicationChannel(_resourceOwner, _channelNumber); + _gameMediator.processVisitor(communicationChannel, _channelNumber, _resourceOwner.getName(), new SerializationVisitor(doc, update)); - doc.appendChild(update); + doc.appendChild(update); - _responseWriter.writeXmlResponse(doc); - } catch (SubscriptionConflictException exp) { - _responseWriter.writeError(409); - } catch (PrivateInformationException e) { - _responseWriter.writeError(403); - } catch (SubscriptionExpiredException e) { - _responseWriter.writeError(410); - } catch (Exception e) { - _responseWriter.writeError(500); + _responseWriter.writeXmlResponse(doc); + } catch (SubscriptionConflictException exp) { + _responseWriter.writeError(409); + } catch (PrivateInformationException e) { + _responseWriter.writeError(403); + } catch (SubscriptionExpiredException e) { + _responseWriter.writeError(410); + } catch (Exception e) { + _responseWriter.writeError(500); + } + _processed = true; } } 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 c90d0c79a..53870d93f 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 @@ -83,7 +83,7 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri } else if (uri.startsWith("/tournament/") && uri.endsWith("/leave") && request.getMethod() == HttpMethod.POST) { dropFromTournament(request, uri.substring(12, uri.length() - 6), responseWriter); } else if (uri.startsWith("/") && uri.endsWith("/leave") && request.getMethod() == HttpMethod.POST) { - leaveTable(request, uri.substring(1, uri.length()-6), responseWriter); + leaveTable(request, uri.substring(1, uri.length() - 6), responseWriter); } else if (uri.startsWith("/") && request.getMethod() == HttpMethod.POST) { joinTable(request, uri.substring(1), responseWriter); } else { @@ -131,7 +131,7 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri DraftUpdateLongPollingResource polledResource = new DraftUpdateLongPollingResource(tournamentId, resourceOwner, channelNumber, responseWriter); if (polledResource.isChanged()) - polledResource.process(); + polledResource.processIfNotProcessed(); else _longPollingSystem.appendLongPollingResource(polledResource); } @@ -141,6 +141,7 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri private int _channelNumber; private String _tournamentId; private ResponseWriter _responseWriter; + private boolean _processed; private DraftUpdateLongPollingResource(String tournamentId, Player player, int channelNumber, ResponseWriter responseWriter) { _tournamentId = tournamentId; @@ -161,32 +162,35 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri } } - public void process() { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - - Document doc = documentBuilder.newDocument(); - - Element draft = doc.createElement("draft"); - + public synchronized void processIfNotProcessed() { + if (!_processed) { try { - _hallServer.processChangesInDraft(_tournamentId, _player, _channelNumber, new SerializeDraftVisitor(doc, draft)); + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - doc.appendChild(draft); + Document doc = documentBuilder.newDocument(); - _responseWriter.writeXmlResponse(doc); - } catch (DraftFinishedException e) { - throw new HttpProcessingException(204); - } catch (SubscriptionConflictException e) { - throw new HttpProcessingException(409); - } catch (SubscriptionExpiredException e) { - throw new HttpProcessingException(410); + Element draft = doc.createElement("draft"); + + try { + _hallServer.processChangesInDraft(_tournamentId, _player, _channelNumber, new SerializeDraftVisitor(doc, draft)); + + doc.appendChild(draft); + + _responseWriter.writeXmlResponse(doc); + } catch (DraftFinishedException e) { + throw new HttpProcessingException(204); + } catch (SubscriptionConflictException e) { + throw new HttpProcessingException(409); + } catch (SubscriptionExpiredException e) { + throw new HttpProcessingException(410); + } + } catch (HttpProcessingException exp) { + _responseWriter.writeError(exp.getStatus()); + } catch (Exception exp) { + _responseWriter.writeError(500); } - } catch (HttpProcessingException exp) { - _responseWriter.writeError(exp.getStatus()); - } catch (Exception exp) { - _responseWriter.writeError(500); + _processed = true; } } } @@ -424,7 +428,7 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri HallUpdateLongPollingResource polledResource = new HallUpdateLongPollingResource(request, resourceOwner, channelNumber, responseWriter); if (polledResource.isChanged()) - polledResource.process(); + polledResource.processIfNotProcessed(); else _longPollingSystem.appendLongPollingResource(polledResource); } @@ -434,6 +438,7 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri private Player _resourceOwner; private int _channelNumber; private ResponseWriter _responseWriter; + private boolean _processed; private HallUpdateLongPollingResource(HttpRequest request, Player resourceOwner, int channelNumber, ResponseWriter responseWriter) { _request = request; @@ -454,33 +459,36 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri } @Override - public void process() { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - - Document doc = documentBuilder.newDocument(); - - Element hall = doc.createElement("hall"); + public synchronized void processIfNotProcessed() { + if (!_processed) { try { - _hallServer.getCommunicationChannel(_resourceOwner, _channelNumber).processCommunicationChannel(_hallServer, _resourceOwner, new SerializeHallInfoVisitor(doc, hall)); - } catch (SubscriptionExpiredException exp) { - throw new HttpProcessingException(410); - } catch (SubscriptionConflictException exp) { - throw new HttpProcessingException(409); + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + + Document doc = documentBuilder.newDocument(); + + Element hall = doc.createElement("hall"); + try { + _hallServer.getCommunicationChannel(_resourceOwner, _channelNumber).processCommunicationChannel(_hallServer, _resourceOwner, new SerializeHallInfoVisitor(doc, hall)); + } catch (SubscriptionExpiredException exp) { + throw new HttpProcessingException(410); + } catch (SubscriptionConflictException exp) { + throw new HttpProcessingException(409); + } + hall.setAttribute("currency", String.valueOf(_collectionManager.getPlayerCollection(_resourceOwner, "permanent").getCurrency())); + + doc.appendChild(hall); + + Map headers = new HashMap(); + processDeliveryServiceNotification(_request, headers); + + _responseWriter.writeXmlResponse(doc, headers); + } catch (HttpProcessingException exp) { + _responseWriter.writeError(exp.getStatus()); + } catch (Exception exp) { + _responseWriter.writeError(500); } - hall.setAttribute("currency", String.valueOf(_collectionManager.getPlayerCollection(_resourceOwner, "permanent").getCurrency())); - - doc.appendChild(hall); - - Map headers = new HashMap(); - processDeliveryServiceNotification(_request, headers); - - _responseWriter.writeXmlResponse(doc, headers); - } catch (HttpProcessingException exp) { - _responseWriter.writeError(exp.getStatus()); - } catch (Exception exp) { - _responseWriter.writeError(500); + _processed = true; } } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DefaultDraft.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DefaultDraft.java index cd97053c7..854112f02 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DefaultDraft.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DefaultDraft.java @@ -82,11 +82,11 @@ public class DefaultDraft implements Draft { draftCommunicationChannel.processCommunicationChannel(getCardChoice(playerName), draftChannelVisitor); } - public boolean hasChanges(String playerName, int channelNumber) throws SubscriptionExpiredException, SubscriptionConflictException { + public DraftCommunicationChannel getCommunicationChannel(String playerName, int channelNumber) throws SubscriptionExpiredException, SubscriptionConflictException { DraftCommunicationChannel communicationChannel = _playerDraftCommunications.get(playerName); if (communicationChannel != null) { if (communicationChannel.getChannelNumber() == channelNumber) { - return communicationChannel.hasChangesInCommunicationChannel(getCardChoice(playerName)); + return communicationChannel; } else { throw new SubscriptionConflictException(); } @@ -95,20 +95,7 @@ public class DefaultDraft implements Draft { } } - public void processDraft(String playerName, int channelNumber, DraftChannelVisitor draftChannelVisitor) throws SubscriptionExpiredException, SubscriptionConflictException { - DraftCommunicationChannel communicationChannel = _playerDraftCommunications.get(playerName); - if (communicationChannel != null) { - if (communicationChannel.getChannelNumber() == channelNumber) { - communicationChannel.processCommunicationChannel(getCardChoice(playerName), draftChannelVisitor); - } else { - throw new SubscriptionConflictException(); - } - } else { - throw new SubscriptionExpiredException(); - } - } - - private DraftCardChoice getCardChoice(String playerName) { + public DraftCardChoice getCardChoice(String playerName) { MutableCardCollection cardChoice = _cardChoice.get(playerName); return new DefaultDraftCardChoice(cardChoice, _lastPickStart + PICK_TIME); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/Draft.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/Draft.java index 2b46029e3..c1300579e 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/Draft.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/Draft.java @@ -10,8 +10,10 @@ public interface Draft { public void playerChosenCard(String playerName, String cardId); public void signUpForDraft(String playerName, DraftChannelVisitor draftChannelVisitor); - public boolean hasChanges(String playerName, int channelNumber) throws SubscriptionExpiredException, SubscriptionConflictException; - public void processDraft(String playerName, int channelNumber, DraftChannelVisitor draftChannelVisitor) throws SubscriptionExpiredException, SubscriptionConflictException; + + public DraftCommunicationChannel getCommunicationChannel(String playerName, int channelNumber) throws SubscriptionExpiredException, SubscriptionConflictException; + + public DraftCardChoice getCardChoice(String playerName); public boolean isFinished(); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java index 07cba45d5..7a058a1bb 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java @@ -372,7 +372,7 @@ public class HallServer extends AbstractServer { Draft draft = tournament.getDraft(); if (draft == null) throw new DraftFinishedException(); - return draft.hasChanges(player.getName(), channelNumber); + return draft.getCommunicationChannel(player.getName(), channelNumber).hasChangesInCommunicationChannel(draft.getCardChoice(player.getName())); } finally { _hallDataAccessLock.readLock().unlock(); } @@ -388,7 +388,7 @@ public class HallServer extends AbstractServer { Draft draft = tournament.getDraft(); if (draft == null) throw new DraftFinishedException(); - draft.processDraft(player.getName(), channelNumber, draftChannelVisitor); + draft.getCommunicationChannel(player.getName(), channelNumber).processCommunicationChannel(draft.getCardChoice(player.getName()), draftChannelVisitor); CardCollection cardCollection = _collectionsManager.getPlayerCollection(player, tournament.getCollectionType().getCode()); draftChannelVisitor.chosenCards(cardCollection); } finally {