/*******************************************************************************
* 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.ide.extension.maven.server.projecttype.handler;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Provider;
import com.google.inject.multibindings.Multibinder;
import org.eclipse.che.api.core.notification.EventService;
import org.eclipse.che.api.core.rest.HttpJsonRequest;
import org.eclipse.che.api.core.rest.HttpJsonRequestFactory;
import org.eclipse.che.api.core.rest.HttpJsonResponse;
import org.eclipse.che.api.core.rest.shared.dto.Link;
import org.eclipse.che.api.project.server.AttributeFilter;
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.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.ProjectTypeDef;
import org.eclipse.che.api.project.server.type.ProjectTypeRegistry;
import org.eclipse.che.api.vfs.server.SystemPathsFilter;
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 org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;
import org.eclipse.che.api.workspace.shared.dto.UsersWorkspaceDto;
import org.eclipse.che.commons.test.SelfReturningAnswer;
import org.eclipse.che.dto.server.DtoFactory;
import org.eclipse.che.ide.extension.maven.shared.MavenAttributes;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* @author Vitaly Parfonov
*/
public class MavenProjectImportedTest {
private static final String workspace = "my_ws";
private static final String API_ENDPOINT = "http://localhost:8080/che/api";
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 HttpJsonRequest httpJsonRequest;
@Mock
private Provider<AttributeFilter> filterProvider;
@Mock
private AttributeFilter filter;
@Mock
private HttpJsonRequestFactory httpJsonRequestFactory;
@Mock
private HttpJsonResponse httpJsonResponse;
private static final String vfsUser = "dev";
private static final Set<String> vfsUserGroups = new LinkedHashSet<>(Collections.singletonList("workspace/developer"));
private ProjectManager projectManager;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(filterProvider.get()).thenReturn(filter);
Set<ProjectTypeDef> pts = new HashSet<>();
final ProjectTypeDef pt = new ProjectTypeDef("maven", "Maven type", true, false) {
};
pts.add(pt);
final ProjectTypeRegistry projectTypeRegistry = new ProjectTypeRegistry(pts);
VirtualFileSystemRegistry virtualFileSystemRegistry = new VirtualFileSystemRegistry();
EventService eventService = new EventService();
ProjectHandlerRegistry handlerRegistry = new ProjectHandlerRegistry(new HashSet<>());
projectManager = new DefaultProjectManager(virtualFileSystemRegistry,
eventService,
projectTypeRegistry,
handlerRegistry,
filterProvider,
API_ENDPOINT,
httpJsonRequestFactory);
// 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,
SystemPathsFilter.ANY);
virtualFileSystemRegistry.registerProvider(workspace, memoryFileSystemProvider);
mavenProjectImportedHandler = injector.getInstance(MavenProjectImportedHandler.class);
projectManager = injector.getInstance(ProjectManager.class);
httpJsonRequest = mock(HttpJsonRequest.class, new SelfReturningAnswer());
UsersWorkspaceDto usersWorkspaceMock = mock(UsersWorkspaceDto.class);
when(httpJsonRequestFactory.fromLink(eq(DtoFactory.newDto(Link.class)
.withMethod("PUT")
.withHref(API_ENDPOINT + "/workspace/" + workspace + "/project"))))
.thenReturn(httpJsonRequest);
when(httpJsonRequestFactory.fromLink(eq(DtoFactory.newDto(Link.class)
.withMethod("GET")
.withHref(API_ENDPOINT + "/workspace/" + workspace))))
.thenReturn(httpJsonRequest);
when(httpJsonRequest.request()).thenReturn(httpJsonResponse);
when(httpJsonResponse.asDto(UsersWorkspaceDto.class)).thenReturn(usersWorkspaceMock);
final ProjectConfigDto projectConfig = DtoFactory.getInstance().createDto(ProjectConfigDto.class)
.withPath("/test")
.withType(MavenAttributes.MAVEN_ID);
final ProjectConfigDto module1 = DtoFactory.getInstance().createDto(ProjectConfigDto.class)
.withPath("/test/module1")
.withType(MavenAttributes.MAVEN_ID);
final ProjectConfigDto module2 = DtoFactory.getInstance().createDto(ProjectConfigDto.class)
.withPath("/test/module2")
.withType(MavenAttributes.MAVEN_ID);
final ProjectConfigDto module3 = DtoFactory.getInstance().createDto(ProjectConfigDto.class)
.withPath("/test/module3")
.withType(MavenAttributes.MAVEN_ID);
List<ProjectConfigDto> projectsList = new ArrayList<>();
projectsList.add(projectConfig);
projectsList.add(module1);
projectsList.add(module2);
projectsList.add(module3);
when(usersWorkspaceMock.getProjects()).thenReturn(projectsList);
}
@Test
public void shouldNotChangeParentProjectType() throws Exception {
Project test = projectManager.createProject(workspace, "test", DtoFactory.getInstance().createDto(ProjectConfigDto.class)
.withName("module1")
.withType("maven"), null);
test.getBaseFolder().createFile("pom.xml", pomJar.getBytes());
test.getBaseFolder().createFolder("module1");
mavenProjectImportedHandler.onProjectImported(test.getBaseFolder());
assertNotNull(projectManager.getProject(workspace, "test"));
}
@Test
public void withPomXmlWithFolders() throws Exception {
Project test = projectManager.createProject(workspace, "test", DtoFactory.getInstance().createDto(ProjectConfigDto.class)
.withType("maven"), null);
test.getBaseFolder().createFile("pom.xml", pomJar.getBytes());
FolderEntry folder = test.getBaseFolder().createFolder("folder1");
folder.createFile("pom.xml", pomJar.getBytes());
FolderEntry folder1 = test.getBaseFolder().createFolder("folder2");
folder1.createFile("pom.xml", pomJar.getBytes());
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", DtoFactory.getInstance().createDto(ProjectConfigDto.class)
.withType("maven"), null);
test.getBaseFolder().createFile("pom.xml", pom.getBytes());
FolderEntry module1 = test.getBaseFolder().createFolder("module1");
module1.createFile("pom.xml", pom.getBytes());
FolderEntry module2 = test.getBaseFolder().createFolder("module2");
module2.createFile("pom.xml", pom.getBytes());
FolderEntry moduleNotDescribedInParentPom = test.getBaseFolder().createFolder("moduleNotDescribedInParentPom");
moduleNotDescribedInParentPom.createFile("pom.xml", pom.getBytes());
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, "test", DtoFactory.getInstance().createDto(ProjectConfigDto.class)
.withType("maven"), null).getBaseFolder();
rootProject.createFile("pom.xml", pom.getBytes());
FolderEntry module1 = rootProject.createFolder("module1");
module1.createFile("pom.xml", pomWithNestingModule.getBytes());
FolderEntry module2 = rootProject.createFolder("module2");
module2.createFile("pom.xml", pom.getBytes());
FolderEntry module3 = rootProject.createFolder("module3");
module3.createFile("pom.xml", pom.getBytes());
FolderEntry moduleNotDescribedInParentPom = rootProject.createFolder("moduleNotDescribedInParentPom");
moduleNotDescribedInParentPom.createFile("pom.xml", pom.getBytes());
mavenProjectImportedHandler.onProjectImported(rootProject);
assertNotNull(projectManager.getProject(workspace, "test"));
assertNotNull(projectManager.getProject(workspace, "test/module1"));
assertNotNull(projectManager.getProject(workspace, "test/module2"));
assertNotNull(projectManager.getProject(workspace, "test/module3"));
assertNull(projectManager.getProject(workspace, "test/test/moduleNotDescribedInParentPom"));
}
}