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

Generalizing providers as resource listeners

This commit is contained in:
Andrew Gvozdev 2011-10-04 00:11:21 -04:00
parent e314ac4b68
commit b33b63d970
9 changed files with 785 additions and 87 deletions

View file

@ -26,6 +26,7 @@ public class AllLanguageSettingsProvidersTests {
suite.addTest(LanguageSettingsManagerTests.suite());
suite.addTest(LanguageSettingsSerializableTests.suite());
suite.addTest(LanguageSettingsPersistenceProjectTests.suite());
suite.addTest(LanguageSettingsListenersTests.suite());
suite.addTest(LanguageSettingsScannerInfoProviderTests.suite());
return suite;
}

View file

@ -37,11 +37,11 @@ import org.eclipse.core.runtime.Path;
public class LanguageSettingsExtensionsTests extends TestCase {
// These should match corresponding entries defined in plugin.xml
private static final String EXTENSION_BASE_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.base.provider";
private static final String EXTENSION_BASE_PROVIDER_NAME = "Test Plugin Language Settings Base Provider";
private static final String EXTENSION_BASE_PROVIDER_NAME = "Test Plugin Mock Language Settings Base Provider";
private static final String EXTENSION_BASE_PROVIDER_LANG_ID = "org.eclipse.cdt.core.tests.language.id";
private static final String EXTENSION_BASE_PROVIDER_PARAMETER = "custom parameter";
private static final String EXTENSION_CUSTOM_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.language.settings.provider";
private static final String EXTENSION_CUSTOM_PROVIDER_NAME = "Test Plugin Language Settings Provider";
private static final String EXTENSION_CUSTOM_PROVIDER_NAME = "Test Plugin Mock Language Settings Provider";
private static final String EXTENSION_BASE_SUBCLASS_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.base.provider.subclass";
private static final String EXTENSION_BASE_SUBCLASS_PROVIDER_PARAMETER = "custom parameter subclass";
private static final String EXTENSION_SERIALIZABLE_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.serializable.language.settings.provider";

View file

@ -0,0 +1,494 @@
/*******************************************************************************
* Copyright (c) 2011, 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.core.language.settings.providers;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.testplugin.ResourceHelper;
import org.eclipse.core.resources.IProject;
/**
* Test cases testing LanguageSettingsProvider functionality
*/
public class LanguageSettingsListenersTests extends TestCase {
// Must match provider id defined as extension point
private static final String EXTENSION_REGISTERER_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.listener.registerer.provider";
private static final String PROVIDER_1 = "test.provider.1.id";
private static final String PROVIDER_NAME_1 = "test.provider.1.name";
private static final String PROVIDER_CUSTOM_GLOBAL = "test.provider.custom.global.id";
private static final String PROVIDER_CUSTOM_GLOBAL_NAME = "test.provider.custom.global.name";
/**
* Constructor.
* @param name - name of the test.
*/
public LanguageSettingsListenersTests(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
}
@Override
protected void tearDown() throws Exception {
LanguageSettingsManager.setWorkspaceProviders(null);
ResourceHelper.cleanUp();
}
/**
* @return - new TestSuite.
*/
public static TestSuite suite() {
return new TestSuite(LanguageSettingsListenersTests.class);
}
/**
* main function of the class.
*
* @param args - arguments
*/
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
/**
*/
public void testListenerRegisterer_CheckExtensionProvider() throws Exception {
// check if extension provider exists
ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_REGISTERER_PROVIDER_ID);
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(workspaceProvider);
assertNotNull(rawProvider);
// global listeners providers get registered only lazily
assertEquals(0, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
/**
*/
public void testListenerRegisterer_OneOwnedByCfg() throws Exception {
IProject project = ResourceHelper.createCDTProjectWithConfig(this.getName());
{
// get project descriptions
ICProjectDescription writableProjDescription = CoreModel.getDefault().getProjectDescription(project);
assertNotNull(writableProjDescription);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(1, cfgDescriptions.length);
ICConfigurationDescription cfgDescription = cfgDescriptions[0];
// create a provider
ILanguageSettingsProvider mockProvider = new MockListenerRegisterer(PROVIDER_1, PROVIDER_NAME_1);
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.getDefault().setProjectDescription(project, writableProjDescription);
assertEquals(1, MockListenerRegisterer.getCount(PROVIDER_1));
}
{
// close the project
project.close(null);
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_1));
}
{
// reopen the project
project.open(null);
CoreModel.getDefault().getProjectDescription(project);
assertEquals(1, MockListenerRegisterer.getCount(PROVIDER_1));
// and delete
project.delete(true, null);
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_1));
}
}
/**
*/
public void testListenerRegisterer_TwoOwnedByCfgs() throws Exception {
IProject project = ResourceHelper.createCDTProject(this.getName(), null, new String[] {
"org.eclipse.cdt.core.tests.configuration.id.1",
"org.eclipse.cdt.core.tests.configuration.id.2",
});
{
// get project descriptions
ICProjectDescription writableProjDescription = CoreModel.getDefault().getProjectDescription(project);
assertNotNull(writableProjDescription);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(2, cfgDescriptions.length);
ICConfigurationDescription cfgDescription1 = cfgDescriptions[0];
ICConfigurationDescription cfgDescription2 = cfgDescriptions[1];
{
// create a provider 1
ILanguageSettingsProvider mockProvider = new MockListenerRegisterer(PROVIDER_1, PROVIDER_NAME_1);
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(mockProvider);
cfgDescription1.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription1.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
}
{
// create a provider 2
ILanguageSettingsProvider mockProvider = new MockListenerRegisterer(PROVIDER_1, PROVIDER_NAME_1);
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(mockProvider);
cfgDescription2.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription2.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
}
// write to project description
CoreModel.getDefault().setProjectDescription(project, writableProjDescription);
assertEquals(2, MockListenerRegisterer.getCount(PROVIDER_1));
}
{
// close the project
project.close(null);
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_1));
}
{
// reopen the project
project.open(null);
CoreModel.getDefault().getProjectDescription(project);
assertEquals(2, MockListenerRegisterer.getCount(PROVIDER_1));
// and delete
project.delete(true, null);
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_1));
}
}
/**
*/
public void testListenerRegisterer_OneGlobal() throws Exception {
IProject project = ResourceHelper.createCDTProjectWithConfig(this.getName());
{
// get project descriptions
ICProjectDescription writableProjDescription = CoreModel.getDefault().getProjectDescription(project);
assertNotNull(writableProjDescription);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(1, cfgDescriptions.length);
ICConfigurationDescription cfgDescription = cfgDescriptions[0];
// add global provider
ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_REGISTERER_PROVIDER_ID);
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(workspaceProvider);
cfgDescription.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
// write to project description
CoreModel.getDefault().setProjectDescription(project, writableProjDescription);
assertEquals(1, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
{
// close the project
project.close(null);
assertEquals(0, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
{
// reopen the project
project.open(null);
CoreModel.getDefault().getProjectDescription(project);
assertEquals(1, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
// and delete
project.delete(true, null);
assertEquals(0, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
}
/**
*/
public void testListenerRegisterer_TwoGlobal() throws Exception {
IProject project = ResourceHelper.createCDTProject(this.getName(), null, new String[] {
"org.eclipse.cdt.core.tests.configuration.id.1",
"org.eclipse.cdt.core.tests.configuration.id.2",
});
{
// retrieve global provider
ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_REGISTERER_PROVIDER_ID);
// get project descriptions
ICProjectDescription writableProjDescription = CoreModel.getDefault().getProjectDescription(project);
assertNotNull(writableProjDescription);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(2, cfgDescriptions.length);
ICConfigurationDescription cfgDescription1 = cfgDescriptions[0];
ICConfigurationDescription cfgDescription2 = cfgDescriptions[1];
{
// add global provider to configuration 1
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(workspaceProvider);
cfgDescription1.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription1.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
}
{
// add global provider to configuration 2
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(workspaceProvider);
cfgDescription2.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription2.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
}
// write to project description
CoreModel.getDefault().setProjectDescription(project, writableProjDescription);
assertEquals(1, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
{
// close the project
project.close(null);
assertEquals(0, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
{
// reopen the project
project.open(null);
CoreModel.getDefault().getProjectDescription(project);
assertEquals(1, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
// and delete
project.delete(true, null);
assertEquals(0, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
}
/**
*/
public void testListenerRegisterer_TwoGlobalMinusOne() throws Exception {
IProject project = ResourceHelper.createCDTProject(this.getName(), null, new String[] {
"org.eclipse.cdt.core.tests.configuration.id.1",
"org.eclipse.cdt.core.tests.configuration.id.2",
});
{
// retrieve workspace provider
ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_REGISTERER_PROVIDER_ID);
// get project descriptions
ICProjectDescription writableProjDescription = CoreModel.getDefault().getProjectDescription(project);
assertNotNull(writableProjDescription);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(2, cfgDescriptions.length);
ICConfigurationDescription cfgDescription1 = cfgDescriptions[0];
ICConfigurationDescription cfgDescription2 = cfgDescriptions[1];
{
// add global provider to configuration 1
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(workspaceProvider);
cfgDescription1.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription1.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
}
{
// add global provider to configuration 2
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(workspaceProvider);
cfgDescription2.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription2.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
}
// write to project description
CoreModel.getDefault().setProjectDescription(project, writableProjDescription);
assertEquals(1, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
{
// retrieve workspace provider
ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_REGISTERER_PROVIDER_ID);
// get project descriptions
ICProjectDescription writableProjDescription = CoreModel.getDefault().getProjectDescription(project);
assertNotNull(writableProjDescription);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(2, cfgDescriptions.length);
ICConfigurationDescription cfgDescription1 = cfgDescriptions[0];
ICConfigurationDescription cfgDescription2 = cfgDescriptions[1];
{
// remove global provider from configuration 1
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
cfgDescription1.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription1.getLanguageSettingProviders();
assertEquals(0, storedProviders.size());
}
// write to project description
CoreModel.getDefault().setProjectDescription(project, writableProjDescription);
assertEquals(1, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
{
// close the project
project.close(null);
assertEquals(0, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
}
/**
*/
public void testListenerRegisterer_GlobalProviderTwoProjects() throws Exception {
// create project 1
IProject project_1 = ResourceHelper.createCDTProjectWithConfig(this.getName() + ".1");
{
// get project descriptions
ICProjectDescription writableProjDescription = CoreModel.getDefault().getProjectDescription(project_1);
assertNotNull(writableProjDescription);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(1, cfgDescriptions.length);
ICConfigurationDescription cfgDescription = cfgDescriptions[0];
// add global provider
ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_REGISTERER_PROVIDER_ID);
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(workspaceProvider);
cfgDescription.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
// write to project description
CoreModel.getDefault().setProjectDescription(project_1, writableProjDescription);
assertEquals(1, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
// create project 2
IProject project_2 = ResourceHelper.createCDTProjectWithConfig(this.getName() + ".2");
{
// get project descriptions
ICProjectDescription writableProjDescription = CoreModel.getDefault().getProjectDescription(project_2);
assertNotNull(writableProjDescription);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(1, cfgDescriptions.length);
ICConfigurationDescription cfgDescription = cfgDescriptions[0];
// add global provider
ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_REGISTERER_PROVIDER_ID);
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(workspaceProvider);
cfgDescription.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
// write to project description
CoreModel.getDefault().setProjectDescription(project_2, writableProjDescription);
assertEquals(1, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
{
// close project 1
project_1.close(null);
assertEquals(1, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
{
// close project 2
project_2.close(null);
assertEquals(0, MockListenerRegisterer.getCount(EXTENSION_REGISTERER_PROVIDER_ID));
}
}
/**
*/
public void testListenerRegisterer_GlobalProviderNotInUse() throws Exception {
ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager.getWorkspaceProvider(PROVIDER_CUSTOM_GLOBAL);
// the global custom provider has not been added yet
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(workspaceProvider);
assertNull(rawProvider);
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_CUSTOM_GLOBAL));
List<ILanguageSettingsProvider> workspaceProvidersOriginal = LanguageSettingsManager.getWorkspaceProviders();
{
// add global provider which is not engaged
ILanguageSettingsProvider provider = new MockListenerRegisterer(PROVIDER_CUSTOM_GLOBAL, PROVIDER_CUSTOM_GLOBAL_NAME);
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(workspaceProvidersOriginal);
providers.add(provider);
LanguageSettingsManager.setWorkspaceProviders(providers);
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_CUSTOM_GLOBAL));
}
{
// remove global provider and restore original list
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(workspaceProvidersOriginal);
LanguageSettingsManager.setWorkspaceProviders(providers);
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_CUSTOM_GLOBAL));
}
}
/**
*/
public void testListenerRegisterer_GlobalProviderAddRemoveOutsideTheProject() throws Exception {
ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager.getWorkspaceProvider(PROVIDER_CUSTOM_GLOBAL);
// the global custom provider has not been added yet
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(workspaceProvider);
assertNull(rawProvider);
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_CUSTOM_GLOBAL));
// prepare project
List<ILanguageSettingsProvider> workspaceProvidersOriginal = LanguageSettingsManager.getWorkspaceProviders();
IProject project = ResourceHelper.createCDTProjectWithConfig(this.getName());
{
// get project descriptions
ICProjectDescription writableProjDescription = CoreModel.getDefault().getProjectDescription(project);
assertNotNull(writableProjDescription);
ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations();
assertEquals(1, cfgDescriptions.length);
ICConfigurationDescription cfgDescription = cfgDescriptions[0];
// add global provider
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(workspaceProvider);
cfgDescription.setLanguageSettingProviders(providers);
List<ILanguageSettingsProvider> storedProviders = cfgDescription.getLanguageSettingProviders();
assertEquals(1, storedProviders.size());
// write to project description
CoreModel.getDefault().setProjectDescription(project, writableProjDescription);
// the global custom provider has not been added yet
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_CUSTOM_GLOBAL));
}
{
// add global provider
ILanguageSettingsProvider provider = new MockListenerRegisterer(PROVIDER_CUSTOM_GLOBAL, PROVIDER_CUSTOM_GLOBAL_NAME);
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(provider);
LanguageSettingsManager.setWorkspaceProviders(providers);
assertEquals(1, MockListenerRegisterer.getCount(PROVIDER_CUSTOM_GLOBAL));
}
{
// remove global provider
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(workspaceProvidersOriginal);
LanguageSettingsManager.setWorkspaceProviders(providers);
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_CUSTOM_GLOBAL));
}
{
// close project
project.close(null);
assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_CUSTOM_GLOBAL));
}
}
}

View file

@ -44,7 +44,7 @@ public class LanguageSettingsManagerTests extends TestCase {
// Should match id of extension point defined in plugin.xml
private static final String EXTENSION_BASE_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.base.provider";
private static final String EXTENSION_EDITABLE_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.editable.language.settings.provider";
private static final String EXTENSION_EDITABLE_PROVIDER_NAME = "Test Plugin Editable Language Settings Provider";
private static final String EXTENSION_EDITABLE_PROVIDER_NAME = "Test Plugin Mock Editable Language Settings Provider";
private static final IFile FILE_0 = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path("/project/path0"));
private static final String CFG_ID = "test.configuration.id";

View file

@ -43,9 +43,9 @@ import org.w3c.dom.Element;
public class LanguageSettingsPersistenceProjectTests extends TestCase {
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 extension points 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_NAME = "Test Plugin Base Provider Subclass";
private static final String EXTENSION_PROVIDER_NAME = "Test Plugin Mock Base Provider Subclass";
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.0";

View file

@ -0,0 +1,103 @@
/*******************************************************************************
* Copyright (c) 2011, 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.core.language.settings.providers;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ILanguageSettingsEditableProvider;
import org.eclipse.core.runtime.Assert;
/**
* Language Settings Provider that keeps count how many times it has been registered.
*/
public class MockListenerRegisterer extends LanguageSettingsSerializable implements ILanguageSettingsEditableProvider, ICListenerRegisterer {
private static MockListenerManager mockListenerManager = new MockListenerManager();
private static class MockListenerManager {
private class ListenerCount {
private MockListenerRegisterer listener;
private int count;
public ListenerCount(MockListenerRegisterer l, int cnt) {
listener = l;
count = cnt;
}
}
private List<ListenerCount> register = new ArrayList<ListenerCount>();
public void registerListener(MockListenerRegisterer listener) {
for (ListenerCount lc : register) {
if (lc.listener == listener) {
lc.count++;
return;
}
}
register.add(new ListenerCount(listener, 1));
}
public void unregisterListener(MockListenerRegisterer listener) {
for (ListenerCount lc : register) {
if (lc.listener == listener) {
lc.count--;
Assert.isTrue(lc.count>=0);
return;
}
}
// attempt to unregister non-registered listener
Assert.isTrue(false);
}
/**
* Note that that count includes all listeners with that id.
*/
public int getCount(String id) {
int count = 0;
for (ListenerCount lc : register) {
if (lc.listener.getId().equals(id)) {
count = count + lc.count;
}
}
return count;
}
}
public MockListenerRegisterer() {
super();
}
public MockListenerRegisterer(String id, String name) {
super(id, name);
}
public void registerListener(ICConfigurationDescription cfgDescription) {
mockListenerManager.registerListener(this);
}
public void unregisterListener() {
mockListenerManager.unregisterListener(this);
}
@Override
public MockListenerRegisterer cloneShallow() throws CloneNotSupportedException {
return (MockListenerRegisterer) super.cloneShallow();
}
@Override
public MockListenerRegisterer clone() throws CloneNotSupportedException {
return (MockListenerRegisterer) super.clone();
}
public static int getCount(String id) {
return mockListenerManager.getCount(id);
}
}

View file

@ -201,7 +201,7 @@
-->
<provider
id="org.eclipse.cdt.core.tests.language.settings.base.provider"
name="Test Plugin Language Settings Base Provider"
name="Test Plugin Mock Language Settings Base Provider"
parameter="custom parameter">
<language-scope
id="org.eclipse.cdt.core.tests.language.id">
@ -250,12 +250,12 @@
<provider
class="org.eclipse.cdt.core.language.settings.providers.MockLanguageSettingsProvider"
id="org.eclipse.cdt.core.tests.custom.language.settings.provider"
name="Test Plugin Language Settings Provider">
name="Test Plugin Mock Language Settings Provider">
</provider>
<provider
class="org.eclipse.cdt.core.language.settings.providers.MockLanguageSettingsSerializableProvider"
id="org.eclipse.cdt.core.tests.custom.serializable.language.settings.provider"
name="Test Plugin Serializable Language Settings Provider">
name="Test Plugin Mock Serializable Language Settings Provider">
<entry
kind="macro"
name="MACRO"
@ -265,7 +265,7 @@
<provider
class="org.eclipse.cdt.core.language.settings.providers.MockLanguageSettingsEditableProvider"
id="org.eclipse.cdt.core.tests.custom.editable.language.settings.provider"
name="Test Plugin Editable Language Settings Provider">
name="Test Plugin Mock Editable Language Settings Provider">
<entry
kind="macro"
name="MACRO"
@ -275,7 +275,7 @@
<provider
class="org.eclipse.cdt.core.language.settings.providers.MockLanguageSettingsBaseProvider"
id="org.eclipse.cdt.core.tests.language.settings.base.provider.subclass"
name="Test Plugin Base Provider Subclass"
name="Test Plugin Mock Base Provider Subclass"
parameter="custom parameter subclass">
<entry
kind="includePath"
@ -285,6 +285,16 @@
</flag>
</entry>
</provider>
<provider
class="org.eclipse.cdt.core.language.settings.providers.MockListenerRegisterer"
id="org.eclipse.cdt.core.tests.language.settings.listener.registerer.provider"
name="Test Plugin Mock Listener Language Settings Provider">
<entry
kind="macro"
name="MACRO"
value="value">
</entry>
</provider>
<provider
id="org.eclipse.cdt.core.tests.language.settings"
name="Test Plugin Setting Entries UI Tester">

View file

@ -0,0 +1,24 @@
/*******************************************************************************
* Copyright (c) 2011, 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.core.language.settings.providers;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
/**
* Helper class to allow listeners self-register/dispose. Called by cdt core.
* TODO - expand in more detail.
*/
public interface ICListenerRegisterer {
public void registerListener(ICConfigurationDescription cfgDescription);
public void unregisterListener();
}

View file

@ -19,6 +19,7 @@ import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.language.settings.providers.ICListenerRegisterer;
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider;
import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsManager;
import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsSerializable;
@ -33,10 +34,6 @@ import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
@ -66,13 +63,22 @@ public class LanguageSettingsProvidersSerializer {
private static Map<String, ILanguageSettingsProvider> rawGlobalWorkspaceProviders = new HashMap<String, ILanguageSettingsProvider>();
private static Map<String, ILanguageSettingsProvider> globalWorkspaceProviders = new HashMap<String, ILanguageSettingsProvider>();
private static class LanguageSettingsWorkspaceProvider implements ILanguageSettingsProvider, IResourceChangeListener {
private String providerId;
private int registrationCount = 0;
private static class ListenerAssociation {
private ICListenerRegisterer listener;
private ICConfigurationDescription cfgDescription;
public ListenerAssociation(ICListenerRegisterer li, ICConfigurationDescription cfgd) {
listener = li;
cfgDescription = cfgd;
}
}
public LanguageSettingsWorkspaceProvider(String id) {
private static class LanguageSettingsWorkspaceProvider implements ILanguageSettingsProvider, ICListenerRegisterer {
private String providerId;
private int projectCount = 0;
private LanguageSettingsWorkspaceProvider(String id) {
Assert.isNotNull(id);
Assert.isTrue(id.length()>0);
providerId = id;
}
@ -117,22 +123,38 @@ public class LanguageSettingsProvidersSerializer {
}
/**
* {@inheritDoc}
*
* LanguageSettingsWorkspaceProvider delegates event handling to raw provider.
*
* We count number of times <b>workspace</b> provider (not the raw one!) associated
* with a <b>project</b>. If a project includes it multiple times via different configurations
* it still counts as 1.
*/
public void resourceChanged(IResourceChangeEvent event) {
// keep in mind that type of rawProvider can change
ILanguageSettingsProvider rawProvider = getRawProvider();
if (rawProvider instanceof IResourceChangeListener) {
((IResourceChangeListener) rawProvider).resourceChanged(event);
}
private int getProjectCount() {
return projectCount;
}
synchronized int incrementListenerCount(int inc) {
registrationCount += inc;
return registrationCount;
private synchronized int incrementProjectCount() {
projectCount++;
return projectCount;
}
private synchronized int decrementProjectCount() {
projectCount--;
return projectCount;
}
public void registerListener(ICConfigurationDescription cfgDescription) {
// keep in mind that rawProvider can change
ILanguageSettingsProvider rawProvider = getRawProvider();
if (rawProvider instanceof ICListenerRegisterer) {
((ICListenerRegisterer) rawProvider).registerListener(null);
}
}
public void unregisterListener() {
// keep in mind that rawProvider can change
ILanguageSettingsProvider rawProvider = getRawProvider();
if (rawProvider instanceof ICListenerRegisterer) {
((ICListenerRegisterer) rawProvider).unregisterListener();
}
}
}
@ -142,9 +164,8 @@ public class LanguageSettingsProvidersSerializer {
try {
loadLanguageSettingsWorkspace();
} catch (Throwable e) {
// log and swallow any exception
CCorePlugin.log("Error loading workspace language settings providers", e); //$NON-NLS-1$
} finally {
// swallow any exception
}
}
@ -195,8 +216,8 @@ public class LanguageSettingsProvidersSerializer {
}
}
List<ILanguageSettingsProvider> rawProviders = new ArrayList<ILanguageSettingsProvider>();
if (providers!=null) {
List<ILanguageSettingsProvider> rawProviders = new ArrayList<ILanguageSettingsProvider>();
for (ILanguageSettingsProvider provider : providers) {
if (isWorkspaceProvider(provider)) {
provider = rawGlobalWorkspaceProviders.get(provider.getId());
@ -210,6 +231,27 @@ public class LanguageSettingsProvidersSerializer {
}
}
List<ICListenerRegisterer> oldListeners = selectListeners(rawGlobalWorkspaceProviders.values());
List<ICListenerRegisterer> newListeners = selectListeners(rawProviders);
for (ICListenerRegisterer oldListener : oldListeners) {
if (!isObjectInTheList(newListeners, oldListener)) {
LanguageSettingsWorkspaceProvider wspProvider = (LanguageSettingsWorkspaceProvider) globalWorkspaceProviders.get(((ILanguageSettingsProvider)oldListener).getId());
if (wspProvider != null && wspProvider.getProjectCount() > 0) {
oldListener.unregisterListener();
}
}
}
for (ICListenerRegisterer newListener : newListeners) {
if (!isObjectInTheList(oldListeners, newListener)) {
LanguageSettingsWorkspaceProvider wspProvider = (LanguageSettingsWorkspaceProvider) globalWorkspaceProviders.get(((ILanguageSettingsProvider)newListener).getId());
if (wspProvider != null && wspProvider.getProjectCount() > 0) {
newListener.registerListener(null);
}
}
}
rawGlobalWorkspaceProviders = rawWorkspaceProviders;
}
@ -654,36 +696,39 @@ public class LanguageSettingsProvidersSerializer {
}
}
/**
* TODO - remove me
* Temporary method to report inconsistency in log.
*/
@Deprecated
public static void assertConsistency(ICConfigurationDescription cfgDescription) {
List<ILanguageSettingsProvider> listeners = new ArrayList<ILanguageSettingsProvider>();
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
for (ILanguageSettingsProvider provider : providers) {
if (isObjectInTheList(listeners, provider)) {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Inconsistent state, duplicate LSP in project description " + provider);
CoreException e = new CoreException(status);
CCorePlugin.log(e);
}
listeners.add(provider);
private static <T> boolean isObjectInTheList(Collection<T> list, T element) {
// list.contains(element) won't do it as we are interested in exact object, not in equal object
for (T elem : list) {
if (elem == element)
return true;
}
return false;
}
private static boolean isListenerInTheListOfAssociations(Collection<ListenerAssociation> list, ICListenerRegisterer element) {
// list.contains(element) won't do it as we are interested in exact object, not in equal object
for (ListenerAssociation la : list) {
if (la.listener == element)
return true;
}
return false;
}
/**
* Get a providers list including only providers of type IResourceChangeListener
* Get a providers list including only providers of type ICListenerRegisterer
* for a given project description - collecting from all configurations.
*/
private static List<IResourceChangeListener> getResourceChangeListeners(ICProjectDescription prjDescription) {
List<IResourceChangeListener> listeners = new ArrayList<IResourceChangeListener>();
private static List<ICListenerRegisterer> getListeners(ICProjectDescription prjDescription) {
List<ICListenerRegisterer> listeners = new ArrayList<ICListenerRegisterer>();
if (prjDescription != null) {
for (ICConfigurationDescription cfgDescription : prjDescription.getConfigurations()) {
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
for (ILanguageSettingsProvider provider : providers) {
if (provider instanceof IResourceChangeListener) {
listeners.add((IResourceChangeListener) provider);
if (provider instanceof ICListenerRegisterer) {
ICListenerRegisterer listener = (ICListenerRegisterer) provider;
if (!isObjectInTheList(listeners, listener)) {
listeners.add(listener);
}
}
}
}
@ -691,6 +736,35 @@ public class LanguageSettingsProvidersSerializer {
return listeners;
}
private static List<ICListenerRegisterer> selectListeners(Collection<ILanguageSettingsProvider> values) {
List<ICListenerRegisterer> listeners = new ArrayList<ICListenerRegisterer>();
for (ILanguageSettingsProvider provider : values) {
if (provider instanceof ICListenerRegisterer)
listeners.add((ICListenerRegisterer) provider);
}
return listeners;
}
/**
* Get a providers list including only providers of type IResourceChangeListener
* for a given project description - collecting from all configurations.
*/
private static List<ListenerAssociation> getListenersAssociations(ICProjectDescription prjDescription) {
List<ListenerAssociation> associations = new ArrayList<ListenerAssociation>();
if (prjDescription != null) {
for (ICConfigurationDescription cfgDescription : prjDescription.getConfigurations()) {
List<ILanguageSettingsProvider> providers = cfgDescription.getLanguageSettingProviders();
List<ICListenerRegisterer> listeners = selectListeners(providers);
for (ICListenerRegisterer listener : listeners) {
if (!isListenerInTheListOfAssociations(associations, listener)) {
associations.add(new ListenerAssociation(listener, cfgDescription));
}
}
}
}
return associations;
}
/**
* Unregister listeners which are not used anymore and register new listeners.
* The method is used when project description is applied to workspace.
@ -706,54 +780,46 @@ public class LanguageSettingsProvidersSerializer {
assertConsistency(oldPrjDescription); // TODO - remove me
assertConsistency(newPrjDescription); // TODO - remove me
IWorkspace workspace = ResourcesPlugin.getWorkspace();
List<ICListenerRegisterer> oldListeners = getListeners(oldPrjDescription);
List<ListenerAssociation> newAssociations = getListenersAssociations(newPrjDescription);
List<IResourceChangeListener> oldListeners = getResourceChangeListeners(oldPrjDescription);
List<IResourceChangeListener> newListeners = getResourceChangeListeners(newPrjDescription);
for (IResourceChangeListener listener : oldListeners) {
if (!isObjectInTheList(newListeners, listener)) {
for (ICListenerRegisterer oldListener : oldListeners) {
if (!isListenerInTheListOfAssociations(newAssociations, oldListener)) {
int count = 0;
if (listener instanceof LanguageSettingsWorkspaceProvider) {
count = ((LanguageSettingsWorkspaceProvider) listener).incrementListenerCount(-1);
if (oldListener instanceof LanguageSettingsWorkspaceProvider) {
count = ((LanguageSettingsWorkspaceProvider) oldListener).decrementProjectCount();
}
if (count == 0) {
workspace.removeResourceChangeListener(listener);
// TODO - remove me
CCorePlugin.log(new Status(IStatus.WARNING,CCorePlugin.PLUGIN_ID, oldPrjDescription.getProject() + ": Removed IResourceChangeListener "
+ "[" + System.identityHashCode(listener) + "] "
+ listener));
try {
oldListener.unregisterListener();
} catch (Throwable e) {
// protect from any exceptions from implementers
CCorePlugin.log(e);
}
}
}
}
for (IResourceChangeListener listener : newListeners) {
if (!isObjectInTheList(oldListeners, listener)) {
for (ListenerAssociation newListenerAssociation : newAssociations) {
ICListenerRegisterer newListener = newListenerAssociation.listener;
if (!isObjectInTheList(oldListeners, newListener)) {
int count = 1;
if (listener instanceof LanguageSettingsWorkspaceProvider) {
count = ((LanguageSettingsWorkspaceProvider) listener).incrementListenerCount(1);
if (newListener instanceof LanguageSettingsWorkspaceProvider) {
count = ((LanguageSettingsWorkspaceProvider) newListener).incrementProjectCount();
}
if (count == 1) {
workspace.addResourceChangeListener(listener);
// TODO - remove me
CCorePlugin.log(new Status(IStatus.WARNING,CCorePlugin.PLUGIN_ID, newPrjDescription.getProject() + ": Added IResourceChangeListener "
+ "[" + System.identityHashCode(listener) + "] "
+ listener));
try {
newListener.registerListener(newListenerAssociation.cfgDescription);
} catch (Throwable e) {
// protect from any exceptions from implementers
CCorePlugin.log(e);
}
}
}
}
}
private static <T> boolean isObjectInTheList(Collection<T> list, T element) {
// list.contains(element) won't do it as we are interested in exact object, not in equal object
for (T elem : list) {
if (elem == element)
return true;
}
return false;
}
/**
* Deep clone of a list of language settings providers.
*