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;
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
}
@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
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();
}
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));
}
}
@TestOnly
public void cleanup() {
myCachedFiles.clear();
- myProject2Id.clear();
+ myProjectMap.clear();
}
@Override