/**
   * Replace member from all games, with a new connection with same name (after a network problem).
   *
   * @param oldConn the member's old connection
   * @param oldConn the member's new connection
   * @throws IllegalArgumentException if oldConn's keyname (via {@link StringConnection#getData()
   *     getData()}) differs from newConn's keyname
   * @see #memberGames(StringConnection, String)
   * @since 1.1.08
   */
  public synchronized void replaceMemberAllGames(StringConnection oldConn, StringConnection newConn)
      throws IllegalArgumentException {
    if (!oldConn.getData().equals(newConn.getData()))
      throw new IllegalArgumentException("keyname data");

    System.err.println("L212: replaceMemberAllGames(" + oldConn + ", " + newConn + ")"); // JM TEMP
    final boolean sameVersion = (oldConn.getVersion() == newConn.getVersion());
    for (String gaName : getGameNames()) {
      Vector<StringConnection> members = gameMembers.get(gaName);
      if ((members != null) && members.contains(oldConn)) {
        System.err.println("L221: for game " + gaName + ":"); // JM TEMP
        if (sameVersion) {
          if (members.remove(oldConn)) System.err.println("   OK");
          else System.err.println("   ** not found");
          members.addElement(newConn);
        } else {
          removeMember(oldConn, gaName);
          addMember(newConn, gaName);
        }
      }
    }
  }