/******************************************************************************* * Copyright (c) 2012-2015 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.ide.extension.maven.server.projecttype.handler; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.project.server.DefaultProjectManager; import org.eclipse.che.api.project.server.FolderEntry; import org.eclipse.che.api.project.server.Project; import org.eclipse.che.api.project.server.ProjectConfig; import org.eclipse.che.api.project.server.ProjectManager; import org.eclipse.che.api.project.server.handlers.ProjectHandler; import org.eclipse.che.api.project.server.handlers.ProjectHandlerRegistry; import org.eclipse.che.api.project.server.type.ProjectType; import org.eclipse.che.api.project.server.type.ProjectTypeRegistry; import org.eclipse.che.api.vfs.server.VirtualFileSystemRegistry; import org.eclipse.che.api.vfs.server.VirtualFileSystemUser; import org.eclipse.che.api.vfs.server.VirtualFileSystemUserContext; import org.eclipse.che.api.vfs.server.impl.memory.MemoryFileSystemProvider; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.multibindings.Multibinder; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.MockitoAnnotations; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; /** * @author Vitaly Parfonov */ public class MavenProjectImportedTest { private static final String workspace = "my_ws"; private String pomJar = "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n" + " <modelVersion>4.0.0</modelVersion>\n" + " <groupId>org.eclipse.che.sdk</groupId>\n" + " <artifactId>codenvy-sdk-parent</artifactId>\n" + " <version>3.1.0-SNAPSHOT</version>\n" + "</project>"; private String pom = "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n" + " <modelVersion>4.0.0</modelVersion>\n" + " <groupId>org.eclipse.che.sdk</groupId>\n" + " <artifactId>codenvy-sdk-parent</artifactId>\n" + " <version>3.1.0-SNAPSHOT</version>\n" + " <packaging>pom</packaging>\n" + " <modules>" + " <module>module1</module>" + " <module>module2</module>" + " </modules>" + "</project>"; private String pomWithNestingModule = "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n" + " <modelVersion>4.0.0</modelVersion>\n" + " <groupId>org.eclipse.che.sdk</groupId>\n" + " <artifactId>codenvy-sdk-parent</artifactId>\n" + " <version>3.1.0-SNAPSHOT</version>\n" + " <packaging>pom</packaging>\n" + " <modules>" + " <module>../module2</module>" + " <module>../module3</module>" + " </modules>" + "</project>"; private MavenProjectImportedHandler mavenProjectImportedHandler; private static final String vfsUser = "dev"; private static final Set<String> vfsUserGroups = new LinkedHashSet<>(Arrays.asList("workspace/developer")); private ProjectManager projectManager; @Before public void setUp() throws Exception { Set<ProjectType> pts = new HashSet<>(); final ProjectType pt = new ProjectType("maven", "Maven type", true, false) { }; pts.add(pt); final ProjectTypeRegistry projectTypeRegistry = new ProjectTypeRegistry(pts); VirtualFileSystemRegistry virtualFileSystemRegistry = new VirtualFileSystemRegistry(); EventService eventService = new EventService(); //ProjectGeneratorRegistry generatorRegistry = new ProjectGeneratorRegistry(new HashSet<ProjectGenerator>()); ProjectHandlerRegistry handlerRegistry = new ProjectHandlerRegistry(new HashSet<ProjectHandler>()); projectManager = new DefaultProjectManager(virtualFileSystemRegistry, eventService, projectTypeRegistry, handlerRegistry); MockitoAnnotations.initMocks(this); // Bind components Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { Multibinder<ProjectHandler> projectTypeResolverMultibinder = Multibinder.newSetBinder(binder(), ProjectHandler.class); projectTypeResolverMultibinder.addBinding().to(MavenProjectImportedHandler.class); bind(ProjectManager.class).toInstance(projectManager); } }); final MemoryFileSystemProvider memoryFileSystemProvider = new MemoryFileSystemProvider(workspace, eventService, new VirtualFileSystemUserContext() { @Override public VirtualFileSystemUser getVirtualFileSystemUser() { return new VirtualFileSystemUser(vfsUser, vfsUserGroups); } }, virtualFileSystemRegistry); virtualFileSystemRegistry.registerProvider(workspace, memoryFileSystemProvider); mavenProjectImportedHandler = injector.getInstance(MavenProjectImportedHandler.class); projectManager = injector.getInstance(ProjectManager.class); } @Test public void shouldNotChangeParentProjectType() throws Exception { Project test = projectManager.createProject(workspace, "test", new ProjectConfig("maven", "maven"), null, null); test.getBaseFolder().createFile("pom.xml", pomJar.getBytes(), "text/xml"); mavenProjectImportedHandler.onProjectImported(test.getBaseFolder()); assertNotNull(projectManager.getProject(workspace, "test")); assertNotNull(projectManager.getProject(workspace, "test").getConfig()); assertNotNull(projectManager.getProject(workspace, "test").getConfig().getTypeId()); Assert.assertEquals("maven", projectManager.getProject(workspace, "test").getConfig().getTypeId()); assertNotNull(projectManager.getProject(workspace, "test").getConfig().getBuilders()); } @Test public void withPomXmlWithFolders() throws Exception { Project test = projectManager.createProject(workspace, "test", new ProjectConfig("maven", "maven"), null, null); test.getBaseFolder().createFile("pom.xml", pomJar.getBytes(), "text/xml"); FolderEntry folder = test.getBaseFolder().createFolder("folder1"); folder.createFile("pom.xml", pomJar.getBytes(), "text/xml"); FolderEntry folder1 = test.getBaseFolder().createFolder("folder2"); folder1.createFile("pom.xml", pomJar.getBytes(), "text/xml"); mavenProjectImportedHandler.onProjectImported(test.getBaseFolder()); assertNotNull(projectManager.getProject(workspace, "test")); assertNull(projectManager.getProject(workspace, "test/folder1")); assertNull(projectManager.getProject(workspace, "test/folder2")); } @Test public void withPomXmlMultiModule() throws Exception { Project test = projectManager.createProject(workspace, "test", new ProjectConfig("maven", "maven"), null, null); test.getBaseFolder().createFile("pom.xml", pom.getBytes(), "text/xml"); FolderEntry module1 = test.getBaseFolder().createFolder("module1"); module1.createFile("pom.xml", pom.getBytes(), "text/xml"); FolderEntry module2 = test.getBaseFolder().createFolder("module2"); module2.createFile("pom.xml", pom.getBytes(), "text/xml"); FolderEntry moduleNotDescribedInParentPom = test.getBaseFolder().createFolder("moduleNotDescribedInParentPom"); moduleNotDescribedInParentPom.createFile("pom.xml", pom.getBytes(), "text/xml"); mavenProjectImportedHandler.onProjectImported(test.getBaseFolder()); assertNotNull(projectManager.getProject(workspace, "test")); assertNotNull(projectManager.getProject(workspace, "test/module1")); assertNotNull(projectManager.getProject(workspace, "test/module2")); assertNull(projectManager.getProject(workspace, "test/moduleNotDescribedInParentPom")); } @Test public void withPomXmlMultiModuleWithNesting() throws Exception { //test for multi module project in which the modules are specified in format: <module>../module</module> FolderEntry rootProject = projectManager.createProject(workspace, "rootProject", new ProjectConfig("maven", "maven"), null, null).getBaseFolder(); rootProject.createFile("pom.xml", pom.getBytes(), "text/xml"); FolderEntry module1 = rootProject.createFolder("module1"); module1.createFile("pom.xml", pomWithNestingModule.getBytes(), "text/xml"); FolderEntry module2 = rootProject.createFolder("module2"); module2.createFile("pom.xml", pom.getBytes(), "text/xml"); FolderEntry module3 = rootProject.createFolder("module3"); module3.createFile("pom.xml", pom.getBytes(), "text/xml"); FolderEntry moduleNotDescribedInParentPom = rootProject.createFolder("moduleNotDescribedInParentPom"); moduleNotDescribedInParentPom.createFile("pom.xml", pom.getBytes(), "text/xml"); mavenProjectImportedHandler.onProjectImported(rootProject); assertNotNull(projectManager.getProject(workspace, "rootProject")); assertNotNull(projectManager.getProject(workspace, "rootProject/module1")); assertNotNull(projectManager.getProject(workspace, "rootProject/module2")); assertNotNull(projectManager.getProject(workspace, "rootProject/module3")); assertNull(projectManager.getProject(workspace, "rootProject/test/moduleNotDescribedInParentPom")); } }