@Override
    public Object getValue(String paramName) throws IllegalArgumentException {
      if (values.containsKey(paramName)) {
        return values.get(paramName);
      }

      if (!parameterExpressions.containsKey(paramName)) {
        Expression[] expressions =
            new Expression[] {
              PARSER.parseExpression(paramName),
              PARSER.parseExpression("#root.![" + paramName + "]")
            };
        ExpressionEvaluatingSqlParameterSourceFactory.this.parameterExpressions.put(
            paramName, expressions);
        this.parameterExpressions.put(paramName, expressions);
      }

      Expression expression = null;

      if (input instanceof Collection<?>) {
        expression = parameterExpressions.get(paramName)[1];
      } else {
        expression = parameterExpressions.get(paramName)[0];
      }

      Object value = evaluateExpression(expression, input);
      values.put(paramName, value);
      if (logger.isDebugEnabled()) {
        logger.debug("Resolved expression " + expression + " to " + value);
      }
      return value;
    }
 /**
  * @param groupTimeoutExpression the group timeout expression string.
  * @return the handler spec.
  * @see AbstractCorrelatingMessageHandler#setGroupTimeoutExpression
  */
 public S groupTimeoutExpression(String groupTimeoutExpression) {
   Assert.hasText(groupTimeoutExpression, "'groupTimeoutExpression' must not be empty string.");
   this.handler.setGroupTimeoutExpression(PARSER.parseExpression(groupTimeoutExpression));
   return _this();
 }
 FileWritingMessageHandlerSpec(String directoryExpression) {
   this.target = new FileWritingMessageHandler(PARSER.parseExpression(directoryExpression));
 }