com.ibm.icu.impl.CalendarData Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of icu4j Show documentation
Show all versions of icu4j Show documentation
International Component for Unicode for Java (ICU4J) is a mature, widely used Java library
providing Unicode and Globalization support
/*
*******************************************************************************
* Copyright (C) 2004-2014, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.impl;
import java.util.ArrayList;
import java.util.MissingResourceException;
import com.ibm.icu.util.ULocale;
import com.ibm.icu.util.UResourceBundle;
import com.ibm.icu.util.UResourceBundleIterator;
/**
* This class abstracts access to calendar (Calendar and DateFormat) data.
* @internal ICU 3.0
*/
public class CalendarData {
/**
* Construct a CalendarData from the given locale.
* @param loc locale to use. The 'calendar' keyword will be ignored.
* @param type calendar type. NULL indicates the gregorian calendar.
* No default lookup is done.
*/
public CalendarData(ULocale loc, String type) {
this((ICUResourceBundle)UResourceBundle.getBundleInstance(ICUResourceBundle.ICU_BASE_NAME, loc), type);
}
public CalendarData(ICUResourceBundle b, String type) {
fBundle = b;
if((type == null) || (type.equals("")) || (type.equals("gregorian"))) {
fMainType = "gregorian";
fFallbackType = null;
} else {
fMainType = type;
fFallbackType = "gregorian";
}
}
/**
* Load data for calendar. Note, this object owns the resources, do NOT call ures_close()!
*
* @param key Resource key to data
* @internal
*/
public ICUResourceBundle get(String key) {
try {
return fBundle.getWithFallback("calendar/" + fMainType + "/" + key);
} catch(MissingResourceException m) {
if(fFallbackType != null) {
return fBundle.getWithFallback("calendar/" + fFallbackType + "/" + key);
}
throw m;
}
}
/**
* Load data for calendar. Note, this object owns the resources, do NOT call ures_close()!
* There is an implicit key of 'format'
* data is located in: "calendar/key/format/subKey"
* for example, calendar/dayNames/format/abbreviated
*
* @param key Resource key to data
* @param subKey Resource key to data
* @internal
*/
public ICUResourceBundle get(String key, String subKey) {
try {
return fBundle.getWithFallback("calendar/" + fMainType + "/" + key + "/format/" + subKey);
} catch(MissingResourceException m) {
if(fFallbackType != null) {
return fBundle.getWithFallback("calendar/" + fFallbackType + "/" + key + "/format/" + subKey);
}
throw m;
}
}
/**
* Load data for calendar. Note, this object owns the resources, do NOT call ures_close()!
* data is located in: "calendar/key/contextKey/subKey"
* for example, calendar/dayNames/stand-alone/narrow
*
* @param key Resource key to data
* @param contextKey Resource key to data
* @param subKey Resource key to data
* @internal
*/
public ICUResourceBundle get(String key, String contextKey, String subKey) {
try {
return fBundle.getWithFallback("calendar/" + fMainType + "/" + key + "/" + contextKey + "/" + subKey);
} catch(MissingResourceException m) {
if(fFallbackType != null) {
return fBundle.getWithFallback("calendar/" + fFallbackType + "/" + key + "/" + contextKey + "/" + subKey);
}
throw m;
}
}
/**
* Load data for calendar. Note, this object owns the resources...
* data is located in: "calendar/key/set/contextKey/subKey"
* for example, calendar/cyclicNameSets/years/format/abbreviated
*
* @param key Resource key to data
* @param set Resource key to data
* @param contextKey Resource key to data
* @param subKey Resource key to data
* @internal
*/
public ICUResourceBundle get(String key, String set, String contextKey, String subKey) {
try {
return fBundle.getWithFallback("calendar/" + fMainType + "/" + key + "/" + set + "/" + contextKey + "/" + subKey);
} catch(MissingResourceException m) {
if(fFallbackType != null) {
return fBundle.getWithFallback("calendar/" + fFallbackType + "/" + key + "/" + set + "/" + contextKey + "/" + subKey);
}
throw m;
}
}
public String[] getStringArray(String key) {
return get(key).getStringArray();
}
public String[] getStringArray(String key, String subKey) {
return get(key, subKey).getStringArray();
}
public String[] getStringArray(String key, String contextKey, String subKey) {
return get(key, contextKey, subKey).getStringArray();
}
public String[] getEras(String subkey){
ICUResourceBundle bundle = get("eras/"+subkey);
return bundle.getStringArray();
}
public String[] getDateTimePatterns(){
ICUResourceBundle bundle = get("DateTimePatterns");
ArrayList list = new ArrayList();
UResourceBundleIterator iter = bundle.getIterator();
while (iter.hasNext()) {
UResourceBundle patResource = iter.next();
int resourceType = patResource.getType();
switch (resourceType) {
case UResourceBundle.STRING:
list.add(patResource.getString());
break;
case UResourceBundle.ARRAY:
String[] items = patResource.getStringArray();
list.add(items[0]);
break;
}
}
return list.toArray(new String[list.size()]);
}
/**
* Returns the default date-time pattern such as {1}, {0}
.
* {1} is always the date and {0} is always the time.
*/
public String getDateTimePattern() {
// this is a hack to get offset 8 from the dateTimePatterns array.
return _getDateTimePattern(-1);
}
/**
* Returns the date-time pattern by style where style is one of the style fields defined
* in DateFormat. If date-time patterns by style are not available, it returns what
* {@link #getDateTimePattern()} would return.
* @param style the style e.g DateFormat.LONG.
* @return the pattern, e.g {1}, {0}.
*/
public String getDateTimePattern(int style) {
// mask away high order bits such as the DateFormat.RELATIVE bit.
// We do it this way to avoid making this class depend on DateFormat. It makes this
// code more brittle, but it is no more brittle than how we access patterns by style.
return _getDateTimePattern(style & 7);
}
private String _getDateTimePattern(int offset) {
String[] patterns = null;
try {
patterns = getDateTimePatterns();
} catch (MissingResourceException ignored) {
// ignore. patterns remains null.
}
if (patterns == null || patterns.length < 9) {
// Return hard-coded default. patterns array not available or it has too few
// elements.
return "{1} {0}";
}
if (patterns.length < 13) {
// Offset 8 contains default pattern if we don't have per style patterns.
return patterns[8];
}
// DateTimePatterns start at index 9 in the array.
return patterns[9 + offset];
}
public String[] getOverrides(){
ICUResourceBundle bundle = get("DateTimePatterns");
ArrayList list = new ArrayList();
UResourceBundleIterator iter = bundle.getIterator();
while (iter.hasNext()) {
UResourceBundle patResource = iter.next();
int resourceType = patResource.getType();
switch (resourceType) {
case UResourceBundle.STRING:
list.add(null);
break;
case UResourceBundle.ARRAY:
String[] items = patResource.getStringArray();
list.add(items[1]);
break;
}
}
return list.toArray(new String[list.size()]);
}
public ULocale getULocale() {
return fBundle.getULocale();
}
private ICUResourceBundle fBundle;
private String fMainType;
private String fFallbackType;
}