make project map concurrent appcode/171.1314 clion/171.1310 dbe/171.1312 idea/171.1309 phpstorm/171.1306 pycharm/171.1307 pycharm/171.1313 rubymine/171.1311
authorGregory.Shrago <gregory.shrago@jetbrains.com>
Mon, 28 Nov 2016 20:16:23 +0000 (23:16 +0300)
committerGregory.Shrago <gregory.shrago@jetbrains.com>
Mon, 28 Nov 2016 21:38:46 +0000 (00:38 +0300)
platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyCachingFileSystem.java

index b6552220e2f7bc5d141453f9458c60da911ccbfe..c388b7a7794a930fba9ff36564d57fa77c02cee8 100644 (file)
@@ -25,7 +25,6 @@ import com.intellij.openapi.project.ProjectManagerAdapter;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.containers.BidirectionalMap;
 import com.intellij.util.containers.ConcurrentFactoryMap;
 import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.containers.FactoryMap;
@@ -35,17 +34,17 @@ import org.jetbrains.annotations.TestOnly;
 
 import java.io.IOException;
 import java.util.Collection;
-import java.util.List;
+import java.util.concurrent.ConcurrentMap;
 
 /**
  * @author gregsh
  */
 public abstract class DummyCachingFileSystem<T extends VirtualFile> extends DummyFileSystem {
-  private static final Logger LOG = Logger.getInstance("com.intellij.openapi.vfs.ex.dummy.DummyCachingFileSystem");
+  private static final Logger LOG = Logger.getInstance(DummyCachingFileSystem.class);
 
   private final String myProtocol;
 
-  private final BidirectionalMap<Project, String> myProject2Id = new BidirectionalMap<>();
+  private final ConcurrentMap<String, Project> myProjectMap = ContainerUtil.newConcurrentMap();
 
   private final FactoryMap<String, T> myCachedFiles = new ConcurrentFactoryMap<String, T>() {
     @Override
@@ -117,21 +116,18 @@ public abstract class DummyCachingFileSystem<T extends VirtualFile> extends Dumm
   }
 
   @Nullable
-  public Project getProject(String projectId) {
-    List<Project> list = myProject2Id.getKeysByValue(projectId);
-    return list == null || list.size() > 1 ? null : list.get(0);
+  public Project getProject(@Nullable String projectId) {
+    return myProjectMap.get(projectId);
   }
 
   @NotNull
   public Project getProjectOrFail(String projectId) {
-    List<Project> list = myProject2Id.getKeysByValue(projectId);
-    if (list == null || list.isEmpty()) {
-      throw new AssertionError(projectId + " project not found among: " + ContainerUtil.newArrayList(myProject2Id.values()));
+    Project project = myProjectMap.get(projectId);
+    if (project == null) {
+      throw new AssertionError(String.format("'%s' project not found among %s", projectId,
+                                             ContainerUtil.newArrayList(myProjectMap.keySet())));
     }
-    if (list.size() != 1) {
-      throw new AssertionError(projectId + " is mapped to several projects: " + list);
-    }
-    return list.get(0);
+    return project;
   }
 
   @NotNull
@@ -139,8 +135,17 @@ public abstract class DummyCachingFileSystem<T extends VirtualFile> extends Dumm
     return myCachedFiles.notNullValues();
   }
 
-  public void onProjectClosed(Project project) {
-    myProject2Id.remove(project);
+  @TestOnly
+  public void onProjectClosed(@NotNull Project project) {
+    onProjectClosedInner(project);
+  }
+
+  protected void onProjectClosedInner(@NotNull Project project) {
+    String projectId = project.getLocationHash();
+    Project mapped = myProjectMap.remove(projectId);
+    if (mapped == null) {
+      LOG.warn(String.format("'%s' project not mapped", projectId));
+    }
     clearCache();
   }
 
@@ -150,17 +155,16 @@ public abstract class DummyCachingFileSystem<T extends VirtualFile> extends Dumm
     Disposer.register(project, new Disposable() {
       @Override
       public void dispose() {
-        onProjectClosed(project);
+        onProjectClosedInner(project);
       }
     });
 
     clearCache();
     String projectId = project.getLocationHash();
-    myProject2Id.put(project, projectId);
+    Project mapped = myProjectMap.put(projectId, project);
 
-    List<Project> projects = myProject2Id.getKeysByValue(projectId);
-    if (projects != null && projects.size() > 1) {
-      LOG.error("project " + projectId + " already registered: " + projects);
+    if (mapped != null) {
+      LOG.error(String.format("'%s' project rebound, was %s", projectId, mapped));
     }
   }
 
@@ -185,7 +189,7 @@ public abstract class DummyCachingFileSystem<T extends VirtualFile> extends Dumm
   @TestOnly
   public void cleanup() {
     myCachedFiles.clear();
-    myProject2Id.clear();
+    myProjectMap.clear();
   }
 
   @Override