/**
   * Returns available subject attribute names.
   *
   * @return a set of available subject attribute names or null if not found
   */
  public Set<String> getAvailableSubjectAttributeNames() throws EntitlementException {

    try {
      ServiceConfig sc = idRepoServiceConfigManager.getOrganizationConfig(realm, null);
      if (sc == null) {
        return null;
      }
      Set subConfigNames = sc.getSubConfigNames();
      if ((subConfigNames == null) || (subConfigNames.isEmpty())) {
        return null;
      }

      CaseInsensitiveHashSet result = null;

      for (Iterator iter = subConfigNames.iterator(); iter.hasNext(); ) {
        String idRepoName = (String) iter.next();
        ServiceConfig reposc = sc.getSubConfig(idRepoName);
        Map attrMap = reposc.getAttributesForRead();
        Set userAttrs = (Set) attrMap.get(LDAPv3Config_USER_ATTR);
        if ((userAttrs != null) && (!userAttrs.isEmpty())) {
          if (result == null) {
            result = new CaseInsensitiveHashSet();
          }
          result.addAll(userAttrs);
        }
      }

      return result;
    } catch (SMSException e) {
      throw new EntitlementException(602, e);
    } catch (SSOException e) {
      throw new EntitlementException(602, e);
    }
  }
  private void deleteSubConfig(ServiceConfig sc, String subConfigName)
      throws SSOException, SMSException {
    StringTokenizer st = new StringTokenizer(subConfigName, "/");
    int tokenCount = st.countTokens();

    for (int i = 1; i <= tokenCount; i++) {
      String scn = SMSSchema.unescapeName(st.nextToken());

      if (i != tokenCount) {
        sc = sc.getSubConfig(scn);
      } else {
        sc.removeSubConfig(scn);
      }
    }
  }
  private void addSubConfig(
      ServiceConfig sc, String subConfigName, String subConfigId, Map attrValues, int priority)
      throws SSOException, SMSException {
    StringTokenizer st = new StringTokenizer(subConfigName, "/");
    int tokenCount = st.countTokens();

    for (int i = 1; i <= tokenCount; i++) {
      String scn = SMSSchema.unescapeName(st.nextToken());

      if (i != tokenCount) {
        sc = sc.getSubConfig(scn);
      } else {
        if (subConfigId == null) {
          subConfigId = scn;
        }

        sc.addSubConfig(subConfigId, scn, priority, attrValues);
      }
    }
  }