blob: f5135173c7c3b35231b1826b6e7a42c1e84b45e2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Tilera Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* William R. Swanson (Tilera Corporation)
*******************************************************************************/
package org.eclipse.cdt.visualizer.core;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.core.runtime.Plugin;
// ---------------------------------------------------------------------------
// ResourceManager
// ---------------------------------------------------------------------------
/**
* Plugin resource manager.
* This class should be instanced in the plugin's "start()" method,
* and disposed in the "stop()" method.
*/
public class ResourceManager {
// --- members ---
/** Plugin ID */
protected String m_pluginID = null;
/** Plugin */
protected Plugin m_plugin = null;
/** Parent resource manager, if any */
protected ResourceManager m_parentManager = null;
/** String resource manager */
protected ResourceBundle m_stringResources = null;
/** String resource property file name */
protected String m_stringResourceFilename = null;
// --- constructors/destructors ---
/**
* Constructor,
* Assumes string resources are in the file "messages.properties".
*/
public ResourceManager(Plugin plugin) {
this(plugin, "messages.properties"); //$NON-NLS-1$
}
/** Constructor */
public ResourceManager(Plugin plugin, String stringResourceFilename) {
m_pluginID = plugin.getBundle().getSymbolicName();
m_plugin = plugin;
m_stringResourceFilename = stringResourceFilename;
getStringRegistry(); // creates registry object
}
/** Dispose method */
public void dispose() {
disposeStringRegistry();
m_stringResourceFilename = null;
m_plugin = null;
m_pluginID = null;
}
// --- accessors ---
/** Returns plugin we're associated with */
public Plugin getPlugin() {
return m_plugin;
}
// --- parent manager management ---
/** Sets parent resource manager, if any */
public void setParentManager(ResourceManager parentManager) {
m_parentManager = parentManager;
}
/** Gets parent resource manager, if any */
public ResourceManager getParentManager() {
return m_parentManager;
}
// --- string resource management ---
/** Creates/returns string registry */
protected ResourceBundle getStringRegistry() {
if (m_stringResources == null) {
String filename = m_stringResourceFilename;
// The ".properties" extension is assumed, so we trim it here
String propertiesExtension = ".properties"; //$NON-NLS-1$
if (filename.endsWith(propertiesExtension)) {
filename = filename.substring(0, filename.length() - propertiesExtension.length());
}
// NOTE: We have to be careful to pick up the class loader
// from the plugin class, otherwise we default to the classloader
// of the ResourceManager class, which is the classloader
// for the plugin the ResourceManager comes from.
ClassLoader classLoader = m_plugin.getClass().getClassLoader();
Locale locale = Locale.getDefault();
// we'll check for .properties file first
// in the same directory as the plugin activator class
String propertyFileName1 = m_pluginID + ".plugin." + filename; //$NON-NLS-1$
try {
m_stringResources = ResourceBundle.getBundle(propertyFileName1, locale, classLoader);
} catch (MissingResourceException e) {
// TODO: log this exception (probably a .properties file is missing)
m_stringResources = null;
}
// if not found, we try in the default package
// (that is, the top-level "src" or "resources" folder)
String propertyFileName2 = filename;
if (m_stringResources == null) {
try {
m_stringResources = ResourceBundle.getBundle(propertyFileName2, locale, classLoader);
} catch (MissingResourceException e) {
// TODO: log this exception (probably a .properties file is missing)
m_stringResources = null;
}
}
}
return m_stringResources;
}
/** Disposes of string registry */
protected void disposeStringRegistry() {
m_stringResources = null;
}
/** Returns string resource for specified key */
public String getString(String key) {
String result = null;
if (key == null)
return "(null resource)";
// get string registry, look up key
ResourceBundle strings = getStringRegistry();
if (strings == null) {
// if we can't get the registry, display the key instead,
// so we know what's missing (e.g. the .properties file)
result = "(" + key + ")"; //$NON-NLS-1$ //$NON-NLS-2$
} else {
try {
result = strings.getString(key);
} catch (MissingResourceException e) {
// we fail, but don't throw an exception
// so we don't screw any UI setup that depends
// on this string resource
result = null;
}
}
// if we fail, try the parent manager if there is one
if (result == null && m_parentManager != null) {
result = m_parentManager.getString(key);
}
// if we still fail, display the key instead,
// so we know what's missing
if (result == null)
result = "[" + key + "]"; //$NON-NLS-1$ //$NON-NLS-2$
return result;
}
/** Formats string resource with specified argument(s) */
public String getString(String key, Object... arguments) {
return MessageFormat.format(getString(key), arguments);
}
}