From e64c995ff0dfaa8ce8361563c1a0e94df6a55011 Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Tue, 13 Dec 2011 18:23:04 -0500 Subject: [PATCH] Separate extension and workspace providers inside implementation --- .../LanguageSettingsExtensionsTests.java | 1 + ...nguageSettingsPersistenceProjectTests.java | 44 +++++++++++ .../LanguageSettingsExtensionManager.java | 75 ++++++++++--------- .../LanguageSettingsProvidersSerializer.java | 56 ++++++++------ 4 files changed, 118 insertions(+), 58 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsExtensionsTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsExtensionsTests.java index 5f30e376650..2c380caf7a1 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsExtensionsTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsExtensionsTests.java @@ -48,6 +48,7 @@ public class LanguageSettingsExtensionsTests extends BaseTestCase { /*package*/ static final String EXTENSION_SERIALIZABLE_PROVIDER_MISSING_PARAMETER = "parameter"; /*package*/ static final String EXTENSION_EDITABLE_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.editable.language.settings.provider"; /*package*/ static final String EXTENSION_EDITABLE_PROVIDER_NAME = "Test Plugin Mock Editable Language Settings Provider"; + /*package*/ static final ICLanguageSettingEntry EXTENSION_SERIALIZABLE_PROVIDER_ENTRY = new CMacroEntry("MACRO", "value", 0); /*package*/ static final ICLanguageSettingEntry EXTENSION_EDITABLE_PROVIDER_ENTRY = new CMacroEntry("MACRO", "value", 0); /*package*/ static final String EXTENSION_REGISTERER_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.listener.registerer.provider"; /*package*/ static final String EXTENSION_USER_PROVIDER_ID = "org.eclipse.cdt.ui.user.LanguageSettingsProvider"; diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java index d0c7a4c43a6..30b58b92a16 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java @@ -44,6 +44,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { private static final String EXTENSION_BASE_PROVIDER_ID = LanguageSettingsExtensionsTests.EXTENSION_BASE_PROVIDER_ID; private static final String EXTENSION_BASE_PROVIDER_NAME = LanguageSettingsExtensionsTests.EXTENSION_BASE_PROVIDER_NAME; private static final String EXTENSION_SERIALIZABLE_PROVIDER_ID = LanguageSettingsExtensionsTests.EXTENSION_SERIALIZABLE_PROVIDER_ID; + private static final ICLanguageSettingEntry EXTENSION_SERIALIZABLE_PROVIDER_ENTRY = LanguageSettingsExtensionsTests.EXTENSION_SERIALIZABLE_PROVIDER_ENTRY; private static final String LANGUAGE_SETTINGS_PROJECT_XML = ".settings/language.settings.xml"; private static final String LANGUAGE_SETTINGS_WORKSPACE_XML = "language.settings.xml"; @@ -337,6 +338,49 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { } } + /** + */ + public void testWorkspacePersistence_UnmodifiedExtensionProvider() throws Exception { + List extensionEntries = new ArrayList(); + extensionEntries.add(EXTENSION_SERIALIZABLE_PROVIDER_ENTRY); + { + // test initial state of the extension provider + ILanguageSettingsProvider extProvider = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_SERIALIZABLE_PROVIDER_ID, true); + assertNull(extProvider); + } + { + // get the workspace provider + ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID); + // check that entries match that of extension provider + assertEquals(extensionEntries, provider.getSettingEntries(null, null, null)); + ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); + assertTrue(LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true)); + + // serialize language settings of workspace providers + LanguageSettingsManager.serializeLanguageSettingsWorkspace(); + } + { + // re-load + LanguageSettingsProvidersSerializer.loadLanguageSettingsWorkspace(); + + // ensure the workspace provider still matches extension + ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID); + assertEquals(EXTENSION_SERIALIZABLE_PROVIDER_ID, provider.getId()); + assertEquals(extensionEntries, provider.getSettingEntries(null, null, null)); + ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); + assertTrue(LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true)); + + // replace entries + assertTrue(rawProvider instanceof LanguageSettingsSerializableProvider); + List entries = new ArrayList(); + entries.add(new CIncludePathEntry("path0", 0)); + ((LanguageSettingsSerializableProvider)rawProvider).setSettingEntries(null, null, null, entries); + + // check that the extension provider is not affected + assertTrue(!LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true)); + } + } + /** */ public void testWorkspacePersistence_GlobalProvider() throws Exception { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsExtensionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsExtensionManager.java index d8f74aa42c6..8ba43ae9cf1 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsExtensionManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsExtensionManager.java @@ -218,33 +218,28 @@ public class LanguageSettingsExtensionManager { } /** - * Creates empty non-configured provider from extension point definition. The method will - * inspect extension registry for extension point "org.eclipse.cdt.core.LanguageSettingsProvider" + * Creates provider from extension point definition which matches value of the given attribute. + * The method will inspect extension registry for extension point "org.eclipse.cdt.core.LanguageSettingsProvider" * to determine bundle and instantiate the class. - * ID and name of provider are assigned from the first encountered extension point specifying the class. * - * @param className - full qualified class name of provider. - * @param registry - extension registry - * @return new non-configured provider + * @param attr - attribute to match. + * @param attrValue - value of the attribute to match. + * @param registry - extension registry. + * @param configure - flag which indicates if provider needs to be configured. + * @return new instance of the provider */ - private static ILanguageSettingsProvider createProviderCarcass(String className, IExtensionRegistry registry) { - if (className==null || className.length()==0) { - return new LanguageSettingsBaseProvider(); - } - + private static ILanguageSettingsProvider loadProviderFromRegistry(String attr, String attrValue, + IExtensionRegistry registry, boolean configure) { try { IExtensionPoint extension = registry.getExtensionPoint(CCorePlugin.PLUGIN_ID, PROVIDER_EXTENSION_SIMPLE_ID); if (extension != null) { IExtension[] extensions = extension.getExtensions(); for (IExtension ext : extensions) { for (IConfigurationElement cfgEl : ext.getConfigurationElements()) { - if (cfgEl.getName().equals(ELEM_PROVIDER) && className.equals(cfgEl.getAttribute(ATTR_CLASS))) { + if (cfgEl.getName().equals(ELEM_PROVIDER) && attrValue.equals(cfgEl.getAttribute(attr))) { ILanguageSettingsProvider provider = createExecutableExtension(cfgEl); - if (provider instanceof AbstractExecutableExtensionBase) { - String ceId = determineAttributeValue(cfgEl, ATTR_ID); - String ceName = determineAttributeValue(cfgEl, ATTR_NAME); - ((AbstractExecutableExtensionBase) provider).setId(ceId); - ((AbstractExecutableExtensionBase) provider).setName(ceName); + if (configure) { + configureExecutableProvider(provider, cfgEl); } return provider; } @@ -258,12 +253,13 @@ public class LanguageSettingsExtensionManager { } /** - * Create an instance of language settings provider of given class name. + * Create an instance of non-configured language settings provider of given class name. + * The class should be known or registered with the extension point. * * @param className - class name to instantiate. * @return new instance of language settings provider. */ - /*package*/ static ILanguageSettingsProvider getProviderInstance(String className) { + /*package*/ static ILanguageSettingsProvider instantiateProviderClass(String className) { if (className==null || className.equals(LanguageSettingsSerializableProvider.class.getName())) { return new LanguageSettingsSerializableProvider(); } @@ -277,7 +273,8 @@ public class LanguageSettingsExtensionManager { return new LanguageSettingsGenericProvider(); } - ILanguageSettingsProvider provider = createProviderCarcass(className, Platform.getExtensionRegistry()); + // Create it as executable extension from the extension registry. + ILanguageSettingsProvider provider = loadProviderFromRegistry(ATTR_CLASS, className, Platform.getExtensionRegistry(), false); if (provider == null) { IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Not able to load provider class=" + className); //$NON-NLS-1$ CCorePlugin.log(new CoreException(status)); @@ -286,22 +283,32 @@ public class LanguageSettingsExtensionManager { } /** - * @return list of providers contributed by all extensions. Preferable copy but if not possible - * will return raw provider. + * Load an instance of language settings provider of given id from the extension point. + * The class should be registered with the extension point. + * + * @param id - class name to instantiate. + * @return new instance of language settings provider. */ - /*package*/ static List getExtensionProvidersInternal() { - ArrayList list = new ArrayList(fExtensionProviders.size()); - for (String id : fExtensionProviders.keySet()) { - ILanguageSettingsProvider extensionProvider = getExtensionProviderCopy(id, true); - if (extensionProvider == null) { - extensionProvider = fExtensionProviders.get(id); - } - - if (extensionProvider != null) { - list.add(extensionProvider); - } + /*package*/ static ILanguageSettingsProvider loadProvider(String id) { + if (id==null) { + return null; } - return list; + + // Create it as executable extension from the extension registry. + ILanguageSettingsProvider provider = loadProviderFromRegistry(ATTR_ID, id, Platform.getExtensionRegistry(), true); + if (provider == null) { + IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Not able to load provider id=" + id); //$NON-NLS-1$ + CCorePlugin.log(new CoreException(status)); + } + return provider; + } + + /** + * Returns list of provider id-s contributed by all extensions. + * @return list of provider id-s contributed by all extensions. + */ + public static Set getExtensionProviderIds() { + return fExtensionProviders.keySet(); } /** diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java index 8f9b62edbdd..4786a6260cc 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java @@ -295,18 +295,18 @@ public class LanguageSettingsProvidersSerializer { } /** - * Set and store user defined providers in workspace area. - * - * @param providers - array of user defined providers - * @throws CoreException in case of problems - */ - public static void setWorkspaceProviders(List providers) throws CoreException { - setWorkspaceProvidersInternal(providers); - serializeLanguageSettingsWorkspace(); - // generate preference change event - IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID); - prefs.putBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, ! prefs.getBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, false)); - } + * Set and store user defined providers in workspace area. + * + * @param providers - array of user defined providers + * @throws CoreException in case of problems + */ + public static void setWorkspaceProviders(List providers) throws CoreException { + setWorkspaceProvidersInternal(providers); + serializeLanguageSettingsWorkspace(); + // generate preference change event + IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID); + prefs.putBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, ! prefs.getBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, false)); + } /** * Internal method to set user defined providers in memory. @@ -316,13 +316,8 @@ public class LanguageSettingsProvidersSerializer { */ private static void setWorkspaceProvidersInternal(List providers) { Map rawWorkspaceProviders = new HashMap(); - List extensionProviders = new ArrayList(LanguageSettingsExtensionManager.getExtensionProvidersInternal()); - for (ILanguageSettingsProvider rawExtensionProvider : extensionProviders) { - if (rawExtensionProvider!=null) { - rawWorkspaceProviders.put(rawExtensionProvider.getId(), rawExtensionProvider); - } - } + // given providers List rawProviders = new ArrayList(); if (providers!=null) { for (ILanguageSettingsProvider provider : providers) { @@ -338,6 +333,20 @@ public class LanguageSettingsProvidersSerializer { } } + // fill the rest from extension registry + // this list is independent from the internal list of extensions in LanguageSettingsExtensionManager + for (String id : LanguageSettingsExtensionManager.getExtensionProviderIds()) { + if (!rawWorkspaceProviders.containsKey(id)) { + ILanguageSettingsProvider provider = LanguageSettingsExtensionManager.getExtensionProviderCopy(id, true); + if (provider == null) { + provider = LanguageSettingsExtensionManager.loadProvider(id); + } + if (provider != null) { + rawWorkspaceProviders.put(provider.getId(), provider); + } + } + } + List oldListeners = selectListeners(rawGlobalWorkspaceProviders.values()); List newListeners = selectListeners(rawProviders); @@ -432,8 +441,9 @@ projects: Element elementExtension = XmlUtil.appendElement(rootElement, ELEM_EXTENSION, new String[] {ATTR_POINT, LanguageSettingsExtensionManager.PROVIDER_EXTENSION_FULL_ID}); for (LanguageSettingsSerializableProvider provider : serializableWorkspaceProviders) { - // TODO don't serialize if equals to extension provider - provider.serialize(elementExtension); + if (!LanguageSettingsManager.isEqualExtensionProvider(provider, true)) { + provider.serialize(elementExtension); + } } try { @@ -495,9 +505,7 @@ projects: if (providers == null) { providers = new ArrayList(); } - if (!LanguageSettingsManager.isEqualExtensionProvider(provider, true)) { - providers.add(provider); - } + providers.add(provider); } } } @@ -754,7 +762,7 @@ projects: private static ILanguageSettingsProvider loadProvider(Node providerNode) { String attrClass = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_CLASS); - ILanguageSettingsProvider provider = LanguageSettingsExtensionManager.getProviderInstance(attrClass); + ILanguageSettingsProvider provider = LanguageSettingsExtensionManager.instantiateProviderClass(attrClass); if (provider instanceof LanguageSettingsSerializableProvider) ((LanguageSettingsSerializableProvider)provider).load((Element) providerNode);