code: private Set<Integer> getConstraintNameIndexes() throws PropertyException{
  		Set<Integer> result = new HashSet<>();
  		Set<String> constraintNames = getConstraintNameList();
  		if(constraintNames.isEmpty())
  			return result;
  		for(String constraintName: constraintNames){
  			int separatorIndex = constraintName.lastIndexOf("_");
  			if(separatorIndex == -1 || (constraintName.length() == separatorIndex + 1))
  				throw new PropertyException(ConstraintContextProperty.CONSTRAINT, constraintName, "Corrupted property file (invalid constraint name)");
  			Integer index = null;
  			try {
  				index = Integer.parseInt(constraintName.substring(separatorIndex+1));
  			} catch(Exception e){
  				throw new PropertyException(ConstraintContextProperty.CONSTRAINT, constraintName, "Corrupted property file (invalid constraint name)");
  			}
  			result.add(index);
  		}
  		return result;
  	}
docs: Returns all used indexes for constraint property names.<br>
  Constraint names are enumerated (CONSTRAINT_1, CONSTRAINT_2, ...).<br>
  When new constraints 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).