1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00
This commit is contained in:
Andrew Gvozdev 2011-12-11 21:47:24 -05:00
parent 35f8ff40dc
commit 3713fcd080
4 changed files with 113 additions and 53 deletions

View file

@ -25,10 +25,12 @@ public interface ILanguageSettingsProvidersKeeper {
* used to supply language settings {@link ICLanguageSettingEntry} such as include paths * used to supply language settings {@link ICLanguageSettingEntry} such as include paths
* or preprocessor macros. * or preprocessor macros.
* *
* @param providers the list of providers to assign to the owner (configuration description). * @param providers - the list of providers to assign to the owner (configuration description).
* This method clones the internal list or otherwise ensures immutability of the internal * This method clones the internal list or otherwise ensures immutability of the internal
* list before actual addition to the project model. * list before actual addition to the project model. That is to ensure that there is no
* That is due to TODO - very important reason but I forgot why by now. * back-door access and all changes in the list done by this method which fires notifications
* to the registered listeners about the accompanied changes in settings entries, see
* {@link LanguageSettingsManager#registerLanguageSettingsChangeListener(ILanguageSettingsChangeListener)}.
*/ */
public void setLanguageSettingProviders(List<ILanguageSettingsProvider> providers); public void setLanguageSettingProviders(List<ILanguageSettingsProvider> providers);

View file

@ -121,7 +121,10 @@ public class LanguageSettingsManager {
} }
/** /**
* Checks if the provider is defined on the workspace level. * Checks if the provider is a workspace level provider.
* This method is intended to check providers retrieved from a configuration.
* Raw providers from {@link #getRawProvider(ILanguageSettingsProvider)}
* are not considered as workspace providers.
* *
* @param provider - provider to check. * @param provider - provider to check.
* @return {@code true} if the given provider is workspace provider, {@code false} otherwise. * @return {@code true} if the given provider is workspace provider, {@code false} otherwise.
@ -131,12 +134,16 @@ public class LanguageSettingsManager {
} }
/** /**
* TODO - helper method for often used chunk of code * Helper method to get to real underlying provider collecting entries as opposed to wrapper
* @param provider * which is normally used for workspace provider.
* @return ILanguageSettingsProvider * @see LanguageSettingsProvidersSerializer#isWorkspaceProvider(ILanguageSettingsProvider)
*
* @param provider - the provider to get raw provider for. Can be either workspace provider
* or regular one.
* @return raw underlying provider for workspace provider or provider itself if no wrapper is used.
*/ */
public static ILanguageSettingsProvider getRawProvider(ILanguageSettingsProvider provider) { public static ILanguageSettingsProvider getRawProvider(ILanguageSettingsProvider provider) {
if (LanguageSettingsManager.isWorkspaceProvider(provider)){ if (LanguageSettingsManager.isWorkspaceProvider(provider)) {
provider = LanguageSettingsProvidersSerializer.getRawWorkspaceProvider(provider.getId()); provider = LanguageSettingsProvidersSerializer.getRawWorkspaceProvider(provider.getId());
} }
return provider; return provider;
@ -158,34 +165,43 @@ public class LanguageSettingsManager {
} }
/** /**
* TODO * Copy language settings provider. It is different from clone() methods in that
* @param deepCopy TODO * it does not throw {@code CloneNotSupportedException} but returns {@code null}
* @param id * instead.
*
* @param provider - language settings provider to copy.
* @param deep - {@code true} to request deep copy including copying settings entries
* or {@code false} to return shallow copy with no settings entries.
* *
* @return * @return a copy of the provider or null if copying is not possible.
*/ */
public static ILanguageSettingsEditableProvider getProviderCopy(ILanguageSettingsEditableProvider provider, boolean deep) { public static ILanguageSettingsEditableProvider getProviderCopy(ILanguageSettingsEditableProvider provider, boolean deep) {
return LanguageSettingsExtensionManager.getProviderCopy(provider, deep); return LanguageSettingsExtensionManager.getProviderCopy(provider, deep);
} }
/** /**
* Get Language Settings Provider defined via * Get language settings provider defined via extension point
* {@code org.eclipse.cdt.core.LanguageSettingsProvider} extension point. * {@code org.eclipse.cdt.core.LanguageSettingsProvider}.
* A new copy of the extension provider is returned.
* *
* @param id - ID of provider to find. * @param id - ID of the extension provider.
* @param deep TODO * @param deep - {@code true} to request deep copy including copying settings entries
* @return the copy of the provider if possible (i.e. for {@link ILanguageSettingsEditableProvider}) * or {@code false} to return shallow copy with no settings entries.
* or workspace provider if provider is not copyable. * @return the copy of the extension provider if possible (i.e. for {@link ILanguageSettingsEditableProvider})
* or {@code null} if provider is not copyable.
*/ */
public static ILanguageSettingsProvider getExtensionProviderCopy(String id, boolean deep) { public static ILanguageSettingsProvider getExtensionProviderCopy(String id, boolean deep) {
return LanguageSettingsExtensionManager.getExtensionProviderCopy(id, deep); return LanguageSettingsExtensionManager.getExtensionProviderCopy(id, deep);
} }
/** /**
* TODO * Test if the provider is equal to the one defined via extension point
* @param provider * {@code org.eclipse.cdt.core.LanguageSettingsProvider}.
* @param deep *
* @return * @param provider - the provider to test.
* @param deep - {@code true} to check for deep equality testing also settings entries
* or {@code false} to test shallow copy with no settings entries.
* @return - {@code true} if the provider matches the extension or {@code false} otherwise.
*/ */
public static boolean isEqualExtensionProvider(ILanguageSettingsProvider provider, boolean deep) { public static boolean isEqualExtensionProvider(ILanguageSettingsProvider provider, boolean deep) {
return LanguageSettingsExtensionManager.isEqualsExtensionProvider(provider, deep); return LanguageSettingsExtensionManager.isEqualsExtensionProvider(provider, deep);

View file

@ -276,8 +276,8 @@ public class LanguageSettingsExtensionManager {
} }
ILanguageSettingsProvider provider = createProviderCarcass(className, Platform.getExtensionRegistry()); ILanguageSettingsProvider provider = createProviderCarcass(className, Platform.getExtensionRegistry());
if (provider==null) { if (provider == null) {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, "Not able to load provider class=" + className); 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));
} }
return provider; return provider;
@ -291,20 +291,27 @@ public class LanguageSettingsExtensionManager {
ArrayList<ILanguageSettingsProvider> list = new ArrayList<ILanguageSettingsProvider>(fExtensionProviders.size()); ArrayList<ILanguageSettingsProvider> list = new ArrayList<ILanguageSettingsProvider>(fExtensionProviders.size());
for (String id : fExtensionProviders.keySet()) { for (String id : fExtensionProviders.keySet()) {
ILanguageSettingsProvider extensionProvider = getExtensionProviderCopy(id, true); ILanguageSettingsProvider extensionProvider = getExtensionProviderCopy(id, true);
if (extensionProvider==null) if (extensionProvider == null) {
extensionProvider = fExtensionProviders.get(id); extensionProvider = fExtensionProviders.get(id);
}
if (extensionProvider!=null) if (extensionProvider != null) {
list.add(extensionProvider); list.add(extensionProvider);
}
} }
return list; return list;
} }
/** /**
* TODO * Copy language settings provider. It is different from clone() methods in that
* @param provider * it does not throw {@code CloneNotSupportedException} but returns {@code null}
* @param deep * instead.
* @return *
* @param provider - language settings provider to copy.
* @param deep - {@code true} to request deep copy including copying settings entries
* or {@code false} to return shallow copy with no settings entries.
*
* @return a copy of the provider or null if copying is not possible.
*/ */
public static ILanguageSettingsEditableProvider getProviderCopy(ILanguageSettingsEditableProvider provider, boolean deep) { public static ILanguageSettingsEditableProvider getProviderCopy(ILanguageSettingsEditableProvider provider, boolean deep) {
try { try {
@ -320,12 +327,15 @@ public class LanguageSettingsExtensionManager {
} }
/** /**
* Get Language Settings Provider defined via * Get language settings provider defined via extension point
* {@code org.eclipse.cdt.core.LanguageSettingsProvider} extension point. * {@code org.eclipse.cdt.core.LanguageSettingsProvider}.
* A new copy of the extension provider is returned.
* *
* @param id - ID of provider to find. * @param id - ID of the extension provider.
* @param deep TODO * @param deep - {@code true} to request deep copy including copying settings entries
* @return the clone of the provider or {@code null} TODO if provider is not defined. * or {@code false} to return shallow copy with no settings entries.
* @return the copy of the extension provider if possible (i.e. for {@link ILanguageSettingsEditableProvider})
* or {@code null} if provider is not copyable.
*/ */
public static ILanguageSettingsProvider getExtensionProviderCopy(String id, boolean deep) { public static ILanguageSettingsProvider getExtensionProviderCopy(String id, boolean deep) {
ILanguageSettingsProvider provider = fExtensionProviders.get(id); ILanguageSettingsProvider provider = fExtensionProviders.get(id);
@ -337,10 +347,13 @@ public class LanguageSettingsExtensionManager {
} }
/** /**
* TODO * Test if the provider is equal to the one defined via extension point
* @param provider * {@code org.eclipse.cdt.core.LanguageSettingsProvider}.
* @param deep *
* @return * @param provider - the provider to test.
* @param deep - {@code true} to check for deep equality testing also settings entries
* or {@code false} to test shallow copy with no settings entries.
* @return - {@code true} if the provider matches the extension or {@code false} otherwise.
*/ */
public static boolean isEqualsExtensionProvider(ILanguageSettingsProvider provider, boolean deep) { public static boolean isEqualsExtensionProvider(ILanguageSettingsProvider provider, boolean deep) {
String id = provider.getId(); String id = provider.getId();

View file

@ -88,6 +88,9 @@ public class LanguageSettingsProvidersSerializer {
private static ListenerList fLanguageSettingsChangeListeners = new ListenerList(ListenerList.IDENTITY); private static ListenerList fLanguageSettingsChangeListeners = new ListenerList(ListenerList.IDENTITY);
/**
* language settings provider listener-cfgDescription association
*/
private static class ListenerAssociation { private static class ListenerAssociation {
private ICListenerAgent listener; private ICListenerAgent listener;
private ICConfigurationDescription cfgDescription; private ICConfigurationDescription cfgDescription;
@ -98,6 +101,11 @@ public class LanguageSettingsProvidersSerializer {
} }
} }
/**
* Wrapper for workspace providers to ensure level of indirection. That way workspace providers
* can be changed/replaced without notifying/changing the configurations which keep the providers
* in their lists.
*/
private static class LanguageSettingsWorkspaceProvider implements ILanguageSettingsProvider, ICListenerAgent { private static class LanguageSettingsWorkspaceProvider implements ILanguageSettingsProvider, ICListenerAgent {
private String providerId; private String providerId;
private int projectCount = 0; private int projectCount = 0;
@ -141,6 +149,7 @@ public class LanguageSettingsProvidersSerializer {
} }
return false; return false;
} }
/** /**
* Method toString() for debugging purposes. * Method toString() for debugging purposes.
*/ */
@ -171,7 +180,7 @@ public class LanguageSettingsProvidersSerializer {
@Override @Override
public void registerListener(ICConfigurationDescription cfgDescription) { public void registerListener(ICConfigurationDescription cfgDescription) {
// keep in mind that rawProvider can change // keep in mind that rawProvider can change externally
ILanguageSettingsProvider rawProvider = getRawProvider(); ILanguageSettingsProvider rawProvider = getRawProvider();
if (rawProvider instanceof ICListenerAgent) { if (rawProvider instanceof ICListenerAgent) {
((ICListenerAgent) rawProvider).registerListener(null); ((ICListenerAgent) rawProvider).registerListener(null);
@ -180,7 +189,7 @@ public class LanguageSettingsProvidersSerializer {
@Override @Override
public void unregisterListener() { public void unregisterListener() {
// keep in mind that rawProvider can change // keep in mind that rawProvider can change externally
ILanguageSettingsProvider rawProvider = getRawProvider(); ILanguageSettingsProvider rawProvider = getRawProvider();
if (rawProvider instanceof ICListenerAgent) { if (rawProvider instanceof ICListenerAgent) {
((ICListenerAgent) rawProvider).unregisterListener(); ((ICListenerAgent) rawProvider).unregisterListener();
@ -190,7 +199,6 @@ public class LanguageSettingsProvidersSerializer {
/** /**
* Language Settings Change Event implementation. * Language Settings Change Event implementation.
*
*/ */
private static class LanguageSettingsChangeEvent implements ILanguageSettingsChangeEvent { private static class LanguageSettingsChangeEvent implements ILanguageSettingsChangeEvent {
private String projectName = null; private String projectName = null;
@ -287,7 +295,7 @@ public class LanguageSettingsProvidersSerializer {
} }
/** /**
* Set and store in workspace area user defined providers. * 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
@ -424,6 +432,7 @@ 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
provider.serialize(elementExtension); provider.serialize(elementExtension);
} }
@ -448,14 +457,17 @@ projects:
} }
} }
/**
* Load language settings for workspace.
*/
public static void loadLanguageSettingsWorkspace() throws CoreException { public static void loadLanguageSettingsWorkspace() throws CoreException {
List <ILanguageSettingsProvider> providers = null; List <ILanguageSettingsProvider> providers = null;
URI uriStoreWsp = getStoreInWorkspaceArea(STORAGE_WORKSPACE_LANGUAGE_SETTINGS); URI uriStoreWsp = getStoreInWorkspaceArea(STORAGE_WORKSPACE_LANGUAGE_SETTINGS);
Document doc = null; Document doc = null;
serializingLock.acquire();
try { try {
serializingLock.acquire();
doc = XmlUtil.loadXml(uriStoreWsp); doc = XmlUtil.loadXml(uriStoreWsp);
} catch (Exception e) { } catch (Exception e) {
CCorePlugin.log("Can't load preferences from file "+uriStoreWsp, e); //$NON-NLS-1$ CCorePlugin.log("Can't load preferences from file "+uriStoreWsp, e); //$NON-NLS-1$
@ -463,12 +475,12 @@ projects:
serializingLock.release(); serializingLock.release();
} }
if (doc!=null) { if (doc != null) {
Element rootElement = doc.getDocumentElement(); Element rootElement = doc.getDocumentElement();
NodeList providerNodes = rootElement.getElementsByTagName(LanguageSettingsSerializableProvider.ELEM_PROVIDER); NodeList providerNodes = rootElement.getElementsByTagName(LanguageSettingsSerializableProvider.ELEM_PROVIDER);
List<String> userDefinedProvidersIds = new ArrayList<String>(); List<String> userDefinedProvidersIds = new ArrayList<String>();
for (int i=0;i<providerNodes.getLength();i++) { for (int i = 0; i < providerNodes.getLength(); i++) {
Node providerNode = providerNodes.item(i); Node providerNode = providerNodes.item(i);
String providerId = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_ID); String providerId = XmlUtil.determineAttributeValue(providerNode, LanguageSettingsExtensionManager.ATTR_ID);
if (userDefinedProvidersIds.contains(providerId)) { if (userDefinedProvidersIds.contains(providerId)) {
@ -479,10 +491,10 @@ projects:
userDefinedProvidersIds.add(providerId); userDefinedProvidersIds.add(providerId);
ILanguageSettingsProvider provider = loadProvider(providerNode); ILanguageSettingsProvider provider = loadProvider(providerNode);
if (provider!=null) { if (provider != null) {
if (providers==null) if (providers == null) {
providers= new ArrayList<ILanguageSettingsProvider>(); providers = new ArrayList<ILanguageSettingsProvider>();
}
if (!LanguageSettingsManager.isEqualExtensionProvider(provider, true)) { if (!LanguageSettingsManager.isEqualExtensionProvider(provider, true)) {
providers.add(provider); providers.add(provider);
} }
@ -615,6 +627,8 @@ projects:
} }
/** /**
* Load language settings to the project description from XML.
*
* @noreference This method is not intended to be referenced by clients. * @noreference This method is not intended to be referenced by clients.
* It is public solely for benefit of JUnit testing. * It is public solely for benefit of JUnit testing.
*/ */
@ -748,6 +762,10 @@ projects:
return provider; return provider;
} }
/**
* Load language settings from workspace and project storages for the given project description.
* @param prjDescription - project description to load language settings.
*/
public static void loadLanguageSettings(ICProjectDescription prjDescription) { public static void loadLanguageSettings(ICProjectDescription prjDescription) {
IProject project = prjDescription.getProject(); IProject project = prjDescription.getProject();
IFile storePrj = project.getFile(SETTINGS_FOLDER_NAME+STORAGE_PROJECT_LANGUAGE_SETTINGS); IFile storePrj = project.getFile(SETTINGS_FOLDER_NAME+STORAGE_PROJECT_LANGUAGE_SETTINGS);
@ -766,8 +784,8 @@ projects:
URI uriStoreWsp = getStoreInWorkspaceArea(project.getName()+'.'+STORAGE_WORKSPACE_LANGUAGE_SETTINGS); URI uriStoreWsp = getStoreInWorkspaceArea(project.getName()+'.'+STORAGE_WORKSPACE_LANGUAGE_SETTINGS);
Document docWsp = null; Document docWsp = null;
serializingLock.acquire();
try { try {
serializingLock.acquire();
docWsp = XmlUtil.loadXml(uriStoreWsp); docWsp = XmlUtil.loadXml(uriStoreWsp);
} finally { } finally {
serializingLock.release(); serializingLock.release();
@ -821,6 +839,14 @@ projects:
return provider; return provider;
} }
/**
* Helper method to get to real underlying provider collecting entries as opposed to wrapper
* which is normally used for workspace provider.
* @see LanguageSettingsProvidersSerializer#isWorkspaceProvider(ILanguageSettingsProvider)
*
* @param id - ID of the provider.
* @return raw underlying provider.
*/
public static ILanguageSettingsProvider getRawWorkspaceProvider(String id) { public static ILanguageSettingsProvider getRawWorkspaceProvider(String id) {
return rawGlobalWorkspaceProviders.get(id); return rawGlobalWorkspaceProviders.get(id);
} }
@ -839,11 +865,13 @@ projects:
} }
/** /**
* Checks if the provider is defined on the workspace level. * Checks if the provider is a workspace level provider.
* This method is intended to check providers retrieved from a configuration.
* Raw providers from {@link #getRawWorkspaceProvider(String)}
* are not considered as workspace providers.
* *
* @param provider - provider to check. * @param provider - provider to check.
* @return {@code true} if the given provider is workspace provider, {@code false} otherwise. * @return {@code true} if the given provider is workspace provider, {@code false} otherwise.
*
*/ */
public static boolean isWorkspaceProvider(ILanguageSettingsProvider provider) { public static boolean isWorkspaceProvider(ILanguageSettingsProvider provider) {
return provider instanceof LanguageSettingsWorkspaceProvider; return provider instanceof LanguageSettingsWorkspaceProvider;
@ -1066,6 +1094,7 @@ projects:
return LanguageSettingsStorage.getPooledList(provider.getSettingEntries(cfgDescription, rc, languageId)); return LanguageSettingsStorage.getPooledList(provider.getSettingEntries(cfgDescription, rc, languageId));
} catch (Throwable e) { } catch (Throwable e) {
String cfgId = cfgDescription!=null ? cfgDescription.getId() : null; String cfgId = cfgDescription!=null ? cfgDescription.getId() : null;
@SuppressWarnings("nls")
String msg = "Exception in provider "+provider.getId()+": getSettingEntries("+cfgId+", "+rc+", "+languageId+")"; String msg = "Exception in provider "+provider.getId()+": getSettingEntries("+cfgId+", "+rc+", "+languageId+")";
CCorePlugin.log(msg, e); CCorePlugin.log(msg, e);
// return empty list to prevent getting potentially non-empty list from up the resource tree // return empty list to prevent getting potentially non-empty list from up the resource tree