/*******************************************************************************
* 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.java.plain.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.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.plain.server.projecttype.PlainJavaProjectType;
import org.eclipse.che.plugin.java.plain.server.projecttype.PlainJavaValueProviderFactory;
import org.eclipse.che.plugin.java.plain.shared.PlainJavaProjectConstants;
import org.eclipse.che.plugin.java.server.projecttype.JavaProjectType;
import org.eclipse.che.plugin.java.server.projecttype.JavaValueProviderFactory;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.internal.core.JavaModelManager;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import java.io.File;
import java.nio.file.PathMatcher;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.mockito.Mockito.mock;
/**
* @author Valeriy Svydenko
*/
public abstract class BaseTest {
private final static String wsPath = BaseTest.class.getResource("/projects").getFile();
private final static String INDEX_PATH = "target/fs_index";
protected File root;
protected ProjectRegistry projectRegistry;
protected ProjectManager projectManager;
protected LocalVirtualFileSystemProvider vfsProvider;
@BeforeClass
protected void initProjectApi() throws Exception {
JavaPlugin javaPlugin = new JavaPlugin(wsPath + "/set", null, null);
EventService eventService = new EventService();
TestWorkspaceHolder 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 projectTypeRegistry = new ProjectTypeRegistry(new HashSet<>());
projectTypeRegistry.registerProjectType(new JavaProjectType(new JavaValueProviderFactory()));
projectTypeRegistry.registerProjectType(new PlainJavaProjectType(new PlainJavaValueProviderFactory()));
ProjectHandlerRegistry projectHandlerRegistry = new ProjectHandlerRegistry(new HashSet<>());
projectRegistry = new ProjectRegistry(workspaceHolder, vfsProvider, projectTypeRegistry, projectHandlerRegistry, eventService);
projectRegistry.initProjects();
ProjectImporterRegistry importerRegistry = new ProjectImporterRegistry(new HashSet<>());
FileWatcherNotificationHandler fileWatcherNotificationHandler = new DefaultFileWatcherNotificationHandler(vfsProvider);
FileTreeWatcher fileTreeWatcher = new FileTreeWatcher(root, new HashSet<>(), fileWatcherNotificationHandler);
projectManager = new ProjectManager(vfsProvider,
projectTypeRegistry,
projectRegistry,
projectHandlerRegistry,
importerRegistry,
fileWatcherNotificationHandler,
fileTreeWatcher,
new TestWorkspaceHolder(new ArrayList<>()),
mock(FileWatcherManager.class));
ResourcesPlugin plugin = new ResourcesPlugin("target/index", wsPath, () -> projectRegistry, () -> projectManager);
plugin.start();
javaPlugin.start();
}
@AfterMethod
public void shutdownMavenServer() throws Exception {
JavaModelManager.getJavaModelManager().deltaState.removeExternalElementsToRefresh();
}
protected FolderEntry createTestProject() throws ServerException, NotFoundException, ConflictException, ForbiddenException {
String classpath = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<classpath>\n" +
"\t<classpathentry kind=\"con\" path=\"org.eclipse.jdt.launching.JRE_CONTAINER\"/>\n" +
"</classpath>";
FolderEntry parent = projectManager.getProjectsRoot().createFolder("project");
parent.createFolder("bin");
parent.createFolder("src");
FolderEntry codenvyFolder = parent.createFolder(".che");
FolderEntry libFolder = parent.createFolder("lib");
libFolder.createFile("a.jar", "text".getBytes());
codenvyFolder.createFile("classpath", classpath.getBytes());
projectRegistry.setProjectType(parent.getPath().toString(), PlainJavaProjectConstants.JAVAC_PROJECT_ID, false);
//inform DeltaProcessingStat about new project
JavaModelManager.getJavaModelManager().deltaState.resourceChanged(
new ResourceChangedEvent(root, new ProjectCreatedEvent("", parent.getPath().toString())));
return parent;
}
private static class TestWorkspaceHolder extends WorkspaceProjectsSyncer {
private List<ProjectConfigDto> projects;
TestWorkspaceHolder() {
this.projects = new ArrayList<>();
}
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 {
}
}
}