public Message onExceptionThrown(Message message, InetSocketAddress destinationAddress) { boolean gsAvailable = checkBFFailures(destinationAddress); MessageRequest request = (MessageRequest) message.get("request"); switch (request) { case disconnectedBF: if (gsAvailable) return message; break; case disconnectedUnit: if (gsAvailable) return message; break; case gameState: Unit u; synchronized (this) { u = units.remove(destinationAddress); map[u.getX()][u.getY()] = null; } Integer[] tempClock = vClock.incrementClock(id); LogEntry entry = new LogEntry(tempClock, LogEntryType.DISCONNECTED_UNIT, destinationAddress); logger.writeAsText(entry, true); Message replyMessage = new Message(); replyMessage.put("request", MessageRequest.disconnectedUnit); replyMessage.put("unitAddress", destinationAddress); replyMessage.put("vclock", tempClock); synchronizeWithAllBF(replyMessage); break; default: break; } return null; }
private synchronized boolean checkBFFailures(InetSocketAddress destinationAddress) { Integer failures = battlefields.get(destinationAddress); if (failures != null) { if (failures > 1) { battlefields.remove(destinationAddress); // Remove all Units connected to this battleField for (Map.Entry<InetSocketAddress, Unit> entry : units.entrySet()) { if (entry.getValue().getBattlefieldAddress().equals(destinationAddress)) { removeUnit(entry.getValue().getX(), entry.getValue().getY()); } } Message message = new Message(); message.put("request", MessageRequest.disconnectedBF); message.put("serverAddress", new InetSocketAddress(url, port)); message.put("vclock", vClock.incrementClock(id)); synchronizeWithAllBF(message); return false; } else { battlefields.put(destinationAddress, failures + 1); } } return false; }