mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-29 11:55:40 +02:00
Bug 312575 Changes aren't propagated when the referencing project references the active configuration. JavaDoc + tests.
This commit is contained in:
parent
01dc2b7d1e
commit
f3fdc00e62
8 changed files with 394 additions and 93 deletions
|
@ -24,28 +24,43 @@ import junit.framework.TestSuite;
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.testplugin.ResourceHelper;
|
import org.eclipse.cdt.core.testplugin.ResourceHelper;
|
||||||
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
|
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRunnable;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class for testing exported settings and project references
|
* Class for testing exported settings and project references.
|
||||||
|
* This functionality is provided by the CfgExportSettingContainerFactory which plugins
|
||||||
|
* into the CExternalSettingsManager
|
||||||
*/
|
*/
|
||||||
public class CConfigurationDescriptionExportSettings extends BaseTestCase {
|
public class CConfigurationDescriptionExportSettings extends BaseTestCase {
|
||||||
|
|
||||||
@Override
|
CoreModel coreModel = CoreModel.getDefault();
|
||||||
protected void setUp() throws Exception {
|
|
||||||
super.setUp();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void tearDown() throws Exception {
|
|
||||||
super.tearDown();
|
|
||||||
ResourceHelper.cleanUp();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TestSuite suite() {
|
public static TestSuite suite() {
|
||||||
return suite(CConfigurationDescriptionExportSettings.class, "_");
|
return suite(CConfigurationDescriptionExportSettings.class, "_");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setting entries 1
|
||||||
|
final ICLanguageSettingEntry entries[] = new ICLanguageSettingEntry[]{
|
||||||
|
new CMacroEntry("a", "b", 0),
|
||||||
|
new CMacroEntry("c", "d", 0),
|
||||||
|
new CIncludePathEntry("a/b/c", 0),
|
||||||
|
new CIncludePathEntry("d/e/f", 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Setting entries 2
|
||||||
|
final ICLanguageSettingEntry entries2[] = new ICLanguageSettingEntry[]{
|
||||||
|
new CMacroEntry("a2", "b2", 0),
|
||||||
|
new CMacroEntry("c2", "d2", 0),
|
||||||
|
new CIncludePathEntry("a/b/c/2", 0),
|
||||||
|
new CIncludePathEntry("d/e/f/2", 0),
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This tests for simple reference propagation.
|
* This tests for simple reference propagation.
|
||||||
* It used to live in the Managedbuild testsuite in ProjectModelTests.java
|
* It used to live in the Managedbuild testsuite in ProjectModelTests.java
|
||||||
|
@ -54,7 +69,6 @@ public class CConfigurationDescriptionExportSettings extends BaseTestCase {
|
||||||
public void testReferences() throws Exception {
|
public void testReferences() throws Exception {
|
||||||
final String projectName4 = "test4";
|
final String projectName4 = "test4";
|
||||||
final String projectName5 = "test5";
|
final String projectName5 = "test5";
|
||||||
CoreModel coreModel = CoreModel.getDefault();
|
|
||||||
|
|
||||||
IProject project4 = ResourceHelper.createCDTProjectWithConfig(projectName4);
|
IProject project4 = ResourceHelper.createCDTProjectWithConfig(projectName4);
|
||||||
IProject project5 = ResourceHelper.createCDTProjectWithConfig(projectName5);
|
IProject project5 = ResourceHelper.createCDTProjectWithConfig(projectName5);
|
||||||
|
@ -63,12 +77,6 @@ public class CConfigurationDescriptionExportSettings extends BaseTestCase {
|
||||||
ICProjectDescription des5 = coreModel.getProjectDescription(project5);
|
ICProjectDescription des5 = coreModel.getProjectDescription(project5);
|
||||||
ICConfigurationDescription dess[] = des5.getConfigurations();
|
ICConfigurationDescription dess[] = des5.getConfigurations();
|
||||||
|
|
||||||
ICLanguageSettingEntry entries[] = new ICLanguageSettingEntry[]{
|
|
||||||
new CMacroEntry("a", "b", 0),
|
|
||||||
new CMacroEntry("c", "d", 0),
|
|
||||||
new CIncludePathEntry("a/b/c", 0),
|
|
||||||
new CIncludePathEntry("d/e/f", 0),
|
|
||||||
};
|
|
||||||
dess[0].createExternalSetting(null, null, null, entries);
|
dess[0].createExternalSetting(null, null, null, entries);
|
||||||
dess[0].setActive();
|
dess[0].setActive();
|
||||||
|
|
||||||
|
@ -124,18 +132,9 @@ public class CConfigurationDescriptionExportSettings extends BaseTestCase {
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public void testProjectImport() throws Exception {
|
public void testProjectImport() throws Exception {
|
||||||
CoreModel coreModel = CoreModel.getDefault();
|
|
||||||
final IProject libProj = ResourceHelper.createCDTProjectWithConfig("libProj");
|
final IProject libProj = ResourceHelper.createCDTProjectWithConfig("libProj");
|
||||||
final IProject mainProj = ResourceHelper.createCDTProjectWithConfig("mainProj");
|
final IProject mainProj = ResourceHelper.createCDTProjectWithConfig("mainProj");
|
||||||
|
|
||||||
// Settings to set on the lib project
|
|
||||||
final ICLanguageSettingEntry entries[] = new ICLanguageSettingEntry[]{
|
|
||||||
new CMacroEntry("a", "b", 0),
|
|
||||||
new CMacroEntry("c", "d", 0),
|
|
||||||
new CIncludePathEntry("a/b/c", 0),
|
|
||||||
new CIncludePathEntry("d/e/f", 0),
|
|
||||||
};
|
|
||||||
|
|
||||||
// set the settings on the lib config; reference it from the main config
|
// set the settings on the lib config; reference it from the main config
|
||||||
{
|
{
|
||||||
ICProjectDescription desLib = coreModel.getProjectDescription(libProj);
|
ICProjectDescription desLib = coreModel.getProjectDescription(libProj);
|
||||||
|
@ -176,8 +175,8 @@ public class CConfigurationDescriptionExportSettings extends BaseTestCase {
|
||||||
libProj.open(null);
|
libProj.open(null);
|
||||||
|
|
||||||
// Referenced settings should still exist
|
// Referenced settings should still exist
|
||||||
ICConfigurationDescription cfgMain = coreModel.getProjectDescription(mainProj).getActiveConfiguration();
|
ICConfigurationDescription cfgMain = coreModel.getProjectDescription(mainProj, false).getActiveConfiguration();
|
||||||
ICConfigurationDescription cfgLib = coreModel.getProjectDescription(libProj).getActiveConfiguration();
|
ICConfigurationDescription cfgLib = coreModel.getProjectDescription(libProj, false).getActiveConfiguration();
|
||||||
|
|
||||||
checkEquivContents(cfgLib.getExternalSettings()[0].getEntries(), entries);
|
checkEquivContents(cfgLib.getExternalSettings()[0].getEntries(), entries);
|
||||||
for (ICLanguageSettingEntry e : entries) {
|
for (ICLanguageSettingEntry e : entries) {
|
||||||
|
@ -186,17 +185,293 @@ public class CConfigurationDescriptionExportSettings extends BaseTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkEquivContents(Object[] a1, Object[] a2) {
|
/**
|
||||||
if(a1 == null){
|
* Tests that updating the exported settings on the active configuration, without updating the set
|
||||||
assertTrue(a2 == null);
|
* of references, is correctly picked up in referencing projects.
|
||||||
|
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=312575
|
||||||
|
*/
|
||||||
|
public void testUpdateExportedSettingsActiveCfg() throws Exception {
|
||||||
|
final IProject libProj = ResourceHelper.createCDTProjectWithConfig("libUpdateExtSettings");
|
||||||
|
final IProject mainProj = ResourceHelper.createCDTProjectWithConfig("mainProjUpdateExtSettings");
|
||||||
|
|
||||||
|
{
|
||||||
|
// set the settings on the lib config; reference it from the main config
|
||||||
|
ICProjectDescription desLib = coreModel.getProjectDescription(libProj);
|
||||||
|
ICProjectDescription desMain = coreModel.getProjectDescription(mainProj);
|
||||||
|
ICConfigurationDescription cfgLib = desLib.getActiveConfiguration();
|
||||||
|
ICConfigurationDescription cfgMain = desMain.getActiveConfiguration();
|
||||||
|
|
||||||
|
cfgLib.createExternalSetting(null, null, null, entries);
|
||||||
|
coreModel.setProjectDescription(libProj, desLib);
|
||||||
|
|
||||||
|
// Main Project references lib project
|
||||||
|
cfgMain.setReferenceInfo(new HashMap<String, String>() {{ put(libProj.getName(), ""); }});
|
||||||
|
coreModel.setProjectDescription(mainProj, desMain);
|
||||||
|
|
||||||
|
// Referenced settings have been picked up
|
||||||
|
for (ICLanguageSettingEntry e : entries) {
|
||||||
|
assertTrue(cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Now apply different language setting entries
|
||||||
|
ICProjectDescription desLib = coreModel.getProjectDescription(libProj);
|
||||||
|
ICConfigurationDescription cfgLib = desLib.getActiveConfiguration();
|
||||||
|
cfgLib.removeExternalSetting(cfgLib.getExternalSettings()[0]);
|
||||||
|
cfgLib.createExternalSetting(null, null, null, entries2);
|
||||||
|
coreModel.setProjectDescription(libProj, desLib);
|
||||||
|
|
||||||
|
// Check the exported settings is correct
|
||||||
|
checkEquivContents(entries2, cfgLib.getExternalSettings()[0].getEntries());
|
||||||
|
// Fetch the configuration a-fresh to pick up the settings
|
||||||
|
ICConfigurationDescription cfgMain = coreModel.getProjectDescription(mainProj, false).getActiveConfiguration();
|
||||||
|
assertTrue(cfgMain.getReferenceInfo().containsKey(libProj.getName()));
|
||||||
|
|
||||||
|
// Referenced settings have changed from entries -> entries2
|
||||||
|
for (ICLanguageSettingEntry e : entries)
|
||||||
|
assertTrue(!cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
for (ICLanguageSettingEntry e : entries2)
|
||||||
|
assertTrue(cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the same as testeUpdateExprtedSettingsActiveCfg except we explicitly name the
|
||||||
|
* referenced configuration.
|
||||||
|
* Tests that updating the exported settings on a name configuration, without updating the set
|
||||||
|
* of references, is correctly picked up in referencing projects
|
||||||
|
*/
|
||||||
|
public void testUpdateExportedSettingsNamedConfig() throws Exception {
|
||||||
|
final IProject libProj = ResourceHelper.createCDTProjectWithConfig("libUpdateExpSettingsNamed");
|
||||||
|
final IProject mainProj = ResourceHelper.createCDTProjectWithConfig("mainProjUpdateExpSettingsNamed");
|
||||||
|
|
||||||
|
{
|
||||||
|
// set the settings on the lib config; reference it from the main config
|
||||||
|
ICProjectDescription desLib = coreModel.getProjectDescription(libProj);
|
||||||
|
ICProjectDescription desMain = coreModel.getProjectDescription(mainProj);
|
||||||
|
final ICConfigurationDescription cfgLib = desLib.getActiveConfiguration();
|
||||||
|
ICConfigurationDescription cfgMain = desMain.getActiveConfiguration();
|
||||||
|
|
||||||
|
cfgLib.createExternalSetting(null, null, null, entries);
|
||||||
|
coreModel.setProjectDescription(libProj, desLib);
|
||||||
|
|
||||||
|
// Main Project references lib project
|
||||||
|
cfgMain.setReferenceInfo(new HashMap<String, String>() {{ put(libProj.getName(), cfgLib.getId()); }});
|
||||||
|
coreModel.setProjectDescription(mainProj, desMain);
|
||||||
|
|
||||||
|
// Referenced settings have been picked up
|
||||||
|
for (ICLanguageSettingEntry e : entries) {
|
||||||
|
assertTrue(cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Now apply different language setting entries
|
||||||
|
ICProjectDescription desLib = coreModel.getProjectDescription(libProj);
|
||||||
|
ICConfigurationDescription cfgLib = desLib.getActiveConfiguration();
|
||||||
|
cfgLib.removeExternalSetting(cfgLib.getExternalSettings()[0]);
|
||||||
|
cfgLib.createExternalSetting(null, null, null, entries2);
|
||||||
|
coreModel.setProjectDescription(libProj, desLib);
|
||||||
|
|
||||||
|
// Check the exported settings is correct
|
||||||
|
checkEquivContents(entries2, cfgLib.getExternalSettings()[0].getEntries());
|
||||||
|
// Fetch the configuration a-fresh to pick up the settings
|
||||||
|
ICConfigurationDescription cfgMain = coreModel.getProjectDescription(mainProj, false).getActiveConfiguration();
|
||||||
|
assertTrue(cfgMain.getReferenceInfo().get(libProj.getName()).equals(cfgLib.getId()));
|
||||||
|
|
||||||
|
// Referenced settings have changed from entries -> entries2
|
||||||
|
for (ICLanguageSettingEntry e : entries)
|
||||||
|
assertTrue(!cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
for (ICLanguageSettingEntry e : entries2)
|
||||||
|
assertTrue(cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bug 312575 tests that updating a .cproject external (e.g. via a repository update)
|
||||||
|
* causes referencing projects to correctly pick up changes to the project exports.
|
||||||
|
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=312575
|
||||||
|
*/
|
||||||
|
public void _testExportedSettingsExternalUpdate() throws Exception {
|
||||||
|
final IProject libProj = ResourceHelper.createCDTProjectWithConfig("libProj312575");
|
||||||
|
final IProject mainProj = ResourceHelper.createCDTProjectWithConfig("mainProj312575");
|
||||||
|
|
||||||
|
// .cproject file and its backup
|
||||||
|
IFile libCproject = libProj.getFile(".cproject");
|
||||||
|
IFile libCproject_back = libProj.getFile(".cproject_back");
|
||||||
|
|
||||||
|
// set the settings on the lib config; reference it from the main config
|
||||||
|
{
|
||||||
|
ICProjectDescription desLib = coreModel.getProjectDescription(libProj);
|
||||||
|
ICProjectDescription desMain = coreModel.getProjectDescription(mainProj);
|
||||||
|
final ICConfigurationDescription cfgLib = desLib.getActiveConfiguration();
|
||||||
|
ICConfigurationDescription cfgMain = desMain.getActiveConfiguration();
|
||||||
|
|
||||||
|
cfgLib.createExternalSetting(null, null, null, entries);
|
||||||
|
coreModel.setProjectDescription(libProj, desLib);
|
||||||
|
|
||||||
|
// Main Project references lib project
|
||||||
|
cfgMain.setReferenceInfo(new HashMap<String, String>() {{ put(libProj.getName(), cfgLib.getId()); }});
|
||||||
|
coreModel.setProjectDescription(mainProj, desMain);
|
||||||
|
checkEquivContents(entries, cfgLib.getExternalSettings()[0].getEntries());
|
||||||
|
|
||||||
|
// Referenced settings have been picked up
|
||||||
|
for (ICLanguageSettingEntry e : entries) {
|
||||||
|
assertTrue(cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Backup the .cproject
|
||||||
|
libCproject_back.create(libCproject.getContents(), false, null);
|
||||||
|
|
||||||
|
// Now apply different language setting entries
|
||||||
|
cfgLib.removeExternalSetting(cfgLib.getExternalSettings()[0]);
|
||||||
|
cfgLib.createExternalSetting(null, null, null, entries2);
|
||||||
|
coreModel.setProjectDescription(libProj, desLib);
|
||||||
|
checkEquivContents(entries2, cfgLib.getExternalSettings()[0].getEntries());
|
||||||
|
// Referenced settings have been picked up
|
||||||
|
for (ICLanguageSettingEntry e : entries2) {
|
||||||
|
assertTrue(coreModel.getProjectDescription(mainProj).getActiveConfiguration().getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now replace the .cproject with .cproject_back. The exported settings should be picked up in the referenced config
|
||||||
|
libCproject.setContents(libCproject_back.getContents(), IResource.NONE, null);
|
||||||
|
|
||||||
|
// Referenced settings should still exist
|
||||||
|
ICConfigurationDescription cfgLib = coreModel.getProjectDescription(libProj, false).getActiveConfiguration();
|
||||||
|
ICConfigurationDescription cfgMain = coreModel.getProjectDescription(mainProj, false).getActiveConfiguration();
|
||||||
|
|
||||||
|
checkEquivContents(entries, cfgLib.getExternalSettings()[0].getEntries());
|
||||||
|
// Referencing project contains entries and not entries2
|
||||||
|
for (ICLanguageSettingEntry e : entries) {
|
||||||
|
assertTrue(cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
for (ICLanguageSettingEntry e : entries2) {
|
||||||
|
assertTrue(!cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Two configurations in two projects reference each other.
|
||||||
|
* Test that the system is happy with this and updates each correctly on
|
||||||
|
* the other's change.
|
||||||
|
*/
|
||||||
|
public void _testExportedSettingsCyclicExternalUpdate() throws Exception {
|
||||||
|
final IProject libProj = ResourceHelper.createCDTProjectWithConfig("libProjCyclic");
|
||||||
|
final IProject mainProj = ResourceHelper.createCDTProjectWithConfig("libProjCyclic2");
|
||||||
|
|
||||||
|
// .cproject file and its backup
|
||||||
|
final IFile libCproject = libProj.getFile(".cproject");
|
||||||
|
final IFile libCproject_back = libProj.getFile(".cproject_back");
|
||||||
|
final IFile mainCproject = mainProj.getFile(".cproject");
|
||||||
|
final IFile mainCproject_back = mainProj.getFile(".cproject_back");
|
||||||
|
|
||||||
|
// set the settings on the lib config; reference it from the main config & vice versa
|
||||||
|
{
|
||||||
|
ICProjectDescription desLib = coreModel.getProjectDescription(libProj);
|
||||||
|
ICProjectDescription desMain = coreModel.getProjectDescription(mainProj);
|
||||||
|
final ICConfigurationDescription cfgLib = desLib.getActiveConfiguration();
|
||||||
|
final ICConfigurationDescription cfgMain = desMain.getActiveConfiguration();
|
||||||
|
|
||||||
|
// Lib Exports entries
|
||||||
|
cfgLib.createExternalSetting(null, null, null, entries);
|
||||||
|
// Main Exports entries2
|
||||||
|
cfgMain.createExternalSetting(null, null, null, entries2);
|
||||||
|
|
||||||
|
// Main Project references lib project
|
||||||
|
cfgMain.setReferenceInfo(new HashMap<String, String>() {{ put(libProj.getName(), cfgLib.getId()); }});
|
||||||
|
cfgLib.setReferenceInfo(new HashMap<String, String>() {{ put(mainProj.getName(), cfgMain.getId()); }});
|
||||||
|
coreModel.setProjectDescription(libProj, desLib);
|
||||||
|
coreModel.setProjectDescription(mainProj, desMain);
|
||||||
|
|
||||||
|
checkEquivContents(entries, cfgLib.getExternalSettings()[0].getEntries());
|
||||||
|
checkEquivContents(entries2, cfgMain.getExternalSettings()[0].getEntries());
|
||||||
|
|
||||||
|
// Backup the .cproject
|
||||||
|
libCproject_back.create(libCproject.getContents(), false, null);
|
||||||
|
mainCproject_back.create(mainCproject.getContents(), false, null);
|
||||||
|
|
||||||
|
// Now apply different language setting entries
|
||||||
|
cfgLib.removeExternalSetting(cfgLib.getExternalSettings()[0]);
|
||||||
|
cfgLib.createExternalSetting(null, null, null, entries2);
|
||||||
|
coreModel.setProjectDescription(libProj, desLib);
|
||||||
|
cfgMain.removeExternalSetting(cfgMain.getExternalSettings()[0]);
|
||||||
|
cfgMain.createExternalSetting(null, null, null, entries);
|
||||||
|
coreModel.setProjectDescription(mainProj, desMain);
|
||||||
|
|
||||||
|
checkEquivContents(entries2, cfgLib.getExternalSettings()[0].getEntries());
|
||||||
|
checkEquivContents(entries, cfgMain.getExternalSettings()[0].getEntries());
|
||||||
|
|
||||||
|
}
|
||||||
|
ICConfigurationDescription cfgLib = coreModel.getProjectDescription(libProj).getActiveConfiguration();
|
||||||
|
ICConfigurationDescription cfgMain = coreModel.getProjectDescription(mainProj).getActiveConfiguration();
|
||||||
|
|
||||||
|
// Tests the exports are now the right way round
|
||||||
|
for (ICLanguageSettingEntry e : entries) {
|
||||||
|
assertTrue(!cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
assertTrue(cfgLib.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
for (ICLanguageSettingEntry e : entries2) {
|
||||||
|
assertTrue(cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
assertTrue(!cfgLib.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now replace the .cproject with .cproject_back. The exported settings should be picked up in the referenced config
|
||||||
|
ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
|
||||||
|
public void run(IProgressMonitor monitor) throws CoreException {
|
||||||
|
libCproject.setContents(libCproject_back.getContents(), IResource.NONE, null);
|
||||||
|
mainCproject.setContents(mainCproject_back.getContents(), IResource.NONE, null);
|
||||||
|
}
|
||||||
|
}, null);
|
||||||
|
|
||||||
|
// Referenced settings should still exist
|
||||||
|
cfgLib = coreModel.getProjectDescription(libProj).getActiveConfiguration();
|
||||||
|
cfgMain = coreModel.getProjectDescription(mainProj).getActiveConfiguration();
|
||||||
|
|
||||||
|
checkEquivContents(entries, cfgLib.getExternalSettings()[0].getEntries());
|
||||||
|
checkEquivContents(entries2, cfgMain.getExternalSettings()[0].getEntries());
|
||||||
|
// Referencing project contains entries and not entries2
|
||||||
|
for (ICLanguageSettingEntry e : entries) {
|
||||||
|
assertTrue(cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
assertTrue(!cfgLib.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
for (ICLanguageSettingEntry e : entries2) {
|
||||||
|
assertTrue(!cfgMain.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
assertTrue(cfgLib.getRootFolderDescription().getLanguageSettingForFile("a.c").
|
||||||
|
getSettingEntriesList(e.getKind()).contains(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void checkEquivContents(Object[] expected, Object[] actual) {
|
||||||
|
if(expected == null){
|
||||||
|
assertTrue(actual == null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assertTrue(a2 != null);
|
assertTrue(actual != null);
|
||||||
assertEquals(a1.length, a2.length);
|
assertEquals(expected.length, actual.length);
|
||||||
|
|
||||||
Set s1 = new HashSet(Arrays.asList(a1));
|
Set s1 = new HashSet(Arrays.asList(expected));
|
||||||
Set s2 = new HashSet(Arrays.asList(a2));
|
Set s2 = new HashSet(Arrays.asList(actual));
|
||||||
assertEquals(a1.length, s1.size());
|
assertEquals(expected.length, s1.size());
|
||||||
assertEquals(s1, s2);
|
assertEquals(s1, s2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2007, 2008 Intel Corporation and others.
|
* Copyright (c) 2007, 2010 Intel Corporation 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
|
||||||
|
@ -195,23 +195,38 @@ public interface ICConfigurationDescription extends ICSettingContainer, ICSettin
|
||||||
void setSourceEntries(ICSourceEntry[] entries) throws CoreException, WriteAccessException;
|
void setSourceEntries(ICSourceEntry[] entries) throws CoreException, WriteAccessException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns the reference information for this configuration, i.e. the information on the projects/configurations
|
* Returns a Map of configurations referenced by this configuration. Settings exported
|
||||||
* this configuration references
|
* by a project configuration are automatically picked up by any referencing configurations.
|
||||||
* the map contains the project_name<->configuration_id associations
|
* <p>
|
||||||
* if the current configuration does not reference any other configurations,
|
* This Map is keyed by project name with value equal to the referenced configuration's ID, or the
|
||||||
* empty map is returned
|
* empty string. The empty string is a special configuration value which indicates the reference
|
||||||
|
* tracks the Active configuration in the referenced Project.
|
||||||
|
* <p>
|
||||||
|
* If the current configuration does not reference any other configurations,
|
||||||
|
* an empty map is returned.
|
||||||
|
*
|
||||||
|
* @return Map<String,String> of referenced Project -> Configuration ID
|
||||||
|
* @see {@link #setReferenceInfo(Map)} <br/>
|
||||||
|
* {@link #getExternalSettings()}<br/>
|
||||||
|
* {@link #createExternalSetting(String[], String[], String[], ICSettingEntry[])}
|
||||||
*/
|
*/
|
||||||
Map<String, String> getReferenceInfo();
|
Map<String, String> getReferenceInfo();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sets the reference information for this configuration, i.e. the information on the projects/configurations
|
* Sets the reference information for this configuration. This configuration
|
||||||
* this configuration references
|
* will pick up settings exported by referenced configurations.
|
||||||
* the map should contain the project_name<->configuration_id associations
|
* <p>
|
||||||
*
|
* This reference information is a map from project name to configuration ID
|
||||||
* @param refs
|
* within the referenced project.
|
||||||
|
* The empty string is a special configuration value which indicates the reference
|
||||||
|
* tracks the Active configuration in the referenced Project.
|
||||||
*
|
*
|
||||||
|
* @param refs Map of project name -> configuration ID of referenced configurations
|
||||||
* @throws WriteAccessException when the configuration description is read-only
|
* @throws WriteAccessException when the configuration description is read-only
|
||||||
* see {@link CoreModel#getProjectDescription(org.eclipse.core.resources.IProject, boolean)}
|
* see {@link CoreModel#getProjectDescription(org.eclipse.core.resources.IProject, boolean)}
|
||||||
|
* @see {@link #getReferenceInfo()} <br/>
|
||||||
|
* {@link #getExternalSettings()}<br/>
|
||||||
|
* {@link #createExternalSetting(String[], String[], String[], ICSettingEntry[])}
|
||||||
*/
|
*/
|
||||||
void setReferenceInfo(Map<String, String> refs) throws WriteAccessException;
|
void setReferenceInfo(Map<String, String> refs) throws WriteAccessException;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2007, 2009 Intel Corporation and others.
|
* Copyright (c) 2007, 2010 Intel Corporation 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
|
||||||
|
@ -15,6 +15,21 @@ import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Root of the External Settings Provider Factory hierarchy. These
|
||||||
|
* are responsible for creating {@link CExternalSettingsContainer}s
|
||||||
|
* for a given settings provider id. The container
|
||||||
|
* is a simple container for external settings accessible via:
|
||||||
|
* {@link CExternalSettingsContainer#getExternalSettings()}
|
||||||
|
*
|
||||||
|
* There are two concrete implementation of this in CDT:
|
||||||
|
* <ul>
|
||||||
|
* <li>{@link CfgExportSettingContainerFactory} responsible for settings propagated
|
||||||
|
* referenced configurations.</li>
|
||||||
|
* <li>{@link ExtensionContainerFactory} responsible for settings contributed
|
||||||
|
* using the external settings extension point.</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
public abstract class CExternalSettingContainerFactory {
|
public abstract class CExternalSettingContainerFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2007 Intel Corporation and others.
|
* Copyright (c) 2007, 2010 Intel Corporation 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
|
||||||
|
@ -7,14 +7,24 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Intel Corporation - Initial API and implementation
|
* Intel Corporation - Initial API and implementation
|
||||||
|
* James Blackburn (Broadcom Corp.)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.settings.model;
|
package org.eclipse.cdt.internal.core.settings.model;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.settings.model.CExternalSetting;
|
import org.eclipse.cdt.core.settings.model.CExternalSetting;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container class which returns the {@link CExternalSetting}s
|
||||||
|
* for a given context.
|
||||||
|
*/
|
||||||
public abstract class CExternalSettingsContainer {
|
public abstract class CExternalSettingsContainer {
|
||||||
|
|
||||||
|
/** Empty array of external settings */
|
||||||
|
public static final CExternalSetting[] EMPTY_EXT_SETTINGS_ARRAY = new CExternalSetting[0];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return CExternalSetting[] of settings in this container; never null
|
||||||
|
*/
|
||||||
public abstract CExternalSetting[] getExternalSettings();
|
public abstract CExternalSetting[] getExternalSettings();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,6 @@ import org.eclipse.cdt.internal.core.settings.model.CExternalSettinsDeltaCalcula
|
||||||
public class CExternalSettingsHolder extends CExternalSettingsContainer {
|
public class CExternalSettingsHolder extends CExternalSettingsContainer {
|
||||||
private Map<ExtSettingMapKey, CExternalSetting> fSettingsMap;
|
private Map<ExtSettingMapKey, CExternalSetting> fSettingsMap;
|
||||||
static final String ELEMENT_EXT_SETTINGS_CONTAINER = "externalSettings"; //$NON-NLS-1$
|
static final String ELEMENT_EXT_SETTINGS_CONTAINER = "externalSettings"; //$NON-NLS-1$
|
||||||
static final CExternalSetting[] EMPTY_EXT_SETTINGS_ARRAY = new CExternalSetting[0];
|
|
||||||
|
|
||||||
private boolean fIsModified;
|
private boolean fIsModified;
|
||||||
|
|
||||||
|
|
|
@ -200,31 +200,11 @@ public class CExternalSettingsManager implements ICExternalSettingsListener, ICP
|
||||||
private static class NullFactory extends CExternalSettingContainerFactory {
|
private static class NullFactory extends CExternalSettingContainerFactory {
|
||||||
static NullFactory INSTANCE = new NullFactory();
|
static NullFactory INSTANCE = new NullFactory();
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addListener(ICExternalSettingsListener listener) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CExternalSettingsContainer createContainer(String id,
|
public CExternalSettingsContainer createContainer(String id,
|
||||||
IProject project, ICConfigurationDescription cfgDes, CExternalSetting[] previousSettings) throws CoreException {
|
IProject project, ICConfigurationDescription cfgDes, CExternalSetting[] previousSettings) throws CoreException {
|
||||||
return NullContainer.INSTANCE;
|
return NullContainer.INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// public String[] getSupplierIds() {
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeListener(ICExternalSettingsListener listener) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void shutdown() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void startup() {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class FactoryDescriptor {
|
private class FactoryDescriptor {
|
||||||
|
|
|
@ -11,12 +11,12 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.settings.model;
|
package org.eclipse.cdt.internal.core.settings.model;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.settings.model.CExternalSetting;
|
import org.eclipse.cdt.core.settings.model.CExternalSetting;
|
||||||
|
@ -34,12 +34,18 @@ import org.eclipse.core.runtime.CoreException;
|
||||||
/**
|
/**
|
||||||
* A class responsible for persisting CDT Projects and Configuration IDs as referenced
|
* A class responsible for persisting CDT Projects and Configuration IDs as referenced
|
||||||
* by other configurations in other projects.
|
* by other configurations in other projects.
|
||||||
* The user controls this via RefsTab and integrators can use
|
* The user controls this via RefsTab. This External settings factory listens
|
||||||
|
* for CProjectDescription model changes and notifies the {@link CExternalSettingsManager},
|
||||||
|
* which is a listener, of changes to the set of external settings.
|
||||||
* {@link ICConfigurationDescription#setReferenceInfo(Map)} and {@link ICConfigurationDescription#getReferenceInfo()}
|
* {@link ICConfigurationDescription#setReferenceInfo(Map)} and {@link ICConfigurationDescription#getReferenceInfo()}
|
||||||
*/
|
*/
|
||||||
public class CfgExportSettingContainerFactory extends
|
public class CfgExportSettingContainerFactory extends
|
||||||
CExternalSettingContainerFactoryWithListener implements ICProjectDescriptionListener {
|
CExternalSettingContainerFactoryWithListener implements ICProjectDescriptionListener {
|
||||||
|
|
||||||
|
/** ID of this external settings factory */
|
||||||
static final String FACTORY_ID = CCorePlugin.PLUGIN_ID + ".cfg.export.settings.sipplier"; //$NON-NLS-1$
|
static final String FACTORY_ID = CCorePlugin.PLUGIN_ID + ".cfg.export.settings.sipplier"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/** Empty String is a the magic configuration ID which maps to the Active configuration */
|
||||||
private static final String ACTIVE_CONFIG_ID = ""; //$NON-NLS-1$
|
private static final String ACTIVE_CONFIG_ID = ""; //$NON-NLS-1$
|
||||||
private static final char DELIMITER = ';';
|
private static final char DELIMITER = ';';
|
||||||
|
|
||||||
|
@ -230,7 +236,7 @@ public class CfgExportSettingContainerFactory extends
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the set of ReferenceIDs (project_name;config_id) for the project descriptions
|
* Returns the set of containers (Project configurations) (project_name;config_id) for the project descriptions
|
||||||
* reported as changed by the ICDescriptionDelta
|
* reported as changed by the ICDescriptionDelta
|
||||||
* @param delta
|
* @param delta
|
||||||
* @return String[] of Configuration Reference IDs
|
* @return String[] of Configuration Reference IDs
|
||||||
|
@ -240,7 +246,7 @@ public class CfgExportSettingContainerFactory extends
|
||||||
return new String[0];
|
return new String[0];
|
||||||
int deltaKind = delta.getDeltaKind();
|
int deltaKind = delta.getDeltaKind();
|
||||||
|
|
||||||
List<String> cfgIds = new ArrayList<String>();
|
Set<String> cfgIds = new HashSet<String>();
|
||||||
switch(deltaKind){
|
switch(deltaKind){
|
||||||
case ICDescriptionDelta.ADDED:
|
case ICDescriptionDelta.ADDED:
|
||||||
case ICDescriptionDelta.REMOVED:
|
case ICDescriptionDelta.REMOVED:
|
||||||
|
@ -264,28 +270,23 @@ public class CfgExportSettingContainerFactory extends
|
||||||
String[] ids = new String[cfgIds.size()];
|
String[] ids = new String[cfgIds.size()];
|
||||||
if(ids.length != 0){
|
if(ids.length != 0){
|
||||||
String projName = ((ICProjectDescription)delta.getSetting()).getProject().getName();
|
String projName = ((ICProjectDescription)delta.getSetting()).getProject().getName();
|
||||||
for(int i = 0; i < ids.length; i++){
|
int i = 0;
|
||||||
ids[i] = createId(projName, cfgIds.get(i));
|
for (String config : cfgIds)
|
||||||
}
|
ids[i++] = createId(projName, config);
|
||||||
}
|
}
|
||||||
return ids;
|
return ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the set of changed {Added, Remove & Changed} configuration IDs as discvoered
|
* Return the set of changed {Added, Remove & Changed} configuration IDs as discovered
|
||||||
* from an ICDescrptionDelta[]
|
* from an ICDescrptionDelta[]
|
||||||
* @param deltas
|
* @param deltas
|
||||||
* @param c
|
* @param c
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private Collection<String> collectCfgIds(ICDescriptionDelta[] deltas, Collection<String> c){
|
private Collection<String> collectCfgIds(ICDescriptionDelta[] deltas, Collection<String> c){
|
||||||
if(c == null)
|
for (ICDescriptionDelta delta : deltas) {
|
||||||
c = new ArrayList<String>();
|
switch (delta.getDeltaKind()) {
|
||||||
for(int i = 0; i < deltas.length; i++){
|
|
||||||
ICDescriptionDelta delta = deltas[i];
|
|
||||||
int deltaKind = delta.getDeltaKind();
|
|
||||||
|
|
||||||
switch(deltaKind){
|
|
||||||
case ICDescriptionDelta.ADDED:
|
case ICDescriptionDelta.ADDED:
|
||||||
case ICDescriptionDelta.REMOVED:
|
case ICDescriptionDelta.REMOVED:
|
||||||
c.add(delta.getSetting().getId());
|
c.add(delta.getSetting().getId());
|
||||||
|
@ -296,6 +297,9 @@ public class CfgExportSettingContainerFactory extends
|
||||||
(ICDescriptionDelta.EXTERNAL_SETTINGS_ADDED
|
(ICDescriptionDelta.EXTERNAL_SETTINGS_ADDED
|
||||||
| ICDescriptionDelta.EXTERNAL_SETTINGS_REMOVED)) != 0){
|
| ICDescriptionDelta.EXTERNAL_SETTINGS_REMOVED)) != 0){
|
||||||
c.add(delta.getSetting().getId());
|
c.add(delta.getSetting().getId());
|
||||||
|
// If this is the Active configuration, then record it as changed too (bug 312575)
|
||||||
|
if (delta.getSetting().getConfiguration().isActive())
|
||||||
|
c.add(ACTIVE_CONFIG_ID);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,9 @@ package org.eclipse.cdt.internal.core.settings.model;
|
||||||
|
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listener for external settings changes
|
||||||
|
*/
|
||||||
public interface ICExternalSettingsListener {
|
public interface ICExternalSettingsListener {
|
||||||
void settingsChanged(IProject project, String cfgId, CExternalSettingChangeEvent event);
|
void settingsChanged(IProject project, String cfgId, CExternalSettingChangeEvent event);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue