Пример #1
0
  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;
  }
Пример #2
0
 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;
 }