/**
   * Parses a String which may be a date followed by an optional math expression.
   *
   * @param now an optional fixed date to use as "NOW" in the DateMathParser
   * @param val the string to parse
   */
  public Date parseMathLenient(Date now, String val, SolrQueryRequest req) {
    String math = null;
    final DateMathParser p = new DateMathParser();

    if (null != now) p.setNow(now);

    if (val.startsWith(NOW)) {
      math = val.substring(NOW.length());
    } else {
      final int zz = val.indexOf(Z);
      if (0 < zz) {
        math = val.substring(zz + 1);
        try {
          // p.setNow(toObject(val.substring(0,zz)));
          p.setNow(parseDateLenient(val.substring(0, zz + 1), req));
        } catch (ParseException e) {
          throw new SolrException(
              SolrException.ErrorCode.BAD_REQUEST,
              "Invalid Date in Date Math String:'" + val + '\'',
              e);
        }
      } else {
        throw new SolrException(
            SolrException.ErrorCode.BAD_REQUEST, "Invalid Date String:'" + val + '\'');
      }
    }

    if (null == math || math.equals("")) {
      return p.getNow();
    }

    try {
      return p.parseMath(math);
    } catch (ParseException e) {
      throw new SolrException(
          SolrException.ErrorCode.BAD_REQUEST, "Invalid Date Math String:'" + val + '\'', e);
    }
  }
 @Override
 public Date parseAndAddGap(Date value, String gap) throws java.text.ParseException {
   final DateMathParser dmp = new DateMathParser();
   dmp.setNow(value);
   return dmp.parseMath(gap);
 }