Open Source Repository

Home /jodd/jodd-3.3.2 | Repository Home


jodd/util/DateFormatSymbolsEx.java
// Copyright (c) 2003-2012, Jodd Team (jodd.org). All Rights Reserved.

package jodd.util;

import jodd.exception.UncheckedException;

import java.util.Locale;
import java.text.DateFormatSymbols;
import java.lang.reflect.Field;

/**
 * Enhanced <code>DateFormatSymbols</code> with improved performance by avoiding duplication of returned arrays.
 * Note: this class should be cached as by {@link LocaleUtil}, since reflection is used upon creation.
 */
public class DateFormatSymbolsEx extends DateFormatSymbols {

  public DateFormatSymbolsEx() {
    super();
    afterInit();
  }

  public DateFormatSymbolsEx(Locale locale) {
    super(locale);
    afterInit();
  }

  String[] _months;
  String[] _shortMonths;
  String[] _weekdays;
  String[] _shortWeekdays;
  String[] _eras;
  String[] _ampms;

  protected void afterInit() {
    Class type = DateFormatSymbols.class;
    try {
      Field f = type.getDeclaredField("months");
      f.setAccessible(true);
      _months = (String[]) f.get(this);

      f = type.getDeclaredField("shortMonths");
      f.setAccessible(true);
      _shortMonths = (String[]) f.get(this);

      f = type.getDeclaredField("weekdays");
      f.setAccessible(true);
      _weekdays = (String[]) f.get(this);

      f = type.getDeclaredField("shortWeekdays");
      f.setAccessible(true);
      _shortWeekdays = (String[]) f.get(this);

      f = type.getDeclaredField("eras");
      f.setAccessible(true);
      _eras = (String[]) f.get(this);

      f = type.getDeclaredField("ampms");
      f.setAccessible(true);
      _ampms = (String[]) f.get(this);
      
    catch (Exception ex) {
      throw new UncheckedException("Unable to initialize.", ex);
    }
  }

  // ---------------------------------------------------------------- fast

  /**
   * Returns month string.
   */
  public String getMonth(int i) {
    return this._months[i];
  }

  /**
   * Returns short months.
   */
  public String getShortMonth(int i) {
    return this._shortMonths[i];
  }

  /**
   * Returns weekday.
   */
  public String getWeekday(int i) {
    return this._weekdays[i];
  }

  /**
   * Returns short weekday.
   */
  public String getShortWeekday(int i) {
    return this._shortWeekdays[i];
  }

  /**
   * Returns BC era.
   */
  public String getBcEra() {
    return this._eras[0];
  }

  /**
   * Returns AD era.
   */
  public String getAdEra() {
    return this._eras[1];
  }

  /**
   * Returns AM.
   */
  public String getAM() {
    return this._ampms[0];
  }

  /**
   * Returns PM.
   */
  public String getPM() {
    return this._ampms[1];
  }

  // ---------------------------------------------------------------- clone

  @Override
  public Object clone() {
    return super.clone();
  }
}