1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Serialization of LSE entries in workspace area

This commit is contained in:
Andrew Gvozdev 2011-08-15 12:21:47 -04:00
parent 6088b4e980
commit 36c081996e
5 changed files with 941 additions and 321 deletions

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2009 Andrew Gvozdev and others. * Copyright (c) 2009, 2011 Andrew Gvozdev and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -17,6 +17,7 @@ import java.util.List;
import junit.framework.TestCase; import junit.framework.TestCase;
import junit.framework.TestSuite; import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.settings.model.CIncludePathEntry; import org.eclipse.cdt.core.settings.model.CIncludePathEntry;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
@ -30,6 +31,7 @@ import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSetting
import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
@ -38,6 +40,7 @@ import org.w3c.dom.Element;
*/ */
public class LanguageSettingsPersistenceProjectTests extends TestCase { public class LanguageSettingsPersistenceProjectTests extends TestCase {
private static final String LANGUAGE_SETTINGS_PROJECT_XML = ".settings/language.settings.xml"; private static final String LANGUAGE_SETTINGS_PROJECT_XML = ".settings/language.settings.xml";
private static final String LANGUAGE_SETTINGS_WORKSPACE_XML = "language.settings.xml";
// Should match id of extension point defined in plugin.xml // Should match id of extension point defined in plugin.xml
private static final String EXTENSION_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.base.provider.subclass"; private static final String EXTENSION_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.base.provider.subclass";
private static final String EXTENSION_PROVIDER_NAME = "Test Plugin Base Provider Subclass"; private static final String EXTENSION_PROVIDER_NAME = "Test Plugin Base Provider Subclass";
@ -162,6 +165,16 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
return cfgDescription; return cfgDescription;
} }
/**
*/
public void testNoProviders() throws Exception {
// serialize language settings of user defined providers (on workspace level)
LanguageSettingsProvidersSerializer.serializeLanguageSettingsWorkspace();
LanguageSettingsProvidersSerializer.loadLanguageSettingsWorkspace();
// test passes if no exception was thrown
}
/** /**
*/ */
public void testWorkspacePersistence_ModifiedExtensionProvider() throws Exception { public void testWorkspacePersistence_ModifiedExtensionProvider() throws Exception {
@ -174,7 +187,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
LanguageSettingsSerializable extProvider = (LanguageSettingsSerializable) LanguageSettingsManager.getRawProvider(provider); LanguageSettingsSerializable extProvider = (LanguageSettingsSerializable) LanguageSettingsManager.getRawProvider(provider);
assertNotNull(extProvider); assertNotNull(extProvider);
assertEquals(EXTENSION_SERIALIZABLE_PROVIDER_ID, extProvider.getId()); assertEquals(EXTENSION_SERIALIZABLE_PROVIDER_ID, extProvider.getId());
// add entries // add entries
extProvider.setSettingEntries(null, null, null, entries); extProvider.setSettingEntries(null, null, null, entries);
List<ICLanguageSettingEntry> actual = extProvider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> actual = extProvider.getSettingEntries(null, null, null);
@ -183,7 +196,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
// serialize language settings of workspace providers // serialize language settings of workspace providers
LanguageSettingsProvidersSerializer.serializeLanguageSettingsWorkspace(); LanguageSettingsProvidersSerializer.serializeLanguageSettingsWorkspace();
// clear the provider // clear the provider
extProvider.setSettingEntries(null, null, null, null); extProvider.setSettingEntries(null, null, null, null);
} }
@ -234,7 +247,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
assertEquals(CUSTOM_PARAMETER, rawProvider.getCustomParameter()); assertEquals(CUSTOM_PARAMETER, rawProvider.getCustomParameter());
} }
} }
/** /**
*/ */
public void testWorkspacePersistence_ShadowedExtensionProvider() throws Exception { public void testWorkspacePersistence_ShadowedExtensionProvider() throws Exception {
@ -263,18 +276,18 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
assertEquals(EXTENSION_PROVIDER_ID, rawProvider.getId()); assertEquals(EXTENSION_PROVIDER_ID, rawProvider.getId());
assertEquals(PROVIDER_NAME_0, rawProvider.getName()); assertEquals(PROVIDER_NAME_0, rawProvider.getName());
} }
{ {
// re-load to check serialization // re-load to check serialization
LanguageSettingsProvidersSerializer.loadLanguageSettingsWorkspace(); LanguageSettingsProvidersSerializer.loadLanguageSettingsWorkspace();
ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_PROVIDER_ID); ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_PROVIDER_ID);
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider);
assertTrue(rawProvider instanceof MockLanguageSettingsSerializableProvider); assertTrue(rawProvider instanceof MockLanguageSettingsSerializableProvider);
assertEquals(EXTENSION_PROVIDER_ID, rawProvider.getId()); assertEquals(EXTENSION_PROVIDER_ID, rawProvider.getId());
assertEquals(PROVIDER_NAME_0, rawProvider.getName()); assertEquals(PROVIDER_NAME_0, rawProvider.getName());
} }
{ {
// reset workspace providers, that will also serialize // reset workspace providers, that will also serialize
LanguageSettingsManager.setWorkspaceProviders(null); LanguageSettingsManager.setWorkspaceProviders(null);
@ -290,7 +303,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
{ {
// re-load to check serialization // re-load to check serialization
LanguageSettingsProvidersSerializer.loadLanguageSettingsWorkspace(); LanguageSettingsProvidersSerializer.loadLanguageSettingsWorkspace();
ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_PROVIDER_ID); ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_PROVIDER_ID);
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider);
assertTrue(rawProvider instanceof LanguageSettingsBaseProvider); assertTrue(rawProvider instanceof LanguageSettingsBaseProvider);
@ -298,7 +311,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
assertEquals(EXTENSION_PROVIDER_NAME, rawProvider.getName()); assertEquals(EXTENSION_PROVIDER_NAME, rawProvider.getName());
} }
} }
/** /**
*/ */
public void testProjectPersistence_SerializableProviderDOM() throws Exception { public void testProjectPersistence_SerializableProviderDOM() throws Exception {
@ -317,6 +330,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
LanguageSettingsSerializable serializableProvider = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0); LanguageSettingsSerializable serializableProvider = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0);
serializableProvider.setSettingEntries(null, null, null, entries); serializableProvider.setSettingEntries(null, null, null, entries);
serializableProvider.setStoringEntriesInProjectArea(true);
ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(serializableProvider); providers.add(serializableProvider);
@ -326,12 +340,12 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
rootElement = XmlUtil.appendElement(doc, ELEM_TEST); rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
// serialize language settings to the DOM // serialize language settings to the DOM
LanguageSettingsProvidersSerializer.serializeLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.serializeLanguageSettingsInternal(rootElement, null, mockPrjDescription);
} }
{ {
// re-load and check language settings of the newly loaded provider // re-load and check language settings of the newly loaded provider
MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID)); MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID));
LanguageSettingsProvidersSerializer.loadLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.loadLanguageSettingsInternal(rootElement, null, mockPrjDescription);
ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations();
assertNotNull(cfgDescriptions); assertNotNull(cfgDescriptions);
@ -378,6 +392,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
assertNotNull(cfgDescription1); assertNotNull(cfgDescription1);
assertEquals(CFG_ID, cfgDescription1.getId()); assertEquals(CFG_ID, cfgDescription1.getId());
LanguageSettingsSerializable provider1 = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0); LanguageSettingsSerializable provider1 = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0);
provider1.setStoringEntriesInProjectArea(true);
provider1.setSettingEntries(null, null, null, entries); provider1.setSettingEntries(null, null, null, entries);
ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(provider1); providers.add(provider1);
@ -389,6 +404,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
assertNotNull(cfgDescription2); assertNotNull(cfgDescription2);
assertEquals(CFG_ID_2, cfgDescription2.getId()); assertEquals(CFG_ID_2, cfgDescription2.getId());
LanguageSettingsSerializable provider2 = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0); LanguageSettingsSerializable provider2 = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0);
provider2.setStoringEntriesInProjectArea(true);
provider2.setSettingEntries(null, null, null, entries2); provider2.setSettingEntries(null, null, null, entries2);
ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(provider2); providers.add(provider2);
@ -433,7 +449,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
rootElement = XmlUtil.appendElement(doc, ELEM_TEST); rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
// serialize language settings to the DOM // serialize language settings to the DOM
LanguageSettingsProvidersSerializer.serializeLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.serializeLanguageSettingsInternal(rootElement, null, mockPrjDescription);
} }
{ {
// re-create a project description and re-load language settings for each configuration // re-create a project description and re-load language settings for each configuration
@ -443,7 +459,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
new MockConfigurationDescription(CFG_ID_2), new MockConfigurationDescription(CFG_ID_2),
}); });
// load // load
LanguageSettingsProvidersSerializer.loadLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.loadLanguageSettingsInternal(rootElement, null, mockPrjDescription);
ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations();
assertNotNull(cfgDescriptions); assertNotNull(cfgDescriptions);
@ -495,6 +511,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
LanguageSettingsSerializable serializableProvider = new MockLanguageSettingsSerializableProvider(PROVIDER_0, PROVIDER_NAME_0); LanguageSettingsSerializable serializableProvider = new MockLanguageSettingsSerializableProvider(PROVIDER_0, PROVIDER_NAME_0);
serializableProvider.setSettingEntries(null, null, null, entries); serializableProvider.setSettingEntries(null, null, null, entries);
serializableProvider.setStoringEntriesInProjectArea(true);
ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(serializableProvider); providers.add(serializableProvider);
@ -504,12 +521,12 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
rootElement = XmlUtil.appendElement(doc, ELEM_TEST); rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
// serialize language settings to the DOM // serialize language settings to the DOM
LanguageSettingsProvidersSerializer.serializeLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.serializeLanguageSettingsInternal(rootElement, null, mockPrjDescription);
} }
{ {
// re-load and check language settings of the newly loaded provider // re-load and check language settings of the newly loaded provider
MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID)); MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID));
LanguageSettingsProvidersSerializer.loadLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.loadLanguageSettingsInternal(rootElement, null, mockPrjDescription);
ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations();
assertNotNull(cfgDescriptions); assertNotNull(cfgDescriptions);
@ -553,12 +570,12 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
rootElement = XmlUtil.appendElement(doc, ELEM_TEST); rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
// serialize language settings to the DOM // serialize language settings to the DOM
LanguageSettingsProvidersSerializer.serializeLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.serializeLanguageSettingsInternal(rootElement, null, mockPrjDescription);
} }
{ {
// re-load // re-load
MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID)); MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID));
LanguageSettingsProvidersSerializer.loadLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.loadLanguageSettingsInternal(rootElement, null, mockPrjDescription);
ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations();
assertNotNull(cfgDescriptions); assertNotNull(cfgDescriptions);
@ -593,7 +610,8 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
// populate with provider overriding the extension (must be SerializableLanguageSettingsProvider or a class from another extension) // populate with provider overriding the extension (must be SerializableLanguageSettingsProvider or a class from another extension)
ILanguageSettingsProvider providerOverride = new MockLanguageSettingsSerializableProvider(idExt, PROVIDER_NAME_0); MockLanguageSettingsSerializableProvider providerOverride = new MockLanguageSettingsSerializableProvider(idExt, PROVIDER_NAME_0);
providerOverride.setStoringEntriesInProjectArea(true);
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(providerOverride); providers.add(providerOverride);
cfgDescription.setLanguageSettingProviders(providers); cfgDescription.setLanguageSettingProviders(providers);
@ -603,12 +621,12 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
rootElement = XmlUtil.appendElement(doc, ELEM_TEST); rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
// serialize language settings to the DOM // serialize language settings to the DOM
LanguageSettingsProvidersSerializer.serializeLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.serializeLanguageSettingsInternal(rootElement, null, mockPrjDescription);
} }
{ {
// re-load // re-load
MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID)); MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID));
LanguageSettingsProvidersSerializer.loadLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.loadLanguageSettingsInternal(rootElement, null, mockPrjDescription);
ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations();
assertNotNull(cfgDescriptions); assertNotNull(cfgDescriptions);
@ -658,9 +676,11 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
// 3. Providers defined in a configuration // 3. Providers defined in a configuration
// 3.1 // 3.1
LanguageSettingsSerializable mockProvider1 = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0); LanguageSettingsSerializable mockProvider1 = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0);
mockProvider1.setStoringEntriesInProjectArea(true);
mockProvider1.setSettingEntries(null, null, null, entries_31); mockProvider1.setSettingEntries(null, null, null, entries_31);
// 3.2 // 3.2
LanguageSettingsSerializable mockProvider2 = new MockLanguageSettingsSerializableProvider(PROVIDER_2, PROVIDER_NAME_2); LanguageSettingsSerializable mockProvider2 = new MockLanguageSettingsSerializableProvider(PROVIDER_2, PROVIDER_NAME_2);
mockProvider2.setStoringEntriesInProjectArea(true);
mockProvider2.setSettingEntries(null, null, null, entries_32); mockProvider2.setSettingEntries(null, null, null, entries_32);
ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
@ -674,13 +694,13 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
rootElement = XmlUtil.appendElement(doc, ELEM_TEST); rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
// serialize language settings to the DOM // serialize language settings to the DOM
LanguageSettingsProvidersSerializer.serializeLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.serializeLanguageSettingsInternal(rootElement, null, mockPrjDescription);
XmlUtil.toString(doc); XmlUtil.toString(doc);
} }
{ {
// re-load and check language settings of the newly loaded provider // re-load and check language settings of the newly loaded provider
MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID)); MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID));
LanguageSettingsProvidersSerializer.loadLanguageSettings(rootElement, mockPrjDescription); LanguageSettingsProvidersSerializer.loadLanguageSettingsInternal(rootElement, null, mockPrjDescription);
ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations();
assertNotNull(cfgDescriptions); assertNotNull(cfgDescriptions);
@ -736,6 +756,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
// create a provider // create a provider
LanguageSettingsSerializable mockProvider = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0); LanguageSettingsSerializable mockProvider = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0);
mockProvider.setStoringEntriesInProjectArea(true);
mockProvider.setSettingEntries(cfgDescription, null, null, entries); mockProvider.setSettingEntries(cfgDescription, null, null, entries);
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(mockProvider); providers.add(mockProvider);
@ -772,6 +793,12 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
assertFalse(xmlFile.exists()); assertFalse(xmlFile.exists());
assertTrue(xmlFileOut.exists()); assertTrue(xmlFileOut.exists());
} }
{
// Should not pollute workspace area with file with no meaningful data
String xmlWspStorageFileLocation = getStoreLocationInWorkspaceArea(project.getName()+'.'+LANGUAGE_SETTINGS_WORKSPACE_XML);
java.io.File xmlStorageFileWsp = new java.io.File(xmlWspStorageFileLocation);
assertFalse(xmlStorageFileWsp.exists());
}
{ {
// clear configuration // clear configuration
@ -836,5 +863,223 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase {
} }
} }
/**
*/
public void testProjectPersistence_SplitStorageDOM() throws Exception {
Element prjStorageElement = null;
Element wspStorageElement = null;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
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);
LanguageSettingsSerializable serializableProvider = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0);
serializableProvider.setSettingEntries(null, null, null, entries);
// do not store entries inside project
serializableProvider.setStoringEntriesInProjectArea(false);
ArrayList<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(serializableProvider);
cfgDescription.setLanguageSettingProviders(providers);
// prepare DOM storage
Document prjDoc = XmlUtil.newDocument();
prjStorageElement = XmlUtil.appendElement(prjDoc, ELEM_TEST);
Document wspDoc = XmlUtil.newDocument();
wspStorageElement = XmlUtil.appendElement(wspDoc, ELEM_TEST);
// serialize language settings to the DOM
LanguageSettingsProvidersSerializer.serializeLanguageSettingsInternal(prjStorageElement, wspStorageElement, mockPrjDescription);
}
{
// re-load and check language settings of the newly loaded provider
MockProjectDescription mockPrjDescription = new MockProjectDescription(new MockConfigurationDescription(CFG_ID));
LanguageSettingsProvidersSerializer.loadLanguageSettingsInternal(prjStorageElement, wspStorageElement, mockPrjDescription);
ICConfigurationDescription[] cfgDescriptions = mockPrjDescription.getConfigurations();
assertNotNull(cfgDescriptions);
assertEquals(1, cfgDescriptions.length);
ICConfigurationDescription cfgDescription = cfgDescriptions[0];
assertNotNull(cfgDescription);
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
assertNotNull(providers);
assertEquals(1, providers.size());
ILanguageSettingsProvider provider = providers.get(0);
assertTrue(provider instanceof LanguageSettingsSerializable);
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, null);
assertEquals(entries.get(0), actual.get(0));
assertEquals(entries.size(), actual.size());
}
}
/**
* TODO: refactor with ErrorParserManager
*
* @param store - name of the store
* @return location of the store in the plug-in state area
*/
private static String getStoreLocationInWorkspaceArea(String store) {
IPath location = CCorePlugin.getDefault().getStateLocation().append(store);
return location.toString();
}
/**
*/
public void testProjectPersistence_RealProjectSplitStorage() throws Exception {
IProject project = ResourceHelper.createCDTProjectWithConfig(this.getName());
String xmlStorageFileLocation;
String xmlOutOfTheWay;
String xmlWspStorageFileLocation;
String xmlWspOutOfTheWay;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 0));
{
// get project descriptions
ICProjectDescription writableProjDescription = coreModel.getProjectDescription(project);
assertNotNull(writableProjDescription);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(1, cfgDescriptions.length);
ICConfigurationDescription cfgDescription = cfgDescriptions[0];
// create a provider
LanguageSettingsSerializable mockProvider = new LanguageSettingsSerializable(PROVIDER_0, PROVIDER_NAME_0);
mockProvider.setStoringEntriesInProjectArea(false);
mockProvider.setSettingEntries(cfgDescription, null, null, entries);
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(mockProvider);
cfgDescription.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
// write to project description
coreModel.setProjectDescription(project, writableProjDescription);
IFile xmlStorageFile = project.getFile(LANGUAGE_SETTINGS_PROJECT_XML);
assertTrue(xmlStorageFile.exists());
xmlStorageFileLocation = xmlStorageFile.getLocation().toOSString();
// TODO - cleanup names
xmlWspStorageFileLocation = getStoreLocationInWorkspaceArea(project.getName()+'.'+LANGUAGE_SETTINGS_WORKSPACE_XML);
java.io.File xmlStorageFileWsp = new java.io.File(xmlWspStorageFileLocation);
assertTrue(xmlStorageFileWsp.exists());
}
{
coreModel.getProjectDescription(project);
ICConfigurationDescription cfgDescription = getFirstConfigurationDescription(project);
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
assertEquals(1, providers.size());
ILanguageSettingsProvider provider = providers.get(0);
assertTrue(provider instanceof LanguageSettingsSerializable);
assertEquals(PROVIDER_0, provider.getId());
assertEquals(PROVIDER_NAME_0, provider.getName());
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(cfgDescription, null, null);
assertEquals(entries.get(0), actual.get(0));
assertEquals(entries.size(), actual.size());
}
// Move storages out of the way
{
java.io.File xmlFile = new java.io.File(xmlStorageFileLocation);
xmlOutOfTheWay = xmlStorageFileLocation+".out-of-the-way";
java.io.File xmlFileOut = new java.io.File(xmlOutOfTheWay);
xmlFile.renameTo(xmlFileOut);
assertFalse(xmlFile.exists());
assertTrue(xmlFileOut.exists());
}
{
// TODO - workspace file
java.io.File xmlStorageFileWsp = new java.io.File(xmlWspStorageFileLocation);
assertTrue(xmlStorageFileWsp.exists());
xmlWspOutOfTheWay = xmlWspStorageFileLocation+".out-of-the-way";
java.io.File xmlWspFileOut = new java.io.File(xmlWspOutOfTheWay);
boolean result = xmlStorageFileWsp.renameTo(xmlWspFileOut);
assertTrue(result);
assertFalse(xmlStorageFileWsp.exists());
assertTrue(xmlWspFileOut.exists());
}
{
// clear configuration
ICProjectDescription writableProjDescription = coreModel.getProjectDescription(project);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(1, cfgDescriptions.length);
ICConfigurationDescription cfgDescription = cfgDescriptions[0];
assertNotNull(cfgDescription);
cfgDescription.setLanguageSettingProviders(new ArrayList<ILanguageSettingsProvider>());
coreModel.setProjectDescription(project, writableProjDescription);
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
assertEquals(0, providers.size());
}
{
// re-check if it really took it
ICConfigurationDescription cfgDescription = getFirstConfigurationDescription(project);
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
assertEquals(0, providers.size());
}
{
// close the project
project.close(null);
}
{
// open to double-check the data is not kept in some other kind of cache
project.open(null);
ICConfigurationDescription cfgDescription = getFirstConfigurationDescription(project);
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
assertEquals(0, providers.size());
// and close
project.close(null);
}
{
// Move storage back
java.io.File xmlFile = new java.io.File(xmlStorageFileLocation);
xmlFile.delete();
assertFalse("File "+xmlFile+ " still exist", xmlFile.exists());
java.io.File xmlFileOut = new java.io.File(xmlOutOfTheWay);
xmlFileOut.renameTo(xmlFile);
assertTrue("File "+xmlFile+ " does not exist", xmlFile.exists());
assertFalse("File "+xmlFileOut+ " still exist", xmlFileOut.exists());
}
{
// TODO
// Move storage back
java.io.File xmlWspFile = new java.io.File(xmlWspStorageFileLocation);
xmlWspFile.delete();
assertFalse("File "+xmlWspFile+ " still exist", xmlWspFile.exists());
java.io.File xmlWspFileOut = new java.io.File(xmlWspOutOfTheWay);
xmlWspFileOut.renameTo(xmlWspFile);
assertTrue("File "+xmlWspFile+ " does not exist", xmlWspFile.exists());
assertFalse("File "+xmlWspFileOut+ " still exist", xmlWspFileOut.exists());
}
{
// Remove project from internal cache
CProjectDescriptionManager.getInstance().projectClosedRemove(project);
// open project and check if providers are loaded
project.open(null);
ICConfigurationDescription cfgDescription = getFirstConfigurationDescription(project);
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
assertEquals(1, providers.size());
ILanguageSettingsProvider loadedProvider = providers.get(0);
assertTrue(loadedProvider instanceof LanguageSettingsSerializable);
assertEquals(PROVIDER_0, loadedProvider.getId());
assertEquals(PROVIDER_NAME_0, loadedProvider.getName());
List<ICLanguageSettingEntry> actual = loadedProvider.getSettingEntries(cfgDescription, null, null);
assertEquals(entries.get(0), actual.get(0));
assertEquals(entries.size(), actual.size());
}
}
} }

View file

@ -29,7 +29,6 @@ import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.core.testplugin.CModelMock; import org.eclipse.cdt.core.testplugin.CModelMock;
import org.eclipse.cdt.core.testplugin.ResourceHelper; import org.eclipse.cdt.core.testplugin.ResourceHelper;
import org.eclipse.cdt.internal.core.XmlUtil; import org.eclipse.cdt.internal.core.XmlUtil;
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
@ -43,12 +42,7 @@ import org.w3c.dom.Element;
* Test cases testing LanguageSettingsProvider functionality * Test cases testing LanguageSettingsProvider functionality
*/ */
public class LanguageSettingsSerializableTests extends TestCase { public class LanguageSettingsSerializableTests extends TestCase {
// Should match id of extension point defined in plugin.xml
private static final String EXTENSION_SERIALIZABLE_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.serializable.language.settings.provider";
private static final String CFG_ID = "test.configuration.id"; private static final String CFG_ID = "test.configuration.id";
private static final String CFG_ID_1 = "test.configuration.id.1";
private static final String CFG_ID_2 = "test.configuration.id.2";
private static final ICConfigurationDescription MOCK_CFG = new CModelMock.DummyCConfigurationDescription(CFG_ID); private static final ICConfigurationDescription MOCK_CFG = new CModelMock.DummyCConfigurationDescription(CFG_ID);
private static final IResource MOCK_RC = ResourcesPlugin.getWorkspace().getRoot(); private static final IResource MOCK_RC = ResourcesPlugin.getWorkspace().getRoot();
private static final String LANG_ID = "test.lang.id"; private static final String LANG_ID = "test.lang.id";
@ -101,7 +95,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testProvider() throws Exception { public void testProvider_SettersGetters() throws Exception {
// benchmark data // benchmark data
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 0)); entries.add(new CIncludePathEntry("path0", 0));
@ -112,7 +106,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
LanguageSettingsSerializable mockProvider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializable mockProvider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1);
// test isEmpty() // test isEmpty()
assertTrue(mockProvider.isEmpty()); assertTrue(mockProvider.isEmpty());
// test setters and getters // test setters and getters
mockProvider.setId(PROVIDER_2); mockProvider.setId(PROVIDER_2);
assertEquals(PROVIDER_2, mockProvider.getId()); assertEquals(PROVIDER_2, mockProvider.getId());
@ -120,16 +114,16 @@ public class LanguageSettingsSerializableTests extends TestCase {
assertEquals(PROVIDER_NAME_2, mockProvider.getName()); assertEquals(PROVIDER_NAME_2, mockProvider.getName());
mockProvider.setCustomParameter(CUSTOM_PARAMETER); mockProvider.setCustomParameter(CUSTOM_PARAMETER);
assertEquals(CUSTOM_PARAMETER, mockProvider.getCustomParameter()); assertEquals(CUSTOM_PARAMETER, mockProvider.getCustomParameter());
assertEquals(false, mockProvider.isEntriesStorageWithProject()); assertEquals(false, mockProvider.isStoringEntriesInProjectArea());
mockProvider.setEntriesStorageWithProject(true); mockProvider.setStoringEntriesInProjectArea(true);
assertEquals(true, mockProvider.isEntriesStorageWithProject()); assertEquals(true, mockProvider.isStoringEntriesInProjectArea());
mockProvider.setLanguageScope(languages); mockProvider.setLanguageScope(languages);
assertEquals(languages, mockProvider.getLanguageScope()); assertEquals(languages, mockProvider.getLanguageScope());
mockProvider.setLanguageScope(null); mockProvider.setLanguageScope(null);
assertEquals(null, mockProvider.getLanguageScope()); assertEquals(null, mockProvider.getLanguageScope());
mockProvider.setSettingEntries(null, MOCK_RC, LANG_ID, entries); mockProvider.setSettingEntries(null, MOCK_RC, LANG_ID, entries);
List<ICLanguageSettingEntry> actual = mockProvider.getSettingEntries(null, MOCK_RC, LANG_ID); List<ICLanguageSettingEntry> actual = mockProvider.getSettingEntries(null, MOCK_RC, LANG_ID);
assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.get(0), actual.get(0));
@ -143,17 +137,153 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testNoProviders() throws Exception { public void testProvider_RegularDOM() throws Exception {
// serialize language settings of user defined providers (on workspace level) Element elementProvider;
LanguageSettingsProvidersSerializer.serializeLanguageSettingsWorkspace(); {
LanguageSettingsProvidersSerializer.loadLanguageSettingsWorkspace(); // create customized provider
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1);
provider.setStoringEntriesInProjectArea(true);
provider.setCustomParameter(CUSTOM_PARAMETER);
// test passes if no exception was thrown List<String> languageScope = new ArrayList<String>();
languageScope.add(LANG_ID);
provider.setLanguageScope(languageScope);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 1));
provider.setSettingEntries(null, null, null, entries);
// serialize
Document doc = XmlUtil.newDocument();
Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
elementProvider = provider.serialize(rootElement);
// check XML
String xmlString = XmlUtil.toString(doc);
assertTrue(xmlString.contains(PROVIDER_1));
assertTrue(xmlString.contains(PROVIDER_NAME_1));
assertTrue(xmlString.contains(CUSTOM_PARAMETER));
assertTrue(xmlString.contains(LANG_ID));
assertTrue(xmlString.contains("path0"));
}
{
// re-load and check language settings of the newly loaded provider
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(elementProvider);
assertEquals(PROVIDER_1, provider.getId());
assertEquals(true, provider.isStoringEntriesInProjectArea());
assertEquals(CUSTOM_PARAMETER, provider.getCustomParameter());
assertNotNull(provider.getLanguageScope());
assertTrue(provider.getLanguageScope().size()>0);
assertEquals(LANG_ID, provider.getLanguageScope().get(0));
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, null);
assertNotNull(entries);
assertTrue(entries.size()>0);
assertEquals(new CIncludePathEntry("path0", 1), entries.get(0));
}
} }
/** /**
*/ */
public void testEmptyProvider() throws Exception { public void testProvider_serializeAttributesDOM() throws Exception {
Element elementProvider;
{
// create customized provider
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1);
provider.setStoringEntriesInProjectArea(true);
provider.setCustomParameter(CUSTOM_PARAMETER);
List<String> languageScope = new ArrayList<String>();
languageScope.add(LANG_ID);
provider.setLanguageScope(languageScope);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 1));
provider.setSettingEntries(null, null, null, entries);
// serialize
Document doc = XmlUtil.newDocument();
Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
elementProvider = provider.serializeAttributes(rootElement);
// check XML
String xmlString = XmlUtil.toString(doc);
assertTrue(xmlString.contains(PROVIDER_1));
assertTrue(xmlString.contains(PROVIDER_NAME_1));
assertTrue(xmlString.contains(CUSTOM_PARAMETER));
assertTrue(xmlString.contains(LANG_ID));
// no entries
assertFalse(xmlString.contains("path0"));
}
{
// re-load and check language settings of the newly loaded provider
LanguageSettingsSerializable provider = new LanguageSettingsSerializable();
provider.loadAttributes(elementProvider);
assertEquals(PROVIDER_1, provider.getId());
assertEquals(true, provider.isStoringEntriesInProjectArea());
assertEquals(CUSTOM_PARAMETER, provider.getCustomParameter());
assertNotNull(provider.getLanguageScope());
assertTrue(provider.getLanguageScope().size()>0);
assertEquals(LANG_ID, provider.getLanguageScope().get(0));
// no entries should be loaded
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, null);
assertNull(entries);
}
}
/**
*/
public void testProvider_serializeEntriesDOM() throws Exception {
Element rootElement;
{
// create customized provider
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1);
provider.setStoringEntriesInProjectArea(true);
provider.setCustomParameter(CUSTOM_PARAMETER);
List<String> languageScope = new ArrayList<String>();
languageScope.add(LANG_ID);
provider.setLanguageScope(languageScope);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 1));
provider.setSettingEntries(null, null, null, entries);
// serialize
Document doc = XmlUtil.newDocument();
rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
provider.serializeEntries(rootElement);
// check XML
String xmlString = XmlUtil.toString(doc);
// no attributes
assertFalse(xmlString.contains(PROVIDER_1));
assertFalse(xmlString.contains(PROVIDER_NAME_1));
assertFalse(xmlString.contains(CUSTOM_PARAMETER));
assertFalse(xmlString.contains(LANG_ID));
// entries should be present
assertTrue(xmlString.contains("path0"));
}
{
// re-load and check language settings of the newly loaded provider
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_2, PROVIDER_NAME_2);
provider.loadEntries(rootElement);
assertEquals(PROVIDER_2, provider.getId());
assertEquals(PROVIDER_NAME_2, provider.getName());
// no attributes should be loaded
assertFalse(PROVIDER_1.equals(provider.getId()));
assertFalse(PROVIDER_NAME_1.equals(provider.getName()));
assertFalse(true==provider.isStoringEntriesInProjectArea());
assertFalse(CUSTOM_PARAMETER.equals(provider.getCustomParameter()));
assertNull(provider.getLanguageScope());
// entries should be loaded
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, null);
assertNotNull(entries);
assertTrue(entries.size()>0);
assertEquals(new CIncludePathEntry("path0", 1), entries.get(0));
}
}
/**
*/
public void testProvider_EmptyDOM() throws Exception {
Element elementProvider; Element elementProvider;
{ {
// create null provider // create null provider
@ -180,7 +310,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testCustomParameter() throws Exception { public void testCustomParameterDOM() throws Exception {
Element elementProvider; Element elementProvider;
{ {
// create provider with custom parameter // create provider with custom parameter
@ -203,15 +333,15 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testStoreEntriesWithProject() throws Exception { public void testStoreEntriesWithProjectDOM() throws Exception {
Element elementProvider; Element elementProvider;
{ {
// create provider with custom parameter // create provider with custom parameter
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1);
assertEquals(false, provider.isEntriesStorageWithProject()); assertEquals(false, provider.isStoringEntriesInProjectArea());
provider.setEntriesStorageWithProject(true); provider.setStoringEntriesInProjectArea(true);
assertEquals(true, provider.isEntriesStorageWithProject()); assertEquals(true, provider.isStoringEntriesInProjectArea());
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
elementProvider = provider.serialize(rootElement); elementProvider = provider.serialize(rootElement);
@ -222,13 +352,13 @@ public class LanguageSettingsSerializableTests extends TestCase {
{ {
// re-load and check custom parameter of the newly loaded provider // re-load and check custom parameter of the newly loaded provider
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(elementProvider); LanguageSettingsSerializable provider = new LanguageSettingsSerializable(elementProvider);
assertEquals(true, provider.isEntriesStorageWithProject()); assertEquals(true, provider.isStoringEntriesInProjectArea());
} }
} }
/** /**
*/ */
public void testLanguages() throws Exception { public void testLanguagesDOM() throws Exception {
List<String> expectedLanguageIds = new ArrayList<String>(); List<String> expectedLanguageIds = new ArrayList<String>();
expectedLanguageIds.add(LANG_ID); expectedLanguageIds.add(LANG_ID);
expectedLanguageIds.add(LANG_ID_1); expectedLanguageIds.add(LANG_ID_1);
@ -259,19 +389,19 @@ public class LanguageSettingsSerializableTests extends TestCase {
assertEquals(expectedLanguageIds.size(), actualIds.size()); assertEquals(expectedLanguageIds.size(), actualIds.size());
} }
} }
/** /**
*/ */
public void testLanguageScope() throws Exception { public void testLanguageScopeDOM() throws Exception {
// benchmark entries // benchmark entries
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 0)); entries.add(new CIncludePathEntry("path0", 0));
// define the scope // define the scope
List<String> expectedLanguageIds = new ArrayList<String>(); List<String> expectedLanguageIds = new ArrayList<String>();
expectedLanguageIds.add(LANG_ID); expectedLanguageIds.add(LANG_ID);
expectedLanguageIds.add(LANG_ID_1); expectedLanguageIds.add(LANG_ID_1);
Element elementProvider; Element elementProvider;
{ {
// create provider with no scope by default // create provider with no scope by default
@ -288,14 +418,14 @@ public class LanguageSettingsSerializableTests extends TestCase {
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, LANG_ID_2); List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, LANG_ID_2);
assertEquals(entries, actual); assertEquals(entries, actual);
} }
// set the scope // set the scope
provider.setLanguageScope(expectedLanguageIds); provider.setLanguageScope(expectedLanguageIds);
List<String> actualIds = provider.getLanguageScope(); List<String> actualIds = provider.getLanguageScope();
assertEquals(LANG_ID, actualIds.get(0)); assertEquals(LANG_ID, actualIds.get(0));
assertEquals(LANG_ID_1, actualIds.get(1)); assertEquals(LANG_ID_1, actualIds.get(1));
assertEquals(2, actualIds.size()); assertEquals(2, actualIds.size());
{ {
// check for language scope itself // check for language scope itself
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, null);
@ -311,7 +441,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, LANG_ID_2); List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, LANG_ID_2);
assertNull(actual); assertNull(actual);
} }
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
elementProvider = provider.serialize(rootElement); elementProvider = provider.serialize(rootElement);
@ -347,7 +477,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testNullConfiguration() throws Exception { public void testNullConfigurationDOM() throws Exception {
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -376,7 +506,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testNullLanguage() throws Exception { public void testNullLanguageDOM() throws Exception {
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -406,20 +536,20 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testNullLanguageScope() throws Exception { public void testNullLanguageScopeDOM() throws Exception {
// define benchmark entries // define benchmark entries
List<ICLanguageSettingEntry> entriesNullLanguage = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entriesNullLanguage = new ArrayList<ICLanguageSettingEntry>();
entriesNullLanguage.add(new CIncludePathEntry("path_null", 0)); entriesNullLanguage.add(new CIncludePathEntry("path_null", 0));
List<ICLanguageSettingEntry> entriesLanguage = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entriesLanguage = new ArrayList<ICLanguageSettingEntry>();
entriesLanguage.add(new CIncludePathEntry("path", 0)); entriesLanguage.add(new CIncludePathEntry("path", 0));
Element elementProvider; Element elementProvider;
{ {
// create a provider // create a provider
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1);
assertEquals(null, provider.getLanguageScope()); assertEquals(null, provider.getLanguageScope());
// add null language // add null language
provider.setSettingEntries(null, MOCK_RC, null, entriesNullLanguage); provider.setSettingEntries(null, MOCK_RC, null, entriesNullLanguage);
assertEquals(null, provider.getLanguageScope()); assertEquals(null, provider.getLanguageScope());
@ -435,7 +565,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
assertEquals(entriesNullLanguage.get(0), actual.get(0)); assertEquals(entriesNullLanguage.get(0), actual.get(0));
assertEquals(entriesNullLanguage.size(), actual.size()); assertEquals(entriesNullLanguage.size(), actual.size());
} }
// add non-null language // add non-null language
provider.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, entriesLanguage); provider.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, entriesLanguage);
assertNull(provider.getLanguageScope()); assertNull(provider.getLanguageScope());
@ -451,12 +581,12 @@ public class LanguageSettingsSerializableTests extends TestCase {
assertEquals(entriesLanguage.get(0), actual.get(0)); assertEquals(entriesLanguage.get(0), actual.get(0));
assertEquals(entriesLanguage.size(), actual.size()); assertEquals(entriesLanguage.size(), actual.size());
} }
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
elementProvider = provider.serialize(rootElement); elementProvider = provider.serialize(rootElement);
// verify that "language" element is saved in XML // verify that "language" element is saved in XML
String xmlString = XmlUtil.toString(doc); String xmlString = XmlUtil.toString(doc);
assertTrue(xmlString.contains("<language")); // LanguageSettingsSerializable.ELEM_LANGUAGE; assertTrue(xmlString.contains("<language")); // LanguageSettingsSerializable.ELEM_LANGUAGE;
@ -478,10 +608,10 @@ public class LanguageSettingsSerializableTests extends TestCase {
} }
} }
} }
/** /**
*/ */
public void testNullResource() throws Exception { public void testNullResourceDOM() throws Exception {
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -510,7 +640,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testNullConfigurationLanguage() throws Exception { public void testNullConfigurationLanguageDOM() throws Exception {
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -540,7 +670,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testNullConfigurationResource() throws Exception { public void testNullConfigurationResourceDOM() throws Exception {
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -570,7 +700,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testNullLanguageResource() throws Exception { public void testNullLanguageResourceDOM() throws Exception {
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -600,7 +730,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testNullConfigurationLanguageResourceFlag() throws Exception { public void testNullConfigurationLanguageResourceFlagDOM() throws Exception {
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -633,7 +763,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testCIncludePathEntry() throws Exception { public void testCIncludePathEntryDOM() throws Exception {
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 1)); entries.add(new CIncludePathEntry("path0", 1));
@ -666,7 +796,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testCIncludeFileEntry() throws Exception { public void testCIncludeFileEntryDOM() throws Exception {
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludeFileEntry("name", 1)); entries.add(new CIncludeFileEntry("name", 1));
@ -698,7 +828,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testCMacroEntry() throws Exception { public void testCMacroEntryDOM() throws Exception {
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CMacroEntry("MACRO0", "value0",1)); entries.add(new CMacroEntry("MACRO0", "value0",1));
@ -730,7 +860,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testCMacroFileEntry() throws Exception { public void testCMacroFileEntryDOM() throws Exception {
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CMacroFileEntry("name", 1)); entries.add(new CMacroFileEntry("name", 1));
@ -762,7 +892,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testCLibraryPathEntry() throws Exception { public void testCLibraryPathEntryDOM() throws Exception {
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CLibraryPathEntry("name", 1)); entries.add(new CLibraryPathEntry("name", 1));
@ -794,7 +924,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testCLibraryFileEntry() throws Exception { public void testCLibraryFileEntryDOM() throws Exception {
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CLibraryFileEntry("name", 1)); entries.add(new CLibraryFileEntry("name", 1));
@ -826,7 +956,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testMixedSettingEntries() throws Exception { public void testMixedSettingEntriesDOM() throws Exception {
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 1)); entries.add(new CIncludePathEntry("path0", 1));
@ -856,7 +986,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testLanguageAndNull() throws Exception { public void testLanguageAndNullDOM() throws Exception {
Element elementProvider = null; Element elementProvider = null;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -892,7 +1022,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testTwoLanguages() throws Exception { public void testTwoLanguagesDOM() throws Exception {
Element elementProvider = null; Element elementProvider = null;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -930,7 +1060,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
/** /**
*/ */
public void testTwoResources() throws Exception { public void testTwoResourcesDOM() throws Exception {
// Create resources // Create resources
IProject project = ResourceHelper.createCDTProjectWithConfig(this.getName()); IProject project = ResourceHelper.createCDTProjectWithConfig(this.getName());
IFile rc1 = ResourceHelper.createFile(project, "rc1"); IFile rc1 = ResourceHelper.createFile(project, "rc1");
@ -1043,8 +1173,8 @@ public class LanguageSettingsSerializableTests extends TestCase {
LanguageSettingsSerializable provider1 = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializable provider1 = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1);
provider1.setLanguageScope(sampleLanguages); provider1.setLanguageScope(sampleLanguages);
provider1.setCustomParameter(CUSTOM_PARAMETER); provider1.setCustomParameter(CUSTOM_PARAMETER);
assertEquals(false, provider1.isEntriesStorageWithProject()); assertEquals(false, provider1.isStoringEntriesInProjectArea());
provider1.setEntriesStorageWithProject(true); provider1.setStoringEntriesInProjectArea(true);
provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1);
provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2); provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2);
@ -1070,8 +1200,8 @@ public class LanguageSettingsSerializableTests extends TestCase {
assertFalse(provider1.equals(provider2)); assertFalse(provider1.equals(provider2));
assertFalse(provider1.hashCode()==provider2.hashCode()); assertFalse(provider1.hashCode()==provider2.hashCode());
provider2.setEntriesStorageWithProject(true); provider2.setStoringEntriesInProjectArea(true);
// All set now, so they should be equal // All set now, so they should be equal
assertTrue(provider1.equals(provider2)); assertTrue(provider1.equals(provider2));
assertTrue(provider1.hashCode()==provider2.hashCode()); assertTrue(provider1.hashCode()==provider2.hashCode());
@ -1120,8 +1250,8 @@ public class LanguageSettingsSerializableTests extends TestCase {
LanguageSettingsSerializableMock provider1 = new LanguageSettingsSerializableMock(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableMock provider1 = new LanguageSettingsSerializableMock(PROVIDER_1, PROVIDER_NAME_1);
provider1.setLanguageScope(sampleLanguages); provider1.setLanguageScope(sampleLanguages);
provider1.setCustomParameter(CUSTOM_PARAMETER); provider1.setCustomParameter(CUSTOM_PARAMETER);
assertEquals(false, provider1.isEntriesStorageWithProject()); assertEquals(false, provider1.isStoringEntriesInProjectArea());
provider1.setEntriesStorageWithProject(true); provider1.setStoringEntriesInProjectArea(true);
provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1);
provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2); provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2);
@ -1131,7 +1261,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
assertTrue(provider1.equals(providerClone)); assertTrue(provider1.equals(providerClone));
assertTrue(provider1.getClass()==providerClone.getClass()); assertTrue(provider1.getClass()==providerClone.getClass());
assertEquals(provider1.getCustomParameter(), providerClone.getCustomParameter()); assertEquals(provider1.getCustomParameter(), providerClone.getCustomParameter());
assertEquals(provider1.isEntriesStorageWithProject(), providerClone.isEntriesStorageWithProject()); assertEquals(provider1.isStoringEntriesInProjectArea(), providerClone.isStoringEntriesInProjectArea());
assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0)); assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0));
List<ICLanguageSettingEntry> actual1 = providerClone.getSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID); List<ICLanguageSettingEntry> actual1 = providerClone.getSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID);
@ -1153,7 +1283,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
// define sample data // define sample data
List<String> sampleLanguages = new ArrayList<String>(); List<String> sampleLanguages = new ArrayList<String>();
sampleLanguages.add(LANG_ID); sampleLanguages.add(LANG_ID);
// create a model provider // create a model provider
class LanguageSettingsSerializableMock extends LanguageSettingsSerializable implements Cloneable { class LanguageSettingsSerializableMock extends LanguageSettingsSerializable implements Cloneable {
public LanguageSettingsSerializableMock(String id, String name) { public LanguageSettingsSerializableMock(String id, String name) {
@ -1163,31 +1293,31 @@ public class LanguageSettingsSerializableTests extends TestCase {
public LanguageSettingsSerializableMock cloneShallow() throws CloneNotSupportedException { public LanguageSettingsSerializableMock cloneShallow() throws CloneNotSupportedException {
return (LanguageSettingsSerializableMock) super.cloneShallow(); return (LanguageSettingsSerializableMock) super.cloneShallow();
} }
} }
LanguageSettingsSerializableMock provider1 = new LanguageSettingsSerializableMock(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableMock provider1 = new LanguageSettingsSerializableMock(PROVIDER_1, PROVIDER_NAME_1);
provider1.setLanguageScope(sampleLanguages); provider1.setLanguageScope(sampleLanguages);
provider1.setCustomParameter(CUSTOM_PARAMETER); provider1.setCustomParameter(CUSTOM_PARAMETER);
assertEquals(false, provider1.isEntriesStorageWithProject()); assertEquals(false, provider1.isStoringEntriesInProjectArea());
provider1.setEntriesStorageWithProject(true); provider1.setStoringEntriesInProjectArea(true);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path", 1)); entries.add(new CIncludePathEntry("path", 1));
provider1.setSettingEntries(null, null, null, entries); provider1.setSettingEntries(null, null, null, entries);
// clone provider // clone provider
LanguageSettingsSerializableMock providerClone = provider1.cloneShallow(); LanguageSettingsSerializableMock providerClone = provider1.cloneShallow();
assertNotSame(provider1, providerClone); assertNotSame(provider1, providerClone);
assertFalse(provider1.equals(providerClone)); assertFalse(provider1.equals(providerClone));
assertTrue(provider1.getClass()==providerClone.getClass()); assertTrue(provider1.getClass()==providerClone.getClass());
assertEquals(provider1.getCustomParameter(), providerClone.getCustomParameter()); assertEquals(provider1.getCustomParameter(), providerClone.getCustomParameter());
assertEquals(provider1.isEntriesStorageWithProject(), providerClone.isEntriesStorageWithProject()); assertEquals(provider1.isStoringEntriesInProjectArea(), providerClone.isStoringEntriesInProjectArea());
assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0)); assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0));
List<ICLanguageSettingEntry> actual = providerClone.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> actual = providerClone.getSettingEntries(null, null, null);
assertNull(actual); assertNull(actual);
} }
/** /**
*/ */
public void testSort_Kinds() throws Exception { public void testSort_Kinds() throws Exception {
@ -1204,7 +1334,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
CLibraryPathEntry libraryPathEntry2 = new CLibraryPathEntry("lib2", 0); CLibraryPathEntry libraryPathEntry2 = new CLibraryPathEntry("lib2", 0);
CLibraryFileEntry libraryFileEntry1 = new CLibraryFileEntry("file1", 0); CLibraryFileEntry libraryFileEntry1 = new CLibraryFileEntry("file1", 0);
CLibraryFileEntry libraryFileEntry2 = new CLibraryFileEntry("file2", 0); CLibraryFileEntry libraryFileEntry2 = new CLibraryFileEntry("file2", 0);
// place entries in unsorted list // place entries in unsorted list
List<ICLanguageSettingEntry> unsortedEntries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> unsortedEntries = new ArrayList<ICLanguageSettingEntry>();
unsortedEntries.add(macroEntry1); unsortedEntries.add(macroEntry1);
@ -1223,7 +1353,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
// create a provider and set the entries // create a provider and set the entries
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, unsortedEntries); provider.setSettingEntries(null, null, null, unsortedEntries);
// retrieve and check that language settings got sorted properly // retrieve and check that language settings got sorted properly
int i=0; int i=0;
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, null);
@ -1233,16 +1363,16 @@ public class LanguageSettingsSerializableTests extends TestCase {
assertEquals(includeFileEntry2, actual.get(i++)); assertEquals(includeFileEntry2, actual.get(i++));
assertEquals(macroEntry1, actual.get(i++)); assertEquals(macroEntry1, actual.get(i++));
assertEquals(macroEntry2, actual.get(i++)); assertEquals(macroEntry2, actual.get(i++));
assertEquals(macroFileEntry1, actual.get(i++)); assertEquals(macroFileEntry1, actual.get(i++));
assertEquals(macroFileEntry2, actual.get(i++)); assertEquals(macroFileEntry2, actual.get(i++));
assertEquals(libraryPathEntry1, actual.get(i++)); assertEquals(libraryPathEntry1, actual.get(i++));
assertEquals(libraryPathEntry2, actual.get(i++)); assertEquals(libraryPathEntry2, actual.get(i++));
assertEquals(libraryFileEntry1, actual.get(i++)); assertEquals(libraryFileEntry1, actual.get(i++));
assertEquals(libraryFileEntry2, actual.get(i++)); assertEquals(libraryFileEntry2, actual.get(i++));
assertEquals(unsortedEntries.size(), actual.size()); assertEquals(unsortedEntries.size(), actual.size());
} }
/** /**
*/ */
public void testSort_Entries() throws Exception { public void testSort_Entries() throws Exception {
@ -1259,7 +1389,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
CLibraryPathEntry libraryPathEntry2 = new CLibraryPathEntry("lib_A", 0); CLibraryPathEntry libraryPathEntry2 = new CLibraryPathEntry("lib_A", 0);
CLibraryFileEntry libraryFileEntry1 = new CLibraryFileEntry("file_B", 0); CLibraryFileEntry libraryFileEntry1 = new CLibraryFileEntry("file_B", 0);
CLibraryFileEntry libraryFileEntry2 = new CLibraryFileEntry("file_A", 0); CLibraryFileEntry libraryFileEntry2 = new CLibraryFileEntry("file_A", 0);
// place entries in unsorted list // place entries in unsorted list
List<ICLanguageSettingEntry> unsortedEntries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> unsortedEntries = new ArrayList<ICLanguageSettingEntry>();
// macros will be sorted by name // macros will be sorted by name
@ -1276,11 +1406,11 @@ public class LanguageSettingsSerializableTests extends TestCase {
unsortedEntries.add(libraryFileEntry2); unsortedEntries.add(libraryFileEntry2);
unsortedEntries.add(libraryPathEntry1); unsortedEntries.add(libraryPathEntry1);
unsortedEntries.add(libraryPathEntry2); unsortedEntries.add(libraryPathEntry2);
// create a provider and set the entries // create a provider and set the entries
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, unsortedEntries); provider.setSettingEntries(null, null, null, unsortedEntries);
// retrieve and check that language settings got sorted properly // retrieve and check that language settings got sorted properly
int i=0; int i=0;
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, null);
@ -1290,16 +1420,16 @@ public class LanguageSettingsSerializableTests extends TestCase {
assertEquals(includeFileEntry2, actual.get(i++)); assertEquals(includeFileEntry2, actual.get(i++));
assertEquals(macroEntry1, actual.get(i++)); assertEquals(macroEntry1, actual.get(i++));
assertEquals(macroEntry2, actual.get(i++)); assertEquals(macroEntry2, actual.get(i++));
assertEquals(macroFileEntry1, actual.get(i++)); assertEquals(macroFileEntry1, actual.get(i++));
assertEquals(macroFileEntry2, actual.get(i++)); assertEquals(macroFileEntry2, actual.get(i++));
assertEquals(libraryPathEntry1, actual.get(i++)); assertEquals(libraryPathEntry1, actual.get(i++));
assertEquals(libraryPathEntry2, actual.get(i++)); assertEquals(libraryPathEntry2, actual.get(i++));
assertEquals(libraryFileEntry1, actual.get(i++)); assertEquals(libraryFileEntry1, actual.get(i++));
assertEquals(libraryFileEntry2, actual.get(i++)); assertEquals(libraryFileEntry2, actual.get(i++));
assertEquals(unsortedEntries.size(), actual.size()); assertEquals(unsortedEntries.size(), actual.size());
} }
/** /**
*/ */
public void testSort_Undef() throws Exception { public void testSort_Undef() throws Exception {
@ -1309,7 +1439,7 @@ public class LanguageSettingsSerializableTests extends TestCase {
CMacroEntry macroEntry2B = new CMacroEntry("MACRO_2", null, 0); CMacroEntry macroEntry2B = new CMacroEntry("MACRO_2", null, 0);
CMacroEntry macroEntry2C = new CMacroEntry("MACRO_2", null, ICSettingEntry.BUILTIN); CMacroEntry macroEntry2C = new CMacroEntry("MACRO_2", null, ICSettingEntry.BUILTIN);
CMacroEntry macroEntry3 = new CMacroEntry("MACRO_3", null, 0); CMacroEntry macroEntry3 = new CMacroEntry("MACRO_3", null, 0);
// place entries in unsorted list // place entries in unsorted list
List<ICLanguageSettingEntry> unsortedEntries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> unsortedEntries = new ArrayList<ICLanguageSettingEntry>();
// macros will be sorted by name and keep order for the same name // macros will be sorted by name and keep order for the same name
@ -1318,11 +1448,11 @@ public class LanguageSettingsSerializableTests extends TestCase {
unsortedEntries.add(macroEntry2B); unsortedEntries.add(macroEntry2B);
unsortedEntries.add(macroEntry1); unsortedEntries.add(macroEntry1);
unsortedEntries.add(macroEntry2C); unsortedEntries.add(macroEntry2C);
// create a provider and set the entries // create a provider and set the entries
LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, unsortedEntries); provider.setSettingEntries(null, null, null, unsortedEntries);
// retrieve and check that language settings got sorted properly // retrieve and check that language settings got sorted properly
int i=0; int i=0;
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, null, null);
@ -1331,10 +1461,10 @@ public class LanguageSettingsSerializableTests extends TestCase {
assertEquals(macroEntry2B, actual.get(i++)); assertEquals(macroEntry2B, actual.get(i++));
assertEquals(macroEntry2C, actual.get(i++)); assertEquals(macroEntry2C, actual.get(i++));
assertEquals(macroEntry3, actual.get(i++)); assertEquals(macroEntry3, actual.get(i++));
assertEquals(unsortedEntries.size(), actual.size()); assertEquals(unsortedEntries.size(), actual.size());
} }
} }

View file

@ -33,6 +33,13 @@ import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
/**
* This class is the base class for language settings providers able to serialize
* into XML storage.
*
* TODO - more JavaDoc, info and hints about class hierarchy
*
*/
public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
public static final String ELEM_PROVIDER = "provider"; //$NON-NLS-1$ public static final String ELEM_PROVIDER = "provider"; //$NON-NLS-1$
private static final String ATTR_ID = "id"; //$NON-NLS-1$ private static final String ATTR_ID = "id"; //$NON-NLS-1$
@ -53,29 +60,53 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
private static final String ATTR_STORE_ENTRIES = "store-entries"; //$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_WORKSPACE = "workspace"; //$NON-NLS-1$
private static final String VALUE_PROJECT = "project"; //$NON-NLS-1$ private static final String VALUE_PROJECT = "project"; //$NON-NLS-1$
private static WeakHashSet<List<ICLanguageSettingEntry>> lseListPool = new WeakHashSet<List<ICLanguageSettingEntry>>() { /**
* Pool of LSE lists implemented as WeakHashSet. That allows to gain memory savings
* at the expense of CPU time. WeakHashSet handles garbage collection when a list is not
* referenced anywhere else. See JavaDoc {@link java.lang.ref.WeakReference} about weak reference objects.
*/
private static WeakHashSet<List<ICLanguageSettingEntry>> listPool = new WeakHashSet<List<ICLanguageSettingEntry>>() {
@Override @Override
public synchronized List<ICLanguageSettingEntry> add(List<ICLanguageSettingEntry> list) { public synchronized List<ICLanguageSettingEntry> add(List<ICLanguageSettingEntry> list) {
return super.add(list); return super.add(list);
} }
}; };
private boolean isEntriesStorageWithProject = false; /** Tells if language settings entries are persisted with the project or in workspace area while serializing. */
private boolean storeEntriesInProjectArea = false;
/**
* Storage to keep settings entries. Note that it is not necessary to keep configuration in the maps
* as the configuration is always the one provider belongs to.
*/
private Map<String, // languageId private Map<String, // languageId
Map<String, // resource project path Map<String, // resource project path
List<ICLanguageSettingEntry>>> fStorage = new HashMap<String, Map<String, List<ICLanguageSettingEntry>>>(); List<ICLanguageSettingEntry>>> fStorage = new HashMap<String, Map<String, List<ICLanguageSettingEntry>>>();
/**
* Default constructor. This constructor has to be always followed with setting id and name of the provider.
*/
public LanguageSettingsSerializable() { public LanguageSettingsSerializable() {
super(); super();
} }
/**
* Constructor.
*
* @param id - id of the provider.
* @param name - name of the provider. Note that this name may show up in UI.
*/
public LanguageSettingsSerializable(String id, String name) { public LanguageSettingsSerializable(String id, String name) {
super(id, name); super(id, name);
} }
/**
* Constructor which allows to instantiate provider defined via XML markup.
*
* @param elementProvider
*/
public LanguageSettingsSerializable(Element elementProvider) { public LanguageSettingsSerializable(Element elementProvider) {
super(); super();
load(elementProvider); load(elementProvider);
@ -104,10 +135,10 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
/** /**
* Set the language scope of the provider. * Set the language scope of the provider.
* *
* @param languages - the list of languages this provider provides for. * @param languages - the list of languages this provider provides for.
* If {@code null}, the provider provides for any language. * If {@code null}, the provider provides for any language.
* *
* @see #getLanguageScope() * @see #getLanguageScope()
*/ */
public void setLanguageScope(List <String> languages) { public void setLanguageScope(List <String> languages) {
@ -117,6 +148,12 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
this.languageScope = new ArrayList<String>(languages); this.languageScope = new ArrayList<String>(languages);
} }
/**
* Set custom parameter for the provider.
* Subclasses are free to define how their behavior depends on custom parameter.
*
* @param customParameter
*/
public void setCustomParameter(String customParameter) { public void setCustomParameter(String customParameter) {
this.customParameter = customParameter; this.customParameter = customParameter;
} }
@ -125,11 +162,11 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
* Tells if language settings entries are persisted with the project (under .settings folder) * 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 * or in workspace area. Persistence in the project area lets the entries migrate with the
* project. * project.
* *
* @return {@code true} if LSE persisted with the project or {@code false} if in the workspace. * @return {@code true} if LSE persisted with the project or {@code false} if in the workspace.
*/ */
public boolean isEntriesStorageWithProject() { public boolean isStoringEntriesInProjectArea() {
return isEntriesStorageWithProject; return storeEntriesInProjectArea;
} }
/** /**
@ -137,14 +174,20 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
* @param storeEntriesWithProject - {@code true} if with the project, * @param storeEntriesWithProject - {@code true} if with the project,
* {@code false} if in workspace area. * {@code false} if in workspace area.
*/ */
public void setEntriesStorageWithProject(boolean storeEntriesWithProject) { public void setStoringEntriesInProjectArea(boolean storeEntriesWithProject) {
this.isEntriesStorageWithProject = storeEntriesWithProject; this.storeEntriesInProjectArea = storeEntriesWithProject;
} }
/**
* Clear all the entries for all configurations, all resources and all languages.
*/
public void clear() { public void clear() {
fStorage.clear(); fStorage.clear();
} }
/**
* Internal convenience method to set language settings entries.
*/
private void setSettingEntriesInternal(String rcProjectPath, String languageId, List<ICLanguageSettingEntry> entries) { private void setSettingEntriesInternal(String rcProjectPath, String languageId, List<ICLanguageSettingEntry> entries) {
if (entries!=null) { if (entries!=null) {
Map<String, List<ICLanguageSettingEntry>> langMap = fStorage.get(languageId); Map<String, List<ICLanguageSettingEntry>> langMap = fStorage.get(languageId);
@ -152,7 +195,7 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
langMap = new HashMap<String, List<ICLanguageSettingEntry>>(); langMap = new HashMap<String, List<ICLanguageSettingEntry>>();
fStorage.put(languageId, langMap); fStorage.put(languageId, langMap);
} }
List<ICLanguageSettingEntry> sortedEntries = lseListPool.add(Collections.unmodifiableList(sortEntries(entries))); List<ICLanguageSettingEntry> sortedEntries = listPool.add(Collections.unmodifiableList(sortEntries(entries)));
langMap.put(rcProjectPath, sortedEntries); langMap.put(rcProjectPath, sortedEntries);
} else { } else {
// do not keep nulls in the tables // do not keep nulls in the tables
@ -166,11 +209,19 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
} }
} }
/**
* Some providers may collect entries in pretty much random order. For the purposes of
* predictability, UI usability and efficient storage the entries are sorted by kinds
* and secondary by name for kinds where the secondary order is not significant.
*
* @param entries - list of entries to sort.
* @return - sorted entries.
*/
protected List<ICLanguageSettingEntry> sortEntries(List<ICLanguageSettingEntry> entries) { protected List<ICLanguageSettingEntry> sortEntries(List<ICLanguageSettingEntry> entries) {
List<ICLanguageSettingEntry> sortedEntries = new ArrayList<ICLanguageSettingEntry>(entries); List<ICLanguageSettingEntry> sortedEntries = new ArrayList<ICLanguageSettingEntry>(entries);
Collections.sort(sortedEntries, new Comparator<ICLanguageSettingEntry>(){ Collections.sort(sortedEntries, new Comparator<ICLanguageSettingEntry>(){
/** /**
* This comparator sorts by kinds first and the macros are sorted additionally by name. * This comparator sorts by kinds first and the macros are sorted additionally by name.
*/ */
public int compare(ICLanguageSettingEntry entry0, ICLanguageSettingEntry entry1) { public int compare(ICLanguageSettingEntry entry0, ICLanguageSettingEntry entry1) {
int kind0 = entry0.getKind(); int kind0 = entry0.getKind();
@ -178,17 +229,17 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
if (kind0==ICSettingEntry.MACRO && kind1==ICSettingEntry.MACRO) { if (kind0==ICSettingEntry.MACRO && kind1==ICSettingEntry.MACRO) {
return entry0.getName().compareTo(entry1.getName()); return entry0.getName().compareTo(entry1.getName());
} }
return kind0 - kind1; return kind0 - kind1;
}}); }});
return sortedEntries; return sortedEntries;
} }
/** /**
* Sets language settings entries for the provider. * Sets language settings entries for the provider.
* Note that the entries are not persisted at that point. To persist use TODO * Note that the entries are not persisted at that point. To persist use TODO
* *
* @param cfgDescription - configuration description. * @param cfgDescription - configuration description.
* @param rc - resource such as file or folder. * @param rc - resource such as file or folder.
* @param languageId - language id. If {@code null}, then entries are considered to be defined for * @param languageId - language id. If {@code null}, then entries are considered to be defined for
@ -202,8 +253,9 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
/** /**
* {@inheritDoc} * {@inheritDoc}
* * <br> Note that this list is <b>unmodifiable</b>. To modify the list copy it, change and use
* Note that this list is unmodifiable. * {@link #setSettingEntries(ICConfigurationDescription, IResource, String, List)}.
*
*/ */
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) {
@ -214,7 +266,7 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
if (entries!=null) if (entries!=null)
return entries; return entries;
} }
if (languageId!=null && (languageScope==null || languageScope.contains(languageId))) { if (languageId!=null && (languageScope==null || languageScope.contains(languageId))) {
List<ICLanguageSettingEntry> entries = getSettingEntries(cfgDescription, rc, null); List<ICLanguageSettingEntry> entries = getSettingEntries(cfgDescription, rc, null);
return entries; return entries;
@ -223,30 +275,44 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
return null; return null;
} }
/* /**
<provider id="provider.id" ...> * Serialize the provider under parent XML element.
<language-scope id="lang.id"/> *
<language id="lang.id"> * @param parentElement - element where to serialize.
<resource project-relative-path="/"> * @return - newly created <provider> element. That element will already be
<entry flags="" kind="includePath" name="path"/> * attached to the parent element.
</resource> */
</language>
</provider>
*/
// provider/configuration/language/resource/entry
public Element serialize(Element parentElement) { public Element serialize(Element parentElement) {
/*
<provider id="provider.id" ...>
<language-scope id="lang.id"/>
<language id="lang.id">
<resource project-relative-path="/">
<entry flags="" kind="includePath" name="path"/>
</resource>
</language>
</provider>
*/
Element elementProvider = serializeAttributes(parentElement); Element elementProvider = serializeAttributes(parentElement);
serializeEntries(elementProvider); serializeEntries(elementProvider);
return elementProvider; return elementProvider;
} }
/**
* Serialize the provider attributes under parent XML element. That is
* equivalent to serializing everything (including language scope) except entries.
*
* @param parentElement - element where to serialize.
* @return - newly created <provider> element. That element will already be
* attached to the parent element.
*/
public Element serializeAttributes(Element parentElement) { public Element serializeAttributes(Element parentElement) {
Element elementProvider = XmlUtil.appendElement(parentElement, ELEM_PROVIDER, new String[] { Element elementProvider = XmlUtil.appendElement(parentElement, ELEM_PROVIDER, new String[] {
ATTR_ID, getId(), ATTR_ID, getId(),
ATTR_NAME, getName(), ATTR_NAME, getName(),
ATTR_CLASS, getClass().getCanonicalName(), ATTR_CLASS, getClass().getCanonicalName(),
ATTR_PARAMETER, getCustomParameter(), ATTR_PARAMETER, getCustomParameter(),
ATTR_STORE_ENTRIES, isEntriesStorageWithProject() ? VALUE_PROJECT : VALUE_WORKSPACE, ATTR_STORE_ENTRIES, isStoringEntriesInProjectArea() ? VALUE_PROJECT : VALUE_WORKSPACE,
}); });
if (languageScope!=null) { if (languageScope!=null) {
@ -256,13 +322,20 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
} }
return elementProvider; return elementProvider;
} }
/**
* Serialize the provider entries under parent XML element.
* @param elementProvider - element where to serialize the entries.
*/
public void serializeEntries(Element elementProvider) { public void serializeEntries(Element elementProvider) {
for (Entry<String, Map<String, List<ICLanguageSettingEntry>>> entryLang : fStorage.entrySet()) { for (Entry<String, Map<String, List<ICLanguageSettingEntry>>> entryLang : fStorage.entrySet()) {
serializeLanguage(elementProvider, entryLang); serializeLanguage(elementProvider, entryLang);
} }
} }
/**
* Serialize the provider entries for a given language list.
*/
private void serializeLanguage(Element parentElement, Entry<String, Map<String, List<ICLanguageSettingEntry>>> entryLang) { private void serializeLanguage(Element parentElement, Entry<String, Map<String, List<ICLanguageSettingEntry>>> entryLang) {
String langId = entryLang.getKey(); String langId = entryLang.getKey();
if (langId!=null) { if (langId!=null) {
@ -274,6 +347,9 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
} }
} }
/**
* Serialize the provider entries for a given resource list.
*/
private void serializeResource(Element parentElement, Entry<String, List<ICLanguageSettingEntry>> entryRc) { private void serializeResource(Element parentElement, Entry<String, List<ICLanguageSettingEntry>> entryRc) {
String rcProjectPath = entryRc.getKey(); String rcProjectPath = entryRc.getKey();
if (rcProjectPath!=null) { if (rcProjectPath!=null) {
@ -283,6 +359,9 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
serializeSettingEntries(parentElement, entryRc.getValue()); serializeSettingEntries(parentElement, entryRc.getValue());
} }
/**
* Serialize given settings entries.
*/
private void serializeSettingEntries(Element parentElement, List<ICLanguageSettingEntry> settingEntries) { private void serializeSettingEntries(Element parentElement, List<ICLanguageSettingEntry> settingEntries) {
for (ICLanguageSettingEntry entry : settingEntries) { for (ICLanguageSettingEntry entry : settingEntries) {
Element elementSettingEntry = XmlUtil.appendElement(parentElement, ELEM_ENTRY, new String[] { Element elementSettingEntry = XmlUtil.appendElement(parentElement, ELEM_ENTRY, new String[] {
@ -293,9 +372,9 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
case ICSettingEntry.MACRO: case ICSettingEntry.MACRO:
elementSettingEntry.setAttribute(ATTR_VALUE, entry.getValue()); elementSettingEntry.setAttribute(ATTR_VALUE, entry.getValue());
break; break;
// case ICLanguageSettingEntry.LIBRARY_FILE: // case ICLanguageSettingEntry.LIBRARY_FILE:
// TODO: sourceAttachment fields need to be covered // // TODO: sourceAttachment fields may need to be covered
// break; // break;
} }
int flags = entry.getFlags(); int flags = entry.getFlags();
if (flags!=0) { if (flags!=0) {
@ -307,6 +386,9 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
} }
} }
/**
* Load a setting entry from XML element.
*/
private ICLanguageSettingEntry loadSettingEntry(Node parentElement) { private ICLanguageSettingEntry loadSettingEntry(Node parentElement) {
String settingKind = XmlUtil.determineAttributeValue(parentElement, ATTR_KIND); String settingKind = XmlUtil.determineAttributeValue(parentElement, ATTR_KIND);
String settingName = XmlUtil.determineAttributeValue(parentElement, ATTR_NAME); String settingName = XmlUtil.determineAttributeValue(parentElement, ATTR_NAME);
@ -333,17 +415,25 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
} }
// provider/configuration/language/resource/entry /**
* Load provider from XML provider element.
* @param providerNode - XML element <provider> to load provider from.
*/
public void load(Element providerNode) { public void load(Element providerNode) {
fStorage.clear(); fStorage.clear();
languageScope = null; languageScope = null;
// provider/configuration/language/resource/entry
if (providerNode!=null) { if (providerNode!=null) {
loadAttributes(providerNode); loadAttributes(providerNode);
loadEntries(providerNode); loadEntries(providerNode);
} }
} }
/**
* Load attributes from XML provider element.
* @param providerNode - XML element <provider> to load attributes from.
*/
public void loadAttributes(Element providerNode) { public void loadAttributes(Element providerNode) {
String providerId = XmlUtil.determineAttributeValue(providerNode, ATTR_ID); String providerId = XmlUtil.determineAttributeValue(providerNode, ATTR_ID);
String providerName = XmlUtil.determineAttributeValue(providerNode, ATTR_NAME); String providerName = XmlUtil.determineAttributeValue(providerNode, ATTR_NAME);
@ -353,11 +443,8 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
this.setId(providerId); this.setId(providerId);
this.setName(providerName); this.setName(providerName);
this.setCustomParameter(providerParameter); this.setCustomParameter(providerParameter);
this.setEntriesStorageWithProject(VALUE_PROJECT.equals(providerStoreEntries)); this.setStoringEntriesInProjectArea(VALUE_PROJECT.equals(providerStoreEntries));
}
public void loadEntries(Element providerNode) {
List<ICLanguageSettingEntry> settings = new ArrayList<ICLanguageSettingEntry>();
NodeList nodes = providerNode.getChildNodes(); NodeList nodes = providerNode.getChildNodes();
for (int i=0;i<nodes.getLength();i++) { for (int i=0;i<nodes.getLength();i++) {
Node elementNode = nodes.item(i); Node elementNode = nodes.item(i);
@ -366,7 +453,24 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
if (ELEM_LANGUAGE_SCOPE.equals(elementNode.getNodeName())) { if (ELEM_LANGUAGE_SCOPE.equals(elementNode.getNodeName())) {
loadLanguageScopeElement(elementNode); loadLanguageScopeElement(elementNode);
} else if (ELEM_LANGUAGE.equals(elementNode.getNodeName())) { }
}
}
/**
* Load provider entries from XML provider element.
* @param providerNode - parent XML element <provider> where entries are defined.
*/
public void loadEntries(Element providerNode) {
List<ICLanguageSettingEntry> settings = new ArrayList<ICLanguageSettingEntry>();
NodeList nodes = providerNode.getChildNodes();
for (int i=0;i<nodes.getLength();i++) {
Node elementNode = nodes.item(i);
if(elementNode.getNodeType() != Node.ELEMENT_NODE)
continue;
if (ELEM_LANGUAGE.equals(elementNode.getNodeName())) {
loadLanguageElement(elementNode, null); loadLanguageElement(elementNode, null);
} else if (ELEM_RESOURCE.equals(elementNode.getNodeName())) { } else if (ELEM_RESOURCE.equals(elementNode.getNodeName())) {
loadResourceElement(elementNode, null, null); loadResourceElement(elementNode, null, null);
@ -383,6 +487,9 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
} }
} }
/**
* Determine and set language scope from given XML node.
*/
private void loadLanguageScopeElement(Node parentNode) { private void loadLanguageScopeElement(Node parentNode) {
if (languageScope==null) { if (languageScope==null) {
languageScope = new ArrayList<String>(); languageScope = new ArrayList<String>();
@ -392,6 +499,9 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
} }
/**
* Load entries defined in language element.
*/
private void loadLanguageElement(Node parentNode, String cfgId) { private void loadLanguageElement(Node parentNode, String cfgId) {
String langId = XmlUtil.determineAttributeValue(parentNode, ATTR_ID); String langId = XmlUtil.determineAttributeValue(parentNode, ATTR_ID);
if (langId.length()==0) { if (langId.length()==0) {
@ -420,6 +530,9 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
} }
} }
/**
* Load entries defined in resource element.
*/
private void loadResourceElement(Node parentNode, String cfgId, String langId) { private void loadResourceElement(Node parentNode, String cfgId, String langId) {
String rcProjectPath = XmlUtil.determineAttributeValue(parentNode, ATTR_PROJECT_PATH); String rcProjectPath = XmlUtil.determineAttributeValue(parentNode, ATTR_PROJECT_PATH);
@ -444,46 +557,47 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
} }
} }
/**
* Clone storage for the entries. Copies references for lists of entries as a whole.
* Note that is OK as the lists kept in storage are unmodifiable.
*/
private Map<String, Map<String, List<ICLanguageSettingEntry>>> cloneStorage() { private Map<String, Map<String, List<ICLanguageSettingEntry>>> cloneStorage() {
Map<String, // languageId Map<String, // languageId
Map<String, // resource String Map<String, // resource
List<ICLanguageSettingEntry>>> storageClone = new HashMap<String, Map<String, List<ICLanguageSettingEntry>>>(); List<ICLanguageSettingEntry>>> storageClone = new HashMap<String, Map<String, List<ICLanguageSettingEntry>>>();
// Set<Entry<String, Map<String, Map<String, List<ICLanguageSettingEntry>>>>> entrySetCfg = fStorage.entrySet(); Set<Entry<String, Map<String, List<ICLanguageSettingEntry>>>> entrySetLang = fStorage.entrySet();
// for (Entry<String, Map<String, Map<String, List<ICLanguageSettingEntry>>>> entryCfg : entrySetCfg) { for (Entry<String, Map<String, List<ICLanguageSettingEntry>>> entryLang : entrySetLang) {
// String cfgDescriptionId = entryCfg.getKey(); String langId = entryLang.getKey();
// Map<String, Map<String, List<ICLanguageSettingEntry>>> mapLang = entryCfg.getValue(); Map<String, List<ICLanguageSettingEntry>> mapRc = entryLang.getValue();
// Map<String, Map<String, List<ICLanguageSettingEntry>>> mapLangClone = new HashMap<String, Map<String, List<ICLanguageSettingEntry>>>(); Map<String, List<ICLanguageSettingEntry>> mapRcClone = new HashMap<String, List<ICLanguageSettingEntry>>();
Set<Entry<String, Map<String, List<ICLanguageSettingEntry>>>> entrySetLang = fStorage.entrySet(); Set<Entry<String, List<ICLanguageSettingEntry>>> entrySetRc = mapRc.entrySet();
for (Entry<String, Map<String, List<ICLanguageSettingEntry>>> entryLang : entrySetLang) { for (Entry<String, List<ICLanguageSettingEntry>> entryRc : entrySetRc) {
String langId = entryLang.getKey(); String rcProjectPath = entryRc.getKey();
Map<String, List<ICLanguageSettingEntry>> mapRc = entryLang.getValue(); List<ICLanguageSettingEntry> lsEntries = entryRc.getValue();
Map<String, List<ICLanguageSettingEntry>> mapRcClone = new HashMap<String, List<ICLanguageSettingEntry>>(); // don't need to clone entries, they are from the LSE pool
Set<Entry<String, List<ICLanguageSettingEntry>>> entrySetRc = mapRc.entrySet(); mapRcClone.put(rcProjectPath, lsEntries);
for (Entry<String, List<ICLanguageSettingEntry>> entryRc : entrySetRc) {
String rcProjectPath = entryRc.getKey();
List<ICLanguageSettingEntry> lsEntries = entryRc.getValue();
// don't need to clone entries, they are from the pool
mapRcClone.put(rcProjectPath, lsEntries);
}
// mapLangClone.put(langId, mapRcClone);
storageClone.put(langId, mapRcClone);
} }
// } storageClone.put(langId, mapRcClone);
}
return storageClone; return storageClone;
} }
/**
* Shallow clone of the provider. "Shallow" is defined here as the exact copy except that
* the copy will have zero language settings entries.
*
* @return shallow copy of the provider.
* @throws CloneNotSupportedException in case {@link #clone()} throws the exception.
*/
protected LanguageSettingsSerializable cloneShallow() throws CloneNotSupportedException { protected LanguageSettingsSerializable cloneShallow() throws CloneNotSupportedException {
LanguageSettingsSerializable clone = (LanguageSettingsSerializable)super.clone(); LanguageSettingsSerializable clone = (LanguageSettingsSerializable)super.clone();
if (languageScope!=null) if (languageScope!=null)
clone.languageScope = new ArrayList<String>(languageScope); clone.languageScope = new ArrayList<String>(languageScope);
clone.fStorage = new HashMap<String, Map<String, List<ICLanguageSettingEntry>>>(); clone.fStorage = new HashMap<String, Map<String, List<ICLanguageSettingEntry>>>();
return clone; return clone;
} }
/* (non-Javadoc)
* @see java.lang.Object#clone()
*/
@Override @Override
protected LanguageSettingsSerializable clone() throws CloneNotSupportedException { protected LanguageSettingsSerializable clone() throws CloneNotSupportedException {
LanguageSettingsSerializable clone = cloneShallow(); LanguageSettingsSerializable clone = cloneShallow();
@ -499,7 +613,7 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
result = prime * result + ((languageScope == null) ? 0 : languageScope.hashCode()); result = prime * result + ((languageScope == null) ? 0 : languageScope.hashCode());
result = prime * result + ((customParameter == null) ? 0 : customParameter.hashCode()); result = prime * result + ((customParameter == null) ? 0 : customParameter.hashCode());
result = prime * result + (isEntriesStorageWithProject ? 0 : 1); result = prime * result + (storeEntriesInProjectArea ? 0 : 1);
result = prime * result + ((fStorage == null) ? 0 : fStorage.hashCode()); result = prime * result + ((fStorage == null) ? 0 : fStorage.hashCode());
result = prime * result + getClass().hashCode(); result = prime * result + getClass().hashCode();
return result; return result;
@ -507,7 +621,6 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
/** /**
* @return {@code true} if the objects are equal, {@code false } otherwise. * @return {@code true} if the objects are equal, {@code false } otherwise.
*
* @see java.lang.Object#equals(java.lang.Object) * @see java.lang.Object#equals(java.lang.Object)
*/ */
@Override @Override
@ -547,8 +660,8 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
return false; return false;
} else if (!customParameter.equals(other.customParameter)) } else if (!customParameter.equals(other.customParameter))
return false; return false;
if (isEntriesStorageWithProject!=other.isEntriesStorageWithProject) if (storeEntriesInProjectArea!=other.storeEntriesInProjectArea)
return false; return false;
if (fStorage == null) { if (fStorage == null) {

View file

@ -1,3 +1,14 @@
/*******************************************************************************
* Copyright (c) 2009, 2011 Andrew Gvozdev and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andrew Gvozdev - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.language.settings.providers; package org.eclipse.cdt.internal.core.language.settings.providers;
import java.net.URI; import java.net.URI;
@ -41,11 +52,12 @@ public class LanguageSettingsProvidersSerializer {
private static final String ATTR_POINT = "point"; //$NON-NLS-1$ private static final String ATTR_POINT = "point"; //$NON-NLS-1$
private static final String ELEM_PROJECT = "project"; //$NON-NLS-1$ private static final String ELEM_PROJECT = "project"; //$NON-NLS-1$
private static final String ELEM_CONFIGURATION = "configuration"; //$NON-NLS-1$ private static final String ELEM_CONFIGURATION = "configuration"; //$NON-NLS-1$
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 ELEM_PROVIDER_REFERENCE = "provider-reference"; //$NON-NLS-1$
/** Cache of globally available providers to be consumed by calling clients */ /** Cache of globally available providers to be consumed by calling clients */
private static Map<String, ILanguageSettingsProvider> rawGlobalWorkspaceProviders = new HashMap<String, ILanguageSettingsProvider>(); private static Map<String, ILanguageSettingsProvider> rawGlobalWorkspaceProviders = new HashMap<String, ILanguageSettingsProvider>();
private static Object serializingLock = new Object(); private static Object serializingLock = new Object();
private static class LanguageSettingsWorkspaceProvider implements ILanguageSettingsProvider { private static class LanguageSettingsWorkspaceProvider implements ILanguageSettingsProvider {
private String providerId; private String providerId;
@ -54,7 +66,7 @@ public class LanguageSettingsProvidersSerializer {
Assert.isTrue(id.length()>0); Assert.isTrue(id.length()>0);
providerId = id; providerId = id;
} }
public String getId() { public String getId() {
return providerId; return providerId;
} }
@ -72,12 +84,12 @@ public class LanguageSettingsProvidersSerializer {
} }
/** /**
* Do not cache the "raw" provider as workspace provider can be changed at any time. * Do not cache the "raw" provider as workspace provider can be changed at any time.
*/ */
private ILanguageSettingsProvider getRawProvider() { private ILanguageSettingsProvider getRawProvider() {
return LanguageSettingsProvidersSerializer.getRawWorkspaceProvider(providerId); return LanguageSettingsProvidersSerializer.getRawWorkspaceProvider(providerId);
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (obj instanceof LanguageSettingsWorkspaceProvider) { if (obj instanceof LanguageSettingsWorkspaceProvider) {
@ -96,7 +108,7 @@ public class LanguageSettingsProvidersSerializer {
} }
} }
/** static initializer */ /** static initializer */
static { static {
try { try {
@ -104,9 +116,31 @@ public class LanguageSettingsProvidersSerializer {
} catch (Throwable e) { } catch (Throwable e) {
CCorePlugin.log("Error loading workspace language settings providers", e); //$NON-NLS-1$ CCorePlugin.log("Error loading workspace language settings providers", e); //$NON-NLS-1$
} finally { } finally {
// swallow any exception
} }
} }
private static IFile getStoreInProjectArea(IProject project) throws CoreException {
IFolder folder = project.getFolder(SETTINGS_FOLDER_NAME);
if (!folder.exists()) {
folder.create(true, true, null);
}
IFile storage = folder.getFile(STORAGE_PROJECT_LANGUAGE_SETTINGS);
return storage;
}
/**
* TODO: refactor with ErrorParserManager ?
*
* @param store - name of the store
* @return location of the store in the plug-in state area
*/
private static URI getStoreInWorkspaceArea(String store) {
IPath location = CCorePlugin.getDefault().getStateLocation().append(store);
URI uri = URIUtil.toURI(location);
return uri;
}
/** /**
* Set and store in workspace area user defined providers. * Set and store in workspace area user defined providers.
* *
@ -132,7 +166,7 @@ public class LanguageSettingsProvidersSerializer {
rawWorkspaceProviders.put(rawExtensionProvider.getId(), rawExtensionProvider); rawWorkspaceProviders.put(rawExtensionProvider.getId(), rawExtensionProvider);
} }
} }
if (providers!=null) { if (providers!=null) {
List<ILanguageSettingsProvider> rawProviders = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> rawProviders = new ArrayList<ILanguageSettingsProvider>();
for (ILanguageSettingsProvider provider : providers) { for (ILanguageSettingsProvider provider : providers) {
@ -147,24 +181,12 @@ public class LanguageSettingsProvidersSerializer {
rawWorkspaceProviders.put(provider.getId(), provider); rawWorkspaceProviders.put(provider.getId(), provider);
} }
} }
rawGlobalWorkspaceProviders = rawWorkspaceProviders; rawGlobalWorkspaceProviders = rawWorkspaceProviders;
} }
/**
* TODO: refactor with ErrorParserManager
*
* @param store - name of the store
* @return location of the store in the plug-in state area
*/
private static URI getStoreLocationInWorkspaceArea(String store) {
IPath location = CCorePlugin.getDefault().getStateLocation().append(store);
URI uri = URIUtil.toURI(location);
return uri;
}
public static void serializeLanguageSettingsWorkspace() throws CoreException { public static void serializeLanguageSettingsWorkspace() throws CoreException {
URI uriLocation = getStoreLocationInWorkspaceArea(STORAGE_WORKSPACE_LANGUAGE_SETTINGS); URI uriLocation = getStoreInWorkspaceArea(STORAGE_WORKSPACE_LANGUAGE_SETTINGS);
List<LanguageSettingsSerializable> serializableExtensionProviders = new ArrayList<LanguageSettingsSerializable>(); List<LanguageSettingsSerializable> serializableExtensionProviders = new ArrayList<LanguageSettingsSerializable>();
for (ILanguageSettingsProvider provider : rawGlobalWorkspaceProviders.values()) { for (ILanguageSettingsProvider provider : rawGlobalWorkspaceProviders.values()) {
if (provider instanceof LanguageSettingsSerializable) { if (provider instanceof LanguageSettingsSerializable) {
@ -183,19 +205,19 @@ public class LanguageSettingsProvidersSerializer {
} }
return; return;
} }
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
Element rootElement = XmlUtil.appendElement(doc, ELEM_PLUGIN); Element rootElement = XmlUtil.appendElement(doc, ELEM_PLUGIN);
Element elementExtension = XmlUtil.appendElement(rootElement, ELEM_EXTENSION, new String[] {ATTR_POINT, LanguageSettingsExtensionManager.PROVIDER_EXTENSION_FULL_ID}); Element elementExtension = XmlUtil.appendElement(rootElement, ELEM_EXTENSION, new String[] {ATTR_POINT, LanguageSettingsExtensionManager.PROVIDER_EXTENSION_FULL_ID});
for (LanguageSettingsSerializable provider : serializableExtensionProviders) { for (LanguageSettingsSerializable provider : serializableExtensionProviders) {
provider.serialize(elementExtension); provider.serialize(elementExtension);
} }
synchronized (serializingLock) { synchronized (serializingLock) {
XmlUtil.serializeXml(doc, uriLocation); XmlUtil.serializeXml(doc, uriLocation);
} }
} catch (Exception e) { } catch (Exception e) {
CCorePlugin.log("Internal error while trying to serialize language settings", e); //$NON-NLS-1$ CCorePlugin.log("Internal error while trying to serialize language settings", e); //$NON-NLS-1$
IStatus s = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Internal error while trying to serialize language settings", e); IStatus s = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Internal error while trying to serialize language settings", e);
@ -205,9 +227,9 @@ public class LanguageSettingsProvidersSerializer {
public static void loadLanguageSettingsWorkspace() throws CoreException { public static void loadLanguageSettingsWorkspace() throws CoreException {
List <ILanguageSettingsProvider> providers = null; List <ILanguageSettingsProvider> providers = null;
URI uriLocation = getStoreLocationInWorkspaceArea(STORAGE_WORKSPACE_LANGUAGE_SETTINGS); URI uriLocation = getStoreInWorkspaceArea(STORAGE_WORKSPACE_LANGUAGE_SETTINGS);
Document doc = null; Document doc = null;
try { try {
synchronized (serializingLock) { synchronized (serializingLock) {
@ -216,12 +238,12 @@ public class LanguageSettingsProvidersSerializer {
} catch (Exception e) { } catch (Exception e) {
CCorePlugin.log("Can't load preferences from file "+uriLocation, e); //$NON-NLS-1$ CCorePlugin.log("Can't load preferences from file "+uriLocation, e); //$NON-NLS-1$
} }
if (doc!=null) { if (doc!=null) {
Element rootElement = doc.getDocumentElement(); Element rootElement = doc.getDocumentElement();
NodeList providerNodes = rootElement.getElementsByTagName(LanguageSettingsSerializable.ELEM_PROVIDER); NodeList providerNodes = rootElement.getElementsByTagName(LanguageSettingsSerializable.ELEM_PROVIDER);
List<String> userDefinedProvidersIds = new ArrayList<String>(); List<String> userDefinedProvidersIds = new ArrayList<String>();
for (int i=0;i<providerNodes.getLength();i++) { for (int i=0;i<providerNodes.getLength();i++) {
Node providerNode = providerNodes.item(i); Node providerNode = providerNodes.item(i);
String providerId = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_ID); String providerId = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_ID);
@ -231,12 +253,12 @@ public class LanguageSettingsProvidersSerializer {
continue; continue;
} }
userDefinedProvidersIds.add(providerId); userDefinedProvidersIds.add(providerId);
ILanguageSettingsProvider provider = loadProvider(providerNode); ILanguageSettingsProvider provider = loadProvider(providerNode);
if (provider!=null) { if (provider!=null) {
if (providers==null) if (providers==null)
providers= new ArrayList<ILanguageSettingsProvider>(); providers= new ArrayList<ILanguageSettingsProvider>();
if (!LanguageSettingsExtensionManager.equalsExtensionProvider(provider)) { if (!LanguageSettingsExtensionManager.equalsExtensionProvider(provider)) {
providers.add(provider); providers.add(provider);
} }
@ -246,17 +268,24 @@ public class LanguageSettingsProvidersSerializer {
setWorkspaceProvidersInternal(providers); setWorkspaceProvidersInternal(providers);
} }
public static void serializeLanguageSettings(Element parentElement, ICProjectDescription prjDescription) throws CoreException { /**
* @noreference This method is not intended to be referenced by clients.
* It is public solely for benefit of JUnit testing.
*/
public static void serializeLanguageSettingsInternal(Element projectElementPrjStore, Element projectElementWspStore, ICProjectDescription prjDescription) throws CoreException {
ICConfigurationDescription[] cfgDescriptions = prjDescription.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = prjDescription.getConfigurations();
for (ICConfigurationDescription cfgDescription : cfgDescriptions) { for (ICConfigurationDescription cfgDescription : cfgDescriptions) {
Element elementConfiguration = XmlUtil.appendElement(parentElement, ELEM_CONFIGURATION, new String[] { Element elementConfiguration = XmlUtil.appendElement(projectElementPrjStore, ELEM_CONFIGURATION, new String[] {
LanguageSettingsExtensionManager.ATTR_ID, cfgDescription.getId(), LanguageSettingsExtensionManager.ATTR_ID, cfgDescription.getId(),
LanguageSettingsExtensionManager.ATTR_NAME, cfgDescription.getName(), LanguageSettingsExtensionManager.ATTR_NAME, cfgDescription.getName(),
}); });
Element elementConfigurationWsp = null;
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders(); List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
if (providers.size()>0) { if (providers.size()>0) {
Element elementExtension = XmlUtil.appendElement(elementConfiguration, ELEM_EXTENSION, new String[] { Element elementExtension = XmlUtil.appendElement(elementConfiguration, ELEM_EXTENSION, new String[] {
ATTR_POINT, LanguageSettingsExtensionManager.PROVIDER_EXTENSION_FULL_ID}); ATTR_POINT, LanguageSettingsExtensionManager.PROVIDER_EXTENSION_FULL_ID});
Element elementExtensionWsp = null;
for (ILanguageSettingsProvider provider : providers) { for (ILanguageSettingsProvider provider : providers) {
if (isWorkspaceProvider(provider)) { if (isWorkspaceProvider(provider)) {
// Element elementProviderReference = // Element elementProviderReference =
@ -265,7 +294,29 @@ public class LanguageSettingsProvidersSerializer {
continue; continue;
} }
if (provider instanceof LanguageSettingsSerializable) { if (provider instanceof LanguageSettingsSerializable) {
((LanguageSettingsSerializable) provider).serialize(elementExtension); LanguageSettingsSerializable lss = (LanguageSettingsSerializable) provider;
boolean useWsp = projectElementWspStore!=null && projectElementPrjStore!=projectElementWspStore;
if (lss.isStoringEntriesInProjectArea() || !useWsp) {
lss.serialize(elementExtension);
} else {
lss.serializeAttributes(elementExtension);
// lazy initialization of elements - to avoid serialization of no-data file
if (elementExtensionWsp==null) {
if (elementConfigurationWsp==null) {
elementConfigurationWsp = XmlUtil.appendElement(projectElementWspStore, ELEM_CONFIGURATION, new String[] {
LanguageSettingsExtensionManager.ATTR_ID, cfgDescription.getId(),
LanguageSettingsExtensionManager.ATTR_NAME, cfgDescription.getName(),
});
}
elementExtensionWsp = XmlUtil.appendElement(elementConfigurationWsp, ELEM_EXTENSION, new String[] {
ATTR_POINT, LanguageSettingsExtensionManager.PROVIDER_EXTENSION_FULL_ID});
}
Element elementProviderWsp = XmlUtil.appendElement(elementExtensionWsp, ELEM_PROVIDER, new String[] {
LanguageSettingsExtensionManager.ATTR_ID, provider.getId()});
lss.serializeEntries(elementProviderWsp);
}
} else { } else {
// Element elementProvider = // Element elementProvider =
XmlUtil.appendElement(elementExtension, LanguageSettingsExtensionManager.ELEM_PROVIDER, new String[] { XmlUtil.appendElement(elementExtension, LanguageSettingsExtensionManager.ELEM_PROVIDER, new String[] {
@ -279,27 +330,35 @@ public class LanguageSettingsProvidersSerializer {
} }
} }
private static IFile getStorage(IProject project) throws CoreException {
IFolder folder = project.getFolder(SETTINGS_FOLDER_NAME);
if (!folder.exists()) {
folder.create(true, true, null);
}
IFile storage = folder.getFile(STORAGE_PROJECT_LANGUAGE_SETTINGS);
return storage;
}
public static void serializeLanguageSettings(ICProjectDescription prjDescription) throws CoreException { public static void serializeLanguageSettings(ICProjectDescription prjDescription) throws CoreException {
IProject project = prjDescription.getProject(); IProject project = prjDescription.getProject();
try { try {
Document doc = XmlUtil.newDocument(); // Document to store in project area
Element rootElement = XmlUtil.appendElement(doc, ELEM_PROJECT); Document docPrjStore = XmlUtil.newDocument();
serializeLanguageSettings(rootElement, prjDescription); Element projectElementPrjStore = XmlUtil.appendElement(docPrjStore, ELEM_PROJECT);
// Document to store in workspace area
IFile file = getStorage(project); Document docWspStore = XmlUtil.newDocument();
Element projectElementWspStore = XmlUtil.appendElement(docWspStore, ELEM_PROJECT);
serializeLanguageSettingsInternal(projectElementPrjStore, projectElementWspStore, prjDescription);
IFile filePrjStore = getStoreInProjectArea(project);
URI uriWspStore = null;
boolean isWorkspaceStoreEmpty = projectElementWspStore.getChildNodes().getLength() == 0;
uriWspStore = getStoreInWorkspaceArea(project.getName()+'.'+STORAGE_WORKSPACE_LANGUAGE_SETTINGS);
synchronized (serializingLock){ synchronized (serializingLock){
XmlUtil.serializeXml(doc, file); // The project store should not be absent. Absent store means legacy project, not 0 providers.
XmlUtil.serializeXml(docPrjStore, filePrjStore);
// project-specific location in workspace area
if (!isWorkspaceStoreEmpty) {
XmlUtil.serializeXml(docWspStore, uriWspStore);
} else {
new java.io.File(uriWspStore).delete();
}
} }
} catch (Exception e) { } catch (Exception e) {
IStatus s = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Internal error while trying to serialize language settings", e); IStatus s = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Internal error while trying to serialize language settings", e);
CCorePlugin.log(s); CCorePlugin.log(s);
@ -307,7 +366,11 @@ public class LanguageSettingsProvidersSerializer {
} }
} }
public static void loadLanguageSettings(Element parentElement, ICProjectDescription prjDescription) { /**
* @noreference This method is not intended to be referenced by clients.
* It is public solely for benefit of JUnit testing.
*/
public static void loadLanguageSettingsInternal(Element projectElementPrj, Element projectElementWsp, ICProjectDescription prjDescription) {
/* /*
<project> <project>
<configuration id="cfg.id"> <configuration id="cfg.id">
@ -318,7 +381,7 @@ public class LanguageSettingsProvidersSerializer {
</configuration> </configuration>
</project> </project>
*/ */
NodeList configurationNodes = parentElement.getChildNodes(); NodeList configurationNodes = projectElementPrj.getChildNodes();
for (int ic=0;ic<configurationNodes.getLength();ic++) { for (int ic=0;ic<configurationNodes.getLength();ic++) {
Node cfgNode = configurationNodes.item(ic); Node cfgNode = configurationNodes.item(ic);
if (!(cfgNode instanceof Element && cfgNode.getNodeName().equals(ELEM_CONFIGURATION)) ) if (!(cfgNode instanceof Element && cfgNode.getNodeName().equals(ELEM_CONFIGURATION)) )
@ -327,27 +390,33 @@ public class LanguageSettingsProvidersSerializer {
String cfgId = XmlUtil.determineAttributeValue(cfgNode, LanguageSettingsExtensionManager.ATTR_ID); String cfgId = XmlUtil.determineAttributeValue(cfgNode, LanguageSettingsExtensionManager.ATTR_ID);
@SuppressWarnings("unused") @SuppressWarnings("unused")
String cfgName = XmlUtil.determineAttributeValue(cfgNode, LanguageSettingsExtensionManager.ATTR_NAME); String cfgName = XmlUtil.determineAttributeValue(cfgNode, LanguageSettingsExtensionManager.ATTR_NAME);
NodeList extensionAndReferenceNodes = cfgNode.getChildNodes(); NodeList extensionAndReferenceNodes = cfgNode.getChildNodes();
for (int ie=0;ie<extensionAndReferenceNodes.getLength();ie++) { for (int ie=0;ie<extensionAndReferenceNodes.getLength();ie++) {
Node extNode = extensionAndReferenceNodes.item(ie); Node extNode = extensionAndReferenceNodes.item(ie);
if (!(extNode instanceof Element)) if (!(extNode instanceof Element))
continue; continue;
if (extNode.getNodeName().equals(ELEM_EXTENSION)) { if (extNode.getNodeName().equals(ELEM_EXTENSION)) {
NodeList providerNodes = extNode.getChildNodes(); NodeList providerNodes = extNode.getChildNodes();
for (int i=0;i<providerNodes.getLength();i++) { for (int i=0;i<providerNodes.getLength();i++) {
Node providerNode = providerNodes.item(i); Node providerNode = providerNodes.item(i);
if (!(providerNode instanceof Element)) if (!(providerNode instanceof Element))
continue; continue;
ILanguageSettingsProvider provider=null; ILanguageSettingsProvider provider=null;
if (providerNode.getNodeName().equals(ELEM_PROVIDER_REFERENCE)) { if (providerNode.getNodeName().equals(ELEM_PROVIDER_REFERENCE)) {
String providerId = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_ID); String providerId = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_ID);
provider = getWorkspaceProvider(providerId); provider = getWorkspaceProvider(providerId);
} else if (providerNode.getNodeName().equals(LanguageSettingsExtensionManager.ELEM_PROVIDER)) { } else if (providerNode.getNodeName().equals(LanguageSettingsExtensionManager.ELEM_PROVIDER)) {
provider = loadProvider(providerNode); provider = loadProvider(providerNode);
if (provider instanceof LanguageSettingsSerializable) {
LanguageSettingsSerializable lss = (LanguageSettingsSerializable) provider;
if (!lss.isStoringEntriesInProjectArea() && projectElementWsp!=null) {
loadProviderEntries(lss, cfgId, projectElementWsp);
}
}
} }
if (provider!=null) { if (provider!=null) {
providers.add(provider); providers.add(provider);
@ -355,17 +424,67 @@ public class LanguageSettingsProvidersSerializer {
} }
} }
} }
ICConfigurationDescription cfgDescription = prjDescription.getConfigurationById(cfgId); ICConfigurationDescription cfgDescription = prjDescription.getConfigurationById(cfgId);
if (cfgDescription!=null) if (cfgDescription!=null)
cfgDescription.setLanguageSettingProviders(providers); cfgDescription.setLanguageSettingProviders(providers);
} }
} }
private static void loadProviderEntries(LanguageSettingsSerializable provider, String cfgId, Element projectElementWsp) {
/*
<project>
<configuration id="cfg.id">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider .../>
<provider-reference id="..."/>
</extension>
</configuration>
</project>
*/
NodeList configurationNodes = projectElementWsp.getChildNodes();
for (int ic=0;ic<configurationNodes.getLength();ic++) {
Node cfgNode = configurationNodes.item(ic);
if (!(cfgNode instanceof Element && cfgNode.getNodeName().equals(ELEM_CONFIGURATION)) )
continue;
String cfgIdXml = XmlUtil.determineAttributeValue(cfgNode, LanguageSettingsExtensionManager.ATTR_ID);
if (!cfgId.equals(cfgIdXml))
continue;
NodeList extensionAndReferenceNodes = cfgNode.getChildNodes();
for (int ie=0;ie<extensionAndReferenceNodes.getLength();ie++) {
Node extNode = extensionAndReferenceNodes.item(ie);
if (!(extNode instanceof Element))
continue;
if (extNode.getNodeName().equals(ELEM_EXTENSION)) {
NodeList providerNodes = extNode.getChildNodes();
for (int i=0;i<providerNodes.getLength();i++) {
Node providerNode = providerNodes.item(i);
if (!(providerNode instanceof Element))
continue;
if (!providerNode.getNodeName().equals(LanguageSettingsExtensionManager.ELEM_PROVIDER))
continue;
String providerIdXml = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_ID);
if (!provider.getId().equals(providerIdXml))
continue;
provider.loadEntries((Element) providerNode);
return;
}
}
}
}
}
private static ILanguageSettingsProvider loadProvider(Node providerNode) { private static ILanguageSettingsProvider loadProvider(Node providerNode) {
String attrClass = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_CLASS); String attrClass = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_CLASS);
ILanguageSettingsProvider provider = LanguageSettingsExtensionManager.getProviderInstance(attrClass); ILanguageSettingsProvider provider = LanguageSettingsExtensionManager.getProviderInstance(attrClass);
if (provider instanceof LanguageSettingsSerializable) if (provider instanceof LanguageSettingsSerializable)
((LanguageSettingsSerializable)provider).load((Element) providerNode); ((LanguageSettingsSerializable)provider).load((Element) providerNode);
@ -388,15 +507,28 @@ public class LanguageSettingsProvidersSerializer {
synchronized (serializingLock) { synchronized (serializingLock) {
doc = XmlUtil.loadXml(file); doc = XmlUtil.loadXml(file);
} }
Element rootElement = doc.getDocumentElement(); // <project/> Element rootElementPrj = doc.getDocumentElement(); // <project/>
loadLanguageSettings(rootElement, prjDescription);
URI uriLocation = getStoreInWorkspaceArea(project.getName()+'.'+STORAGE_WORKSPACE_LANGUAGE_SETTINGS);
Document docWsp = null;
synchronized (serializingLock) {
docWsp = XmlUtil.loadXml(uriLocation);
}
Element rootElementWsp = null; // <project/>
if (docWsp!=null) {
rootElementWsp = docWsp.getDocumentElement();
}
loadLanguageSettingsInternal(rootElementPrj, rootElementWsp, prjDescription);
} catch (Exception e) { } catch (Exception e) {
CCorePlugin.log("Can't load preferences from file "+file.getLocation(), e); //$NON-NLS-1$ CCorePlugin.log("Can't load preferences from file "+file.getLocation(), e); //$NON-NLS-1$
} }
if (doc!=null) { if (doc!=null) {
} }
} else { } else {
// Already existing legacy projects // Already existing legacy projects
ICConfigurationDescription[] cfgDescriptions = prjDescription.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = prjDescription.getConfigurations();
@ -408,7 +540,7 @@ public class LanguageSettingsProvidersSerializer {
cfgDescription.setLanguageSettingProviders(providers); cfgDescription.setLanguageSettingProviders(providers);
} }
} }
} }
} }
@ -433,7 +565,7 @@ public class LanguageSettingsProvidersSerializer {
/** /**
* TODO * TODO
* @return ordered set of providers defined in the workspace which include contributed through extension + user defined ones * @return ordered set of providers defined in the workspace which include contributed through extension + user defined ones
* *
*/ */
public static List<ILanguageSettingsProvider> getWorkspaceProviders() { public static List<ILanguageSettingsProvider> getWorkspaceProviders() {
ArrayList<ILanguageSettingsProvider> workspaceProviders = new ArrayList<ILanguageSettingsProvider>(); ArrayList<ILanguageSettingsProvider> workspaceProviders = new ArrayList<ILanguageSettingsProvider>();
@ -448,9 +580,9 @@ public class LanguageSettingsProvidersSerializer {
* *
* @param provider - provider to check. * @param provider - provider to check.
* @return {@code true} if the given provider is workspace provider, {@code false} otherwise. * @return {@code true} if the given provider is workspace provider, {@code false} otherwise.
* *
*/ */
public static boolean isWorkspaceProvider(ILanguageSettingsProvider provider) { public static boolean isWorkspaceProvider(ILanguageSettingsProvider provider) {
return provider instanceof LanguageSettingsWorkspaceProvider; return provider instanceof LanguageSettingsWorkspaceProvider;
} }
} }

View file

@ -102,14 +102,14 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
MOVEUP_STR, MOVEUP_STR,
MOVEDOWN_STR, MOVEDOWN_STR,
}; };
private final static String[] BUTTON_LABELS_PREF = { private final static String[] BUTTON_LABELS_PREF = {
// RENAME_STR, // RENAME_STR,
// RUN_STR, // RUN_STR,
CLEAR_STR, CLEAR_STR,
RESET_STR, RESET_STR,
}; };
private static final int[] DEFAULT_CONFIGURE_SASH_WEIGHTS = new int[] { 50, 50 }; private static final int[] DEFAULT_CONFIGURE_SASH_WEIGHTS = new int[] { 50, 50 };
private SashForm sashFormConfigure; private SashForm sashFormConfigure;
@ -118,14 +118,14 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
private Group groupOptionsPage; private Group groupOptionsPage;
private ICOptionPage currentOptionsPage = null; private ICOptionPage currentOptionsPage = null;
private Composite compositeOptionsPage; private Composite compositeOptionsPage;
private Button enableProvidersCheckBox; private Button enableProvidersCheckBox;
private StatusMessageLine fStatusLine; private StatusMessageLine fStatusLine;
private Button globalProviderCheckBox = null; private Button globalProviderCheckBox = null;
private Link linkWorkspacePreferences = null; private Link linkWorkspacePreferences = null;
private Button projectStorageCheckBox = null; private Button projectStorageCheckBox = null;
private Page_LanguageSettingsProviders masterPropertyPage = null; private Page_LanguageSettingsProviders masterPropertyPage = null;
/** /**
@ -136,36 +136,36 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
private List<ILanguageSettingsProvider> presentedProviders = null; private List<ILanguageSettingsProvider> presentedProviders = null;
private final Map<String, ICOptionPage> optionsPageMap = new HashMap<String, ICOptionPage>(); private final Map<String, ICOptionPage> optionsPageMap = new HashMap<String, ICOptionPage>();
private Map<String, List<ILanguageSettingsProvider>> initialProvidersByCfg = new HashMap<String, List<ILanguageSettingsProvider>>(); private Map<String, List<ILanguageSettingsProvider>> initialProvidersByCfg = new HashMap<String, List<ILanguageSettingsProvider>>();
private boolean initialEnablement = false; private boolean initialEnablement = false;
/** /**
* Returns current working copy of the provider. Creates one if it has not been created yet. * Returns current working copy of the provider. Creates one if it has not been created yet.
* Used by option pages when there is a need to modify the provider. * Used by option pages when there is a need to modify the provider.
* Warning: Do not cache the result as the provider can be replaced at any time. * Warning: Do not cache the result as the provider can be replaced at any time.
* @param providerId * @param providerId
* *
* @return the provider * @return the provider
*/ */
public ILanguageSettingsProvider getWorkingCopy(String providerId) { public ILanguageSettingsProvider getWorkingCopy(String providerId) {
ILanguageSettingsProvider provider = findProvider(providerId, presentedProviders); ILanguageSettingsProvider provider = findProvider(providerId, presentedProviders);
if (isWorkingCopy(provider)) if (isWorkingCopy(provider))
return provider; return provider;
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider);
Assert.isTrue(rawProvider instanceof ILanguageSettingsEditableProvider); Assert.isTrue(rawProvider instanceof ILanguageSettingsEditableProvider);
ILanguageSettingsEditableProvider editableProvider = (ILanguageSettingsEditableProvider)rawProvider; ILanguageSettingsEditableProvider editableProvider = (ILanguageSettingsEditableProvider)rawProvider;
try { try {
ILanguageSettingsEditableProvider newProvider = editableProvider.clone(); ILanguageSettingsEditableProvider newProvider = editableProvider.clone();
replaceSelectedProvider(newProvider); replaceSelectedProvider(newProvider);
return newProvider; return newProvider;
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
CUIPlugin.log("Error cloning provider " + editableProvider.getId(), e); CUIPlugin.log("Error cloning provider " + editableProvider.getId(), e);
// TODO warning dialog for user? // TODO warning dialog for user?
} }
return null; return null;
} }
@ -173,19 +173,19 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
@Override @Override
protected String[] getOverlayKeys(ILanguageSettingsProvider provider) { protected String[] getOverlayKeys(ILanguageSettingsProvider provider) {
String[] overlayKeys = super.getOverlayKeys(provider); String[] overlayKeys = super.getOverlayKeys(provider);
ILanguageSettingsProvider rawProvider = page.isForPrefs() ? LanguageSettingsManager.getRawProvider(provider) : provider; ILanguageSettingsProvider rawProvider = page.isForPrefs() ? LanguageSettingsManager.getRawProvider(provider) : provider;
if (LanguageSettingsManager_TBD.isReconfigured(rawProvider)) { if (LanguageSettingsManager_TBD.isReconfigured(rawProvider)) {
overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_SETTING; overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_SETTING;
} }
if (isWorkingCopy(provider)) { if (isWorkingCopy(provider)) {
overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_EDITED; overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_EDITED;
} }
return overlayKeys; return overlayKeys;
} }
} }
/** /**
* Shortcut for getting the current resource for the property page. * Shortcut for getting the current resource for the property page.
*/ */
@ -199,7 +199,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
private ICConfigurationDescription getConfigurationDescription() { private ICConfigurationDescription getConfigurationDescription() {
if (page.isForPrefs()) if (page.isForPrefs())
return null; return null;
ICConfigurationDescription cfgDescription = getResDesc().getConfiguration(); ICConfigurationDescription cfgDescription = getResDesc().getConfiguration();
return cfgDescription; return cfgDescription;
} }
@ -231,7 +231,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
initialEnablement = LanguageSettingsManager.isLanguageSettingsProvidersEnabled(page.getProject()); initialEnablement = LanguageSettingsManager.isLanguageSettingsProvidersEnabled(page.getProject());
} }
} }
@Override @Override
public void createControls(Composite parent) { public void createControls(Composite parent) {
super.createControls(parent); super.createControls(parent);
@ -239,7 +239,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
GridData gd = (GridData) usercomp.getLayoutData(); GridData gd = (GridData) usercomp.getLayoutData();
// Discourage settings entry table from trying to show all its items at once, see bug 264330 // Discourage settings entry table from trying to show all its items at once, see bug 264330
gd.heightHint =1; gd.heightHint =1;
if (page instanceof Page_LanguageSettingsProviders) { if (page instanceof Page_LanguageSettingsProviders) {
masterPropertyPage = (Page_LanguageSettingsProviders) page; masterPropertyPage = (Page_LanguageSettingsProviders) page;
} }
@ -248,7 +248,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
// SashForms for each mode // SashForms for each mode
createConfigureSashForm(); createConfigureSashForm();
// Status line // Status line
fStatusLine = new StatusMessageLine(usercomp, SWT.LEFT, 2); fStatusLine = new StatusMessageLine(usercomp, SWT.LEFT, 2);
@ -290,7 +290,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
// Providers table // Providers table
Composite compositeSashForm = new Composite(sashFormConfigure, SWT.BORDER | SWT.SINGLE); Composite compositeSashForm = new Composite(sashFormConfigure, SWT.BORDER | SWT.SINGLE);
compositeSashForm.setLayout(new GridLayout()); compositeSashForm.setLayout(new GridLayout());
// items checkboxes only for project properties page // items checkboxes only for project properties page
tableProviders = new Table(compositeSashForm, page.isForPrefs() ? SWT.NONE : SWT.CHECK); tableProviders = new Table(compositeSashForm, page.isForPrefs() ? SWT.NONE : SWT.CHECK);
tableProviders.setLayoutData(new GridData(GridData.FILL_BOTH)); tableProviders.setLayoutData(new GridData(GridData.FILL_BOTH));
@ -353,14 +353,14 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
} }
if (newProvider!=null) { if (newProvider!=null) {
replaceSelectedProvider(newProvider); replaceSelectedProvider(newProvider);
ICConfigurationDescription cfgDescription = getConfigurationDescription(); ICConfigurationDescription cfgDescription = getConfigurationDescription();
initializeOptionsPage(newProvider, cfgDescription); initializeOptionsPage(newProvider, cfgDescription);
displaySelectedOptionPage(); displaySelectedOptionPage();
} else { } else {
newProvider = oldProvider; newProvider = oldProvider;
} }
return newProvider; return newProvider;
} }
@ -373,7 +373,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
ICConfigurationDescription cfgDescription = null; ICConfigurationDescription cfgDescription = null;
if (!page.isForPrefs()) { if (!page.isForPrefs()) {
cfgDescription = getConfigurationDescription(); cfgDescription = getConfigurationDescription();
List<ILanguageSettingsProvider> cfgProviders = new ArrayList<ILanguageSettingsProvider>(cfgDescription.getLanguageSettingProviders()); List<ILanguageSettingsProvider> cfgProviders = new ArrayList<ILanguageSettingsProvider>(cfgDescription.getLanguageSettingProviders());
pos = getProviderIndex(newProvider.getId(), cfgProviders); pos = getProviderIndex(newProvider.getId(), cfgProviders);
cfgProviders.set(pos, newProvider); cfgProviders.set(pos, newProvider);
@ -392,7 +392,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
groupOptionsPage = new Group(sashFormConfigure, SWT.SHADOW_ETCHED_IN); groupOptionsPage = new Group(sashFormConfigure, SWT.SHADOW_ETCHED_IN);
groupOptionsPage.setText("Language Settings Provider Options"); groupOptionsPage.setText("Language Settings Provider Options");
groupOptionsPage.setLayout(new GridLayout(2, false)); groupOptionsPage.setLayout(new GridLayout(2, false));
if (!page.isForPrefs()) { if (!page.isForPrefs()) {
if (globalProviderCheckBox==null) { if (globalProviderCheckBox==null) {
globalProviderCheckBox = new Button(groupOptionsPage, SWT.CHECK); globalProviderCheckBox = new Button(groupOptionsPage, SWT.CHECK);
@ -406,7 +406,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
provider = toggleGlobalProvider(provider, isGlobal); provider = toggleGlobalProvider(provider, isGlobal);
} }
projectStorageCheckBox.setSelection(provider instanceof LanguageSettingsSerializable projectStorageCheckBox.setSelection(provider instanceof LanguageSettingsSerializable
&& ((LanguageSettingsSerializable) provider).isEntriesStorageWithProject()); && ((LanguageSettingsSerializable) provider).isStoringEntriesInProjectArea());
} }
@Override @Override
@ -415,7 +415,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
} }
}); });
projectStorageCheckBox = new Button(groupOptionsPage, SWT.CHECK); projectStorageCheckBox = new Button(groupOptionsPage, SWT.CHECK);
projectStorageCheckBox.setText("Store entries in project settings folder (supporting project miration)"); projectStorageCheckBox.setText("Store entries in project settings folder (supporting project miration)");
projectStorageCheckBox.addSelectionListener(new SelectionAdapter() { projectStorageCheckBox.addSelectionListener(new SelectionAdapter() {
@ -424,7 +424,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
boolean isWithProject = projectStorageCheckBox.getSelection(); boolean isWithProject = projectStorageCheckBox.getSelection();
ILanguageSettingsProvider provider = getWorkingCopy(getSelectedProvider().getId()); ILanguageSettingsProvider provider = getWorkingCopy(getSelectedProvider().getId());
Assert.isTrue(provider instanceof LanguageSettingsSerializable); Assert.isTrue(provider instanceof LanguageSettingsSerializable);
((LanguageSettingsSerializable)provider).setEntriesStorageWithProject(isWithProject); ((LanguageSettingsSerializable)provider).setStoringEntriesInProjectArea(isWithProject);
refreshItem(provider); refreshItem(provider);
} }
@ -434,7 +434,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
} }
}); });
linkWorkspacePreferences = createLinkToPreferences(groupOptionsPage, 2); linkWorkspacePreferences = createLinkToPreferences(groupOptionsPage, 2);
} }
} }
@ -445,7 +445,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
private void enableSashForm(SashForm sashForm, boolean enable) { private void enableSashForm(SashForm sashForm, boolean enable) {
sashForm.setVisible(enable); sashForm.setVisible(enable);
// Some of woodoo to fill properties page vertically and still keep right border visible in preferences // Some of woodoo to fill properties page vertically and still keep right border visible in preferences
GridData gd = new GridData(enable || page.isForPrefs() ? GridData.FILL_BOTH : SWT.NONE); GridData gd = new GridData(enable || page.isForPrefs() ? GridData.FILL_BOTH : SWT.NONE);
gd.horizontalSpan = 2; gd.horizontalSpan = 2;
gd.heightHint = enable ? SWT.DEFAULT : 0; gd.heightHint = enable ? SWT.DEFAULT : 0;
@ -456,7 +456,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
sashFormConfigure.setEnabled(enable); sashFormConfigure.setEnabled(enable);
tableProviders.setEnabled(enable); tableProviders.setEnabled(enable);
compositeOptionsPage.setEnabled(enable); compositeOptionsPage.setEnabled(enable);
buttoncomp.setEnabled(enable); buttoncomp.setEnabled(enable);
if (enable) { if (enable) {
@ -468,7 +468,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
disableButtons(); disableButtons();
} }
} }
/** /**
* Populate provider tables and their option pages which are used in Configure mode * Populate provider tables and their option pages which are used in Configure mode
*/ */
@ -484,7 +484,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
List<ILanguageSettingsProvider> cfgProviders = cfgDescription.getLanguageSettingProviders(); List<ILanguageSettingsProvider> cfgProviders = cfgDescription.getLanguageSettingProviders();
tableProvidersViewer.setCheckedElements(cfgProviders.toArray(new ILanguageSettingsProvider[0])); tableProvidersViewer.setCheckedElements(cfgProviders.toArray(new ILanguageSettingsProvider[0]));
} }
if (selectedId!=null) { if (selectedId!=null) {
for (int i=0; i<presentedProviders.size(); i++) { for (int i=0; i<presentedProviders.size(); i++) {
if (selectedId.equals(presentedProviders.get(i).getId())) { if (selectedId.equals(presentedProviders.get(i).getId())) {
@ -493,7 +493,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
} }
} }
} }
optionsPageMap.clear(); optionsPageMap.clear();
for (ILanguageSettingsProvider provider : presentedProviders) { for (ILanguageSettingsProvider provider : presentedProviders) {
initializeOptionsPage(provider, cfgDescription); initializeOptionsPage(provider, cfgDescription);
@ -518,9 +518,9 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
} else { } else {
providers = new ArrayList<ILanguageSettingsProvider>(); providers = new ArrayList<ILanguageSettingsProvider>();
} }
List<ILanguageSettingsProvider> workspaceProviders = LanguageSettingsManager.getWorkspaceProviders(); List<ILanguageSettingsProvider> workspaceProviders = LanguageSettingsManager.getWorkspaceProviders();
// ensure sorting by name all unchecked providers // ensure sorting by name all unchecked providers
Set<ILanguageSettingsProvider> allAvailableProvidersSet = new TreeSet<ILanguageSettingsProvider>(new Comparator<ILanguageSettingsProvider>() { Set<ILanguageSettingsProvider> allAvailableProvidersSet = new TreeSet<ILanguageSettingsProvider>(new Comparator<ILanguageSettingsProvider>() {
public int compare(ILanguageSettingsProvider prov1, ILanguageSettingsProvider prov2) { public int compare(ILanguageSettingsProvider prov1, ILanguageSettingsProvider prov2) {
@ -541,7 +541,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
idsList.add(id); idsList.add(id);
} }
} }
// renders better when using temporary // renders better when using temporary
presentedProviders = providers; presentedProviders = providers;
tableProvidersViewer.setInput(presentedProviders); tableProvidersViewer.setInput(presentedProviders);
@ -559,20 +559,20 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
((AbstractLanguageSettingProviderOptionPage)optionsPage).init(this, provider.getId()); ((AbstractLanguageSettingProviderOptionPage)optionsPage).init(this, provider.getId());
} }
} }
return optionsPage; return optionsPage;
} }
private void initializeOptionsPage(ILanguageSettingsProvider provider, ICConfigurationDescription cfgDescription) { private void initializeOptionsPage(ILanguageSettingsProvider provider, ICConfigurationDescription cfgDescription) {
ICOptionPage optionsPage = createOptionsPage(provider, cfgDescription); ICOptionPage optionsPage = createOptionsPage(provider, cfgDescription);
if (optionsPage!=null) { if (optionsPage!=null) {
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider);
boolean isEditableForProject = page.isForProject() && provider instanceof ILanguageSettingsEditableProvider; boolean isEditableForProject = page.isForProject() && provider instanceof ILanguageSettingsEditableProvider;
boolean isEditableForPrefs = page.isForPrefs() && rawProvider instanceof ILanguageSettingsEditableProvider; boolean isEditableForPrefs = page.isForPrefs() && rawProvider instanceof ILanguageSettingsEditableProvider;
boolean isEditable = isEditableForProject || isEditableForPrefs; boolean isEditable = isEditableForProject || isEditableForPrefs;
compositeOptionsPage.setEnabled(isEditable); compositeOptionsPage.setEnabled(isEditable);
String id = (provider!=null) ? provider.getId() : null; String id = (provider!=null) ? provider.getId() : null;
optionsPageMap.put(id, optionsPage); optionsPageMap.put(id, optionsPage);
optionsPage.setContainer(page); optionsPage.setContainer(page);
@ -601,12 +601,12 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
globalProviderCheckBox.setSelection(isGlobal); globalProviderCheckBox.setSelection(isGlobal);
globalProviderCheckBox.setEnabled(isChecked && isRawProviderEditable); globalProviderCheckBox.setEnabled(isChecked && isRawProviderEditable);
globalProviderCheckBox.setVisible(provider!=null); globalProviderCheckBox.setVisible(provider!=null);
projectStorageCheckBox.setEnabled(!isGlobal); projectStorageCheckBox.setEnabled(!isGlobal);
projectStorageCheckBox.setVisible(rawProvider instanceof LanguageSettingsSerializable); projectStorageCheckBox.setVisible(rawProvider instanceof LanguageSettingsSerializable);
projectStorageCheckBox.setSelection(provider instanceof LanguageSettingsSerializable projectStorageCheckBox.setSelection(provider instanceof LanguageSettingsSerializable
&& ((LanguageSettingsSerializable)provider).isEntriesStorageWithProject()); && ((LanguageSettingsSerializable)provider).isStoringEntriesInProjectArea());
boolean needPreferencesLink=isGlobal && currentOptionsPage!=null; boolean needPreferencesLink=isGlobal && currentOptionsPage!=null;
// TODO: message // TODO: message
final String linkMsg = needPreferencesLink ? "Options of global providers can be changed in <a href=\"workspace\">Workspace Settings</a>, Discovery Tab." : ""; final String linkMsg = needPreferencesLink ? "Options of global providers can be changed in <a href=\"workspace\">Workspace Settings</a>, Discovery Tab." : "";
@ -614,7 +614,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
linkWorkspacePreferences.pack(); linkWorkspacePreferences.pack();
linkWorkspacePreferences.setEnabled(isChecked); linkWorkspacePreferences.setEnabled(isChecked);
} }
if (currentOptionsPage != null) { if (currentOptionsPage != null) {
boolean isEditableForProject = page.isForProject() && provider instanceof ILanguageSettingsEditableProvider; boolean isEditableForProject = page.isForProject() && provider instanceof ILanguageSettingsEditableProvider;
boolean isEditableForPrefs = page.isForPrefs() && rawProvider instanceof ILanguageSettingsEditableProvider; boolean isEditableForPrefs = page.isForPrefs() && rawProvider instanceof ILanguageSettingsEditableProvider;
@ -638,7 +638,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
} }
ICConfigurationDescription cfgDescription = getConfigurationDescription(); ICConfigurationDescription cfgDescription = getConfigurationDescription();
cfgDescription.setLanguageSettingProviders(providers); cfgDescription.setLanguageSettingProviders(providers);
if (selectedElement!=null) { if (selectedElement!=null) {
tableProvidersViewer.update(selectedElement, null); tableProvidersViewer.update(selectedElement, null);
if (selectedElement instanceof ILanguageSettingsProvider) { if (selectedElement instanceof ILanguageSettingsProvider) {
@ -682,15 +682,15 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
canClear = canForWorkspace || canForProject; canClear = canForWorkspace || canForProject;
} }
} }
boolean canReset = false; boolean canReset = false;
if (rawProvider!=null && (canForWorkspace || canForProject)) { if (rawProvider!=null && (canForWorkspace || canForProject)) {
canReset = ! LanguageSettingsManager_TBD.isEqualExtensionProvider(rawProvider); canReset = ! LanguageSettingsManager_TBD.isEqualExtensionProvider(rawProvider);
} }
boolean canMoveUp = page.isForProject() && isProviderSelected && isRangeOk && pos!=0; boolean canMoveUp = page.isForProject() && isProviderSelected && isRangeOk && pos!=0;
boolean canMoveDown = page.isForProject() && isProviderSelected && isRangeOk && pos!=last; boolean canMoveDown = page.isForProject() && isProviderSelected && isRangeOk && pos!=last;
// buttonSetEnabled(BUTTON_RENAME, false); // buttonSetEnabled(BUTTON_RENAME, false);
// buttonSetEnabled(BUTTON_RUN, false); // buttonSetEnabled(BUTTON_RUN, false);
buttonSetEnabled(BUTTON_CLEAR, canClear); buttonSetEnabled(BUTTON_CLEAR, canClear);
@ -748,7 +748,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(selectedProvider); ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(selectedProvider);
if (rawProvider instanceof ILanguageSettingsEditableProvider) { if (rawProvider instanceof ILanguageSettingsEditableProvider) {
ILanguageSettingsEditableProvider editableProvider = (ILanguageSettingsEditableProvider) rawProvider; ILanguageSettingsEditableProvider editableProvider = (ILanguageSettingsEditableProvider) rawProvider;
try { try {
ILanguageSettingsEditableProvider newProvider = editableProvider.cloneShallow(); ILanguageSettingsEditableProvider newProvider = editableProvider.cloneShallow();
replaceSelectedProvider(newProvider); replaceSelectedProvider(newProvider);
@ -756,13 +756,13 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
ICConfigurationDescription cfgDescription = getConfigurationDescription(); ICConfigurationDescription cfgDescription = getConfigurationDescription();
initializeOptionsPage(newProvider, cfgDescription); initializeOptionsPage(newProvider, cfgDescription);
displaySelectedOptionPage(); displaySelectedOptionPage();
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
CUIPlugin.log("Error cloning provider " + editableProvider.getId(), e); CUIPlugin.log("Error cloning provider " + editableProvider.getId(), e);
return; return;
} }
} }
} }
updateButtons(); updateButtons();
} }
@ -787,7 +787,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
List<ILanguageSettingsProvider> initialProviders = initialProvidersByCfg.get(cfgDescription.getId()); List<ILanguageSettingsProvider> initialProviders = initialProvidersByCfg.get(cfgDescription.getId());
isWorkingCopy = ! initialProviders.contains(provider); isWorkingCopy = ! initialProviders.contains(provider);
} }
} }
return isWorkingCopy; return isWorkingCopy;
} }
@ -809,10 +809,10 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
private void moveProvider(int oldPos, int newPos) { private void moveProvider(int oldPos, int newPos) {
Collections.swap(presentedProviders, oldPos, newPos); Collections.swap(presentedProviders, oldPos, newPos);
updateProvidersTable(); updateProvidersTable();
tableProviders.setSelection(newPos); tableProviders.setSelection(newPos);
saveCheckedProviders(null); saveCheckedProviders(null);
updateButtons(); updateButtons();
} }
@ -847,7 +847,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
} else { } else {
setAllVisible(true, null); setAllVisible(true, null);
} }
if (masterPropertyPage!=null) { if (masterPropertyPage!=null) {
boolean enabled = masterPropertyPage.isLanguageSettingsProvidersEnabled(); boolean enabled = masterPropertyPage.isLanguageSettingsProvidersEnabled();
enableProvidersCheckBox.setSelection(enabled); enableProvidersCheckBox.setSelection(enabled);
@ -868,12 +868,12 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
protected void performDefaults() { protected void performDefaults() {
if (enableProvidersCheckBox==null || enableProvidersCheckBox.getSelection()==false) if (enableProvidersCheckBox==null || enableProvidersCheckBox.getSelection()==false)
return; return;
if (page.isForPrefs() || page.isForProject()) { if (page.isForPrefs() || page.isForProject()) {
if (MessageDialog.openQuestion(usercomp.getShell(), if (MessageDialog.openQuestion(usercomp.getShell(),
Messages.LanguageSettingsProviderTab_TitleResetProviders, Messages.LanguageSettingsProviderTab_TitleResetProviders,
Messages.LanguageSettingsProviderTab_AreYouSureToResetProviders)) { Messages.LanguageSettingsProviderTab_AreYouSureToResetProviders)) {
if (page.isForProject()) { if (page.isForProject()) {
ICConfigurationDescription cfgDescription = getConfigurationDescription(); ICConfigurationDescription cfgDescription = getConfigurationDescription();
List<ILanguageSettingsProvider> cfgProviders = new ArrayList<ILanguageSettingsProvider>(cfgDescription.getLanguageSettingProviders()); List<ILanguageSettingsProvider> cfgProviders = new ArrayList<ILanguageSettingsProvider>(cfgDescription.getLanguageSettingProviders());
@ -889,7 +889,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
if (atLeastOneChanged) { if (atLeastOneChanged) {
cfgDescription.setLanguageSettingProviders(cfgProviders); cfgDescription.setLanguageSettingProviders(cfgProviders);
} }
} else if (page.isForPrefs()) { } else if (page.isForPrefs()) {
int pos = tableProviders.getSelectionIndex(); int pos = tableProviders.getSelectionIndex();
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(presentedProviders); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(presentedProviders);
@ -905,11 +905,11 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
presentedProviders = providers; presentedProviders = providers;
tableProvidersViewer.setInput(presentedProviders); tableProvidersViewer.setInput(presentedProviders);
tableProviders.setSelection(pos); tableProviders.setSelection(pos);
updateButtons(); updateButtons();
} }
} }
updateData(getResDesc()); updateData(getResDesc());
} }
} }
@ -934,7 +934,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
destCfgDescription.setLanguageSettingProviders(destProviders); destCfgDescription.setLanguageSettingProviders(destProviders);
} }
if (!page.isForPrefs()) { if (!page.isForPrefs()) {
ICConfigurationDescription sd = srcRcDescription.getConfiguration(); ICConfigurationDescription sd = srcRcDescription.getConfiguration();
ICConfigurationDescription dd = destRcDescription.getConfiguration(); ICConfigurationDescription dd = destRcDescription.getConfiguration();
@ -952,7 +952,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
ICResourceDescription rcDesc = getResDesc(); ICResourceDescription rcDesc = getResDesc();
IResource rc = getResource(); IResource rc = getResource();
ICConfigurationDescription cfgDescription = rcDesc.getConfiguration(); ICConfigurationDescription cfgDescription = rcDesc.getConfiguration();
List<ILanguageSettingsProvider> destProviders = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> destProviders = new ArrayList<ILanguageSettingsProvider>();
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders(); List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
for (ILanguageSettingsProvider pro : providers) { for (ILanguageSettingsProvider pro : providers) {
@ -961,7 +961,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
} }
cfgDescription.setLanguageSettingProviders(destProviders); cfgDescription.setLanguageSettingProviders(destProviders);
} }
// Build Settings page // Build Settings page
if (page.isForPrefs()) { if (page.isForPrefs()) {
try { try {
@ -971,7 +971,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
} }
initializeProviders(); initializeProviders();
} }
if (page.isForProject() && enableProvidersCheckBox!=null) { if (page.isForProject() && enableProvidersCheckBox!=null) {
boolean enabled = enableProvidersCheckBox.getSelection(); boolean enabled = enableProvidersCheckBox.getSelection();
if (masterPropertyPage!=null) if (masterPropertyPage!=null)
@ -979,7 +979,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
LanguageSettingsManager.setLanguageSettingsProvidersEnabled(page.getProject(), enabled); LanguageSettingsManager.setLanguageSettingsProvidersEnabled(page.getProject(), enabled);
enableProvidersCheckBox.setSelection(enabled); enableProvidersCheckBox.setSelection(enabled);
} }
Collection<ICOptionPage> optionPages = optionsPageMap.values(); Collection<ICOptionPage> optionPages = optionsPageMap.values();
for (ICOptionPage op : optionPages) { for (ICOptionPage op : optionPages) {
try { try {
@ -1006,7 +1006,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
return false; return false;
if (page.isForPrefs()) if (page.isForPrefs())
return true; return true;
if (!page.isForProject()) if (!page.isForProject())
return false; return false;
@ -1035,7 +1035,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
newProvidersList = cfgDescription.getLanguageSettingProviders(); newProvidersList = cfgDescription.getLanguageSettingProviders();
} }
boolean newEnablement = LanguageSettingsManager.isLanguageSettingsProvidersEnabled(page.getProject()); boolean newEnablement = LanguageSettingsManager.isLanguageSettingsProvidersEnabled(page.getProject());
// TODO // TODO
boolean isEqualList = false; boolean isEqualList = false;
// boolean isEqualList = (newProvidersList==initialProvidersMap) || (newProvidersList!=null && newProvidersList.equals(initialProvidersMap)); // boolean isEqualList = (newProvidersList==initialProvidersMap) || (newProvidersList!=null && newProvidersList.equals(initialProvidersMap));
@ -1060,11 +1060,11 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab {
} }
return null; return null;
} }
public ILanguageSettingsProvider getProvider(String id) { public ILanguageSettingsProvider getProvider(String id) {
return findProvider(id, presentedProviders); return findProvider(id, presentedProviders);
} }
private int getProviderIndex(String id, List<ILanguageSettingsProvider> providers) { private int getProviderIndex(String id, List<ILanguageSettingsProvider> providers) {
int pos = 0; int pos = 0;
for (ILanguageSettingsProvider p : providers) { for (ILanguageSettingsProvider p : providers) {