docs: public static String getSubstitutedProperty( String value,
                                                   PropertyAccessor propertyAccessor ) {
  
          if (value == null || value.trim().length() == 0) return value;
  
          StringBuilder sb = new StringBuilder(value);
  
          // Get the index of the first constant, if any
          int startName = sb.indexOf(CURLY_PREFIX);
  
          if (startName == -1) return value;
  
          // process as many different variable groupings that are defined, where one group will resolve to one property
          // substitution
          while (startName != -1) {
              String defaultValue = null;
  
              int endName = sb.indexOf(CURLY_SUFFIX, startName);
  
              if (endName == -1) {
                  // if no suffix can be found, then this variable was probably defined incorrectly
                  // but return what there is at this point
                  return sb.toString();
              }
  
              String varString = sb.substring(startName + 2, endName);
              if (varString.indexOf(DEFAULT_DELIM) > -1) {
                  List<String> defaults = split(varString, DEFAULT_DELIM);
  
                  // get the property(s) variables that are defined left of the default delimiter.
                  varString = defaults.get(0);
  
                  // if the default is defined, then capture in case none of the other properties are found
                  if (defaults.size() == 2) {
                      defaultValue = defaults.get(1);
                  }
              }
  
              String constValue = null;
              // split the property(s) based VAR_DELIM, when multiple property options are defined
              List<String> vars = split(varString, VAR_DELIM);
              for (final String var : vars) {
                  constValue = System.getenv(var);
                  if (constValue == null) {
                      constValue = propertyAccessor.getProperty(var);
                  }
  
                  // the first found property is the value to be substituted
                  if (constValue != null) {
                      break;
                  }
              }
  
              // if no property is found to substitute, then use the default value, if defined
              if (constValue == null && defaultValue != null) {
                  constValue = defaultValue;
              }
  
              if (constValue != null) {
                  sb = sb.replace(startName, endName + 1, constValue);
                  // Checking for another constants
                  startName = sb.indexOf(CURLY_PREFIX);
  
              } else {
                  // continue to try to substitute for other properties so that all defined variables
                  // are tried to be substituted for
                  startName = sb.indexOf(CURLY_PREFIX, endName);
  
              }
  
          }
  
          return sb.toString();
      }