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

Separate extension and workspace providers inside implementation

This commit is contained in:
Andrew Gvozdev 2011-12-13 18:23:04 -05:00
parent a34ad0edcf
commit e64c995ff0
4 changed files with 118 additions and 58 deletions

View file

@ -48,6 +48,7 @@ public class LanguageSettingsExtensionsTests extends BaseTestCase {
/*package*/ static final String EXTENSION_SERIALIZABLE_PROVIDER_MISSING_PARAMETER = "parameter"; /*package*/ static final String EXTENSION_SERIALIZABLE_PROVIDER_MISSING_PARAMETER = "parameter";
/*package*/ static final String EXTENSION_EDITABLE_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.editable.language.settings.provider"; /*package*/ static final String EXTENSION_EDITABLE_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.editable.language.settings.provider";
/*package*/ static final String EXTENSION_EDITABLE_PROVIDER_NAME = "Test Plugin Mock Editable Language Settings Provider"; /*package*/ static final String EXTENSION_EDITABLE_PROVIDER_NAME = "Test Plugin Mock Editable Language Settings Provider";
/*package*/ static final ICLanguageSettingEntry EXTENSION_SERIALIZABLE_PROVIDER_ENTRY = new CMacroEntry("MACRO", "value", 0);
/*package*/ static final ICLanguageSettingEntry EXTENSION_EDITABLE_PROVIDER_ENTRY = new CMacroEntry("MACRO", "value", 0); /*package*/ static final ICLanguageSettingEntry EXTENSION_EDITABLE_PROVIDER_ENTRY = new CMacroEntry("MACRO", "value", 0);
/*package*/ static final String EXTENSION_REGISTERER_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.listener.registerer.provider"; /*package*/ static final String EXTENSION_REGISTERER_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.listener.registerer.provider";
/*package*/ static final String EXTENSION_USER_PROVIDER_ID = "org.eclipse.cdt.ui.user.LanguageSettingsProvider"; /*package*/ static final String EXTENSION_USER_PROVIDER_ID = "org.eclipse.cdt.ui.user.LanguageSettingsProvider";

View file

@ -44,6 +44,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase {
private static final String EXTENSION_BASE_PROVIDER_ID = LanguageSettingsExtensionsTests.EXTENSION_BASE_PROVIDER_ID; private static final String EXTENSION_BASE_PROVIDER_ID = LanguageSettingsExtensionsTests.EXTENSION_BASE_PROVIDER_ID;
private static final String EXTENSION_BASE_PROVIDER_NAME = LanguageSettingsExtensionsTests.EXTENSION_BASE_PROVIDER_NAME; private static final String EXTENSION_BASE_PROVIDER_NAME = LanguageSettingsExtensionsTests.EXTENSION_BASE_PROVIDER_NAME;
private static final String EXTENSION_SERIALIZABLE_PROVIDER_ID = LanguageSettingsExtensionsTests.EXTENSION_SERIALIZABLE_PROVIDER_ID; private static final String EXTENSION_SERIALIZABLE_PROVIDER_ID = LanguageSettingsExtensionsTests.EXTENSION_SERIALIZABLE_PROVIDER_ID;
private static final ICLanguageSettingEntry EXTENSION_SERIALIZABLE_PROVIDER_ENTRY = LanguageSettingsExtensionsTests.EXTENSION_SERIALIZABLE_PROVIDER_ENTRY;
private static final String LANGUAGE_SETTINGS_PROJECT_XML = ".settings/language.settings.xml"; private static final String LANGUAGE_SETTINGS_PROJECT_XML = ".settings/language.settings.xml";
private static final String LANGUAGE_SETTINGS_WORKSPACE_XML = "language.settings.xml"; private static final String LANGUAGE_SETTINGS_WORKSPACE_XML = "language.settings.xml";
@ -337,6 +338,49 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase {
} }
} }
/**
*/
public void testWorkspacePersistence_UnmodifiedExtensionProvider() throws Exception {
List<ICLanguageSettingEntry> extensionEntries = new ArrayList<ICLanguageSettingEntry>();
extensionEntries.add(EXTENSION_SERIALIZABLE_PROVIDER_ENTRY);
{
// test initial state of the extension provider
ILanguageSettingsProvider extProvider = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_SERIALIZABLE_PROVIDER_ID, true);
assertNull(extProvider);
}
{
// get the workspace provider
ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID);
// check that entries match that of extension provider
assertEquals(extensionEntries, provider.getSettingEntries(null, null, null));
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider);
assertTrue(LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true));
// serialize language settings of workspace providers
LanguageSettingsManager.serializeLanguageSettingsWorkspace();
}
{
// re-load
LanguageSettingsProvidersSerializer.loadLanguageSettingsWorkspace();
// ensure the workspace provider still matches extension
ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID);
assertEquals(EXTENSION_SERIALIZABLE_PROVIDER_ID, provider.getId());
assertEquals(extensionEntries, provider.getSettingEntries(null, null, null));
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider);
assertTrue(LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true));
// replace entries
assertTrue(rawProvider instanceof LanguageSettingsSerializableProvider);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 0));
((LanguageSettingsSerializableProvider)rawProvider).setSettingEntries(null, null, null, entries);
// check that the extension provider is not affected
assertTrue(!LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true));
}
}
/** /**
*/ */
public void testWorkspacePersistence_GlobalProvider() throws Exception { public void testWorkspacePersistence_GlobalProvider() throws Exception {

View file

@ -218,33 +218,28 @@ public class LanguageSettingsExtensionManager {
} }
/** /**
* Creates empty non-configured provider from extension point definition. The method will * Creates provider from extension point definition which matches value of the given attribute.
* inspect extension registry for extension point "org.eclipse.cdt.core.LanguageSettingsProvider" * The method will inspect extension registry for extension point "org.eclipse.cdt.core.LanguageSettingsProvider"
* to determine bundle and instantiate the class. * to determine bundle and instantiate the class.
* ID and name of provider are assigned from the first encountered extension point specifying the class.
* *
* @param className - full qualified class name of provider. * @param attr - attribute to match.
* @param registry - extension registry * @param attrValue - value of the attribute to match.
* @return new non-configured provider * @param registry - extension registry.
* @param configure - flag which indicates if provider needs to be configured.
* @return new instance of the provider
*/ */
private static ILanguageSettingsProvider createProviderCarcass(String className, IExtensionRegistry registry) { private static ILanguageSettingsProvider loadProviderFromRegistry(String attr, String attrValue,
if (className==null || className.length()==0) { IExtensionRegistry registry, boolean configure) {
return new LanguageSettingsBaseProvider();
}
try { try {
IExtensionPoint extension = registry.getExtensionPoint(CCorePlugin.PLUGIN_ID, PROVIDER_EXTENSION_SIMPLE_ID); IExtensionPoint extension = registry.getExtensionPoint(CCorePlugin.PLUGIN_ID, PROVIDER_EXTENSION_SIMPLE_ID);
if (extension != null) { if (extension != null) {
IExtension[] extensions = extension.getExtensions(); IExtension[] extensions = extension.getExtensions();
for (IExtension ext : extensions) { for (IExtension ext : extensions) {
for (IConfigurationElement cfgEl : ext.getConfigurationElements()) { for (IConfigurationElement cfgEl : ext.getConfigurationElements()) {
if (cfgEl.getName().equals(ELEM_PROVIDER) && className.equals(cfgEl.getAttribute(ATTR_CLASS))) { if (cfgEl.getName().equals(ELEM_PROVIDER) && attrValue.equals(cfgEl.getAttribute(attr))) {
ILanguageSettingsProvider provider = createExecutableExtension(cfgEl); ILanguageSettingsProvider provider = createExecutableExtension(cfgEl);
if (provider instanceof AbstractExecutableExtensionBase) { if (configure) {
String ceId = determineAttributeValue(cfgEl, ATTR_ID); configureExecutableProvider(provider, cfgEl);
String ceName = determineAttributeValue(cfgEl, ATTR_NAME);
((AbstractExecutableExtensionBase) provider).setId(ceId);
((AbstractExecutableExtensionBase) provider).setName(ceName);
} }
return provider; return provider;
} }
@ -258,12 +253,13 @@ public class LanguageSettingsExtensionManager {
} }
/** /**
* Create an instance of language settings provider of given class name. * Create an instance of non-configured language settings provider of given class name.
* The class should be known or registered with the extension point.
* *
* @param className - class name to instantiate. * @param className - class name to instantiate.
* @return new instance of language settings provider. * @return new instance of language settings provider.
*/ */
/*package*/ static ILanguageSettingsProvider getProviderInstance(String className) { /*package*/ static ILanguageSettingsProvider instantiateProviderClass(String className) {
if (className==null || className.equals(LanguageSettingsSerializableProvider.class.getName())) { if (className==null || className.equals(LanguageSettingsSerializableProvider.class.getName())) {
return new LanguageSettingsSerializableProvider(); return new LanguageSettingsSerializableProvider();
} }
@ -277,7 +273,8 @@ public class LanguageSettingsExtensionManager {
return new LanguageSettingsGenericProvider(); return new LanguageSettingsGenericProvider();
} }
ILanguageSettingsProvider provider = createProviderCarcass(className, Platform.getExtensionRegistry()); // Create it as executable extension from the extension registry.
ILanguageSettingsProvider provider = loadProviderFromRegistry(ATTR_CLASS, className, Platform.getExtensionRegistry(), false);
if (provider == null) { if (provider == null) {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Not able to load provider class=" + className); //$NON-NLS-1$ IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Not able to load provider class=" + className); //$NON-NLS-1$
CCorePlugin.log(new CoreException(status)); CCorePlugin.log(new CoreException(status));
@ -286,22 +283,32 @@ public class LanguageSettingsExtensionManager {
} }
/** /**
* @return list of providers contributed by all extensions. Preferable copy but if not possible * Load an instance of language settings provider of given id from the extension point.
* will return raw provider. * The class should be registered with the extension point.
*
* @param id - class name to instantiate.
* @return new instance of language settings provider.
*/ */
/*package*/ static List<ILanguageSettingsProvider> getExtensionProvidersInternal() { /*package*/ static ILanguageSettingsProvider loadProvider(String id) {
ArrayList<ILanguageSettingsProvider> list = new ArrayList<ILanguageSettingsProvider>(fExtensionProviders.size()); if (id==null) {
for (String id : fExtensionProviders.keySet()) { return null;
ILanguageSettingsProvider extensionProvider = getExtensionProviderCopy(id, true);
if (extensionProvider == null) {
extensionProvider = fExtensionProviders.get(id);
}
if (extensionProvider != null) {
list.add(extensionProvider);
}
} }
return list;
// Create it as executable extension from the extension registry.
ILanguageSettingsProvider provider = loadProviderFromRegistry(ATTR_ID, id, Platform.getExtensionRegistry(), true);
if (provider == null) {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Not able to load provider id=" + id); //$NON-NLS-1$
CCorePlugin.log(new CoreException(status));
}
return provider;
}
/**
* Returns list of provider id-s contributed by all extensions.
* @return list of provider id-s contributed by all extensions.
*/
public static Set<String> getExtensionProviderIds() {
return fExtensionProviders.keySet();
} }
/** /**

View file

@ -295,18 +295,18 @@ public class LanguageSettingsProvidersSerializer {
} }
/** /**
* Set and store user defined providers in workspace area. * Set and store user defined providers in workspace area.
* *
* @param providers - array of user defined providers * @param providers - array of user defined providers
* @throws CoreException in case of problems * @throws CoreException in case of problems
*/ */
public static void setWorkspaceProviders(List<ILanguageSettingsProvider> providers) throws CoreException { public static void setWorkspaceProviders(List<ILanguageSettingsProvider> providers) throws CoreException {
setWorkspaceProvidersInternal(providers); setWorkspaceProvidersInternal(providers);
serializeLanguageSettingsWorkspace(); serializeLanguageSettingsWorkspace();
// generate preference change event // generate preference change event
IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID); IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID);
prefs.putBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, ! prefs.getBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, false)); prefs.putBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, ! prefs.getBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, false));
} }
/** /**
* Internal method to set user defined providers in memory. * Internal method to set user defined providers in memory.
@ -316,13 +316,8 @@ public class LanguageSettingsProvidersSerializer {
*/ */
private static void setWorkspaceProvidersInternal(List<ILanguageSettingsProvider> providers) { private static void setWorkspaceProvidersInternal(List<ILanguageSettingsProvider> providers) {
Map<String, ILanguageSettingsProvider> rawWorkspaceProviders = new HashMap<String, ILanguageSettingsProvider>(); Map<String, ILanguageSettingsProvider> rawWorkspaceProviders = new HashMap<String, ILanguageSettingsProvider>();
List<ILanguageSettingsProvider> extensionProviders = new ArrayList<ILanguageSettingsProvider>(LanguageSettingsExtensionManager.getExtensionProvidersInternal());
for (ILanguageSettingsProvider rawExtensionProvider : extensionProviders) {
if (rawExtensionProvider!=null) {
rawWorkspaceProviders.put(rawExtensionProvider.getId(), rawExtensionProvider);
}
}
// given providers
List<ILanguageSettingsProvider> rawProviders = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> rawProviders = new ArrayList<ILanguageSettingsProvider>();
if (providers!=null) { if (providers!=null) {
for (ILanguageSettingsProvider provider : providers) { for (ILanguageSettingsProvider provider : providers) {
@ -338,6 +333,20 @@ public class LanguageSettingsProvidersSerializer {
} }
} }
// fill the rest from extension registry
// this list is independent from the internal list of extensions in LanguageSettingsExtensionManager
for (String id : LanguageSettingsExtensionManager.getExtensionProviderIds()) {
if (!rawWorkspaceProviders.containsKey(id)) {
ILanguageSettingsProvider provider = LanguageSettingsExtensionManager.getExtensionProviderCopy(id, true);
if (provider == null) {
provider = LanguageSettingsExtensionManager.loadProvider(id);
}
if (provider != null) {
rawWorkspaceProviders.put(provider.getId(), provider);
}
}
}
List<ICListenerAgent> oldListeners = selectListeners(rawGlobalWorkspaceProviders.values()); List<ICListenerAgent> oldListeners = selectListeners(rawGlobalWorkspaceProviders.values());
List<ICListenerAgent> newListeners = selectListeners(rawProviders); List<ICListenerAgent> newListeners = selectListeners(rawProviders);
@ -432,8 +441,9 @@ projects:
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 (LanguageSettingsSerializableProvider provider : serializableWorkspaceProviders) { for (LanguageSettingsSerializableProvider provider : serializableWorkspaceProviders) {
// TODO don't serialize if equals to extension provider if (!LanguageSettingsManager.isEqualExtensionProvider(provider, true)) {
provider.serialize(elementExtension); provider.serialize(elementExtension);
}
} }
try { try {
@ -495,9 +505,7 @@ projects:
if (providers == null) { if (providers == null) {
providers = new ArrayList<ILanguageSettingsProvider>(); providers = new ArrayList<ILanguageSettingsProvider>();
} }
if (!LanguageSettingsManager.isEqualExtensionProvider(provider, true)) { providers.add(provider);
providers.add(provider);
}
} }
} }
} }
@ -754,7 +762,7 @@ projects:
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.instantiateProviderClass(attrClass);
if (provider instanceof LanguageSettingsSerializableProvider) if (provider instanceof LanguageSettingsSerializableProvider)
((LanguageSettingsSerializableProvider)provider).load((Element) providerNode); ((LanguageSettingsSerializableProvider)provider).load((Element) providerNode);