Skip to content

Commit

Permalink
Add new command to improt projects in workspace
Browse files Browse the repository at this point in the history
Signed-off-by: Sheng Chen <[email protected]>
  • Loading branch information
jdneo committed May 19, 2020
1 parent a7bcbcc commit 480514e
Show file tree
Hide file tree
Showing 7 changed files with 232 additions and 0 deletions.
3 changes: 3 additions & 0 deletions org.eclipse.jdt.ls.core/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@
<command
id="java.project.getSemanticTokensLegend">
</command>
<command
id="java.project.import">
</command>
</delegateCommandHandler>
</extension>
<extension
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ public Object executeCommand(String commandId, List<Object> arguments, IProgress
return SemanticTokensCommand.provide((String) arguments.get(0));
case "java.project.getSemanticTokensLegend":
return SemanticTokensCommand.getLegend();
case "java.project.import":
ProjectCommand.importProject(monitor);
return null;
default:
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
Expand Down Expand Up @@ -128,6 +129,10 @@ public static boolean isTestFile(String uri) throws CoreException {
return false;
}

public static void importProject(IProgressMonitor monitor) {
JavaLanguageServerPlugin.getProjectsManager().importProjects(monitor);
}

private static IPath[] listTestSourcePaths(IJavaProject project) throws JavaModelException {
List<IPath> result = new ArrayList<>();
for (IClasspathEntry entry : project.getRawClasspath()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

import org.eclipse.core.internal.resources.Workspace;
Expand Down Expand Up @@ -149,6 +150,17 @@ public void importToWorkspace(IProgressMonitor monitor) throws CoreException, Op
for (MavenProjectInfo projectInfo : files) {
File pom = projectInfo.getPomFile();
IContainer container = root.getContainerForLocation(new Path(pom.getAbsolutePath()));
// getContainerForLocation() will return the nearest container for the given path,
// if the project has been imported, container.getProject() will return the imported IProject
// otherwise, container.getProject() will return the root level project
if (container != null && projectInfo.getParent() != null) {
MavenProjectInfo parentInfo = projectInfo.getParent();
File parentPom = parentInfo.getPomFile();
IContainer parentContainer = root.getContainerForLocation(new Path(parentPom.getAbsolutePath()));
if (parentContainer != null && Objects.equals(container.getProject(), parentContainer.getProject())) {
container = null;
}
}
if (container == null) {
digestStore.updateDigest(pom.toPath());
toImport.add(projectInfo);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,25 @@ protected void importProjects(Collection<IPath> rootPaths, IProgressMonitor moni
}
}

public void importProjects(IProgressMonitor monitor) {
WorkspaceJob job = new WorkspaceJob("Importing projects in workspace...") {

@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
try {
importProjects(preferenceManager.getPreferences().getRootPaths(), monitor);
} catch (OperationCanceledException e) {
JavaLanguageServerPlugin.logInfo("Importing projects job has been cancelled.");
} catch (CoreException e) {
JavaLanguageServerPlugin.logException("Importing projects failed.", e);
}
return null;
}
};
job.setRule(getWorkspaceRoot());
job.schedule();
}

@Override
public Job updateWorkspaceFolders(Collection<IPath> addedRootPaths, Collection<IPath> removedRootPaths) {
JavaLanguageServerPlugin.sendStatus(ServiceStatus.Message, "Updating workspace folders: Adding " + addedRootPaths.size() + " folder(s), removing " + removedRootPaths.size() + " folders.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ public StandardProjectsManager(PreferenceManager preferenceManager) {
this.preferenceManager = preferenceManager;
}

@Override
public void cleanInvalidProjects(final Collection<IPath> rootPaths, IProgressMonitor monitor) {
SubMonitor subMonitor = SubMonitor.convert(monitor, 20);
deleteInvalidProjects(rootPaths, subMonitor.split(10));
Expand Down Expand Up @@ -202,6 +203,7 @@ private List<IProject> findUnrelatedGradleProjects(List<IProject> suspiciousProj
return result;
}

@Override
public void fileChanged(String uriString, CHANGE_TYPE changeType) {
if (uriString == null) {
return;
Expand Down Expand Up @@ -390,6 +392,7 @@ public List<FileSystemWatcher> registerWatchers() {
return Collections.emptyList();
}

@Override
public void registerListeners() {
if (this.preferenceChangeListener == null) {
this.preferenceChangeListener = new IPreferencesChangeListener() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
/*******************************************************************************
* Copyright (c) 2018 Red Hat Inc. and others.
* 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:
* Red Hat Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.ls.core.internal.handlers;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

import org.apache.commons.io.FileUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.ls.core.internal.JavaClientConnection.JavaLanguageClient;
import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
import org.eclipse.jdt.ls.core.internal.JobHelpers;
import org.eclipse.jdt.ls.core.internal.ResourceUtils;
import org.eclipse.jdt.ls.core.internal.WorkspaceHelper;
import org.eclipse.jdt.ls.core.internal.managers.AbstractProjectsManagerBasedTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

/**
* @author snjeza
*
*/
@RunWith(MockitoJUnitRunner.class)
public class ImportNewProjectsTest extends AbstractProjectsManagerBasedTest {

protected JDTLanguageServer server;
@Mock
private JavaLanguageClient client;
private Path projectDir;

@Before
public void setup() throws Exception {
server = new JDTLanguageServer(projectsManager, preferenceManager);
server.connectClient(client);
JavaLanguageServerPlugin.getInstance().setProtocol(server);
projectDir = Files.createTempDirectory("test");
Collection<IPath> rootPaths = new ArrayList<>();
IPath rootPath = new org.eclipse.core.runtime.Path(projectDir.toFile().getAbsolutePath());
rootPaths.add(rootPath);
preferenceManager.getPreferences().setRootPaths(rootPaths);
Job updateJob = projectsManager.updateWorkspaceFolders(Collections.singleton(new org.eclipse.core.runtime.Path(projectDir.toString())), Collections.emptySet());
updateJob.join(20000, monitor);
}

@After
public void tearDown() {
server.disconnectClient();
JavaLanguageServerPlugin.getInstance().setProtocol(null);
try {
if (projectDir != null) {
FileUtils.deleteDirectory(projectDir.toFile());
}
} catch (IOException e) {
JavaLanguageServerPlugin.logException(e.getMessage(), e);
}
}

private void waitForJobs() {
JobHelpers.waitForJobsToComplete();
JobHelpers.waitForInitializeJobs();
}

@Test
public void testImportNewMavenProjects() throws Exception {
IWorkspaceRoot wsRoot = WorkspaceHelper.getWorkspaceRoot();
IWorkspace workspace = wsRoot.getWorkspace();
IProject[] projects = workspace.getRoot().getProjects();
assertEquals(0, projects.length);
File from = new File(getSourceProjectDirectory(), "maven/multimodule");
File projectBasePath = new File(projectDir.toFile(), "multimodule");
FileUtils.copyDirectory(from, projectBasePath);
projects = workspace.getRoot().getProjects();
assertEquals(0, projects.length);
projectsManager.importProjects(new NullProgressMonitor());
waitForJobs();
projects = workspace.getRoot().getProjects();
assertEquals(5, projects.length);

// Add new sub-module
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("multimodule");
IFile pom = project.getFile("/pom.xml");
ResourceUtils.setContent(pom, ResourceUtils.getContent(pom).replaceAll("<module>module1</module>", "<module>module1</module>\n<module>module4</module>"));
File subModulePath = new File(projectBasePath, "module4");
FileUtils.forceMkdir(subModulePath);
File buildFile = new File(subModulePath, "pom.xml");
buildFile.createNewFile();
BufferedWriter writer = new BufferedWriter(new FileWriter(buildFile, true));
writer.newLine();
//@formatter:off
writer.write(
"<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/xsd/maven-4.0.0.xsd\">" +
"<modelVersion>4.0.0</modelVersion>" +
"<parent>" +
"<groupId>foo.bar</groupId>" +
"<artifactId>multimodule</artifactId>" +
"<version>0.0.1-SNAPSHOT</version>" +
"</parent>" +
"<artifactId>module4</artifactId>" +
"</project>");
//@formatter:on
writer.close();

// Verify no projects imported
projects = workspace.getRoot().getProjects();
assertEquals(5, projects.length);

// Verify import projects
projectsManager.importProjects(new NullProgressMonitor());
waitForJobs();
IProject newProject = workspace.getRoot().getProject("module4");
assertTrue(newProject.exists());
projects = workspace.getRoot().getProjects();
assertEquals(6, projects.length);
}

@Test
public void testImportNewGradleProjects() throws Exception {
IWorkspaceRoot wsRoot = WorkspaceHelper.getWorkspaceRoot();
IWorkspace workspace = wsRoot.getWorkspace();
IProject[] projects = workspace.getRoot().getProjects();
assertEquals(0, projects.length);
File from = new File(getSourceProjectDirectory(), "gradle/multi-module");
File projectBasePath = new File(projectDir.toFile(), "multi-module");
FileUtils.copyDirectory(from, projectBasePath);
projects = workspace.getRoot().getProjects();
assertEquals(0, projects.length);
projectsManager.importProjects(new NullProgressMonitor());
waitForJobs();
IProject project = workspace.getRoot().getProject("multi-module");
assertTrue(project.exists());
projects = workspace.getRoot().getProjects();
assertEquals(3, projects.length);

// Add new sub-module
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(projectBasePath, "settings.gradle"), true));
writer.newLine();
writer.write("include 'test'");
writer.close();
File subModulePath = new File(projectBasePath, "test");
FileUtils.forceMkdir(subModulePath);
File buildFile = new File(subModulePath, "build.gradle");
buildFile.createNewFile();

// Verify no projects imported
projects = workspace.getRoot().getProjects();
assertEquals(3, projects.length);

// Verify import projects
projectsManager.importProjects(new NullProgressMonitor());
waitForJobs();
IProject newProject = workspace.getRoot().getProject("test");
assertTrue(newProject.exists());
projects = workspace.getRoot().getProjects();
assertEquals(4, projects.length);
}
}

0 comments on commit 480514e

Please sign in to comment.