### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/JavaProject.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java,v retrieving revision 1.422 diff -u -r1.422 JavaProject.java --- model/org/eclipse/jdt/internal/core/JavaProject.java 7 Mar 2009 00:58:56 -0000 1.422 +++ model/org/eclipse/jdt/internal/core/JavaProject.java 23 Mar 2009 10:10:35 -0000 @@ -161,6 +161,12 @@ protected IProject project; /** + * Preferences listeners + */ + private IEclipsePreferences.INodeChangeListener preferencesNodeListener; + private IEclipsePreferences.IPreferenceChangeListener preferencesChangeListener; + + /** * Constructor needed for IProject.getNature() and IProject.addNature(). * * @see #setProject(IProject) @@ -423,6 +429,28 @@ return true; } + /* (non-Javadoc) + * @see org.eclipse.jdt.internal.core.JavaElement#close() + */ + public void close() throws JavaModelException { + if (JavaProject.hasJavaNature(this.project)) { + // Get cached preferences if exist + JavaModelManager.PerProjectInfo perProjectInfo = JavaModelManager.getJavaModelManager().getPerProjectInfo(this.project, false); + if (perProjectInfo != null && perProjectInfo.preferences != null) { + IEclipsePreferences eclipseParentPreferences = (IEclipsePreferences) perProjectInfo.preferences.parent(); + if (this.preferencesNodeListener != null) { + eclipseParentPreferences.removeNodeChangeListener(this.preferencesNodeListener); + this.preferencesNodeListener = null; + } + if (this.preferencesChangeListener != null) { + perProjectInfo.preferences.removePreferenceChangeListener(this.preferencesChangeListener); + this.preferencesChangeListener = null; + } + } + } + super.close(); + } + /** * Internal computation of an expanded classpath. It will eliminate duplicates, and produce copies * of exported or restricted classpath entries to avoid possible side-effects ever after. @@ -1361,63 +1389,72 @@ return null; } - /** - * Returns the project custom preference pool. - * Project preferences may include custom encoding. - * @return IEclipsePreferences or null if the project - * does not have a java nature. - */ - public IEclipsePreferences getEclipsePreferences(){ - if (!JavaProject.hasJavaNature(this.project)) return null; - // Get cached preferences if exist - JavaModelManager.PerProjectInfo perProjectInfo = JavaModelManager.getJavaModelManager().getPerProjectInfo(this.project, true); - if (perProjectInfo.preferences != null) return perProjectInfo.preferences; - // Init project preferences - IScopeContext context = new ProjectScope(getProject()); - final IEclipsePreferences eclipsePreferences = context.getNode(JavaCore.PLUGIN_ID); - updatePreferences(eclipsePreferences); - perProjectInfo.preferences = eclipsePreferences; - - // Listen to node removal from parent in order to reset cache (see bug 68993) - IEclipsePreferences.INodeChangeListener nodeListener = new IEclipsePreferences.INodeChangeListener() { - public void added(IEclipsePreferences.NodeChangeEvent event) { - // do nothing - } - public void removed(IEclipsePreferences.NodeChangeEvent event) { - if (event.getChild() == eclipsePreferences) { - JavaModelManager.getJavaModelManager().resetProjectPreferences(JavaProject.this); - } - } - }; - ((IEclipsePreferences) eclipsePreferences.parent()).addNodeChangeListener(nodeListener); - - // Listen to preference changes - IEclipsePreferences.IPreferenceChangeListener preferenceListener = new IEclipsePreferences.IPreferenceChangeListener() { - public void preferenceChange(IEclipsePreferences.PreferenceChangeEvent event) { - String propertyName = event.getKey(); - JavaModelManager manager = JavaModelManager.getJavaModelManager(); - if (propertyName.startsWith(JavaCore.PLUGIN_ID)) { - if (propertyName.equals(JavaCore.CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER) || - propertyName.equals(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER) || - propertyName.equals(JavaCore.CORE_JAVA_BUILD_DUPLICATE_RESOURCE) || - propertyName.equals(JavaCore.CORE_JAVA_BUILD_RECREATE_MODIFIED_CLASS_FILES_IN_OUTPUT_FOLDER) || - propertyName.equals(JavaCore.CORE_JAVA_BUILD_INVALID_CLASSPATH) || - propertyName.equals(JavaCore.CORE_ENABLE_CLASSPATH_EXCLUSION_PATTERNS) || - propertyName.equals(JavaCore.CORE_ENABLE_CLASSPATH_MULTIPLE_OUTPUT_LOCATIONS) || - propertyName.equals(JavaCore.CORE_INCOMPLETE_CLASSPATH) || - propertyName.equals(JavaCore.CORE_CIRCULAR_CLASSPATH) || - propertyName.equals(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL)) - { - manager.deltaState.addClasspathValidation(JavaProject.this); - } - manager.resetProjectOptions(JavaProject.this); - JavaProject.this.resetCaches(); // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=233568 - } - } - }; - eclipsePreferences.addPreferenceChangeListener(preferenceListener); - return eclipsePreferences; - } + /** + * Returns the project custom preference pool. + * Project preferences may include custom encoding. + * @return IEclipsePreferences or null if the project + * does not have a java nature. + */ + public IEclipsePreferences getEclipsePreferences() { + if (!JavaProject.hasJavaNature(this.project)) return null; + // Get cached preferences if exist + JavaModelManager.PerProjectInfo perProjectInfo = JavaModelManager.getJavaModelManager().getPerProjectInfo(this.project, true); + if (perProjectInfo.preferences != null) return perProjectInfo.preferences; + // Init project preferences + IScopeContext context = new ProjectScope(getProject()); + final IEclipsePreferences eclipsePreferences = context.getNode(JavaCore.PLUGIN_ID); + updatePreferences(eclipsePreferences); + perProjectInfo.preferences = eclipsePreferences; + + // Listen to new preferences node + final IEclipsePreferences eclipseParentPreferences = (IEclipsePreferences) eclipsePreferences.parent(); + if (eclipseParentPreferences != null) { + if (this.preferencesNodeListener != null) { + eclipseParentPreferences.removeNodeChangeListener(this.preferencesNodeListener); + } + this.preferencesNodeListener = new IEclipsePreferences.INodeChangeListener() { + public void added(IEclipsePreferences.NodeChangeEvent event) { + // do nothing + } + public void removed(IEclipsePreferences.NodeChangeEvent event) { + if (event.getChild() == eclipsePreferences) { + JavaModelManager.getJavaModelManager().resetProjectPreferences(JavaProject.this); + } + } + }; + eclipseParentPreferences.addNodeChangeListener(this.preferencesNodeListener); + } + + // Listen to preferences changes + if (this.preferencesChangeListener != null) { + eclipsePreferences.removePreferenceChangeListener(this.preferencesChangeListener); + } + this.preferencesChangeListener = new IEclipsePreferences.IPreferenceChangeListener() { + public void preferenceChange(IEclipsePreferences.PreferenceChangeEvent event) { + String propertyName = event.getKey(); + JavaModelManager manager = JavaModelManager.getJavaModelManager(); + if (propertyName.startsWith(JavaCore.PLUGIN_ID)) { + if (propertyName.equals(JavaCore.CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER) || + propertyName.equals(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER) || + propertyName.equals(JavaCore.CORE_JAVA_BUILD_DUPLICATE_RESOURCE) || + propertyName.equals(JavaCore.CORE_JAVA_BUILD_RECREATE_MODIFIED_CLASS_FILES_IN_OUTPUT_FOLDER) || + propertyName.equals(JavaCore.CORE_JAVA_BUILD_INVALID_CLASSPATH) || + propertyName.equals(JavaCore.CORE_ENABLE_CLASSPATH_EXCLUSION_PATTERNS) || + propertyName.equals(JavaCore.CORE_ENABLE_CLASSPATH_MULTIPLE_OUTPUT_LOCATIONS) || + propertyName.equals(JavaCore.CORE_INCOMPLETE_CLASSPATH) || + propertyName.equals(JavaCore.CORE_CIRCULAR_CLASSPATH) || + propertyName.equals(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL)) + { + manager.deltaState.addClasspathValidation(JavaProject.this); + } + manager.resetProjectOptions(JavaProject.this); + JavaProject.this.resetCaches(); // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=233568 + } + } + }; + eclipsePreferences.addPreferenceChangeListener(this.preferencesChangeListener); + return eclipsePreferences; + } public String getElementName() { return this.project.getName();