From 9a66dd7b79f2d352a987a0be42f503463f3ea95c Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Mon, 5 Dec 2011 14:13:16 -0500 Subject: [PATCH] Generalize properties for LanguageSettingsSerializableProvider, keep storeEntriesInProjectArea attribute in there --- ...nguageSettingsPersistenceProjectTests.java | 22 ++--- .../LanguageSettingsSerializableTests.java | 59 +++++++----- .../providers/LanguageSettingsManager.java | 23 +++++ .../LanguageSettingsSerializableProvider.java | 92 +++++++++++-------- .../LanguageSettingsProvidersSerializer.java | 33 ++++++- .../LanguageSettingsProviderTab.java | 6 +- 6 files changed, 158 insertions(+), 77 deletions(-) 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 1e95c8d6f4b..6b994c49e4c 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 @@ -239,7 +239,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { // create a provider LanguageSettingsSerializableProvider mockProvider = new MockLanguageSettingsEditableProvider(PROVIDER_0, PROVIDER_NAME_0); - mockProvider.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(mockProvider, true); mockProvider.setSettingEntries(cfgDescription, null, null, entries); List providers = new ArrayList(); providers.add(mockProvider); @@ -450,7 +450,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { LanguageSettingsSerializableProvider serializableProvider = new LanguageSettingsSerializableProvider(PROVIDER_0, PROVIDER_NAME_0); serializableProvider.setSettingEntries(null, null, null, entries); - serializableProvider.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(serializableProvider, true); ArrayList providers = new ArrayList(); providers.add(serializableProvider); @@ -516,7 +516,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { assertEquals(CFG_ID, cfgDescription1.getId()); LanguageSettingsSerializableProvider provider1 = new LanguageSettingsSerializableProvider(PROVIDER_0, PROVIDER_NAME_0); - provider1.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true); provider1.setSettingEntries(null, null, null, entries); ArrayList providers = new ArrayList(); providers.add(provider1); @@ -530,7 +530,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { assertEquals(CFG_ID_2, cfgDescription2.getId()); LanguageSettingsSerializableProvider provider2 = new LanguageSettingsSerializableProvider(PROVIDER_0, PROVIDER_NAME_0); - provider2.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider2, true); provider2.setSettingEntries(null, null, null, entries2); ArrayList providers = new ArrayList(); providers.add(provider2); @@ -646,7 +646,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { LanguageSettingsSerializableProvider serializableProvider = new MockLanguageSettingsSerializableProvider(PROVIDER_0, PROVIDER_NAME_0); serializableProvider.setSettingEntries(null, null, null, entries); - serializableProvider.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(serializableProvider, true); ArrayList providers = new ArrayList(); providers.add(serializableProvider); @@ -750,7 +750,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { // populate with provider overriding the extension (must be SerializableLanguageSettingsProvider or a class from another extension) MockLanguageSettingsSerializableProvider providerOverride = new MockLanguageSettingsSerializableProvider(idExt, PROVIDER_NAME_0); - providerOverride.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(providerOverride, true); List providers = new ArrayList(); providers.add(providerOverride); ((ILanguageSettingsProvidersKeeper) cfgDescription).setLanguageSettingProviders(providers); @@ -817,11 +817,11 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { // 3. Providers defined in a configuration // 3.1 LanguageSettingsSerializableProvider mockProvider1 = new LanguageSettingsSerializableProvider(PROVIDER_0, PROVIDER_NAME_0); - mockProvider1.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(mockProvider1, true); mockProvider1.setSettingEntries(null, null, null, entries_31); // 3.2 LanguageSettingsSerializableProvider mockProvider2 = new MockLanguageSettingsSerializableProvider(PROVIDER_2, PROVIDER_NAME_2); - mockProvider2.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(mockProvider2, true); mockProvider2.setSettingEntries(null, null, null, entries_32); ArrayList providers = new ArrayList(); @@ -901,7 +901,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { // create a provider LanguageSettingsSerializableProvider mockProvider = new LanguageSettingsSerializableProvider(PROVIDER_0, PROVIDER_NAME_0); - mockProvider.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(mockProvider, true); mockProvider.setSettingEntries(cfgDescription, null, null, entries); List providers = new ArrayList(); providers.add(mockProvider); @@ -1042,7 +1042,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { LanguageSettingsSerializableProvider serializableProvider = new LanguageSettingsSerializableProvider(PROVIDER_0, PROVIDER_NAME_0); serializableProvider.setSettingEntries(null, null, null, entries); // do not store entries inside project - serializableProvider.setStoringEntriesInProjectArea(false); + LanguageSettingsManager.setStoringEntriesInProjectArea(serializableProvider, false); ArrayList providers = new ArrayList(); providers.add(serializableProvider); @@ -1115,7 +1115,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { // create a provider LanguageSettingsSerializableProvider mockProvider = new LanguageSettingsSerializableProvider(PROVIDER_0, PROVIDER_NAME_0); - mockProvider.setStoringEntriesInProjectArea(false); + LanguageSettingsManager.setStoringEntriesInProjectArea(mockProvider, false); mockProvider.setSettingEntries(cfgDescription, null, null, entries); List providers = new ArrayList(); providers.add(mockProvider); diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java index 53e28a72e2d..7b85ac4668d 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java @@ -116,9 +116,11 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { mockProvider.setCustomParameter(CUSTOM_PARAMETER); assertEquals(CUSTOM_PARAMETER, mockProvider.getCustomParameter()); - assertEquals(false, mockProvider.isStoringEntriesInProjectArea()); - mockProvider.setStoringEntriesInProjectArea(true); - assertEquals(true, mockProvider.isStoringEntriesInProjectArea()); + assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(mockProvider)); + LanguageSettingsManager.setStoringEntriesInProjectArea(mockProvider, true); + assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(mockProvider)); + LanguageSettingsManager.setStoringEntriesInProjectArea(mockProvider, false); + assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(mockProvider)); mockProvider.setLanguageScope(languages); assertEquals(languages, mockProvider.getLanguageScope()); @@ -143,7 +145,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { { // create customized provider LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); - provider.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); provider.setCustomParameter(CUSTOM_PARAMETER); List languageScope = new ArrayList(); @@ -170,7 +172,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { // re-load and check language settings of the newly loaded provider LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(elementProvider); assertEquals(PROVIDER_1, provider.getId()); - assertEquals(true, provider.isStoringEntriesInProjectArea()); + assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); assertEquals(CUSTOM_PARAMETER, provider.getCustomParameter()); assertNotNull(provider.getLanguageScope()); assertTrue(provider.getLanguageScope().size()>0); @@ -190,7 +192,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { { // create customized provider LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); - provider.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); provider.setCustomParameter(CUSTOM_PARAMETER); List languageScope = new ArrayList(); @@ -219,7 +221,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(); provider.loadAttributes(elementProvider); assertEquals(PROVIDER_1, provider.getId()); - assertEquals(true, provider.isStoringEntriesInProjectArea()); + assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); assertEquals(CUSTOM_PARAMETER, provider.getCustomParameter()); assertNotNull(provider.getLanguageScope()); assertTrue(provider.getLanguageScope().size()>0); @@ -237,7 +239,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { { // create customized provider LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); - provider.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); provider.setCustomParameter(CUSTOM_PARAMETER); List languageScope = new ArrayList(); @@ -271,7 +273,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { // no attributes should be loaded assertFalse(PROVIDER_1.equals(provider.getId())); assertFalse(PROVIDER_NAME_1.equals(provider.getName())); - assertFalse(true==provider.isStoringEntriesInProjectArea()); + assertFalse(true==LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); assertFalse(CUSTOM_PARAMETER.equals(provider.getCustomParameter())); assertNull(provider.getLanguageScope()); // entries should be loaded @@ -337,11 +339,11 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { public void testStoreEntriesWithProjectDOM() throws Exception { Element elementProvider; { - // create provider with custom parameter + // create provider storing entries in project area LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); - assertEquals(false, provider.isStoringEntriesInProjectArea()); - provider.setStoringEntriesInProjectArea(true); - assertEquals(true, provider.isStoringEntriesInProjectArea()); + assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); + assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); Document doc = XmlUtil.newDocument(); Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); @@ -351,9 +353,9 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { assertTrue(xmlString.contains(VALUE_PROJECT)); } { - // re-load and check custom parameter of the newly loaded provider + // re-load and check storing mode of the newly loaded provider LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(elementProvider); - assertEquals(true, provider.isStoringEntriesInProjectArea()); + assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); } } @@ -1174,8 +1176,8 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { LanguageSettingsSerializableProvider provider1 = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); provider1.setLanguageScope(sampleLanguages); provider1.setCustomParameter(CUSTOM_PARAMETER); - assertEquals(false, provider1.isStoringEntriesInProjectArea()); - provider1.setStoringEntriesInProjectArea(true); + assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider1)); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true); provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2); @@ -1201,7 +1203,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { assertFalse(provider1.equals(provider2)); assertFalse(provider1.hashCode()==provider2.hashCode()); - provider2.setStoringEntriesInProjectArea(true); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider2, true); // All set now, so they should be equal assertTrue(provider1.equals(provider2)); @@ -1251,8 +1253,8 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { MockSerializableProvider provider1 = new MockSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); provider1.setLanguageScope(sampleLanguages); provider1.setCustomParameter(CUSTOM_PARAMETER); - assertEquals(false, provider1.isStoringEntriesInProjectArea()); - provider1.setStoringEntriesInProjectArea(true); + assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider1)); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true); provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2); @@ -1261,8 +1263,17 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { assertNotSame(provider1, providerClone); assertTrue(provider1.equals(providerClone)); assertTrue(provider1.getClass()==providerClone.getClass()); + assertEquals(provider1.getCustomParameter(), providerClone.getCustomParameter()); - assertEquals(provider1.isStoringEntriesInProjectArea(), providerClone.isStoringEntriesInProjectArea()); + // ensure we did not clone reference + provider1.setCustomParameter(""); + assertFalse(provider1.getCustomParameter().equals(providerClone.getCustomParameter())); + + assertEquals(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1), LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone)); + // ensure we did not clone reference + LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, !LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone)); + assertFalse(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1) == LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone)); + assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0)); List actual1 = providerClone.getSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID); @@ -1299,8 +1310,8 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { MockSerializableProvider provider1 = new MockSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); provider1.setLanguageScope(sampleLanguages); provider1.setCustomParameter(CUSTOM_PARAMETER); - assertEquals(false, provider1.isStoringEntriesInProjectArea()); - provider1.setStoringEntriesInProjectArea(true); + assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider1)); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true); List entries = new ArrayList(); entries.add(new CIncludePathEntry("path", 1)); @@ -1312,7 +1323,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { assertFalse(provider1.equals(providerClone)); assertTrue(provider1.getClass()==providerClone.getClass()); assertEquals(provider1.getCustomParameter(), providerClone.getCustomParameter()); - assertEquals(provider1.isStoringEntriesInProjectArea(), providerClone.isStoringEntriesInProjectArea()); + assertEquals(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1), LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone)); assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0)); List actual = providerClone.getSettingEntries(null, null, null); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsManager.java index 4fa512496ad..d4e04c9657d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsManager.java @@ -274,6 +274,29 @@ public class LanguageSettingsManager { LanguageSettingsProvidersSerializer.unregisterLanguageSettingsChangeListener(listener); } + /** + * Tells if language settings entries of the provider are persisted with the project + * (under .settings/ folder) or in workspace area. Persistence in the project area lets + * the entries migrate with the project. + * + * @param provider - provider to check the persistence mode. + * @return {@code true} if LSE persisted with the project or {@code false} if in the workspace. + */ + public static boolean isStoringEntriesInProjectArea(LanguageSettingsSerializableProvider provider) { + return LanguageSettingsProvidersSerializer.isStoringEntriesInProjectArea(provider); + } + + /** + * Define where language settings are persisted for the provider. + * + * @param provider - provider to set the persistence mode. + * @param storeEntriesWithProject - {@code true} if with the project, + * {@code false} if in workspace area. + */ + public static void setStoringEntriesInProjectArea(LanguageSettingsSerializableProvider provider, boolean storeEntriesWithProject) { + LanguageSettingsProvidersSerializer.setStoringEntriesInProjectArea(provider, storeEntriesWithProject); + } + /** * Save language settings providers of a project to persistent storage. * diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java index 27af0a2ca59..b5f0f63d29a 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java @@ -11,7 +11,10 @@ package org.eclipse.cdt.core.language.settings.providers; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; @@ -21,6 +24,7 @@ import org.eclipse.cdt.internal.core.XmlUtil; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsSerializableStorage; import org.eclipse.core.resources.IResource; import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -41,13 +45,8 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr private static final String ATTR_NAME = "name"; //$NON-NLS-1$ private static final String ATTR_CLASS = "class"; //$NON-NLS-1$ private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$ - private static final String ATTR_STORE_ENTRIES = "store-entries"; //$NON-NLS-1$ - private static final String VALUE_WORKSPACE = "workspace"; //$NON-NLS-1$ - private static final String VALUE_PROJECT = "project"; //$NON-NLS-1$ - - /** Tells if language settings entries are persisted with the project or in workspace area while serializing. */ - private boolean storeEntriesInProjectArea = false; + private Map properties = new HashMap(); private LanguageSettingsSerializableStorage fStorage = new LanguageSettingsSerializableStorage(); /** @@ -124,26 +123,6 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr this.customParameter = customParameter; } - /** - * Tells if language settings entries are persisted with the project (under .settings folder) - * or in workspace area. Persistence in the project area lets the entries migrate with the - * project. - * - * @return {@code true} if LSE persisted with the project or {@code false} if in the workspace. - */ - public boolean isStoringEntriesInProjectArea() { - return storeEntriesInProjectArea; - } - - /** - * Setter to define where language settings are persisted. - * @param storeEntriesWithProject - {@code true} if with the project, - * {@code false} if in workspace area. - */ - public void setStoringEntriesInProjectArea(boolean storeEntriesWithProject) { - this.storeEntriesInProjectArea = storeEntriesWithProject; - } - /** * Clear all the entries for all configurations, all resources and all languages. */ @@ -230,13 +209,23 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr * attached to the parent element. */ public Element serializeAttributes(Element parentElement) { - Element elementProvider = XmlUtil.appendElement(parentElement, ELEM_PROVIDER, new String[] { - ATTR_ID, getId(), - ATTR_NAME, getName(), - ATTR_CLASS, getClass().getCanonicalName(), - ATTR_PARAMETER, getCustomParameter(), - ATTR_STORE_ENTRIES, isStoringEntriesInProjectArea() ? VALUE_PROJECT : VALUE_WORKSPACE, - }); + // Keeps pairs: key, value. See JavaDoc XmlUtil.appendElement(Node, String, String[]). + List attributes = new ArrayList(); + + attributes.add(ATTR_ID); + attributes.add(getId()); + attributes.add(ATTR_NAME); + attributes.add(getName()); + attributes.add(ATTR_CLASS); + attributes.add(getClass().getCanonicalName()); + attributes.add(ATTR_PARAMETER); + attributes.add(getCustomParameter()); + for (Entry entry : properties.entrySet()) { + attributes.add(entry.getKey()); + attributes.add(entry.getValue()); + } + + Element elementProvider = XmlUtil.appendElement(parentElement, ELEM_PROVIDER, attributes.toArray(new String[0])); if (languageScope!=null) { for (String langId : languageScope) { @@ -293,12 +282,23 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr String providerId = XmlUtil.determineAttributeValue(providerNode, ATTR_ID); String providerName = XmlUtil.determineAttributeValue(providerNode, ATTR_NAME); String providerParameter = XmlUtil.determineAttributeValue(providerNode, ATTR_PARAMETER); - String providerStoreEntries = XmlUtil.determineAttributeValue(providerNode, ATTR_STORE_ENTRIES); + + properties.clear(); + NamedNodeMap attrs = providerNode.getAttributes(); + for (int i=0; i(languageScope); + clone.properties = new HashMap(properties); clone.fStorage = new LanguageSettingsSerializableStorage(); return clone; @@ -360,7 +375,7 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); result = prime * result + ((languageScope == null) ? 0 : languageScope.hashCode()); result = prime * result + ((customParameter == null) ? 0 : customParameter.hashCode()); - result = prime * result + (storeEntriesInProjectArea ? 0 : 1); + result = prime * result + ((properties == null) ? 0 : properties.hashCode()); result = prime * result + ((fStorage == null) ? 0 : fStorage.hashCode()); result = prime * result + getClass().hashCode(); return result; @@ -408,7 +423,10 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr } else if (!customParameter.equals(other.customParameter)) return false; - if (storeEntriesInProjectArea!=other.storeEntriesInProjectArea) + if (properties == null) { + if (other.properties != null) + return false; + } else if (!properties.equals(other.properties)) return false; if (fStorage == null) { 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 ae19d072285..15fc6ccf4a9 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 @@ -76,6 +76,10 @@ public class LanguageSettingsProvidersSerializer { private static final String ELEM_PROVIDER = "provider"; //$NON-NLS-1$ private static final String ELEM_PROVIDER_REFERENCE = "provider-reference"; //$NON-NLS-1$ + private static final String ATTR_STORE_ENTRIES = "store-entries"; //$NON-NLS-1$ + private static final String VALUE_WORKSPACE = "workspace"; //$NON-NLS-1$ + private static final String VALUE_PROJECT = "project"; //$NON-NLS-1$ + private static ILock serializingLock = Job.getJobManager().newLock(); /** Cache of globally available providers to be consumed by calling clients */ @@ -512,7 +516,7 @@ projects: LanguageSettingsSerializableProvider lss = (LanguageSettingsSerializableProvider) provider; boolean useWsp = projectElementWspStore!=null && projectElementPrjStore!=projectElementWspStore; - if (lss.isStoringEntriesInProjectArea() || !useWsp) { + if (isStoringEntriesInProjectArea(lss) || !useWsp) { lss.serialize(elementExtension); } else { lss.serializeAttributes(elementExtension); @@ -649,7 +653,7 @@ projects: provider = loadProvider(providerNode); if (provider instanceof LanguageSettingsSerializableProvider) { LanguageSettingsSerializableProvider lss = (LanguageSettingsSerializableProvider) provider; - if (!lss.isStoringEntriesInProjectArea() && projectElementWsp!=null) { + if (!isStoringEntriesInProjectArea(lss) && projectElementWsp!=null) { loadProviderEntries(lss, cfgId, projectElementWsp); } } @@ -1316,4 +1320,29 @@ projects: return getSettingEntriesByKind(cfgDescription, rc, languageId, kind, /* checkLocality */ true, /* isLocal */ true); } + /** + * Tells if language settings entries of the provider are persisted with the project + * (under .settings/ folder) or in workspace area. Persistence in the project area lets + * the entries migrate with the project. + * + * @param provider - provider to check the persistence mode. + * @return {@code true} if LSE persisted with the project or {@code false} if in the workspace. + */ + public static boolean isStoringEntriesInProjectArea(LanguageSettingsSerializableProvider provider) { + String value = provider.getProperty(ATTR_STORE_ENTRIES); + return VALUE_PROJECT.equals(value); + } + + /** + * Define where language settings are persisted for the provider. + * + * @param provider - provider to set the persistence mode. + * @param storeEntriesWithProject - {@code true} if with the project, + * {@code false} if in workspace area. + */ + public static void setStoringEntriesInProjectArea(LanguageSettingsSerializableProvider provider, boolean storeEntriesWithProject) { + provider.setProperty(ATTR_STORE_ENTRIES, storeEntriesWithProject ? VALUE_PROJECT : VALUE_WORKSPACE); + } + + } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderTab.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderTab.java index 380a24ff353..cacf3443028 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderTab.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderTab.java @@ -406,7 +406,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { provider = toggleGlobalProvider(provider, isGlobal); } projectStorageCheckBox.setSelection(provider instanceof LanguageSettingsSerializableProvider - && ((LanguageSettingsSerializableProvider) provider).isStoringEntriesInProjectArea()); + && LanguageSettingsManager.isStoringEntriesInProjectArea((LanguageSettingsSerializableProvider) provider)); } @Override @@ -424,7 +424,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { boolean isWithProject = projectStorageCheckBox.getSelection(); ILanguageSettingsProvider provider = getWorkingCopy(getSelectedProvider().getId()); Assert.isTrue(provider instanceof LanguageSettingsSerializableProvider); - ((LanguageSettingsSerializableProvider)provider).setStoringEntriesInProjectArea(isWithProject); + LanguageSettingsManager.setStoringEntriesInProjectArea((LanguageSettingsSerializableProvider) provider, isWithProject); refreshItem(provider); } @@ -611,7 +611,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { projectStorageCheckBox.setEnabled(!isGlobal); projectStorageCheckBox.setVisible(rawProvider instanceof LanguageSettingsSerializableProvider); projectStorageCheckBox.setSelection(provider instanceof LanguageSettingsSerializableProvider - && ((LanguageSettingsSerializableProvider)provider).isStoringEntriesInProjectArea()); + && LanguageSettingsManager.isStoringEntriesInProjectArea((LanguageSettingsSerializableProvider) provider)); boolean needPreferencesLink=isGlobal && currentOptionsPage!=null; // TODO: message