Skip to content

Commit

Permalink
CHE-1111 create 'ProjectDeletedEvent', clean up maven workspace when …
Browse files Browse the repository at this point in the history
…project was deleted
  • Loading branch information
Evgen Vidolob committed May 11, 2016
1 parent 90f0e8c commit e8c800a
Show file tree
Hide file tree
Showing 13 changed files with 226 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand All @@ -122,7 +122,7 @@ public void resolveMavenProject(IProject project, MavenProject mavenProject) {
dispatcher.projectResolved(mavenProject, modifications);

} finally {
wrapperManager.release(mavenServer);
wrapperManager.release(mavenServer);
}

}
Expand Down Expand Up @@ -465,6 +465,35 @@ private boolean contains(Set<MavenKey> mavenKeys, String artifactId, String grou
.findFirst().isPresent();
}

public void delete(List<IProject> projects) {
if (projects.isEmpty()) {
return;
}
UpdateState state = new UpdateState();

Deque<MavenProject> stack = new LinkedList<>();

Set<MavenProject> 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<MavenProject, MavenProjectModifications> projectWithModification = new HashMap<>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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<ProjectDeletedEvent>() {
@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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<>());
Expand Down Expand Up @@ -228,12 +228,4 @@ protected TestProjectType() {
}
}

// protected static class MavenProjectType extends ProjectTypeDef {
//
// protected MavenProjectType() {
// super("maven", "maven", true, true);
// }
// }


}
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}


Expand Down Expand Up @@ -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 = "<groupId>com.codenvy.workspacebf11inh2ze5i06bk</groupId>\n" +
"<artifactId>multimodule</artifactId>\n" +
" <packaging>pom</packaging>\n" +
" <version>1.0-SNAPSHOT</version>\n" +
" <properties>\n" +
" <maven.compiler.source>1.6</maven.compiler.source>\n" +
" <maven.compiler.target>1.6</maven.compiler.target>\n" +
" </properties>\n" +
" <modules>\n" +
" <module>my-lib</module>\n" +
" <module>my-webapp</module>\n" +
" </modules>";
createTestProject("parent", pom);

String myLibPom = " <parent>\n" +
"<groupId>com.codenvy.workspacebf11inh2ze5i06bk</groupId>\n" +
"<artifactId>multimodule</artifactId>\n" +
" <version>1.0-SNAPSHOT</version>\n" +
" </parent>\n" +
" <artifactId>my-lib</artifactId>\n" +
" <version>1.0-SNAPSHOT</version>\n" +
" <packaging>jar</packaging>\n" +
"\n" +
" <name>sample-lib</name>\n" +
"\n" +
" <properties>\n" +
" <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n" +
" </properties>\n" +
"\n" +
" <dependencies>\n" +
" <dependency>\n" +
" <groupId>junit</groupId>\n" +
" <artifactId>junit</artifactId>\n" +
" <version>3.8.1</version>\n" +
" <scope>test</scope>\n" +
" </dependency>\n" +
" </dependencies>";

createTestProject("parent/my-lib", myLibPom);
String myWebApp = " <parent>\n" +
"<groupId>com.codenvy.workspacebf11inh2ze5i06bk</groupId>\n" +
"<artifactId>multimodule</artifactId>\n" +
" <version>1.0-SNAPSHOT</version>\n" +
" </parent>\n" +
" <artifactId>my-webapp</artifactId>\n" +
" <packaging>war</packaging>\n" +
" <version>1.0</version>\n" +
" <name>SpringDemo</name>\n" +
" <properties>\n" +
" <maven.compiler.source>1.6</maven.compiler.source>\n" +
" <maven.compiler.target>1.6</maven.compiler.target>\n" +
" </properties>\n" +
" <dependencies>\n" +
" <dependency>\n" +
"<groupId>com.codenvy.workspacebf11inh2ze5i06bk</groupId>\n" +
" <artifactId>my-lib</artifactId>\n" +
" <version>1.0-SNAPSHOT</version>\n" +
" </dependency>\n" +
" <dependency>\n" +
" <groupId>javax.servlet</groupId>\n" +
" <artifactId>servlet-api</artifactId>\n" +
" <version>2.5</version>\n" +
" <scope>provided</scope>\n" +
" </dependency>\n" +
" <dependency>\n" +
" <groupId>org.springframework</groupId>\n" +
" <artifactId>spring-webmvc</artifactId>\n" +
" <version>3.0.5.RELEASE</version>\n" +
" </dependency>\n" +
" <dependency>\n" +
" <groupId>junit</groupId>\n" +
" <artifactId>junit</artifactId>\n" +
" <version>3.8.1</version>\n" +
" <scope>test</scope>\n" +
" </dependency>\n" +
" </dependencies>\n" +
" <build>\n" +
" <finalName>greeting</finalName>\n" +
" </build>";
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();
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public void sendNotification(NotificationMessage message) {
public void send(JsonObject object, MessageType type) {

}
}, classpathManager, pm);
}, classpathManager, pm, eventService, new EclipseWorkspaceProvider());
}

@AfterMethod
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -105,7 +106,7 @@ public void setUp() throws Exception {


projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, new ProjectHandlerRegistry(
Collections.<ProjectHandler>emptySet()));
Collections.<ProjectHandler>emptySet()), new EventService());

}

Expand Down
Original file line number Diff line number Diff line change
@@ -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 + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -53,14 +54,17 @@ public class ProjectRegistry {
private final ProjectTypeRegistry projectTypeRegistry;
private final ProjectHandlerRegistry handlers;
private final FolderEntry root;
private final EventService eventService;

private boolean initialized;

@Inject
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();
Expand Down Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading

0 comments on commit e8c800a

Please sign in to comment.