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 30b58b92a16..44c65c77c25 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 String EXTENSION_USER_PROVIDER_ID = LanguageSettingsExtensionsTests.EXTENSION_USER_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"; @@ -530,6 +531,64 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { } } + /** + */ + public void testProjectPersistence_UserProviderDOM() throws Exception { + Element rootElement = null; + + List entries = new ArrayList(); + entries.add(new CIncludePathEntry("path0", 0)); + + { + // create a provider + MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID)); + ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations(); + ICConfigurationDescription cfgDescription = cfgDescriptions[0]; + assertNotNull(cfgDescription); + assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper); + + ILanguageSettingsProvider provider = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_USER_PROVIDER_ID, false); + assertTrue(provider instanceof LanguageSettingsGenericProvider); + LanguageSettingsGenericProvider serializableProvider = (LanguageSettingsGenericProvider) provider; + serializableProvider.setSettingEntries(null, null, null, entries); + LanguageSettingsManager.setStoringEntriesInProjectArea(serializableProvider, true); + + ArrayList providers = new ArrayList(); + providers.add(serializableProvider); + ((ILanguageSettingsProvidersKeeper) cfgDescription).setLanguageSettingProviders(providers); + + // prepare DOM storage + Document doc = XmlUtil.newDocument(); + rootElement = XmlUtil.appendElement(doc, ELEM_TEST); + // serialize language settings to the DOM + LanguageSettingsProvidersSerializer.serializeLanguageSettingsInternal(rootElement, null, mockPrjDescription); + assertTrue(XmlUtil.toString(doc).contains(EXTENSION_USER_PROVIDER_ID)); + assertTrue(XmlUtil.toString(doc).contains(LanguageSettingsGenericProvider.class.getName())); + } + { + // re-load and check language settings of the newly loaded provider + MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID)); + LanguageSettingsProvidersSerializer.loadLanguageSettingsInternal(rootElement, null, mockPrjDescription); + + ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations(); + assertNotNull(cfgDescriptions); + assertEquals(1, cfgDescriptions.length); + ICConfigurationDescription cfgDescription = cfgDescriptions[0]; + assertNotNull(cfgDescription); + assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper); + + List providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); + assertNotNull(providers); + assertEquals(1, providers.size()); + ILanguageSettingsProvider provider = providers.get(0); + assertTrue(provider instanceof LanguageSettingsGenericProvider); + + List actual = provider.getSettingEntries(null, null, null); + assertEquals(entries.get(0), actual.get(0)); + assertEquals(entries.size(), actual.size()); + } + } + /** */ public void testProjectPersistence_TwoConfigurationsDOM() 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 3cd33be7b40..e6339342f14 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 @@ -60,8 +60,8 @@ public class LanguageSettingsExtensionManager { static final String ELEM_ENTRY_FLAG = "flag"; //$NON-NLS-1$ /** - * Extension providers loaded once. If the provider is editable (read cloneable) - * external callers get copy rather than real instance. + * Extension providers loaded once and used for equality only. + * Those who request extension provider will get copy rather than real instance. */ private static final LinkedHashMap fExtensionProviders = new LinkedHashMap(); @@ -80,7 +80,7 @@ public class LanguageSettingsExtensionManager { * Load language settings providers contributed via the extension point. */ synchronized private static void loadProviderExtensions() { - // sort by name - the providers defined via extensions are kept in separate list sorted + // sort by name - the providers defined via extensions are kept in separate list sorted by name Set sortedProviders = new TreeSet( new Comparator() { @Override @@ -131,7 +131,7 @@ public class LanguageSettingsExtensionManager { private static String determineAttributeValue(IConfigurationElement ce, String attr) { String value = ce.getAttribute(attr); - return value!=null ? value : ""; //$NON-NLS-1$ + return value != null ? value : ""; //$NON-NLS-1$ } /** @@ -254,7 +254,7 @@ public class LanguageSettingsExtensionManager { /** * Create an instance of non-configured language settings provider of given class name. - * The class should be known or registered with the extension point. + * The class should be known to this method or registered with the extension point. * * @param className - class name to instantiate. * @return new instance of language settings provider. @@ -263,15 +263,9 @@ public class LanguageSettingsExtensionManager { if (className==null || className.equals(LanguageSettingsSerializableProvider.class.getName())) { return new LanguageSettingsSerializableProvider(); } - - // TODO unit test case for this if (className.equals(LanguageSettingsGenericProvider.class.getName())) { return new LanguageSettingsGenericProvider(); } - // FIXME - older usage, will fade it out - if (className.equals("org.eclipse.cdt.internal.ui.language.settings.providers.UserLanguageSettingsProvider")) { - return new LanguageSettingsGenericProvider(); - } // Create it as executable extension from the extension registry. ILanguageSettingsProvider provider = loadProviderFromRegistry(ATTR_CLASS, className, Platform.getExtensionRegistry(), false); @@ -305,7 +299,7 @@ public class LanguageSettingsExtensionManager { /** * Returns list of provider id-s contributed by all extensions. - * @return list of provider id-s contributed by all extensions. + * @return the provider id-s. */ public static Set getExtensionProviderIds() { return fExtensionProviders.keySet(); @@ -320,7 +314,7 @@ public class LanguageSettingsExtensionManager { * @param deep - {@code true} to request deep copy including copying settings entries * or {@code false} to return shallow copy with no settings entries. * - * @return a copy of the provider or null if copying is not possible. + * @return a copy of the provider or {@code null} if copying is not possible. */ public static ILanguageSettingsEditableProvider getProviderCopy(ILanguageSettingsEditableProvider provider, boolean deep) { try { @@ -362,6 +356,7 @@ public class LanguageSettingsExtensionManager { * @param provider - the provider to test. * @param deep - {@code true} to check for deep equality testing also settings entries * or {@code false} to test shallow copy with no settings entries. + * Shallow equality is applicable only for {@link ILanguageSettingsEditableProvider}. * @return - {@code true} if the provider matches the extension or {@code false} otherwise. */ public static boolean isEqualsExtensionProvider(ILanguageSettingsProvider provider, boolean deep) {