17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2003-2010, International Business Machines Corporation and    *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.text;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.Format;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * An abstract class that extends {@link java.text.Format} to provide
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * additional ICU protocol, specifically, the <tt>getLocale()</tt>
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * API.  All ICU format classes are subclasses of this class.
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.ULocale
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author weiv
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author Alan Liu
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @draft ICU 2.8 (retain)
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @provisional This API might change or be removed in a future release.
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic abstract class UFormat extends Format {
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // jdk1.4.2 serialver
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final long serialVersionUID = -4964390515840164416L;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @draft ICU 2.8 (retain)
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @provisional This API might change or be removed in a future release.
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public UFormat() {}
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // -------- BEGIN ULocale boilerplate --------
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Return the locale that was used to create this object, or null.
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This may may differ from the locale requested at the time of
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * this object's creation.  For example, if an object is created
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * for locale <tt>en_US_CALIFORNIA</tt>, the actual data may be
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * drawn from <tt>en</tt> (the <i>actual</i> locale), and
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <tt>en_US</tt> may be the most specific locale that exists (the
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <i>valid</i> locale).
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>Note: This method will be implemented in ICU 3.0; ICU 2.8
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * contains a partial preview implementation.  The <i>actual</i>
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * locale is returned correctly, but the <i>valid</i> locale is
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * not, in most cases.
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param type type of information requested, either {@link
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * com.ibm.icu.util.ULocale#VALID_LOCALE} or {@link
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * com.ibm.icu.util.ULocale#ACTUAL_LOCALE}.
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the information specified by <i>type</i>, or null if
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * this object was not constructed from locale data.
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale#VALID_LOCALE
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale#ACTUAL_LOCALE
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @draft ICU 2.8 (retain)
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @provisional This API might change or be removed in a future release.
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public final ULocale getLocale(ULocale.Type type) {
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return type == ULocale.ACTUAL_LOCALE ?
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.actualLocale : this.validLocale;
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Set information about the locales that were used to create this
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * object.  If the object was not constructed from locale data,
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * both arguments should be set to null.  Otherwise, neither
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * should be null.  The actual locale must be at the same level or
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * less specific than the valid locale.  This method is intended
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * for use by factories or other entities that create objects of
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * this class.
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param valid the most specific locale containing any resource
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * data, or null
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param actual the locale containing data used to construct this
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * object, or null
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale#VALID_LOCALE
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale#ACTUAL_LOCALE
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    final void setLocale(ULocale valid, ULocale actual) {
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Change the following to an assertion later
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if ((valid == null) != (actual == null)) {
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ///CLOVER:OFF
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new IllegalArgumentException();
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ///CLOVER:ON
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Another check we could do is that the actual locale is at
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the same level or less specific than the valid locale.
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.validLocale = valid;
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.actualLocale = actual;
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The most specific locale containing any resource data, or null.
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private ULocale validLocale;
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The locale containing data used to construct this object, or
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * null.
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private ULocale actualLocale;
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // -------- END ULocale boilerplate --------
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
109