code: protected ModelNode convertParameterExpressions(final ModelNode parameter) {
          if (isAllowExpression() && COMPLEX_TYPES.contains(type)) {
              // They need to subclass and override
              throw new IllegalStateException();
          }
          return isAllowExpression() ? convertStringExpression(parameter) : parameter;
      }
docs: Examine the given operation parameter value for any expression syntax, converting the relevant node to
  {@link ModelType#EXPRESSION} if such is supported.
  <p>
  This implementation checks if {@link #isAllowExpression() expressions are allowed} and if so, calls
  {@link #convertStringExpression(ModelNode)} to convert a {@link ModelType#STRING} to a {@link ModelType#EXPRESSION}.
  No other conversions are performed. For use cases requiring more complex behavior, a subclass that overrides
  this method should be used.
  </p>
  <p>
  If expressions are supported this implementation also checks if the {@link #getType() attribute type} is one of
  the {@link #COMPLEX_TYPES complex DMR types}. If it is, an {@link IllegalStateException} is thrown, as this
  implementation cannot properly handle such a combination, and a subclass that overrides this method should be used.
  </p>
  
  @param parameter the node to examine. Cannot not be {@code null}
  @return a node matching {@code parameter} but with expressions converted, or the original parameter if no
  conversion was performed. Will not return {@code null}
  
  @throws IllegalStateException if expressions are supported, but the {@link #getType() attribute type} is {@link #COMPLEX_TYPES complex}