/******************************************************************************* * Copyright (c) 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.model.terms; import java.text.MessageFormat; import java.util.MissingResourceException; import java.util.ResourceBundle; import org.eclipse.bpel.model.BPELPlugin; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Preferences; import org.eclipse.core.runtime.Preferences.PropertyChangeEvent; /** * The main plugin class to be used in the desktop. */ public class BPELTerms { // preference key. public static final String PREF_BPEL_TERMS_PATH = "pref_bpel_terms_path"; //$NON-NLS-1$ private ResourceBundle resourceBundle = null; private String currentTerms = null; private static String TERMS_PACKAGE = "org.eclipse.bpel.terms"; //$NON-NLS-1$ public static String SPEC_TERMS_PATH = TERMS_PACKAGE+".spec_terms"; //$NON-NLS-1$ protected boolean loadTerms(String terms) { if (terms != null && terms.equals(currentTerms)) return true; currentTerms = terms; ResourceBundle newResourceBundle = null; try { newResourceBundle = ResourceBundle.getBundle(terms); } catch (MissingResourceException x) { return false; } resourceBundle = newResourceBundle; return true; } Preferences.IPropertyChangeListener prefListener = new Preferences.IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if (PREF_BPEL_TERMS_PATH.equals(event.getProperty())) { loadTerms(getPluginPreferences().getString(PREF_BPEL_TERMS_PATH)); } } }; //The shared instance. private static BPELTerms plugin; /** * The constructor. */ public BPELTerms() { plugin = this; } /** * Returns the shared instance. This method must work in both * the eclipse and non-eclipse case. */ public synchronized static BPELTerms getDefault() { // Lazy initialization for the non-eclipse case if (plugin == null) { plugin = new BPELTerms(); // Initialize the resource bundle to the spec terms since // we don't have any preferences store. plugin.loadTerms(SPEC_TERMS_PATH); } return plugin; } /** * Returns the plugin's resource bundle, */ protected ResourceBundle getResourceBundle() { if (resourceBundle == null) { if (Platform.isRunning()) { Preferences prefs = getPluginPreferences(); prefs.setDefault(PREF_BPEL_TERMS_PATH, SPEC_TERMS_PATH); loadTerms(prefs.getString(PREF_BPEL_TERMS_PATH)); prefs.addPropertyChangeListener(prefListener); } } return resourceBundle; } /** * Returns the string from the plugin's resource bundle, * or 'key' if not found. */ public static String getString(String key) { ResourceBundle bundle = BPELTerms.getDefault().getResourceBundle(); try { return (bundle != null) ? bundle.getString(key) : key; } catch (MissingResourceException e) { return key; } } /** * Retrieves a message with one parameter from the catalog. This is just a convenience * wrapper for {@link #get(String,Object[])}. * @param key The key of the message to retrieve. * @param var The substitution variable to use. * @return The message text or <code>null</code>, if the key cannot be found. */ public static String getString(String key, Object var) { return getString(key, new Object[] { var }); } /** * Retrieves a message with an arbitrary number of parameters from the catalog. * <ul> * <li>If you specify less variables than there are parameters, the placeholders for * the missing parameters will be left as-is. This is also true if you omit * the variables at all using {@link #get(String)}.</li> * <li>If you specify a <code>null</code> variable, the corresponding placeholder * will be replaced with the string <code>null</code>.</li> * <li>If you specify any variables at all when retrieving a message (it does not matter * if they are actually used or not), you must escape the single quote character * by doubling it in the message string. In contrast, if you don't specify any * variables by using the {@link #get(String)} method (again, it does not matter if they * are actually used), you must not escape the single quote character.</li> * </ul> * @param key The key of the message to retrieve. * @param vars The list of substitution variables to use. * @return The message text or <code>null</code>, if the key cannot be found. */ public static String getString(String key, Object[] vars) { String text = getString(key); return text == null ? null : MessageFormat.format(text, vars); } /** * Return the name of the currently-selected catalogue. This method must * work whether we are in an eclipse or non-eclipse environment. * @return the name of the currently-selected catalogue. The result will * be either */ public static String getCatalogName() { // Plugin preferences will not exist in a non-eclipse environment. if (Platform.isRunning()) { return BPELTerms.getDefault().getPluginPreferences().getString(PREF_BPEL_TERMS_PATH); } return SPEC_TERMS_PATH; } // TODO: temp method - should be removed public Preferences getPluginPreferences() { return BPELPlugin.getPlugin().getPluginPreferences(); } // TODO: temp method - should be removed public void savePluginPreferences() { BPELPlugin.getPlugin().savePluginPreferences(); } }