/******************************************************************************* * Copyright (c) 2012-2017 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.plugin.maven.server; import org.eclipse.che.api.core.ConflictException; 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.model.project.ProjectConfig; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.project.server.FolderEntry; import org.eclipse.che.api.project.server.ProjectCreatedEvent; import org.eclipse.che.api.project.server.ProjectManager; import org.eclipse.che.api.project.server.ProjectRegistry; import org.eclipse.che.api.project.server.WorkspaceProjectsSyncer; import org.eclipse.che.api.project.server.handlers.ProjectHandlerRegistry; import org.eclipse.che.api.project.server.importer.ProjectImporterRegistry; import org.eclipse.che.api.project.server.type.ProjectTypeDef; import org.eclipse.che.api.project.server.type.ProjectTypeRegistry; import org.eclipse.che.api.vfs.impl.file.DefaultFileWatcherNotificationHandler; import org.eclipse.che.api.vfs.impl.file.FileTreeWatcher; import org.eclipse.che.api.vfs.impl.file.FileWatcherNotificationHandler; import org.eclipse.che.api.vfs.impl.file.LocalVirtualFileSystemProvider; import org.eclipse.che.api.vfs.watcher.FileWatcherManager; import org.eclipse.che.api.vfs.search.impl.FSLuceneSearcherProvider; import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; import org.eclipse.che.commons.lang.IoUtil; import org.eclipse.che.jdt.core.resources.ResourceChangedEvent; import org.eclipse.che.plugin.java.server.projecttype.JavaProjectType; import org.eclipse.che.plugin.java.server.projecttype.JavaValueProviderFactory; import org.eclipse.che.plugin.maven.server.projecttype.MavenProjectType; import org.eclipse.che.plugin.maven.server.projecttype.MavenValueProviderFactory; import org.eclipse.core.internal.filebuffers.FileBuffersPlugin; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.codeassist.impl.AssistOptions; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.internal.ui.JavaPlugin; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.PathMatcher; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import static org.eclipse.che.plugin.maven.shared.MavenAttributes.MAVEN_ID; import static org.mockito.Mockito.mock; /** * @author Evgen Vidolob */ public abstract class BaseTest { protected static final String wsPath = "target/workspace"; protected final static String INDEX_PATH = "target/fs_index"; protected final static String PROJECT_NAME = "testProject"; protected static Map<String, String> options = new HashMap<>(); protected static EventService eventService = new EventService(); protected static ResourcesPlugin plugin; protected static JavaPlugin javaPlugin = new JavaPlugin(wsPath + "/set", null, null); protected static FileBuffersPlugin fileBuffersPlugin = new FileBuffersPlugin(); protected static TestWorkspaceHolder workspaceHolder; private final String mavenServerPath = BaseTest.class.getResource("/maven-server").getPath(); protected File root; protected ProjectManager pm; protected LocalVirtualFileSystemProvider vfsProvider; protected ProjectRegistry projectRegistry; protected FileWatcherNotificationHandler fileWatcherNotificationHandler; protected FileTreeWatcher fileTreeWatcher; protected ProjectTypeRegistry projectTypeRegistry; protected ProjectHandlerRegistry projectHandlerRegistry; protected ProjectImporterRegistry importerRegistry; protected MavenServerManager mavenServerManager; public BaseTest() { options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_8); options.put(JavaCore.CORE_ENCODING, "UTF-8"); options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_8); options.put(CompilerOptions.OPTION_TargetPlatform, JavaCore.VERSION_1_8); options.put(AssistOptions.OPTION_PerformVisibilityCheck, AssistOptions.ENABLED); options.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.WARNING); options.put(CompilerOptions.OPTION_TaskTags, CompilerOptions.WARNING); options.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.WARNING); options.put(CompilerOptions.OPTION_SuppressWarnings, CompilerOptions.DISABLED); options.put(JavaCore.COMPILER_TASK_TAGS, "TODO,FIXME,XXX"); options.put(JavaCore.COMPILER_PB_UNUSED_PARAMETER_INCLUDE_DOC_COMMENT_REFERENCE, JavaCore.ENABLED); options.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, JavaCore.ENABLED); options.put(CompilerOptions.OPTION_Process_Annotations, JavaCore.DISABLED); } @BeforeMethod protected void initProjectApi() throws Exception { mavenServerManager = new MavenServerManager(mavenServerPath); workspaceHolder = new TestWorkspaceHolder(); if (root == null) root = new File(wsPath); if (root.exists()) { IoUtil.deleteRecursive(root); } root.mkdir(); File indexDir = new File(INDEX_PATH); if (indexDir.exists()) { IoUtil.deleteRecursive(indexDir); } indexDir.mkdir(); Set<PathMatcher> filters = new HashSet<>(); filters.add(path -> true); FSLuceneSearcherProvider sProvider = new FSLuceneSearcherProvider(indexDir, filters); vfsProvider = new LocalVirtualFileSystemProvider(root, sProvider); projectTypeRegistry = new ProjectTypeRegistry(new HashSet<>()); projectTypeRegistry.registerProjectType(new TestProjectType()); projectTypeRegistry.registerProjectType(new JavaProjectType(new JavaValueProviderFactory())); projectTypeRegistry.registerProjectType(new MavenProjectType(new MavenValueProviderFactory())); projectHandlerRegistry = new ProjectHandlerRegistry(new HashSet<>()); projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, projectHandlerRegistry, eventService); projectRegistry.initProjects(); importerRegistry = new ProjectImporterRegistry(new HashSet<>()); fileWatcherNotificationHandler = new DefaultFileWatcherNotificationHandler(vfsProvider); fileTreeWatcher = new FileTreeWatcher(root, new HashSet<>(), fileWatcherNotificationHandler); pm = new ProjectManager(vfsProvider, projectTypeRegistry, projectRegistry, projectHandlerRegistry, importerRegistry, fileWatcherNotificationHandler, fileTreeWatcher, new TestWorkspaceHolder(new ArrayList<>()), mock(FileWatcherManager.class)); plugin = new ResourcesPlugin("target/index", wsPath, () -> projectRegistry, () -> pm); plugin.start(); javaPlugin.start(); } @AfterMethod public void shutdownMavenServer() throws Exception { mavenServerManager.shutdown(); JavaModelManager.getJavaModelManager().deltaState.removeExternalElementsToRefresh(); } protected FolderEntry createMultimoduleProject() throws ServerException, NotFoundException, ConflictException, ForbiddenException { String pom = "<groupId>test</groupId>" + "<artifactId>testArtifact</artifactId>" + "<version>42</version>" + "<modules>" + " <module>module1</module>" + " <module>module2</module>" + "</modules>"; FolderEntry parentFolder = createTestProject("parent", pom); String pomModule1 = "<groupId>module1</groupId>" + "<artifactId>testModule1</artifactId>" + "<version>1</version>" + "<dependencies>" + " <dependency>" + " <groupId>junit</groupId>" + " <artifactId>junit</artifactId>" + " <version>4.12</version>" + " </dependency>" + "</dependencies>"; createTestProject("parent/module1", pomModule1); String pomModule2 = "<groupId>module2</groupId>" + "<artifactId>testModule2</artifactId>" + "<version>2</version>" + "<dependencies>" + " <dependency>" + " <groupId>junit</groupId>" + " <artifactId>junit</artifactId>" + " <version>4.12</version>" + " </dependency>" + "</dependencies>"; createTestProject("parent/module2", pomModule2); return parentFolder; } protected void createTestProjectWithPackages(String projectName, String pom, String... packages) throws ForbiddenException, ConflictException, NotFoundException, ServerException { FolderEntry testProject = createTestProject(projectName, pom); FolderEntry src = testProject.createFolder("src/main/java"); for (String aPackage : packages) { src.createFolder(aPackage.replace(".", "/")); } } protected FolderEntry createTestProject(String name, String pomContent) throws ServerException, NotFoundException, ConflictException, ForbiddenException { FolderEntry folder = pm.getProjectsRoot().createFolder(name); folder.createFile("pom.xml", getPomContent(pomContent).getBytes()); projectRegistry.setProjectType(folder.getPath().toString(), MAVEN_ID, false); //inform DeltaProcessingStat about new project JavaModelManager.getJavaModelManager().deltaState.resourceChanged( new ResourceChangedEvent(root, new ProjectCreatedEvent("", folder.getPath().toString()))); return folder; } protected File createTestPom(String folderName, String pomContent) throws IOException { File file = new File(wsPath, folderName); file.mkdirs(); File pomFile = new File(file, "pom.xml"); FileOutputStream outputStream = new FileOutputStream(pomFile); outputStream.write(getPomContent(pomContent).getBytes()); outputStream.flush(); outputStream.close(); return pomFile; } protected String getPomContent(String content) { return "<?xml version=\"1.0\"?>\n" + "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n" + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" + " xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" + " <modelVersion>4.0.0</modelVersion>\n" + content + "</project>"; } protected static class TestProjectType extends ProjectTypeDef { protected TestProjectType() { super("test", "test", true, true); } } protected static class TestWorkspaceHolder extends WorkspaceProjectsSyncer { private List<ProjectConfigDto> projects; public TestWorkspaceHolder() { this.projects = new ArrayList<>(); } public TestWorkspaceHolder(List<ProjectConfigDto> projects) { this.projects = projects; } @Override public List<? extends ProjectConfig> getProjects() { return projects; } @Override public String getWorkspaceId() { return "id"; } @Override protected void addProject(ProjectConfig project) throws ServerException { } @Override protected void updateProject(ProjectConfig project) throws ServerException { } @Override protected void removeProject(ProjectConfig project) throws ServerException { } } }