package jetbrains.mps.tool.environment;
/*Generated by MPS */
import jetbrains.mps.project.ProjectManagerListener;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import java.util.Set;
import jetbrains.mps.project.Project;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.LinkedHashSet;
import jetbrains.mps.project.ProjectManager;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import jetbrains.mps.project.FileBasedProject;
import org.apache.log4j.Level;
import jetbrains.mps.util.EqualUtil;
import java.io.IOException;
/*package*/ class ProjectContainer implements ProjectManagerListener {
private static final Logger LOG = LogManager.getLogger(ProjectContainer.class);
private Set<Project> myProjects;
public ProjectContainer() {
myProjects = SetSequence.fromSet(new LinkedHashSet<Project>());
ProjectManager.getInstance().addProjectListener(this);
}
public void dispose() {
clear();
ProjectManager.getInstance().removeProjectListener(this);
}
private void clear() {
try {
for (final Project project : myProjects) {
assert project != null && !(project.isDisposed()) : "Project has been already disposed";
project.dispose();
}
} catch (Exception e) {
e.printStackTrace();
}
SetSequence.fromSet(myProjects).clear();
}
public Set<Project> getProjects() {
return myProjects;
}
@Nullable
public Project getProject(@NotNull File projectFile) {
assert myProjects != null;
for (Project project : SetSequence.fromSet(myProjects)) {
if (projectHasPath(((FileBasedProject) project), projectFile)) {
return project;
}
}
return null;
}
private void addProject(@NotNull Project project) {
assert !(SetSequence.fromSet(myProjects).contains(project));
if (size() > 100) {
if (LOG.isEnabledFor(Level.WARN)) {
LOG.warn("ProjectContainer is too big");
}
}
SetSequence.fromSet(myProjects).addElement(project);
}
private void removeProject(@NotNull Project project) {
assert SetSequence.fromSet(myProjects).contains(project);
SetSequence.fromSet(myProjects).removeElement(project);
}
public int size() {
return SetSequence.fromSet(myProjects).count();
}
private static boolean projectHasPath(FileBasedProject project, @NotNull File path) {
File projectFile = project.getProjectFile();
try {
String myProjectPath = projectFile.getCanonicalPath();
return EqualUtil.equals(myProjectPath, path.getCanonicalPath());
} catch (IOException e) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Cannot access the project file in container", e);
}
}
return false;
}
@Override
public void projectClosed(@NotNull Project project) {
removeProject(project);
}
@Override
public void projectOpened(@NotNull Project project) {
addProject(project);
}
}