/*
* ClassResourceBundle.java
*
*/
package org.smartly.commons.i18n.resourcebundle.bundle.impl;
import org.smartly.commons.i18n.resourcebundle.bundle.IResourceBundle;
import org.smartly.commons.util.LocaleUtils;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Properties;
import java.util.ResourceBundle;
/**
* Wrapper for a standard ResourceBundle.
*
* @author
*/
public final class ClassResourceBundle
implements IResourceBundle {
private String _baseName;
private Locale _locale;
private Boolean _active;
private ResourceBundle _rb;
private Throwable _error;
/**
* Creates a new instance of ClassResourceBundle
*/
public ClassResourceBundle(final String baseName,
final Locale locale, final ClassLoader classloader) {
_active = false;
_baseName = baseName;
_locale = locale;
final ClassLoader cl = null != classloader
? classloader
: ClassLoader.getSystemClassLoader();
try {
_rb = null != locale
? ResourceBundle.getBundle(baseName, locale, cl)
: ResourceBundle.getBundle(baseName, Locale.getDefault(), cl);
if (null != locale && null != _rb) {
final boolean match = LocaleUtils.like(locale, _rb.getLocale());
if (!match) {
_rb = ResourceBundle.getBundle(baseName, Locale.getDefault(), cl);
}
}
if (null == _rb) {
throw new Exception("Unable to retrieve resources " +
"for current base name: " + baseName);
}
_active = true;
} catch (Throwable t) {
// if ResourceBundle not found
_error = t;
}
}
@Override
protected void finalize() throws Throwable {
try {
_rb = null;
} catch (Throwable ignored) {
}
super.finalize();
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append("Base Name: ").append(_baseName).
append("; Locale: ").append(_locale.toString());
if (null != _rb) {
result.append("; Resources: ").append(_rb.toString());
}
return result.toString();
}
@Override
public Throwable getError() {
return _error;
}
@Override
public String getString(String key) {
if (null != _rb) {
return _rb.getString(key);
} else {
return null;
}
}
@Override
public boolean isActive() {
return _active;
}
@Override
public Properties getProperties() {
final Properties result = new Properties();
if (null == _rb || !_active) {
return result;
}
final Enumeration<String> keys = _rb.getKeys();
while (keys.hasMoreElements()) {
final String key = keys.nextElement();
result.setProperty(key, _rb.getString(key));
}
return result;
}
}