From f77d1619010660b485d29a48b0551d196659ecd7 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Wed, 21 Oct 2009 16:04:22 +0400 Subject: [PATCH] fix dispose for libraries in project structure + directory-based storage fix: set correct requestor for file deletion --- .../configuration/libraryEditor/LibraryEditor.java | 9 ++++-- .../projectRoot/BaseLibrariesConfigurable.java | 3 ++ .../projectRoot/BaseStructureConfigurable.java | 2 ++ .../projectRoot/LibrariesModifiableModel.java | 33 +++++++++++++++++----- .../daemon/ProjectStructureDaemonAnalyzer.java | 9 ++++-- .../intellij/openapi/roots/libraries/Library.java | 5 +++- .../openapi/roots/impl/libraries/LibraryImpl.java | 5 ++-- .../impl/stores/DirectoryBasedStorage.java | 2 +- 8 files changed, 51 insertions(+), 17 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditor.java index 67419b5694..b264953279 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditor.java @@ -15,12 +15,14 @@ */ package com.intellij.openapi.roots.ui.configuration.libraryEditor; +import com.intellij.openapi.Disposable; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; -public class LibraryEditor { +public class LibraryEditor implements Disposable { private final Library myLibrary; private String myLibraryName = null; private Library.ModifiableModel myModel = null; @@ -36,6 +38,9 @@ public class LibraryEditor { return myLibrary.getName(); } + public void dispose() { + } + public String[] getUrls(OrderRootType rootType) { if (myModel != null) { return myModel.getUrls(rootType); @@ -83,10 +88,10 @@ public class LibraryEditor { } } - public Library.ModifiableModel getModel() { if (myModel == null) { myModel = myLibrary.getModifiableModel(); + Disposer.register(this, myModel); } return myModel; } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java index 4377f3a0e5..2e7c324295 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java @@ -160,6 +160,9 @@ public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurabl } public void dispose() { + for (final LibrariesModifiableModel provider : myContext.myLevel2Providers.values()) { + provider.disposeUncommittedLibraries(); + } } protected AnAction createCopyAction() { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseStructureConfigurable.java index 374b6eaa0c..decbe7b967 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseStructureConfigurable.java @@ -209,6 +209,8 @@ public abstract class BaseStructureConfigurable extends MasterDetailsComponent i myAutoScrollHandler.cancelAllRequests(); + myContext.getDaemonAnalyzer().clear(); + Disposer.dispose(this); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibrariesModifiableModel.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibrariesModifiableModel.java index 1069297a46..b539864d8e 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibrariesModifiableModel.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibrariesModifiableModel.java @@ -22,6 +22,7 @@ import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor; +import com.intellij.openapi.util.Disposer; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -55,9 +56,15 @@ public class LibrariesModifiableModel implements LibraryTable.ModifiableModel { public void removeLibrary(@NotNull Library library) { if (getLibrariesModifiableModel().getLibraryByName(library.getName()) == null) return; - myRemovedLibraries.add(library); removeLibraryEditor(library); + final Library existingLibrary = myTable.getLibraryByName(library.getName()); getLibrariesModifiableModel().removeLibrary(library); + if (existingLibrary == library) { + myRemovedLibraries.add(library); + } else { + // dispose uncommitted library + Disposer.dispose(library); + } } public void commit() { @@ -88,6 +95,7 @@ public class LibrariesModifiableModel implements LibraryTable.ModifiableModel { public void deferredCommit(){ for (LibraryEditor libraryEditor : new ArrayList(myLibrary2EditorMap.values())) { libraryEditor.commit(); // TODO: is seems like commit will recreate the editor, but it should not + Disposer.dispose(libraryEditor); } if (!(myLibrary2EditorMap.isEmpty() && myRemovedLibraries.isEmpty())) { getLibrariesModifiableModel().commit(); @@ -126,12 +134,7 @@ public class LibrariesModifiableModel implements LibraryTable.ModifiableModel { private void removeLibraryEditor(final Library library) { final LibraryEditor libraryEditor = myLibrary2EditorMap.remove(library); if (libraryEditor != null) { - for (Iterator it = myLibrary2EditorMap.keySet().iterator(); it.hasNext();) { - final Library lib = (Library)it.next(); - if (libraryEditor == myLibrary2EditorMap.get(lib)) { - it.remove(); - } - } + Disposer.dispose(libraryEditor); } } @@ -146,4 +149,20 @@ public class LibrariesModifiableModel implements LibraryTable.ModifiableModel { return myLibrariesModifiableModel; } + + public void disposeUncommittedLibraries() { + for (final Library library : new ArrayList(myLibrary2EditorMap.keySet())) { + final Library existingLibrary = myTable.getLibraryByName(library.getName()); + if (existingLibrary != library) { + Disposer.dispose(library); + } + + final LibraryEditor libraryEditor = myLibrary2EditorMap.get(library); + if (libraryEditor != null) { + Disposer.dispose(libraryEditor); + } + } + + myLibrary2EditorMap.clear(); + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java index 04ff2888d7..7753c4c652 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java @@ -166,9 +166,6 @@ public class ProjectStructureDaemonAnalyzer implements Disposable { public void clearCaches() { LOG.debug("clear caches"); myProblemHolders.clear(); - mySourceElement2Usages.clear(); - myContainingElement2Usages.clear(); - myElementWithNotCalculatedUsages.clear(); } public void clearAllProblems() { @@ -210,6 +207,12 @@ public class ProjectStructureDaemonAnalyzer implements Disposable { }); } + public void clear() { + mySourceElement2Usages.clear(); + myContainingElement2Usages.clear(); + myElementWithNotCalculatedUsages.clear(); + } + private class AnalyzeElementUpdate extends Update { private final ProjectStructureElement myElement; private final boolean myCheck; diff --git a/platform/lang-api/src/com/intellij/openapi/roots/libraries/Library.java b/platform/lang-api/src/com/intellij/openapi/roots/libraries/Library.java index 38acfce0f4..1b42fee3a3 100644 --- a/platform/lang-api/src/com/intellij/openapi/roots/libraries/Library.java +++ b/platform/lang-api/src/com/intellij/openapi/roots/libraries/Library.java @@ -32,6 +32,9 @@ public interface Library extends JDOMExternalizable, Disposable { @NotNull VirtualFile[] getFiles(@NotNull OrderRootType rootType); + /** + * As soon as you obtaining modifiable model you will have to commit it or call Disposer.dispose(model)! + */ @NotNull ModifiableModel getModifiableModel(); LibraryTable getTable(); @@ -42,7 +45,7 @@ public interface Library extends JDOMExternalizable, Disposable { boolean isValid(@NotNull String url, @NotNull OrderRootType rootType); - interface ModifiableModel { + interface ModifiableModel extends Disposable { @NotNull String[] getUrls(@NotNull OrderRootType rootType); void setName(@NotNull String name); diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java index 92f9340baa..1bc8d9765f 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java @@ -187,12 +187,11 @@ public class LibraryImpl implements LibraryEx.ModifiableModelEx, LibraryEx { myName = name; } + /* you have to commit modifiable model or dispose it by yourself! */ @NotNull public ModifiableModel getModifiableModel() { assert !isDisposed(); - LibraryImpl model = new LibraryImpl(this, this, myRootModel); - Disposer.register(this, model); - return model; + return new LibraryImpl(this, this, myRootModel); } public Library cloneLibrary(RootModelImpl rootModel) { diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/DirectoryBasedStorage.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/DirectoryBasedStorage.java index 948ff4d364..a0114ac7bd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/DirectoryBasedStorage.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/DirectoryBasedStorage.java @@ -284,7 +284,7 @@ public class DirectoryBasedStorage implements StateStorage, Disposable { if (virtualFile != null) { try { LOG.debug("Removing configuration file: " + virtualFile.getPresentableUrl()); - virtualFile.delete(DirectoryBasedStorage.this); + virtualFile.delete(MySaveSession.this); } catch (IOException e) { LOG.error(e); -- 2.11.4.GIT