Home | History | Annotate | Download | only in duration
      1 /* GENERATED SOURCE. DO NOT MODIFY. */
      2 //  2016 and later: Unicode, Inc. and others.
      3 // License & terms of use: http://www.unicode.org/copyright.html#License
      4 /*
      5 ******************************************************************************
      6 * Copyright (C) 2007-2009, International Business Machines Corporation and   *
      7 * others. All Rights Reserved.                                               *
      8 ******************************************************************************
      9 */
     10 
     11 package android.icu.impl.duration;
     12 
     13 import java.util.Locale;
     14 import java.util.TimeZone;
     15 
     16 /**
     17  * Abstract factory object used to create DurationFormatters.
     18  * DurationFormatters are immutable once created.
     19  * <p>
     20  * Setters on the factory mutate the factory and return it,
     21  * for chaining.
     22  * <p>
     23  * Subclasses override getFormatter to return a custom
     24  * DurationFormatter.
     25  */
     26 class BasicDurationFormatterFactory implements DurationFormatterFactory {
     27   private BasicPeriodFormatterService ps;
     28   private PeriodFormatter formatter;
     29   private PeriodBuilder builder;
     30   private DateFormatter fallback;
     31   private long fallbackLimit;
     32   private String localeName;
     33   private TimeZone timeZone;
     34   private BasicDurationFormatter f; // cache
     35 
     36   /**
     37    * Create a default formatter for the current locale and time zone.
     38    */
     39   BasicDurationFormatterFactory(BasicPeriodFormatterService ps) {
     40     this.ps = ps;
     41     this.localeName = Locale.getDefault().toString();
     42     this.timeZone = TimeZone.getDefault();
     43   }
     44 
     45   /**
     46    * Set the period formatter used by the factory.  New formatters created
     47    * with this factory will use the given period formatter.
     48    *
     49    * @return this BasicDurationFormatterFactory
     50    */
     51   @Override
     52   public DurationFormatterFactory setPeriodFormatter(
     53       PeriodFormatter formatter) {
     54     if (formatter != this.formatter) {
     55       this.formatter = formatter;
     56       reset();
     57     }
     58     return this;
     59   }
     60 
     61   /**
     62    * Set the builder used by the factory.  New formatters created
     63    * with this factory will use the given locale.
     64    *
     65    * @param builder the builder to use
     66    * @return this BasicDurationFormatterFactory
     67    */
     68   @Override
     69   public DurationFormatterFactory setPeriodBuilder(PeriodBuilder builder) {
     70     if (builder != this.builder) {
     71       this.builder = builder;
     72       reset();
     73     }
     74     return this;
     75   }
     76 
     77   /**
     78    * Set a fallback formatter for durations over a given limit.
     79    *
     80    * @param fallback the fallback formatter to use, or null
     81    * @return this BasicDurationFormatterFactory
     82    */
     83   @Override
     84   public DurationFormatterFactory setFallback(DateFormatter fallback) {
     85     boolean doReset = fallback == null
     86         ? this.fallback != null
     87         : !fallback.equals(this.fallback);
     88     if (doReset) {
     89       this.fallback = fallback;
     90       reset();
     91     }
     92     return this;
     93   }
     94 
     95   /**
     96    * Set a fallback limit for durations over a given limit.
     97    *
     98    * @param fallbackLimit the fallback limit to use, or 0 if none is desired.
     99    * @return this BasicDurationFormatterFactory
    100    */
    101   @Override
    102   public DurationFormatterFactory setFallbackLimit(long fallbackLimit) {
    103     if (fallbackLimit < 0) {
    104       fallbackLimit = 0;
    105     }
    106     if (fallbackLimit != this.fallbackLimit) {
    107       this.fallbackLimit = fallbackLimit;
    108       reset();
    109     }
    110     return this;
    111   }
    112 
    113   /**
    114    * Set the name of the locale that will be used when
    115    * creating new formatters.
    116    *
    117    * @param localeName the name of the Locale
    118    * @return this BasicDurationFormatterFactory
    119    */
    120   @Override
    121   public DurationFormatterFactory setLocale(String localeName) {
    122     if (!localeName.equals(this.localeName)) {
    123       this.localeName = localeName;
    124       if (builder != null) {
    125           builder = builder.withLocale(localeName);
    126       }
    127       if (formatter != null) {
    128           formatter = formatter.withLocale(localeName);
    129       }
    130       reset();
    131     }
    132     return this;
    133   }
    134 
    135   /**
    136    * Set the name of the locale that will be used when
    137    * creating new formatters.
    138    *
    139    * @param timeZone The time zone to use.
    140    * @return this BasicDurationFormatterFactory
    141    */
    142   @Override
    143   public DurationFormatterFactory setTimeZone(TimeZone timeZone) {
    144     if (!timeZone.equals(this.timeZone)) {
    145       this.timeZone = timeZone;
    146       if (builder != null) {
    147           builder = builder.withTimeZone(timeZone);
    148       }
    149       reset();
    150     }
    151     return this;
    152   }
    153 
    154   /**
    155    * Return a formatter based on this factory's current settings.
    156    *
    157    * @return a BasicDurationFormatter
    158    */
    159   @Override
    160   public DurationFormatter getFormatter() {
    161     if (f == null) {
    162       if (fallback != null) {
    163         fallback = fallback.withLocale(localeName).withTimeZone(timeZone);
    164       }
    165       formatter = getPeriodFormatter();
    166       builder = getPeriodBuilder();
    167 
    168       f = createFormatter();
    169     }
    170     return f;
    171   }
    172 
    173   /**
    174    * Return the current period formatter.
    175    *
    176    * @return the current period formatter
    177    */
    178   public PeriodFormatter getPeriodFormatter() {
    179     if (formatter == null) {
    180       formatter = ps.newPeriodFormatterFactory()
    181           .setLocale(localeName)
    182           .getFormatter();
    183     }
    184     return formatter;
    185   }
    186 
    187   /**
    188    * Return the current builder.
    189    *
    190    * @return the current builder
    191    */
    192   public PeriodBuilder getPeriodBuilder() {
    193     if (builder == null) {
    194       builder = ps.newPeriodBuilderFactory()
    195           .setLocale(localeName)
    196           .setTimeZone(timeZone)
    197           .getSingleUnitBuilder();
    198     }
    199     return builder;
    200   }
    201 
    202   /**
    203    * Return the current fallback formatter.
    204    *
    205    * @return the fallback formatter, or null if there is no fallback
    206    * formatter
    207    */
    208   public DateFormatter getFallback() {
    209     return fallback;
    210   }
    211 
    212   /**
    213    * Return the current fallback formatter limit
    214    *
    215    * @return the limit, or 0 if there is no fallback.
    216    */
    217   public long getFallbackLimit() {
    218     return fallback == null ? 0 : fallbackLimit;
    219   }
    220 
    221   /**
    222    * Return the current locale name.
    223    *
    224    * @return the current locale name
    225    */
    226   public String getLocaleName() {
    227     return localeName;
    228   }
    229 
    230   /**
    231    * Return the current locale name.
    232    *
    233    * @return the current locale name
    234    */
    235   public TimeZone getTimeZone() {
    236     return timeZone;
    237   }
    238 
    239   /**
    240    * Create the formatter.  All local fields are already initialized.
    241    */
    242   protected BasicDurationFormatter createFormatter() {
    243     return new BasicDurationFormatter(formatter, builder, fallback,
    244                                       fallbackLimit, localeName,
    245                                       timeZone);
    246   }
    247 
    248   /**
    249    * Clear the cached formatter.  Subclasses must call this if their
    250    * state has changed. This is automatically invoked by setBuilder,
    251    * setFormatter, setFallback, setLocaleName, and setTimeZone
    252    */
    253   protected void reset() {
    254     f = null;
    255   }
    256 }
    257