From e8c800aa4c0eb02b493ead18d372857278f9546e Mon Sep 17 00:00:00 2001 From: Evgen Vidolob Date: Wed, 11 May 2016 09:59:59 +0300 Subject: [PATCH] CHE-1111 create 'ProjectDeletedEvent', clean up maven workspace when project was deleted --- .../server/core/MavenProjectManager.java | 41 ++++++- .../maven/server/core/MavenWorkspace.java | 15 ++- .../che/plugin/maven/server/BaseTest.java | 10 +- .../plugin/maven/server/WorkspaceTest.java | 105 +++++++++++++++++- .../classpath/ClasspathManagerTest.java | 2 +- .../handler/MavenProjectResolverTest.java | 3 +- .../project/server/ProjectDeletedEvent.java | 39 +++++++ .../api/project/server/ProjectRegistry.java | 7 +- .../project/server/ExtensionCasesTest.java | 2 +- .../server/ProjectManagerReadTest.java | 2 +- .../server/ProjectManagerWriteTest.java | 25 ++++- .../project/server/ProjectServiceTest.java | 2 +- .../api/project/server/WsAgentTestBase.java | 2 +- 13 files changed, 226 insertions(+), 29 deletions(-) create mode 100644 wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectDeletedEvent.java diff --git a/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenProjectManager.java b/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenProjectManager.java index 1a9458a96a8..6ad72687c36 100644 --- a/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenProjectManager.java +++ b/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenProjectManager.java @@ -14,15 +14,15 @@ import com.google.inject.Provider; import com.google.inject.Singleton; +import org.eclipse.che.maven.data.MavenArtifact; +import org.eclipse.che.maven.data.MavenKey; +import org.eclipse.che.maven.data.MavenWorkspaceCache; +import org.eclipse.che.maven.server.MavenTerminal; import org.eclipse.che.plugin.maven.server.MavenServerManager; import org.eclipse.che.plugin.maven.server.MavenServerWrapper; import org.eclipse.che.plugin.maven.server.MavenWrapperManager; import org.eclipse.che.plugin.maven.server.core.project.MavenProject; import org.eclipse.che.plugin.maven.server.core.project.MavenProjectModifications; -import org.eclipse.che.maven.data.MavenArtifact; -import org.eclipse.che.maven.data.MavenKey; -import org.eclipse.che.maven.data.MavenWorkspaceCache; -import org.eclipse.che.maven.server.MavenTerminal; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; @@ -95,7 +95,7 @@ public MavenProjectManager(MavenWrapperManager wrapperManager, private MavenProjectListener createListenersDispatcher() { return (MavenProjectListener)Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), - new Class[]{MavenProjectListener.class}, + new Class[] {MavenProjectListener.class}, (proxy, method, args) -> { for (MavenProjectListener listener : listeners) { method.invoke(listener, args); @@ -122,7 +122,7 @@ public void resolveMavenProject(IProject project, MavenProject mavenProject) { dispatcher.projectResolved(mavenProject, modifications); } finally { - wrapperManager.release(mavenServer); + wrapperManager.release(mavenServer); } } @@ -465,6 +465,35 @@ private boolean contains(Set mavenKeys, String artifactId, String grou .findFirst().isPresent(); } + public void delete(List projects) { + if (projects.isEmpty()) { + return; + } + UpdateState state = new UpdateState(); + + Deque stack = new LinkedList<>(); + + Set childToUpdate = new HashSet<>(); + + for (IProject project : projects) { + MavenProject mavenProject = findMavenProject(project); + if (mavenProject == null) { + return; + } + + childToUpdate.addAll(findChildProjects(mavenProject)); + internalDelete(findParentProject(mavenProject), mavenProject, state); + } + + childToUpdate.removeAll(state.removedProjects); + + for (MavenProject mavenProject : childToUpdate) { + internalUpdate(mavenProject, null, false, false, state, stack); + } + + state.fireUpdate(); + } + private class UpdateState { Map projectWithModification = new HashMap<>(); diff --git a/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenWorkspace.java b/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenWorkspace.java index 9c27890f231..a1b9548aeb2 100644 --- a/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenWorkspace.java +++ b/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenWorkspace.java @@ -17,6 +17,9 @@ import org.eclipse.che.api.core.ForbiddenException; import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.api.core.ServerException; +import org.eclipse.che.api.core.notification.EventService; +import org.eclipse.che.api.core.notification.EventSubscriber; +import org.eclipse.che.api.project.server.ProjectDeletedEvent; import org.eclipse.che.api.project.server.ProjectManager; import org.eclipse.che.api.project.server.ProjectRegistry; import org.eclipse.che.plugin.maven.server.core.classpath.ClasspathHelper; @@ -35,6 +38,7 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -70,13 +74,22 @@ public MavenWorkspace(MavenProjectManager manager, ProjectRegistry projectRegistry, MavenCommunication communication, ClasspathManager classpathManager, - ProjectManager projectManager) { + ProjectManager projectManager, + EventService eventService, + EclipseWorkspaceProvider workspaceProvider) { this.projectRegistry = projectRegistry; this.communication = communication; this.classpathManager = classpathManager; this.manager = manager; this.projectManager = projectManager; resolveExecutor = new MavenTaskExecutor(executorService, notifier); + eventService.subscribe(new EventSubscriber() { + @Override + public void onEvent(ProjectDeletedEvent event) { + IProject project = workspaceProvider.get().getRoot().getProject(event.getProjectPath()); + manager.delete(Collections.singletonList(project)); + } + }); manager.addListener(new MavenProjectListener() { @Override public void projectResolved(MavenProject project, MavenProjectModifications modifications) { diff --git a/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/BaseTest.java b/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/BaseTest.java index 3bced7d3b3f..f608f26bb42 100644 --- a/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/BaseTest.java +++ b/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/BaseTest.java @@ -129,7 +129,7 @@ protected void initProjectApi() throws Exception { projectHandlerRegistry = new ProjectHandlerRegistry(new HashSet<>()); - projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, projectHandlerRegistry); + projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, projectHandlerRegistry, eventService); projectRegistry.initProjects(); importerRegistry = new ProjectImporterRegistry(new HashSet<>()); @@ -228,12 +228,4 @@ protected TestProjectType() { } } -// protected static class MavenProjectType extends ProjectTypeDef { -// -// protected MavenProjectType() { -// super("maven", "maven", true, true); -// } -// } - - } diff --git a/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/WorkspaceTest.java b/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/WorkspaceTest.java index 58bbec0c001..10213ba1cfa 100644 --- a/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/WorkspaceTest.java +++ b/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/WorkspaceTest.java @@ -96,7 +96,7 @@ public void send(JsonObject object, MessageType type) { } }, new ClasspathManager(root.getAbsolutePath(), wrapperManager, projectManager, terminal, - mavenNotifier), pm); + mavenNotifier), pm, eventService, new EclipseWorkspaceProvider()); } @@ -572,4 +572,107 @@ public void testWsShouldAddSourceFolderFromBuildHelperPlugin() throws Exception assertThat(rawClasspath).onProperty("path").contains(new Path("/test/target/generated-sources/dto/")); } + @Test + public void testImportMultimoduleProjectDeleteAndImportAgain() throws Exception { + String pom = "com.codenvy.workspacebf11inh2ze5i06bk\n" + + "multimodule\n" + + " pom\n" + + " 1.0-SNAPSHOT\n" + + " \n" + + " 1.6\n" + + " 1.6\n" + + " \n" + + " \n" + + " my-lib\n" + + " my-webapp\n" + + " "; + createTestProject("parent", pom); + + String myLibPom = " \n" + + "com.codenvy.workspacebf11inh2ze5i06bk\n" + + "multimodule\n" + + " 1.0-SNAPSHOT\n" + + " \n" + + " my-lib\n" + + " 1.0-SNAPSHOT\n" + + " jar\n" + + "\n" + + " sample-lib\n" + + "\n" + + " \n" + + " UTF-8\n" + + " \n" + + "\n" + + " \n" + + " \n" + + " junit\n" + + " junit\n" + + " 3.8.1\n" + + " test\n" + + " \n" + + " "; + + createTestProject("parent/my-lib", myLibPom); + String myWebApp = " \n" + + "com.codenvy.workspacebf11inh2ze5i06bk\n" + + "multimodule\n" + + " 1.0-SNAPSHOT\n" + + " \n" + + " my-webapp\n" + + " war\n" + + " 1.0\n" + + " SpringDemo\n" + + " \n" + + " 1.6\n" + + " 1.6\n" + + " \n" + + " \n" + + " \n" + + "com.codenvy.workspacebf11inh2ze5i06bk\n" + + " my-lib\n" + + " 1.0-SNAPSHOT\n" + + " \n" + + " \n" + + " javax.servlet\n" + + " servlet-api\n" + + " 2.5\n" + + " provided\n" + + " \n" + + " \n" + + " org.springframework\n" + + " spring-webmvc\n" + + " 3.0.5.RELEASE\n" + + " \n" + + " \n" + + " junit\n" + + " junit\n" + + " 3.8.1\n" + + " test\n" + + " \n" + + " \n" + + " \n" + + " greeting\n" + + " "; + createTestProject("parent/my-webapp", myWebApp); + + IProject test = ResourcesPlugin.getWorkspace().getRoot().getProject("parent"); + mavenWorkspace.update(Collections.singletonList(test)); + mavenWorkspace.waitForUpdate(); + MavenProject mavenProject = projectManager.findMavenProject(test); + assertThat(mavenProject).isNotNull(); + + pm.delete("parent"); + + createTestProject("parent2", pom); + createTestProject("parent2/my-lib", myLibPom); + createTestProject("parent2/my-webapp", myWebApp); + + IProject test2 = ResourcesPlugin.getWorkspace().getRoot().getProject("parent2"); + mavenWorkspace.update(Collections.singletonList(test2)); + mavenWorkspace.waitForUpdate(); + MavenProject mavenProject2 = projectManager.findMavenProject(test2); + assertThat(mavenProject2).isNotNull(); + } + + } diff --git a/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/classpath/ClasspathManagerTest.java b/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/classpath/ClasspathManagerTest.java index 44ed675ec9a..2f090e102bf 100644 --- a/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/classpath/ClasspathManagerTest.java +++ b/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/classpath/ClasspathManagerTest.java @@ -86,7 +86,7 @@ public void sendNotification(NotificationMessage message) { public void send(JsonObject object, MessageType type) { } - }, classpathManager, pm); + }, classpathManager, pm, eventService, new EclipseWorkspaceProvider()); } @AfterMethod diff --git a/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/projecttype/handler/MavenProjectResolverTest.java b/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/projecttype/handler/MavenProjectResolverTest.java index 175595bc90c..891873d7011 100644 --- a/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/projecttype/handler/MavenProjectResolverTest.java +++ b/plugins/plugin-maven/che-plugin-maven-server/src/test/java/org/eclipse/che/plugin/maven/server/projecttype/handler/MavenProjectResolverTest.java @@ -11,6 +11,7 @@ package org.eclipse.che.plugin.maven.server.projecttype.handler; import org.eclipse.che.api.core.ServerException; +import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.project.server.FolderEntry; import org.eclipse.che.api.project.server.ProjectRegistry; import org.eclipse.che.api.project.server.WorkspaceHolder; @@ -105,7 +106,7 @@ public void setUp() throws Exception { projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, new ProjectHandlerRegistry( - Collections.emptySet())); + Collections.emptySet()), new EventService()); } diff --git a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectDeletedEvent.java b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectDeletedEvent.java new file mode 100644 index 00000000000..239c07771ee --- /dev/null +++ b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectDeletedEvent.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2012-2016 Codenvy, S.A. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Codenvy, S.A. - initial API and implementation + *******************************************************************************/ +package org.eclipse.che.api.project.server; + +import org.eclipse.che.api.core.notification.EventOrigin; + +/** + * Publish when project deleted. + * + * @author Evgen Vidolob + */ +@EventOrigin("project") +public class ProjectDeletedEvent { + + private String projectPath; + + public ProjectDeletedEvent(String projectPath) { + this.projectPath = projectPath; + } + + public String getProjectPath() { + return projectPath; + } + + @Override + public String toString() { + return "ProjectDeletedEvent{" + + "projectPath='" + projectPath + '\'' + + '}'; + } +} diff --git a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectRegistry.java b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectRegistry.java index ccff821337b..97f6ac99cda 100644 --- a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectRegistry.java +++ b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectRegistry.java @@ -17,6 +17,7 @@ import org.eclipse.che.api.core.model.project.ProjectConfig; import org.eclipse.che.api.core.model.workspace.Workspace; import org.eclipse.che.api.core.model.workspace.WorkspaceConfig; +import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.project.server.handlers.ProjectHandlerRegistry; import org.eclipse.che.api.project.server.handlers.ProjectInitHandler; import org.eclipse.che.api.project.server.type.BaseProjectType; @@ -53,6 +54,7 @@ public class ProjectRegistry { private final ProjectTypeRegistry projectTypeRegistry; private final ProjectHandlerRegistry handlers; private final FolderEntry root; + private final EventService eventService; private boolean initialized; @@ -60,7 +62,9 @@ public class ProjectRegistry { public ProjectRegistry(WorkspaceHolder workspaceHolder, VirtualFileSystemProvider vfsProvider, ProjectTypeRegistry projectTypeRegistry, - ProjectHandlerRegistry handlers) throws ServerException { + ProjectHandlerRegistry handlers, + EventService eventService) throws ServerException { + this.eventService = eventService; this.projects = new ConcurrentHashMap<>(); this.workspaceHolder = workspaceHolder; this.vfs = vfsProvider.getVirtualFileSystem(); @@ -231,6 +235,7 @@ void removeProjects(String path) throws ServerException { getProjects(path).forEach(p -> Optional.ofNullable(projects.remove(p)) .ifPresent(removed::add)); + removed.forEach(registeredProject -> eventService.publish(new ProjectDeletedEvent(registeredProject.getPath()))); workspaceHolder.removeProjects(removed); } diff --git a/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ExtensionCasesTest.java b/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ExtensionCasesTest.java index c7e6770d97e..7dfed87516b 100644 --- a/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ExtensionCasesTest.java +++ b/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ExtensionCasesTest.java @@ -57,7 +57,7 @@ public void setUp() throws Exception { //ProjectHandlerRegistry projectHandlerRegistry = new ProjectHandlerRegistry(new HashSet<>()); - projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, projectHandlerRegistry); + projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, projectHandlerRegistry, eventService); projectRegistry.initProjects(); pm = new ProjectManager(vfsProvider, null, projectTypeRegistry, projectRegistry, projectHandlerRegistry, diff --git a/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectManagerReadTest.java b/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectManagerReadTest.java index 5109bd62453..7ff83f25280 100644 --- a/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectManagerReadTest.java +++ b/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectManagerReadTest.java @@ -72,7 +72,7 @@ public void setUp() throws Exception { ProjectHandlerRegistry projectHandlerRegistry = new ProjectHandlerRegistry(new HashSet<>()); - projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, projectHandlerRegistry); + projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, projectHandlerRegistry, eventService); projectRegistry.initProjects(); pm = new ProjectManager(vfsProvider, null, projectTypeRegistry, projectRegistry, projectHandlerRegistry, diff --git a/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectManagerWriteTest.java b/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectManagerWriteTest.java index 30ca23e882f..985b42a24cb 100644 --- a/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectManagerWriteTest.java +++ b/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectManagerWriteTest.java @@ -16,6 +16,7 @@ import org.eclipse.che.api.core.ServerException; import org.eclipse.che.api.core.model.project.ProjectConfig; import org.eclipse.che.api.core.model.project.SourceStorage; +import org.eclipse.che.api.core.notification.EventSubscriber; import org.eclipse.che.api.core.util.LineConsumerFactory; import org.eclipse.che.api.core.util.ValueHolder; import org.eclipse.che.api.project.server.importer.ProjectImporter; @@ -283,7 +284,7 @@ public void testUpdateProjectWithPersistedAttributes() throws Exception { ProjectConfig pc = new NewProjectConfig("/testUpdateProject", BaseProjectType.ID, null, "name", "descr", null, null); RegisteredProject p = pm.createProject(pc, null); - assertEquals(BaseProjectType.ID , p.getType()); + assertEquals(BaseProjectType.ID, p.getType()); assertEquals("name", p.getName()); attributes.put("pt2-var2", new AttributeValue("updated").getList()); @@ -386,6 +387,23 @@ public void testDeleteProject() throws Exception { } + @Test + public void testDeleteProjectEvent() throws Exception { + + ProjectConfig pc = new NewProjectConfig("/testDeleteProject", BaseProjectType.ID, null, "name", "descr", null, null); + pm.createProject(pc, null); + + String[] deletedPath = new String[1]; + eventService.subscribe(new EventSubscriber() { + @Override + public void onEvent(ProjectDeletedEvent event) {deletedPath[0] = event.getProjectPath();} + }); + pm.delete("/testDeleteProject"); + + assertEquals("/testDeleteProject", deletedPath[0]); + + } + @Test public void testImportProject() throws Exception { @@ -447,7 +465,6 @@ public void testImportProjectWithoutImporterFailed() throws Exception { } - @Test public void testProvidedAttributesNotSerialized() throws Exception { @@ -556,6 +573,7 @@ public void importSources(FolderEntry baseFolder, baseFolder.getVirtualFile().unzip(zip, true, 0); folderHolder.set(baseFolder); } + @Override public ImporterCategory getCategory() { return ProjectImporter.ImporterCategory.ARCHIVE; @@ -564,7 +582,4 @@ public ImporterCategory getCategory() { } - - - } diff --git a/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectServiceTest.java b/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectServiceTest.java index 9c3b60c6938..7adabf9e549 100644 --- a/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectServiceTest.java +++ b/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/ProjectServiceTest.java @@ -205,7 +205,7 @@ public void setUp() throws Exception { importerRegistry = new ProjectImporterRegistry(Collections.emptySet()); - projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, ptRegistry, phRegistry); + projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, ptRegistry, phRegistry, eventService); projectRegistry.initProjects(); FileWatcherNotificationHandler fileWatcherNotificationHandler = new DefaultFileWatcherNotificationHandler(vfsProvider); diff --git a/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/WsAgentTestBase.java b/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/WsAgentTestBase.java index 4752aae1511..67ac82e838a 100644 --- a/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/WsAgentTestBase.java +++ b/wsagent/che-core-api-project/src/test/java/org/eclipse/che/api/project/server/WsAgentTestBase.java @@ -110,7 +110,7 @@ public void setUp() throws Exception { this.eventService = new EventService(); - projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, projectHandlerRegistry); + projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, projectHandlerRegistry, eventService); projectRegistry.initProjects(); this.importerRegistry = new ProjectImporterRegistry(new HashSet<>());