From ae1e68cd094ec8124e14b5989cb046aa6d2c7d20 Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Sun, 10 Mar 2013 07:01:02 -0400 Subject: [PATCH] bug 290631: Missing LSP change notification event when provider being serialized equals extension --- .../LanguageSettingsListenersTests.java | 44 ++++++++++++++++++- .../LanguageSettingsProvidersSerializer.java | 21 +++++---- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsListenersTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsListenersTests.java index cc6424a42bd..45f162d842e 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsListenersTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsListenersTests.java @@ -1099,7 +1099,8 @@ public class LanguageSettingsListenersTests extends BaseTestCase { assertEquals(1, event.getConfigurationDescriptionIds().length); assertEquals(cfgDescriptionId, event.getConfigurationDescriptionIds()[0]); } - // Change the provider's entries back (bug was found for this case) + + // Clear the provider's entries { // retrieve a global provider ILanguageSettingsProvider wspProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_EDITABLE_PROVIDER_ID); @@ -1134,6 +1135,47 @@ public class LanguageSettingsListenersTests extends BaseTestCase { assertEquals(1, event.getConfigurationDescriptionIds().length); assertEquals(cfgDescriptionId, event.getConfigurationDescriptionIds()[0]); } + + // Change the provider's entries back to original state from extension point + { + + ILanguageSettingsProvider extensionProviderCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_EDITABLE_PROVIDER_ID, true); + List extEntries = extensionProviderCopy.getSettingEntries(null, null, null); + + // retrieve a global provider + ILanguageSettingsProvider wspProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_EDITABLE_PROVIDER_ID); + assertNotNull(wspProvider); + ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(wspProvider); + assertTrue(rawProvider instanceof MockLanguageSettingsEditableProvider); + // reset the provider to match extension + ((MockLanguageSettingsEditableProvider) rawProvider).setSettingEntries(null, null, null, extEntries); + assertTrue(LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true)); + + // reset count + mockLseListener.resetCount(); + assertEquals(0, mockLseListener.getCount()); + assertEquals(null, mockLseListener.getLastEvent()); + + // Serialize settings + LanguageSettingsManager.serializeLanguageSettingsWorkspace(); + + // get cfgDescriptionId + ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, false); + assertNotNull(prjDescription); + ICConfigurationDescription[] cfgDescriptions = prjDescription.getConfigurations(); + assertEquals(1, cfgDescriptions.length); + ICConfigurationDescription cfgDescription = cfgDescriptions[0]; + String cfgDescriptionId = cfgDescription.getId(); + + // inspect event + assertEquals(1, mockLseListener.getCount()); + ILanguageSettingsChangeEvent event = mockLseListener.getLastEvent(); + assertNotNull(event); + + assertEquals(project.getName(), event.getProjectName()); + assertEquals(1, event.getConfigurationDescriptionIds().length); + assertEquals(cfgDescriptionId, event.getConfigurationDescriptionIds()[0]); + } } /** 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 04f3d1251fd..ddb1b76f6f5 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 @@ -21,6 +21,7 @@ import java.util.Set; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.language.settings.providers.ICListenerAgent; +import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsBroadcastingProvider; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsChangeEvent; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsChangeListener; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsEditableProvider; @@ -482,11 +483,11 @@ public class LanguageSettingsProvidersSerializer { /** * Compute events for language settings changes in workspace. */ - private static List createLanguageSettingsChangeEvents(List providers) { + private static List createLanguageSettingsChangeEvents(List providers) { List events = new ArrayList(); List providerIds = new ArrayList(); - for (LanguageSettingsSerializableProvider provider : providers) { + for (ILanguageSettingsBroadcastingProvider provider : providers) { providerIds.add(provider.getId()); } @@ -521,23 +522,27 @@ public class LanguageSettingsProvidersSerializer { */ public static void serializeLanguageSettingsWorkspace() throws CoreException { URI uriStoreWsp = getStoreInWorkspaceArea(STORAGE_WORKSPACE_LANGUAGE_SETTINGS); - List serializableWorkspaceProviders = new ArrayList(); + List broadcastingWorkspaceProviders = new ArrayList(); + List serializingWorkspaceProviders = new ArrayList(); for (ILanguageSettingsProvider provider : rawGlobalWorkspaceProviders.values()) { + if (provider instanceof ILanguageSettingsBroadcastingProvider) { + broadcastingWorkspaceProviders.add((ILanguageSettingsBroadcastingProvider)provider); + } if (provider instanceof LanguageSettingsSerializableProvider) { if (!LanguageSettingsManager.isEqualExtensionProvider(provider, true)) { - serializableWorkspaceProviders.add((LanguageSettingsSerializableProvider)provider); + serializingWorkspaceProviders.add((LanguageSettingsSerializableProvider)provider); } } } try { List events = null; - if (serializableWorkspaceProviders.isEmpty()) { + if (serializingWorkspaceProviders.isEmpty()) { java.io.File fileStoreWsp = new java.io.File(uriStoreWsp); try { serializingLockWsp.acquire(); fileStoreWsp.delete(); // manufacture events while inside the lock - events = createLanguageSettingsChangeEvents(serializableWorkspaceProviders); + events = createLanguageSettingsChangeEvents(broadcastingWorkspaceProviders); } finally { serializingLockWsp.release(); } @@ -547,7 +552,7 @@ public class LanguageSettingsProvidersSerializer { Element elementExtension = XmlUtil.appendElement(rootElement, ELEM_EXTENSION, new String[] {ATTR_EXTENSION_POINT, PROVIDER_EXTENSION_POINT_ID}); - for (LanguageSettingsSerializableProvider provider : serializableWorkspaceProviders) { + for (LanguageSettingsSerializableProvider provider : serializingWorkspaceProviders) { provider.serialize(elementExtension); } @@ -555,7 +560,7 @@ public class LanguageSettingsProvidersSerializer { serializingLockWsp.acquire(); XmlUtil.serializeXml(doc, uriStoreWsp); // manufacture events while inside the lock - events = createLanguageSettingsChangeEvents(serializableWorkspaceProviders); + events = createLanguageSettingsChangeEvents(broadcastingWorkspaceProviders); } finally { serializingLockWsp.release(); }