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:
parent
a34ad0edcf
commit
e64c995ff0
4 changed files with 118 additions and 58 deletions
|
@ -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";
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue