@Override
  public final Map<String, List<String>> getAppsMap() {
    Map<String, List<String>> appsMap = OtfCachedListsDTO.getAppsMap();
    if (appsMap == null || appsMap.size() == 0) {
      appsMap = new HashMap<String, List<String>>();
      for (OtfApplication app : getLocalModel().getApps().getApplications().values()) {
        List<String> grpNames = new ArrayList<String>();
        List<OtfGroup> grps = getGroupsByApp(app);
        for (OtfGroup grp : grps) {
          grpNames.add(grp.getName());
        }
        Collections.sort(grpNames);
        appsMap.put(app.getName(), grpNames);
      }

      // add user admin even if only dir
      String useradminapp = getAdminApp();

      if (!appsMap.containsKey(useradminapp)) {
        if (getDirsMap().containsKey(useradminapp)) {
          appsMap.put(useradminapp, getDirsMap().get(useradminapp));
        }
      }
      setAppsMap(appsMap);
    }

    return appsMap;
  }
 @Override
 public OtfApplication getAppbyName(String appNameIn) {
   for (OtfApplication app : getLocalModel().getApps().getApplications().values()) {
     if (app.getName().equals(appNameIn)) {
       return app;
     }
   }
   return null;
 }
  public final List<String> getOtfAppNamesForUser(final String username) {
    ArrayList<String> appsList = new ArrayList<String>();
    Collection<String> dirsforUser = getDirNamesForUser(username);

    for (OtfApplication app : getLocalModel().getApps().getApplications().values()) {
      for (String key : app.getAccountStores().keySet()) {
        if (dirsforUser.contains(key)) {
          appsList.add(app.getName());
        }
      }
    }
    return appsList;
  }
  @Override
  public final List<String> getDirsByAppName(final String appnameIn) {
    List<String> dirs = new ArrayList<String>();
    OtfApplication oapp = getLocalModel().getApps().getAppByName(appnameIn);
    if (oapp != null) {
      Map<String, OtfAccountStore> acsmap = oapp.getAccountStores();
      if (acsmap != null && acsmap.size() > 0) {
        for (OtfAccountStore acs : acsmap.values()) {
          if (acs.isDir()) {
            dirs.add(acs.getName());
          }
        }
      }
    }

    return dirs;
  }
 public final List<OtfGroup> getGroupsByApp(final OtfApplication app) {
   List<OtfGroup> groups = new ArrayList<OtfGroup>();
   for (OtfAccountStore acs : app.getAccountStores().values()) {
     if (acs.isDir()) {
       String dirName = acs.getName();
       groups.addAll(getGroupsByDirName(dirName));
     }
   }
   return groups;
 }