/**
  * Removes from db characters that should be deleted (their deletion time has passed).
  *
  * @param account
  */
 private static void removeDeletedCharacters(Account account) {
   /* Removes chars that should be removed */
   Iterator<PlayerAccountData> it = account.iterator();
   while (it.hasNext()) {
     PlayerAccountData pad = it.next();
     Race race = pad.getPlayerCommonData().getRace();
     long deletionTime = ((long) pad.getDeletionTimeInSeconds()) * 1000;
     if (deletionTime != 0 && deletionTime <= System.currentTimeMillis()) {
       it.remove();
       account.decrementCountOf(race);
       PlayerService.deletePlayerFromDB(pad.getPlayerCommonData().getPlayerObjId());
       if (GSConfig.FACTIONS_RATIO_LIMITED
           && pad.getPlayerCommonData().getLevel() >= GSConfig.FACTIONS_RATIO_LEVEL) {
         if (account.getNumberOf(race) == 0) {
           GameServer.updateRatio(pad.getPlayerCommonData().getRace(), -1);
         }
       }
     }
   }
 }
  /**
   * Returns {@link Account} object that has given id.
   *
   * @param accountId
   * @param accountTime
   * @param accountName
   * @param accessLevel
   * @param membership
   * @return Account
   */
  public static Account getAccount(
      int accountId,
      String accountName,
      AccountTime accountTime,
      byte accessLevel,
      byte membership) {
    log.debug("[AS] request for account: " + accountId);

    Account account = accountsMap.get(accountId);
    if (account == null) {
      account = loadAccount(accountId);

      if (CacheConfig.CACHE_ACCOUNTS) accountsMap.put(accountId, account);
    }

    account.setName(accountName);
    account.setAccountTime(accountTime);
    account.setAccessLevel(accessLevel);
    account.setMembership(membership);

    removeDeletedCharacters(account);

    return account;
  }
  /**
   * Loads account data and returns.
   *
   * @param accountId
   * @param accountName
   * @return
   */
  private static Account loadAccount(int accountId) {
    Account account = new Account(accountId);

    PlayerDAO playerDAO = DAOManager.getDAO(PlayerDAO.class);
    PlayerAppearanceDAO appereanceDAO = DAOManager.getDAO(PlayerAppearanceDAO.class);

    List<Integer> playerOids = playerDAO.getPlayerOidsOnAccount(accountId);

    for (int playerOid : playerOids) {
      PlayerCommonData playerCommonData = playerDAO.loadPlayerCommonData(playerOid);
      PlayerAppearance appereance = appereanceDAO.load(playerOid);

      LegionMember legionMember =
          DAOManager.getDAO(LegionMemberDAO.class).loadLegionMember(playerOid);

      /** Load only equipment and its stones to display on character selection screen */
      List<Item> equipment = DAOManager.getDAO(InventoryDAO.class).loadEquipment(playerOid);

      PlayerAccountData acData =
          new PlayerAccountData(playerCommonData, appereance, equipment, legionMember);
      playerDAO.setCreationDeletionTime(acData);

      account.addPlayerAccountData(acData);

      /** load account warehouse only once */
      if (account.getAccountWarehouse() == null) {
        // TODO memory lake.....
        Player player = new Player(new PlayerController(), playerCommonData, appereance, account);
        Storage accWarehouse =
            DAOManager.getDAO(InventoryDAO.class)
                .loadStorage(player, StorageType.ACCOUNT_WAREHOUSE);
        ItemService.loadItemStones(accWarehouse.getStorageItems());
        account.setAccountWarehouse(accWarehouse);
      }
    }

    /** For new accounts - create empty account warehouse */
    if (account.getAccountWarehouse() == null)
      account.setAccountWarehouse(new Storage(StorageType.ACCOUNT_WAREHOUSE));

    return account;
  }