Package er.chronic

Source Code of er.chronic.ChronicFormatter

package er.chronic;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.webobjects.foundation.NSTimestamp;

import er.chronic.utils.Span;

/**
* ChronicFormatter attempts to parse a date using an expected date format, and then
* falls back to using Chronic in the event of a parse failure.
*
* @author probert
*/
public class ChronicFormatter extends SimpleDateFormat {
  private Options _options;
  private boolean _guessingEarly;

  /**
   * Constructs a new ChronicFormatter.
   *
   * @param pattern the SimpleDateFormat pattern to parse
   */
  public ChronicFormatter(String pattern) {
    this(pattern, null, true);
  }

  /**
   * Constructs a new ChronicFormatter.
   *
   * @param pattern the SimpleDateFormat pattern to parse
   * @param options the chronic options to parse with
   */
  public ChronicFormatter(String pattern, Options options) {
    this(pattern, options, true);
  }

  /**
   * Constructs a new ChronicFormatter.
   *
   * @param pattern the SimpleDateFormat pattern to parse
   * @param options the chronic options to parse with
   * @param guessingEarly if true, guess the start of a span if the parsed date returns a span
   */
  public ChronicFormatter(String pattern, Options options, boolean guessingEarly) {
    super(pattern);
    _options = options;
    _guessingEarly = guessingEarly;
  }

  /**
   * Returns the options used by this formatter.
   *
   * @return the options used by this formatter
   */
  public Options options() {
    if (_options == null) {
      _options = new Options();
    }
    return _options;
  }

  /**
   * Sets the options used by this formatter.
   *
   * @param options the options used by this formatter
   */
  public void setOptions(Options options) {
    _options = options;
  }

  /**
   * Returns whether or not this parser guesses the beginning of a span if a date parses as a span.
   *
   * @return whether or not this parser guesses the beginning of a span
   */
  public boolean isGuessingEarly() {
    return _guessingEarly;
  }

  /**
   * Sets whether or not this parser guesses the beginning of a span if a date parses as a span.
   *
   * @param guessingEarly whether or not this parser guesses the beginning of a span
   */
  public void setGuessingEarly(boolean guessingEarly) {
    _guessingEarly = guessingEarly;
  }

  @Override
  public NSTimestamp parseObject(String text) throws ParseException {
    NSTimestamp parsedTimestamp = null;
    try {
      // Attempt to parse the string with the given pattern.
      Date parsedDate = super.parse(text);
      parsedTimestamp = new NSTimestamp(parsedDate);
    }
    catch (ParseException e) {
      // If the input doesn't match the pattern, use Chronic to parse the
      // input.
      Span span = Chronic.parse(text, options());
      if (span == null) {
        throw e;
      }
      if (span.isSingularity() || isGuessingEarly()) {
        parsedTimestamp = new NSTimestamp(span.getBeginCalendar().getTime());
      }
      else {
        parsedTimestamp = new NSTimestamp(span.getEndCalendar().getTime());
      }
    }
    return parsedTimestamp;
  }

}
TOP

Related Classes of er.chronic.ChronicFormatter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.