public void checkInSim(String msisdn) {
   SimInfo simInfo = simInfos.get(msisdn);
   if (simInfo != null) {
     simInfo.setSimStatus(AppConstants.YES_FLAG);
     simInfos.put(msisdn, simInfo);
   }
 }
  private void load() {
    simInfos.clear();
    simIds.clear();
    try {
      SimInfoDao infoDao = new SimInfoDao();
      List<SimInfo> list = infoDao.selectAll();

      for (SimInfo simInfo : list) {
        simIds.add(simInfo.getMsisdn());
        simInfo.setSimStatus(AppConstants.YES_FLAG);
        simInfos.put(simInfo.getMsisdn(), simInfo);
      }
    } catch (Exception e) {
      log.error("Fail to init sim manager", e);
    }
  }
  public SimInfo checkOutSimPort(long amount, String msisdn) {
    SimInfo result = null;
    SimInfo temp = null;
    SimInfo simInfo = null;
    SimInfoDao infoDao = new SimInfoDao();
    try {
      for (String simId : simIds) {
        temp = simInfos.get(simId);

        if (temp == null) continue;

        if (!AppConstants.YES_FLAG.equalsIgnoreCase(temp.getSimStatus())) continue;

        simInfo = new SimInfo();
        simInfo.setMsisdn(temp.getMsisdn());
        //			validate in database. status and amount
        try {
          if (!infoDao.selectByMsisdn(simInfo)) continue;
        } catch (DaoException e) {
          log.error("Fail to get simInfo from database", e);
          try {
            Thread.sleep(2000L);
          } catch (InterruptedException e1) {
          }
          continue;
        }

        if (!AppConstants.YES_FLAG.equalsIgnoreCase(simInfo.getSimStatus())) continue;

        if (simInfo.getCurrentAmount() - simInfo.getLockAmount() - amount < 0) continue;
        //				check for available transferTxn
        SimTransaction simTransaction = new SimTransaction();
        simTransaction.setSimId(simInfo.getMsisdn());
        simTransaction.setTxnType(AppConstants.ANYPAY_SETTINGS.TRANSFER_TXN);
        SimTransactionDao simTransactionDao = new SimTransactionDao();
        List<SimTransaction> xferTxns =
            simTransactionDao.selectPendingStatusBySimIdTxnType(simTransaction);
        if (xferTxns != null) {
          for (SimTransaction xferTxn : xferTxns) {
            transfer(xferTxn);
          }
        }

        if (result == null) result = simInfo;
        else {
          if (result.getCurrentAmount() - result.getLockAmount()
              < simInfo.getCurrentAmount() - simInfo.getLockAmount()) result = simInfo;
        }
      }
    } catch (Exception e) {
      log.error("Error while checkout simInfo", e);
    }
    if (result != null) {
      result.setSimStatus(AppConstants.NO_FLAG);
      simInfos.put(result.getMsisdn(), result);
    }
    return result;
  }