package rocks.inspectit.ui.rcp.preferences.valueproviders; import java.util.HashMap; import java.util.Map; import rocks.inspectit.ui.rcp.ci.dialog.InstrumentationUpdateDialog; import rocks.inspectit.ui.rcp.preferences.PreferenceException; import rocks.inspectit.ui.rcp.preferences.PreferencesConstants; /** * Factory for providing the preference strings for objects and vice verse. * * @author Ivan Senic * */ public final class PreferenceValueProviderFactory { /** * Private constructor. */ private PreferenceValueProviderFactory() { } /** * List of active providers. */ private static Map<String, PreferenceValueProvider<?>> preferenceValueProviders; static { preferenceValueProviders = new HashMap<>(); preferenceValueProviders.put(PreferencesConstants.CMR_REPOSITORY_DEFINITIONS, new CmrRepositoryPreferenceValueProvider()); preferenceValueProviders.put(PreferencesConstants.TABLE_COLUMN_SIZE_CACHE, new MapPreferenceValueProvider()); preferenceValueProviders.put(PreferencesConstants.HIDDEN_TABLE_COLUMN_CACHE, new CollectionPreferenceValueProvider()); preferenceValueProviders.put(PreferencesConstants.TABLE_COLUMN_ORDER_CACHE, new ColumnOrderPreferenceValueProvider()); preferenceValueProviders.put(PreferencesConstants.LAST_SELECTED_REPOSITORY, new LastSelectedRepositoryPreferenceValueProvider()); preferenceValueProviders.put(PreferencesConstants.INVOCATION_FILTER_DATA_TYPES, new ClassCollectionPreferenceValueProvider()); preferenceValueProviders.put(PreferencesConstants.JMX_PLOT_DATA_SOLVER, new MapPreferenceValueProvider()); preferenceValueProviders.put(PreferencesConstants.INSTRUMENTATION_UPDATED_AUTO_ACTION, new EnumPreferenceValueProvider<InstrumentationUpdateDialog.OnSaveBehavior>(InstrumentationUpdateDialog.OnSaveBehavior.class)); } /** * Returns a String preference value for a given preference key and object. Note that key * provided has to match with the {@link PreferenceValueProvider} key that works with the same * object types as provided E type. * * @param <E> * Type of object. * @param preferenceKey * Preference key. * @param object * Object to create preference value for. * @return String. * @throws PreferenceException * If exception occurs during execution. */ @SuppressWarnings("unchecked") public static <E> String getValueForObject(String preferenceKey, E object) throws PreferenceException { PreferenceValueProvider<?> preferenceValueProvider = preferenceValueProviders.get(preferenceKey); if (null != preferenceValueProvider) { if (preferenceValueProvider.isObjectValid(object)) { return ((PreferenceValueProvider<E>) preferenceValueProvider).getValueForObject(object); } else { throw new PreferenceException("Preference value for key " + preferenceKey + " could not be obtained because the supplied object is not valid."); } } else { throw new PreferenceException("Preference value provider was not found for preference key: " + preferenceKey); } } /** * Returns a object from a string preference value for a given preference key. Note that key * provided has to match with the {@link PreferenceValueProvider} key that works with the same * object types as provided E type. * * @param <E> * Type of object. * @param preferenceKey * Preference key. * @param value * String preference value. * @return Object. * @throws PreferenceException * If exception occurs during execution. */ @SuppressWarnings("unchecked") public static <E> E getObjectFromValue(String preferenceKey, String value) throws PreferenceException { PreferenceValueProvider<?> preferenceValueProvider = preferenceValueProviders.get(preferenceKey); if (null != preferenceValueProvider) { return ((PreferenceValueProvider<E>) preferenceValueProvider).getObjectFromValue(value); } else { throw new PreferenceException("Preference value provider was not found for preference key: " + preferenceKey); } } /** * Abstract class for preference value providers. * * @author Ivan Senic * * @param <E> * Type that is provider working with. */ abstract static class PreferenceValueProvider<E> { /** * @param object * Object to check. * @return Returns the provider can return a preference value for the object. */ public abstract boolean isObjectValid(Object object); /** * Returns a String for the object. * * @param object * Object. * @return String to save. * @throws PreferenceException * If exception occurs during execution. */ public abstract String getValueForObject(E object) throws PreferenceException; /** * Returns a object from String. * * @param value * Previously saved string. * @return Object of type * @throws PreferenceException * If exception occurs during execution. */ public abstract E getObjectFromValue(String value) throws PreferenceException; } }