1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-02 22:55:26 +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_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 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 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";

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_NAME = LanguageSettingsExtensionsTests.EXTENSION_BASE_PROVIDER_NAME;
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_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 {

View file

@ -218,33 +218,28 @@ public class LanguageSettingsExtensionManager {
}
/**
* Creates empty non-configured provider from extension point definition. The method will
* inspect extension registry for extension point "org.eclipse.cdt.core.LanguageSettingsProvider"
* Creates provider from extension point definition which matches value of the given attribute.
* The method will inspect extension registry for extension point "org.eclipse.cdt.core.LanguageSettingsProvider"
* 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 registry - extension registry
* @return new non-configured provider
* @param attr - attribute to match.
* @param attrValue - value of the attribute to match.
* @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) {
if (className==null || className.length()==0) {
return new LanguageSettingsBaseProvider();
}
private static ILanguageSettingsProvider loadProviderFromRegistry(String attr, String attrValue,
IExtensionRegistry registry, boolean configure) {
try {
IExtensionPoint extension = registry.getExtensionPoint(CCorePlugin.PLUGIN_ID, PROVIDER_EXTENSION_SIMPLE_ID);
if (extension != null) {
IExtension[] extensions = extension.getExtensions();
for (IExtension ext : extensions) {
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);
if (provider instanceof AbstractExecutableExtensionBase) {
String ceId = determineAttributeValue(cfgEl, ATTR_ID);
String ceName = determineAttributeValue(cfgEl, ATTR_NAME);
((AbstractExecutableExtensionBase) provider).setId(ceId);
((AbstractExecutableExtensionBase) provider).setName(ceName);
if (configure) {
configureExecutableProvider(provider, cfgEl);
}
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.
* @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())) {
return new LanguageSettingsSerializableProvider();
}
@ -277,7 +273,8 @@ public class LanguageSettingsExtensionManager {
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) {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Not able to load provider class=" + className); //$NON-NLS-1$
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
* will return raw provider.
* Load an instance of language settings provider of given id from the extension point.
* 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() {
ArrayList<ILanguageSettingsProvider> list = new ArrayList<ILanguageSettingsProvider>(fExtensionProviders.size());
for (String id : fExtensionProviders.keySet()) {
ILanguageSettingsProvider extensionProvider = getExtensionProviderCopy(id, true);
if (extensionProvider == null) {
extensionProvider = fExtensionProviders.get(id);
}
if (extensionProvider != null) {
list.add(extensionProvider);
}
/*package*/ static ILanguageSettingsProvider loadProvider(String id) {
if (id==null) {
return null;
}
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.
*
* @param providers - array of user defined providers
* @throws CoreException in case of problems
*/
public static void setWorkspaceProviders(List<ILanguageSettingsProvider> providers) throws CoreException {
setWorkspaceProvidersInternal(providers);
serializeLanguageSettingsWorkspace();
// generate preference change event
IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID);
prefs.putBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, ! prefs.getBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, false));
}
* Set and store user defined providers in workspace area.
*
* @param providers - array of user defined providers
* @throws CoreException in case of problems
*/
public static void setWorkspaceProviders(List<ILanguageSettingsProvider> providers) throws CoreException {
setWorkspaceProvidersInternal(providers);
serializeLanguageSettingsWorkspace();
// generate preference change event
IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID);
prefs.putBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, ! prefs.getBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, false));
}
/**
* Internal method to set user defined providers in memory.
@ -316,13 +316,8 @@ public class LanguageSettingsProvidersSerializer {
*/
private static void setWorkspaceProvidersInternal(List<ILanguageSettingsProvider> providers) {
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>();
if (providers!=null) {
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> newListeners = selectListeners(rawProviders);
@ -432,8 +441,9 @@ projects:
Element elementExtension = XmlUtil.appendElement(rootElement, ELEM_EXTENSION, new String[] {ATTR_POINT, LanguageSettingsExtensionManager.PROVIDER_EXTENSION_FULL_ID});
for (LanguageSettingsSerializableProvider provider : serializableWorkspaceProviders) {
// TODO don't serialize if equals to extension provider
provider.serialize(elementExtension);
if (!LanguageSettingsManager.isEqualExtensionProvider(provider, true)) {
provider.serialize(elementExtension);
}
}
try {
@ -495,9 +505,7 @@ projects:
if (providers == null) {
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) {
String attrClass = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_CLASS);
ILanguageSettingsProvider provider = LanguageSettingsExtensionManager.getProviderInstance(attrClass);
ILanguageSettingsProvider provider = LanguageSettingsExtensionManager.instantiateProviderClass(attrClass);
if (provider instanceof LanguageSettingsSerializableProvider)
((LanguageSettingsSerializableProvider)provider).load((Element) providerNode);