code: private Set<Integer> getDataUsageNameIndexes() throws PropertyException {
          Set<Integer> result = new HashSet<>();
          Set<String> dataUsageNames = getDataUsageNameList();
          if (dataUsageNames.isEmpty()) {
              return result;
          }
          for (String dataUsageName : dataUsageNames) {
              int separatorIndex = dataUsageName.lastIndexOf("_");
              if (separatorIndex == -1 || (dataUsageName.length() == separatorIndex + 1)) {
                  throw new PropertyException(ProcessContextProperty.DATA_USAGE, dataUsageName, "Corrupted property file (invalid data usage name)");
              }
              Integer index = null;
              try {
                  index = Integer.parseInt(dataUsageName.substring(separatorIndex + 1));
              } catch (Exception e) {
                  throw new PropertyException(ProcessContextProperty.DATA_USAGE, dataUsageName, "Corrupted property file (invalid data usage name)");
              }
              result.add(index);
          }
          return result;
      }
docs: Returns all used indexes for data usage property names.<br>
  Constraint names are enumerated (DATA_USAGE_1, DATA_USAGE_2, ...).<br>
  When new data usages are added, the lowest unused index is used within
  the new property name.
  
  @return The set of indexes in use.
  @throws PropertyException if existing constraint names are invalid (e.g.
  due to external file manipulation).