/**
   * Saves all existing chests to the data folder.
   *
   * @return the number of successfully written chests
   */
  public int save() {
    int savedChests = 0;

    dataFolder.mkdirs();

    Iterator<Entry<UUID, Inventory>> chestIterator = chests.entrySet().iterator();

    while (chestIterator.hasNext()) {
      final Entry<UUID, Inventory> entry = chestIterator.next();
      final UUID playerUUID = entry.getKey();
      final Inventory chest = entry.getValue();

      final File chestFile = new File(dataFolder, playerUUID.toString() + YAML_CHEST_EXTENSION);

      if (chest == null) {
        // Chest got removed, so we have to delete the file.
        chestFile.delete();
        chestIterator.remove();
      } else {
        try {
          // Write the chest file in YAML format
          InventoryIO.saveToYaml(chest, chestFile);

          savedChests++;
        } catch (IOException e) {
          logger.log(Level.WARNING, "Couldn't save chest file: " + chestFile.getName(), e);
        }
      }
    }

    return savedChests;
  }
  /** Loads all existing chests from the data folder. */
  private void load() {
    dataFolder.mkdirs();

    FilenameFilter filter =
        new FilenameFilter() {
          public boolean accept(File dir, String name) {
            return name.endsWith(YAML_CHEST_EXTENSION);
          }
        };

    for (File chestFile : dataFolder.listFiles(filter)) {
      String chestFileName = chestFile.getName();
      try {
        try {
          UUID playerUUID =
              UUID.fromString(
                  chestFileName.substring(0, chestFileName.length() - YAML_EXTENSION_LENGTH));
          chests.put(playerUUID, InventoryIO.loadFromYaml(chestFile));
        } catch (IllegalArgumentException e) {
          // Assume that the filename isn't a UUID, and is therefore an old player-name chest
          String playerName =
              chestFileName.substring(0, chestFileName.length() - YAML_EXTENSION_LENGTH);
          boolean flagPlayerNotFound = true;

          for (OfflinePlayer player : Bukkit.getOfflinePlayers()) {
            // Search all the known players, load inventory, flag old file for deletion
            if (player.getName().equalsIgnoreCase(playerName)) {
              flagPlayerNotFound = false;
              chests.put(player.getUniqueId(), InventoryIO.loadFromYaml(chestFile));
              chestFile.deleteOnExit();
            }
          }

          if (flagPlayerNotFound) {
            logger.log(Level.WARNING, "Couldn't load chest file: " + chestFileName);
          }
        }
      } catch (Exception e) {
        logger.log(Level.WARNING, "Couldn't load chest file: " + chestFileName);
      }
    }

    logger.info("Loaded " + chests.size() + " chests");
  }
  /**
   * Saves a specified player's chest to the data folder.
   *
   * @param playerUUID the UUID of the player to save the chest of
   */
  public void saveChest(UUID playerUUID) {
    dataFolder.mkdirs();

    final String uuidString = playerUUID.toString();
    final Inventory chest = chests.get(playerUUID);
    final File chestFile = new File(dataFolder, uuidString + YAML_CHEST_EXTENSION);

    if (chest == null) {
      // Chest got removed, so we have to delete the file.
      chestFile.delete();
    } else {
      try {
        // Write the chest file in YAML format
        InventoryIO.saveToYaml(chest, chestFile);
      } catch (IOException e) {
        logger.log(Level.WARNING, "Couldn't save chest file: " + chestFile.getName(), e);
      }
    }
  }