From 466e2ff03106c83f4c49fe26f2c0a1f1af01cc0e Mon Sep 17 00:00:00 2001 From: Siarhei Leanavets Date: Tue, 16 Mar 2021 14:11:22 +0300 Subject: [PATCH 1/4] Enhanced IBuildSupport usage to support other build tools such as bazel Based on https://github.com/eclipse/eclipse.jdt.ls/pull/1674 Signed-off-by: Siarhei Leanavets --- .../ls/core/internal/ExtensionsExtractor.java | 47 ++++++++ .../jdt/ls/core/internal/ProjectUtils.java | 24 ++-- .../internal/commands/BuildPathCommand.java | 111 ++++++++++-------- .../managers/BuildSupportManager.java | 59 ++++++++++ .../managers/DefaultProjectBuildSupport.java | 5 + .../managers/EclipseBuildSupport.java | 4 + .../internal/managers/GradleBuildSupport.java | 101 +++++++++++++++- .../managers/GradleProjectImporter.java | 2 +- .../core/internal/managers/IBuildSupport.java | 17 +++ .../managers/InternalBuildSupports.java | 23 ++++ .../InvisibleProjectBuildSupport.java | 5 + .../internal/managers/MavenBuildSupport.java | 16 ++- .../managers/MavenProjectImporter.java | 7 +- .../internal/managers/ProjectsManager.java | 3 +- .../managers/StandardProjectsManager.java | 77 ++---------- .../commands/BuildPathCommandTest.java | 10 +- .../AdvancedOrganizeImportsHandlerTest.java | 4 +- .../managers/AbstractGradleBasedTest.java | 3 +- .../managers/AbstractMavenBasedTest.java | 3 +- .../managers/GradleProjectImporterTest.java | 6 +- .../managers/MavenBuildSupportTest.java | 5 +- .../managers/MavenProjectImporterTest.java | 3 +- 22 files changed, 382 insertions(+), 153 deletions(-) create mode 100644 org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ExtensionsExtractor.java create mode 100644 org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java create mode 100644 org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InternalBuildSupports.java diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ExtensionsExtractor.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ExtensionsExtractor.java new file mode 100644 index 0000000000..6d8b7f23a6 --- /dev/null +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ExtensionsExtractor.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2021 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 2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.ls.core.internal; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.Platform; + +/** + * The class simplifies extracting extensions from the extension points. + * + * @author D.Bushenko + * + */ +public class ExtensionsExtractor { + public static List extractExtensions(final String namespace, final String extensionPointName) { + + final var extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(namespace, extensionPointName); + final var configs = extensionPoint.getConfigurationElements(); + + return Arrays.stream(configs).map(ExtensionsExtractor::makeExtension).collect(Collectors.toUnmodifiableList()); + } + + @SuppressWarnings("unchecked") + private static T makeExtension(IConfigurationElement config) { + try { + return (T) config.createExecutableExtension("class"); + + } catch (Exception ex) { + throw new IllegalArgumentException("Could not create the extension", ex); + } + } + +} diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java index 8aacf4d834..67f0970b88 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java @@ -30,7 +30,6 @@ import org.apache.commons.lang3.StringUtils; import org.codehaus.plexus.util.DirectoryScanner; -import org.eclipse.buildship.core.internal.configuration.GradleProjectNature; import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -48,9 +47,11 @@ import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.ls.core.internal.managers.BuildSupportManager; +import org.eclipse.jdt.ls.core.internal.managers.IBuildSupport; +import org.eclipse.jdt.ls.core.internal.managers.InternalBuildSupports; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; -import org.eclipse.m2e.core.internal.IMavenConstants; /** * @author Fred Bricon @@ -82,16 +83,13 @@ public static boolean isJavaProject(IProject project) { return hasNature(project, JavaCore.NATURE_ID); } - public static boolean isMavenProject(IProject project) { - return hasNature(project, IMavenConstants.NATURE_ID); - } - - public static boolean isGradleProject(IProject project) { - return hasNature(project, GradleProjectNature.ID); + public static boolean isGeneralJavaProject(IProject project) { + return isJavaProject(project) && isInternalBuildSupport(BuildSupportManager.find(project).orElse(null)); } - public static boolean isGeneralJavaProject(IProject project) { - return isJavaProject(project) && !isMavenProject(project) && !isGradleProject(project); + public static boolean isInternalBuildSupport(IBuildSupport buildSupport) { + return buildSupport != null && Arrays.stream(InternalBuildSupports.values()) + .anyMatch(bsn -> buildSupport.buildToolName().equals(bsn.toString())); } public static String getJavaSourceLevel(IProject project) { @@ -108,7 +106,11 @@ public static Map getJavaOptions(IProject project) { } public static List getGradleProjects() { - return Stream.of(getAllProjects()).filter(ProjectUtils::isGradleProject).collect(Collectors.toList()); + IBuildSupport buildSupport = BuildSupportManager.find("Gradle").get(); + return Stream + .of(getAllProjects()) + .filter(buildSupport::applies) + .collect(Collectors.toList()); } public static IJavaProject[] getJavaProjects() { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommand.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommand.java index 78c0864ad2..56f86fbcad 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommand.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommand.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018-2021 Microsoft Corporation and others. + * Copyright (c) 2018 Microsoft Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -34,19 +34,24 @@ import org.eclipse.jdt.ls.core.internal.Messages; import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.ResourceUtils; +import org.eclipse.jdt.ls.core.internal.managers.BuildSupportManager; +import org.eclipse.jdt.ls.core.internal.managers.IBuildSupport; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; public class BuildPathCommand { - public static final String UNSUPPORTED_ON_MAVEN = "Unsupported operation. Please use pom.xml file to manage the source directories of maven project."; - public static final String UNSUPPORTED_ON_GRADLE = "Unsupported operation. Please use build.gradle file to manage the source directories of gradle project."; + private static final String UNSUPPORTED_OPERATION = "Unsupported operation. Please use your build tool project file to manage the source directories of the project."; + + private static String unsupportedOperationMessage(IProject targetProject) { + return BuildSupportManager.obtainBuildSupports().stream().filter(bs -> bs.applies(targetProject)).findFirst().map(IBuildSupport::unsupportedOperationMessage).orElse(UNSUPPORTED_OPERATION); + } public static Result addToSourcePath(String sourceFolderUri) { IPath sourceFolderPath = ResourceUtils.filePathFromURI(sourceFolderUri); IProject targetProject = findBelongedProject(sourceFolderPath); + if (targetProject != null && !ProjectUtils.isGeneralJavaProject(targetProject)) { - String message = ProjectUtils.isGradleProject(targetProject) ? UNSUPPORTED_ON_GRADLE : UNSUPPORTED_ON_MAVEN; - return new Result(false, message); + return new Result(false, unsupportedOperationMessage(targetProject)); } IPath projectLocation = null; @@ -99,8 +104,7 @@ public static Result removeFromSourcePath(String sourceFolderUri) { IPath sourceFolderPath = ResourceUtils.filePathFromURI(sourceFolderUri); IProject targetProject = findBelongedProject(sourceFolderPath); if (targetProject != null && !ProjectUtils.isGeneralJavaProject(targetProject)) { - String message = ProjectUtils.isGradleProject(targetProject) ? UNSUPPORTED_ON_GRADLE : UNSUPPORTED_ON_MAVEN; - return new Result(false, message); + return new Result(false, unsupportedOperationMessage(targetProject)); } IPath projectLocation = null; @@ -141,52 +145,58 @@ public static Result removeFromSourcePath(String sourceFolderUri) { } public static Result listSourcePaths() { + try { + List sourcePathList = new ArrayList<>(); + IProject[] projects = ProjectUtils.getAllProjects(); + for (IProject project : projects) { + if (!ProjectsManager.DEFAULT_PROJECT_NAME.equals(project.getName()) && ProjectUtils.isJavaProject(project)) { + sourcePathList.addAll(tryAddProjectToSourcePath(project)); + } + } + + return new ListCommandResult(true, null, sourcePathList.toArray(new SourcePath[0])); + + } catch (JavaModelException e) { + JavaLanguageServerPlugin.logException("Failed to resolve the existing source paths in current workspace.", e); + return new ListCommandResult(false, e.getMessage()); + } + } + + private static List tryAddProjectToSourcePath(IProject project) throws JavaModelException { List sourcePathList = new ArrayList<>(); - IProject[] projects = ProjectUtils.getAllProjects(); - for (IProject project : projects) { - if (!ProjectsManager.DEFAULT_PROJECT_NAME.equals(project.getName()) && ProjectUtils.isJavaProject(project)) { - try { - IPath[] paths = ProjectUtils.listSourcePaths(JavaCore.create(project)); - for (IPath path : paths) { - IPath entryPath = path; - String projectName = project.getName(); - String projectType = "General"; - if (ProjectUtils.isMavenProject(project)) { - projectType = "Maven"; - } - - if (ProjectUtils.isGradleProject(project)) { - projectType = "Gradle"; - } - - IContainer projectRoot = project; - if (!ProjectUtils.isVisibleProject(project)) { - projectType = "Workspace"; - IFolder workspaceLinkFolder = project.getFolder(ProjectUtils.WORKSPACE_LINK); - if (!workspaceLinkFolder.isLinked()) { - continue; - } - - projectRoot = workspaceLinkFolder; - } - - IPath relativePath = entryPath.makeRelativeTo(projectRoot.getFullPath()); - IPath location = projectRoot.getRawLocation().append(relativePath); - IPath displayPath = getWorkspacePath(location); - sourcePathList.add(new SourcePath(location != null ? location.toOSString() : "", - displayPath != null ? displayPath.toOSString() : entryPath.toOSString(), - entryPath.toOSString(), - projectName, - projectType)); - } - } catch (JavaModelException e) { - JavaLanguageServerPlugin.logException("Failed to resolve the existing source paths in current workspace.", e); - return new ListCommandResult(false, e.getMessage()); + IPath[] paths = ProjectUtils.listSourcePaths(JavaCore.create(project)); + + for (IPath path : paths) { + IPath entryPath = path; + String projectName = project.getName(); + String projectType = determineProjectType(project); + + IContainer projectRoot = project; + if (!ProjectUtils.isVisibleProject(project)) { + projectType = "Workspace"; + IFolder workspaceLinkFolder = project.getFolder(ProjectUtils.WORKSPACE_LINK); + if (!workspaceLinkFolder.isLinked()) { + continue; } + + projectRoot = workspaceLinkFolder; } + + IPath relativePath = entryPath.makeRelativeTo(projectRoot.getFullPath()); + IPath location = projectRoot.getRawLocation().append(relativePath); + IPath displayPath = getWorkspacePath(location); + sourcePathList.add(new SourcePath(location != null ? location.toOSString() : "", + displayPath != null ? displayPath.toOSString() : entryPath.toOSString(), + entryPath.toOSString(), + projectName, + projectType)); } - return new ListCommandResult(true, null, sourcePathList.toArray(new SourcePath[0])); + return sourcePathList; + } + + private static String determineProjectType(IProject project) { + return BuildSupportManager.find(project).map(buildSupport -> buildSupport.buildToolName()).orElseGet(() -> "General"); } private static String[] getInvisibleProjectRelativeSourcePaths(IJavaProject javaProject) throws JavaModelException { @@ -199,10 +209,9 @@ private static String[] getInvisibleProjectRelativeSourcePaths(IJavaProject java } IPath[] paths = ProjectUtils.listSourcePaths(javaProject); return Arrays.stream(paths) - .map(p -> p.makeRelativeTo(workspaceLinkFolder.getFullPath()).toString()) - .toArray(String[]::new); + .map(p -> p.makeRelativeTo(workspaceLinkFolder.getFullPath()).toString()) + .toArray(String[]::new); } - private static IProject findBelongedProject(IPath sourceFolder) { List projects = Stream.of(ProjectUtils.getAllProjects()).filter(ProjectUtils::isJavaProject).sorted(new Comparator() { @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java new file mode 100644 index 0000000000..48d90ba462 --- /dev/null +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2021 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 2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.ls.core.internal.managers; + + + +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; + +import org.eclipse.core.resources.IProject; +import org.eclipse.jdt.ls.core.internal.ExtensionsExtractor; +import org.eclipse.jdt.ls.core.internal.IConstants; + +/** + * This is an orchestrator who is responsible for fetching and searching + * IBuildSupport objects. + * + * @author D.Bushenko + * + */ +public class BuildSupportManager { + private static final BuildSupportManager instance = new BuildSupportManager(); + private List lazyLoadedBuildSupportList; + + private BuildSupportManager() {} + + public static List obtainBuildSupports() { + if (instance.lazyLoadedBuildSupportList == null) { + instance.lazyLoadedBuildSupportList = ExtensionsExtractor.extractExtensions(IConstants.PLUGIN_ID, "buildSupport"); + } + + return instance.lazyLoadedBuildSupportList; + } + + public static Optional find(IProject project) { + return instance.find(bs -> bs.applies(project)); + } + + public static Optional find(String buildToolName) { + return instance.find(bs -> bs.buildToolName().equalsIgnoreCase(buildToolName)); + } + + ///////// + + private Optional find(Predicate predicate) { + return obtainBuildSupports().stream().filter(predicate).findFirst(); + } +} diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/DefaultProjectBuildSupport.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/DefaultProjectBuildSupport.java index 1690fa02c2..1131db96a3 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/DefaultProjectBuildSupport.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/DefaultProjectBuildSupport.java @@ -22,4 +22,9 @@ public boolean applies(IProject project) { return JavaLanguageServerPlugin.getProjectsManager().getDefaultProject().equals(project); } + @Override + public String buildToolName() { + return InternalBuildSupports.DEFAULT.toString(); + } + } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/EclipseBuildSupport.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/EclipseBuildSupport.java index a20af3bd18..ddf78a3ceb 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/EclipseBuildSupport.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/EclipseBuildSupport.java @@ -103,5 +103,9 @@ public void discoverSource(IClassFile classFile, IProgressMonitor monitor) throw } } + @Override + public String buildToolName() { + return InternalBuildSupports.ECLIPSE.toString(); + } } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleBuildSupport.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleBuildSupport.java index 943e8f0685..98abed9ad3 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleBuildSupport.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleBuildSupport.java @@ -14,7 +14,9 @@ import java.io.File; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; @@ -23,7 +25,9 @@ import org.eclipse.buildship.core.GradleBuild; import org.eclipse.buildship.core.GradleCore; import org.eclipse.buildship.core.internal.CorePlugin; +import org.eclipse.buildship.core.internal.configuration.GradleProjectNature; import org.eclipse.buildship.core.internal.launch.GradleClasspathProvider; +import org.eclipse.buildship.core.internal.preferences.PersistentModel; import org.eclipse.buildship.core.internal.util.file.FileUtils; import org.eclipse.buildship.core.internal.workspace.FetchStrategy; import org.eclipse.buildship.core.internal.workspace.InternalGradleBuild; @@ -40,6 +44,7 @@ import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.ProjectUtils; +import org.eclipse.jdt.ls.core.internal.ResourceUtils; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.CHANGE_TYPE; import org.eclipse.jdt.ls.core.internal.preferences.IPreferencesChangeListener; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; @@ -56,12 +61,13 @@ public class GradleBuildSupport implements IBuildSupport { public static final String GRADLE_SUFFIX = ".gradle"; public static final String GRADLE_PROPERTIES = "gradle.properties"; public static final List WATCH_FILE_PATTERNS = Arrays.asList("**/*.gradle", "**/gradle.properties"); + public static final String UNSUPPORTED_ON_GRADLE = "Unsupported operation. Please use build.gradle file to manage the source directories of gradle project."; private static IPreferencesChangeListener listener = new GradlePreferenceChangeListener(); @Override public boolean applies(IProject project) { - return ProjectUtils.isGradleProject(project); + return ProjectUtils.hasNature(project, GradleProjectNature.ID); } @Override @@ -103,10 +109,11 @@ private boolean isRoot(IProject project, GradleBuild gradleBuild, IProgressMonit } return false; } + @Override public boolean isBuildFile(IResource resource) { if (resource != null && resource.getType() == IResource.FILE && (resource.getName().endsWith(GRADLE_SUFFIX) || resource.getName().equals(GRADLE_PROPERTIES)) - && ProjectUtils.isGradleProject(resource.getProject())) { + && applies(resource.getProject())) { try { if (!ProjectUtils.isJavaProject(resource.getProject())) { return true; @@ -185,4 +192,94 @@ public void registerPreferencesChangeListener(PreferenceManager preferenceManage public void unregisterPreferencesChangeListener(PreferenceManager preferenceManager) throws CoreException { preferenceManager.removePreferencesChangeListener(listener); } + + @Override + public String buildToolName() { + return "Gradle"; + } + + @Override + public String unsupportedOperationMessage() { + return UNSUPPORTED_ON_GRADLE; + } + + @Override + public boolean hasSpecificDeleteProjectLogic() { + return true; + } + + @Override + public void deleteInvalidProjects(Collection rootPaths, ArrayList deleteProjectCandates, IProgressMonitor monitor) { + List validGradleProjects = new ArrayList<>(); + List suspiciousGradleProjects = new ArrayList<>(); + + for (IProject project : deleteProjectCandates) { + if (applies(project)) { + if (ResourceUtils.isContainedIn(project.getLocation(), rootPaths)) { + validGradleProjects.add(project); + } else { + suspiciousGradleProjects.add(project); + } + } + + } + + List unrelatedProjects = findUnrelatedGradleProjects(suspiciousGradleProjects, validGradleProjects); + unrelatedProjects.forEach((project) -> { + try { + project.delete(false, true, monitor); + } catch (CoreException e1) { + JavaLanguageServerPlugin.logException(e1.getMessage(), e1); + } + }); + } + + /** + * Find those gradle projects not referenced by any gradle project in the + * current workspace. + */ + private List findUnrelatedGradleProjects(List suspiciousProjects, List validProjects) { + suspiciousProjects.sort((IProject p1, IProject p2) -> p1.getLocation().toOSString().length() - p2.getLocation().toOSString().length()); + + List unrelatedCandidates = new ArrayList<>(); + Collection validSubPaths = new ArrayList<>(); + for (IProject suspiciousProject : suspiciousProjects) { + if (validSubPaths.contains(suspiciousProject.getFullPath().makeRelative())) { + continue; + } + + // Check whether the suspicious gradle project is the parent project of the opening project. + boolean isParentProject = false; + Collection subpaths = null; + PersistentModel model = CorePlugin.modelPersistence().loadModel(suspiciousProject); + if (model.isPresent()) { + subpaths = model.getSubprojectPaths(); + if (!subpaths.isEmpty()) { + for (IProject validProject : validProjects) { + if (subpaths.contains(validProject.getFullPath().makeRelative())) { + isParentProject = true; + break; + } + } + } + } + + if (isParentProject) { + validSubPaths.addAll(subpaths); + } else { + unrelatedCandidates.add(suspiciousProject); + } + } + + List result = new ArrayList<>(); + // Exclude those projects which are the subprojects of the verified parent project. + for (IProject candidate : unrelatedCandidates) { + if (!validSubPaths.contains(candidate.getFullPath().makeRelative())) { + result.add(candidate); + } + } + + return result; + } + } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporter.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporter.java index be9b4e3d7c..9a033fdf8f 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporter.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporter.java @@ -98,7 +98,7 @@ public boolean applies(IProgressMonitor monitor) throws CoreException { .addExclusions("**/build")//default gradle build dir .addExclusions("**/bin"); for (IProject project : ProjectUtils.getAllProjects()) { - if (!ProjectUtils.isGradleProject(project)) { + if (!BuildSupportManager.find("Gradle").get().applies(project)) { String path = project.getLocation().toOSString(); gradleDetector.addExclusions(path); } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/IBuildSupport.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/IBuildSupport.java index 432538b29f..340d3a272b 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/IBuildSupport.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/IBuildSupport.java @@ -12,12 +12,15 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.managers; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.jdt.core.IClassFile; @@ -137,4 +140,18 @@ default void registerPreferencesChangeListener(PreferenceManager preferenceManag default void unregisterPreferencesChangeListener(PreferenceManager preferenceManager) throws CoreException { } + default String buildToolName() { + return "UnknownBuildTool"; + } + + default boolean hasSpecificDeleteProjectLogic() { + return false; + } + + default void deleteInvalidProjects(Collection rootPaths, ArrayList deleteProjectCandates, IProgressMonitor monitor) {} + + default String unsupportedOperationMessage() { + return "Unsupported operation. Please use your build tool project file to manage the source directories of the project."; + } + } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InternalBuildSupports.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InternalBuildSupports.java new file mode 100644 index 0000000000..a820c71a08 --- /dev/null +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InternalBuildSupports.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2021 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 2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.ls.core.internal.managers; + +/** + * @author siarhei_leanavets1 + * + */ +public enum InternalBuildSupports { + + DEFAULT, ECLIPSE, INVISIBLE + +} diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectBuildSupport.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectBuildSupport.java index 0516e49c21..cebf515161 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectBuildSupport.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectBuildSupport.java @@ -119,4 +119,9 @@ public void unregisterPreferencesChangeListener(PreferenceManager preferenceMana preferenceManager.removePreferencesChangeListener(listener); } + @Override + public String buildToolName() { + return InternalBuildSupports.INVISIBLE.toString(); + } + } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupport.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupport.java index dd9422bc44..82f23e7ec3 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupport.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupport.java @@ -33,6 +33,7 @@ import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.CHANGE_TYPE; import org.eclipse.m2e.core.MavenPlugin; +import org.eclipse.m2e.core.internal.IMavenConstants; import org.eclipse.m2e.core.internal.MavenPluginActivator; import org.eclipse.m2e.core.internal.project.ProjectConfigurationManager; import org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager; @@ -48,6 +49,7 @@ */ public class MavenBuildSupport implements IBuildSupport { + public static final String UNSUPPORTED_ON_MAVEN = "Unsupported operation. Please use pom.xml file to manage the source directories of maven project."; private static final List WATCH_FILE_PATTERNS = Collections.singletonList("**/pom.xml"); private IProjectConfigurationManager configurationManager; @@ -66,7 +68,7 @@ public MavenBuildSupport() { @Override public boolean applies(IProject project) { - return ProjectUtils.isMavenProject(project); + return ProjectUtils.hasNature(project, IMavenConstants.NATURE_ID); } @Override @@ -92,7 +94,7 @@ public void update(IProject project, boolean force, IProgressMonitor monitor) th } public void collectProjects(Collection projects, IProject project, IProgressMonitor monitor) { - if (!project.isOpen() || !ProjectUtils.isMavenProject(project)) { + if (!project.isOpen() || !applies(project)) { return; } projects.add(project); @@ -155,4 +157,14 @@ public List getWatchPatterns() { return WATCH_FILE_PATTERNS; } + @Override + public String buildToolName() { + return "Maven"; + } + + @Override + public String unsupportedOperationMessage() { + return UNSUPPORTED_ON_MAVEN; + } + } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporter.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporter.java index ffc90bec9e..fd0efafce1 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporter.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporter.java @@ -90,7 +90,10 @@ public boolean applies(IProgressMonitor monitor) throws OperationCanceledExcepti .addExclusions("**/target"); //default maven build dir //@formatter:on for (IProject project : ProjectUtils.getAllProjects()) { - if (!ProjectUtils.isMavenProject(project)) { + // MavenBuildSupport must be available, otherwise the whole system is broken. + IBuildSupport buildSupport = BuildSupportManager.find("Maven").get(); + + if (!buildSupport.applies(project)) { String path = project.getLocation().toOSString(); mavenDetector.addExclusions(path); } @@ -151,7 +154,7 @@ public void importToWorkspace(IProgressMonitor monitor) throws CoreException, Op } else { IProject project = container.getProject(); boolean valid = !ProjectUtils.isJavaProject(project) || project.getFile(IJavaProject.CLASSPATH_FILE_NAME).exists(); - if (ProjectUtils.isMavenProject(project) && valid) { + if (BuildSupportManager.find("Maven").get().applies(project) && valid) { projects.add(container.getProject()); } else if (project != null) { //Project doesn't have the Maven nature, so we (re)import it diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/ProjectsManager.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/ProjectsManager.java index 9e1f15f620..d172cc7fdb 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/ProjectsManager.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/ProjectsManager.java @@ -330,9 +330,10 @@ public static IProject createJavaProject(IProject project, IPath projectLocation @Override public Job updateProject(IProject project, boolean force) { - if (project == null || (!ProjectUtils.isMavenProject(project) && !ProjectUtils.isGradleProject(project))) { + if (project == null || ProjectUtils.isInternalBuildSupport(BuildSupportManager.find(project).orElse(null))) { return null; } + JavaLanguageServerPlugin.sendStatus(ServiceStatus.Message, "Updating " + project.getName() + " configuration"); WorkspaceJob job = new WorkspaceJob("Update project " + project.getName()) { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/StandardProjectsManager.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/StandardProjectsManager.java index 88dc1b2d05..3d53653477 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/StandardProjectsManager.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/StandardProjectsManager.java @@ -39,8 +39,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.eclipse.buildship.core.internal.CorePlugin; -import org.eclipse.buildship.core.internal.preferences.PersistentModel; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -128,21 +126,23 @@ public void cleanInvalidProjects(final Collection rootPaths, IProgressMon private void deleteInvalidProjects(Collection rootPaths, IProgressMonitor monitor) { List workspaceProjects = rootPaths.stream().map((IPath rootPath) -> ProjectUtils.getWorkspaceInvisibleProjectName(rootPath)).collect(Collectors.toList()); - List validGradleProjects = new ArrayList<>(); - List suspiciousGradleProjects = new ArrayList<>(); + ArrayList deleteProjectCandates = new ArrayList<>(); for (IProject project : ProjectUtils.getAllProjects()) { if (project.equals(getDefaultProject())) { continue; } - if (project.exists() && (ResourceUtils.isContainedIn(project.getLocation(), rootPaths) || ProjectUtils.isGradleProject(project) || workspaceProjects.contains(project.getName()))) { + + boolean hasSpecificDeleteProjectLogic = false; + Optional buildSupportOpt = BuildSupportManager.find(project); + if (buildSupportOpt.isPresent()) { + hasSpecificDeleteProjectLogic = buildSupportOpt.get().hasSpecificDeleteProjectLogic(); + } + + if (project.exists() && (ResourceUtils.isContainedIn(project.getLocation(), rootPaths) || workspaceProjects.contains(project.getName()) || hasSpecificDeleteProjectLogic)) { try { project.getDescription(); - if (ProjectUtils.isGradleProject(project)) { - if (ResourceUtils.isContainedIn(project.getLocation(), rootPaths)) { - validGradleProjects.add(project); - } else { - suspiciousGradleProjects.add(project); - } + if (hasSpecificDeleteProjectLogic) { + deleteProjectCandates.add(project); } } catch (CoreException e) { try { @@ -160,61 +160,8 @@ private void deleteInvalidProjects(Collection rootPaths, IProgressMonitor } } - List unrelatedProjects = findUnrelatedGradleProjects(suspiciousGradleProjects, validGradleProjects); - unrelatedProjects.forEach((project) -> { - try { - project.delete(false, true, monitor); - } catch (CoreException e1) { - JavaLanguageServerPlugin.logException(e1.getMessage(), e1); - } - }); - } - - /** - * Find those gradle projects not referenced by any gradle project in the current workspace. - */ - private List findUnrelatedGradleProjects(List suspiciousProjects, List validProjects) { - suspiciousProjects.sort((IProject p1, IProject p2) -> p1.getLocation().toOSString().length() - p2.getLocation().toOSString().length()); - - List unrelatedCandidates = new ArrayList<>(); - Collection validSubPaths = new ArrayList<>(); - for (IProject suspiciousProject : suspiciousProjects) { - if (validSubPaths.contains(suspiciousProject.getFullPath().makeRelative())) { - continue; - } - - // Check whether the suspicious gradle project is the parent project of the opening project. - boolean isParentProject = false; - Collection subpaths = null; - PersistentModel model = CorePlugin.modelPersistence().loadModel(suspiciousProject); - if (model.isPresent()) { - subpaths = model.getSubprojectPaths(); - if (!subpaths.isEmpty()) { - for (IProject validProject : validProjects) { - if (subpaths.contains(validProject.getFullPath().makeRelative())) { - isParentProject = true; - break; - } - } - } - } - - if (isParentProject) { - validSubPaths.addAll(subpaths); - } else { - unrelatedCandidates.add(suspiciousProject); - } - } - - List result = new ArrayList<>(); - // Exclude those projects which are the subprojects of the verified parent project. - for (IProject candidate : unrelatedCandidates) { - if (!validSubPaths.contains(candidate.getFullPath().makeRelative())) { - result.add(candidate); - } - } + BuildSupportManager.obtainBuildSupports().stream().filter(IBuildSupport::hasSpecificDeleteProjectLogic).forEach(buildSupport -> buildSupport.deleteInvalidProjects(rootPaths, deleteProjectCandates, monitor)); - return result; } @Override diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommandTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommandTest.java index 9d8899b74e..1f4f2f320c 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommandTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommandTest.java @@ -36,6 +36,8 @@ import org.eclipse.jdt.ls.core.internal.commands.BuildPathCommand.Result; import org.eclipse.jdt.ls.core.internal.commands.BuildPathCommand.SourcePath; import org.eclipse.jdt.ls.core.internal.managers.AbstractProjectsManagerBasedTest; +import org.eclipse.jdt.ls.core.internal.managers.GradleBuildSupport; +import org.eclipse.jdt.ls.core.internal.managers.MavenBuildSupport; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; import org.junit.Test; @@ -120,12 +122,12 @@ public void testBuildPathOperationInMavenProject() throws Exception { IResource srcResource = project.findMember("src"); Result addSrcResult = BuildPathCommand.addToSourcePath(JDTUtils.getFileURI(srcResource)); assertFalse(addSrcResult.status); - assertEquals(addSrcResult.message, BuildPathCommand.UNSUPPORTED_ON_MAVEN); + assertEquals(addSrcResult.message, MavenBuildSupport.UNSUPPORTED_ON_MAVEN); IResource mainJavaResource = project.findMember("src/main/java"); Result addMainJavaResult = BuildPathCommand.removeFromSourcePath(JDTUtils.getFileURI(mainJavaResource)); assertFalse(addMainJavaResult.status); - assertEquals(addMainJavaResult.message, BuildPathCommand.UNSUPPORTED_ON_MAVEN); + assertEquals(addMainJavaResult.message, MavenBuildSupport.UNSUPPORTED_ON_MAVEN); } @Test @@ -144,11 +146,11 @@ public void testBuildPathOperationInGradleProject() throws Exception { IResource srcResource = project.findMember("src"); Result addSrcResult = BuildPathCommand.addToSourcePath(JDTUtils.getFileURI(srcResource)); assertFalse(addSrcResult.status); - assertEquals(addSrcResult.message, BuildPathCommand.UNSUPPORTED_ON_GRADLE); + assertEquals(addSrcResult.message, GradleBuildSupport.UNSUPPORTED_ON_GRADLE); IResource mainJavaResource = project.findMember("src/main/java"); Result addMainJavaResult = BuildPathCommand.removeFromSourcePath(JDTUtils.getFileURI(mainJavaResource)); assertFalse(addMainJavaResult.status); - assertEquals(addMainJavaResult.message, BuildPathCommand.UNSUPPORTED_ON_GRADLE); + assertEquals(addMainJavaResult.message, GradleBuildSupport.UNSUPPORTED_ON_GRADLE); } } diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/AdvancedOrganizeImportsHandlerTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/AdvancedOrganizeImportsHandlerTest.java index fe7584f245..99f77c9866 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/AdvancedOrganizeImportsHandlerTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/AdvancedOrganizeImportsHandlerTest.java @@ -33,10 +33,10 @@ import org.eclipse.jdt.internal.corext.util.JavaModelUtil; import org.eclipse.jdt.internal.corext.util.ValidateEditException; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.codemanipulation.AbstractSourceTestCase; import org.eclipse.jdt.ls.core.internal.handlers.OrganizeImportsHandler.ImportCandidate; import org.eclipse.jdt.ls.core.internal.handlers.OrganizeImportsHandler.ImportSelection; +import org.eclipse.jdt.ls.core.internal.managers.BuildSupportManager; import org.eclipse.text.edits.TextEdit; import org.junit.Test; @@ -142,7 +142,7 @@ public void testStaticImports() throws ValidateEditException, CoreException, IOE public void testAmbiguousStaticImports() throws Exception { importProjects("maven/salut4"); IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("salut4"); - assertTrue(ProjectUtils.isMavenProject(project)); + assertTrue(BuildSupportManager.find("Maven").get().applies(project)); String[] favourites = JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getJavaCompletionFavoriteMembers(); try { List list = new ArrayList<>(); diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractGradleBasedTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractGradleBasedTest.java index b13d5d9162..7ad0254caf 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractGradleBasedTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractGradleBasedTest.java @@ -19,7 +19,6 @@ import static org.junit.Assert.assertTrue; import org.eclipse.core.resources.IProject; -import org.eclipse.jdt.ls.core.internal.ProjectUtils; /** * @author Fred Bricon @@ -43,7 +42,7 @@ protected IProject importGradleProject(String name) throws Exception { protected void assertIsGradleProject(IProject project) { assertNotNull(project); - assertTrue(project.getName() +" is missing the Gradle nature", ProjectUtils.isGradleProject(project)); + assertTrue(project.getName() + " is missing the Gradle nature", BuildSupportManager.find("Gradle").get().applies(project)); } } diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractMavenBasedTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractMavenBasedTest.java index 07f93e89ec..df399c7949 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractMavenBasedTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractMavenBasedTest.java @@ -19,7 +19,6 @@ import static org.junit.Assert.assertTrue; import org.eclipse.core.resources.IProject; -import org.eclipse.jdt.ls.core.internal.ProjectUtils; /** * @author Fred Bricon @@ -53,7 +52,7 @@ protected IProject importSimpleJavaProject() throws Exception { protected void assertIsMavenProject(IProject project) { assertNotNull(project); - assertTrue(project.getName() +" is missing the Maven nature", ProjectUtils.isMavenProject(project)); + assertTrue(project.getName() + " is missing the Maven nature", BuildSupportManager.find("Maven").get().applies(project)); } protected String comment(String s, String from, String to) { diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporterTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporterTest.java index 541cbaee74..6b95e0d37f 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporterTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporterTest.java @@ -166,7 +166,7 @@ public void testDisableGradleWrapper() throws Exception { assertEquals(2, projects.size());//default + 1 eclipse projects IProject eclipse = WorkspaceHelper.getProject("eclipsegradle"); assertNotNull(eclipse); - assertTrue(eclipse.getName() + " does not have the Gradle nature", ProjectUtils.isGradleProject(eclipse)); + assertTrue(eclipse.getName() + " does not have the Gradle nature", BuildSupportManager.find("Gradle").get().applies(eclipse)); } finally { JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setGradleWrapperEnabled(enabled); JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setGradleVersion(gradleVersion); @@ -185,7 +185,7 @@ public void testGradleUserHome() throws Exception { assertEquals(2, projects.size());//default + 1 eclipse projects IProject project = WorkspaceHelper.getProject("simple-gradle"); assertNotNull(project); - assertTrue(project.getName() + " does not have the Gradle nature", ProjectUtils.isGradleProject(project)); + assertTrue(project.getName() + " does not have the Gradle nature", BuildSupportManager.find("Gradle").get().applies(project)); assertTrue(gradleUserHome.exists()); ProjectConfiguration projectConfiguration = CorePlugin.configurationManager().loadProjectConfiguration(project); assertEquals(gradleUserHome, projectConfiguration.getBuildConfiguration().getGradleUserHome()); @@ -259,7 +259,7 @@ public void testDisableImportGradle() throws Exception { assertEquals(2, projects.size());//default + 1 eclipse projects IProject eclipse = WorkspaceHelper.getProject("eclipse"); assertNotNull(eclipse); - assertFalse(eclipse.getName() + " has the Gradle nature", ProjectUtils.isGradleProject(eclipse)); + assertFalse(eclipse.getName() + " has the Gradle nature", BuildSupportManager.find("Gradle").get().applies(eclipse)); } finally { JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setImportGradleEnabled(enabled); } diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupportTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupportTest.java index 701fde61e1..c8de0d2ed5 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupportTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupportTest.java @@ -46,7 +46,6 @@ import org.eclipse.jdt.ls.core.internal.DependencyUtil; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.JobHelpers; -import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.ResourceUtils; import org.eclipse.jdt.ls.core.internal.SourceContentProvider; import org.eclipse.jdt.ls.core.internal.WorkspaceHelper; @@ -227,11 +226,11 @@ public void testUpdateSnapshots() throws Exception { public void testBatchImport() throws Exception { IProject project = importMavenProject("batch"); waitForBackgroundJobs(); - assertTrue(ProjectUtils.isMavenProject(project)); + assertTrue(BuildSupportManager.find("Maven").get().applies(project)); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); assertEquals(root.getProjects().length, 14); project = root.getProject("batchchild"); - assertTrue(ProjectUtils.isMavenProject(project)); + assertTrue(BuildSupportManager.find("Maven").get().applies(project)); } protected void testNonStandardCompilerId(String projectName) throws Exception { diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java index 4c5555ade1..dd152c6a17 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java @@ -41,7 +41,6 @@ import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.WorkspaceHelper; import org.eclipse.jdt.ls.core.internal.handlers.ProgressReporterManager; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.CHANGE_TYPE; @@ -143,7 +142,7 @@ public void testDisableMaven() throws Exception { assertEquals(2, projects.size());//default + 1 eclipse projects IProject eclipse = WorkspaceHelper.getProject("eclipse"); assertNotNull(eclipse); - assertFalse(eclipse.getName() + " has the Maven nature", ProjectUtils.isMavenProject(eclipse)); + assertFalse(eclipse.getName() + " has the Maven nature", BuildSupportManager.find("Maven").get().applies(eclipse)); } finally { JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setImportMavenEnabled(enabled); } From c82a8e4d4e5c49a4d728c14ad83ce6fd30e42906 Mon Sep 17 00:00:00 2001 From: Siarhei Leanavets Date: Sun, 28 Mar 2021 19:13:00 +0300 Subject: [PATCH 2/4] Refactored ExtensionsExtractor Signed-off-by: Siarhei Leanavets --- .../jdt/ls/core/internal/ExtensionsExtractor.java | 13 ++++++++++--- .../core/internal/managers/BuildSupportManager.java | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ExtensionsExtractor.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ExtensionsExtractor.java index 6d8b7f23a6..91722bc922 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ExtensionsExtractor.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ExtensionsExtractor.java @@ -12,8 +12,9 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal; -import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.TreeMap; import java.util.stream.Collectors; import org.eclipse.core.runtime.IConfigurationElement; @@ -26,12 +27,18 @@ * */ public class ExtensionsExtractor { - public static List extractExtensions(final String namespace, final String extensionPointName) { + public static List extractOrderedExtensions(final String namespace, final String extensionPointName) { final var extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(namespace, extensionPointName); final var configs = extensionPoint.getConfigurationElements(); - return Arrays.stream(configs).map(ExtensionsExtractor::makeExtension).collect(Collectors.toUnmodifiableList()); + Map extensionMap = new TreeMap<>(); + + for (int i = 0; i < configs.length; i++) { + Integer order = Integer.valueOf(configs[i].getAttribute("order")); + extensionMap.put(order, makeExtension(configs[i])); + } + return extensionMap.values().stream().collect(Collectors.toUnmodifiableList()); } @SuppressWarnings("unchecked") diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java index 48d90ba462..2bdfcb30b2 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java @@ -37,7 +37,7 @@ private BuildSupportManager() {} public static List obtainBuildSupports() { if (instance.lazyLoadedBuildSupportList == null) { - instance.lazyLoadedBuildSupportList = ExtensionsExtractor.extractExtensions(IConstants.PLUGIN_ID, "buildSupport"); + instance.lazyLoadedBuildSupportList = ExtensionsExtractor.extractOrderedExtensions(IConstants.PLUGIN_ID, "buildSupport"); } return instance.lazyLoadedBuildSupportList; From 4340738e3c6794e1fc41c931b7267739ee7caa38 Mon Sep 17 00:00:00 2001 From: Siarhei Leanavets Date: Sat, 3 Apr 2021 15:51:52 +0300 Subject: [PATCH 3/4] Use the ProjectUtils static methods in cases where we know exactly which build support we want to check against the project. Signed-off-by: Siarhei Leanavets --- .../jdt/ls/core/internal/ProjectUtils.java | 16 +++++++++++----- .../internal/managers/GradleBuildSupport.java | 5 ++--- .../internal/managers/GradleProjectImporter.java | 2 +- .../internal/managers/MavenBuildSupport.java | 5 ++--- .../internal/managers/MavenProjectImporter.java | 7 ++----- .../managers/AbstractGradleBasedTest.java | 3 ++- .../managers/AbstractMavenBasedTest.java | 3 ++- .../managers/GradleProjectImporterTest.java | 6 +++--- .../internal/managers/MavenBuildSupportTest.java | 5 +++-- .../managers/MavenProjectImporterTest.java | 3 ++- 10 files changed, 30 insertions(+), 25 deletions(-) diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java index 67f0970b88..f657ff01c7 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java @@ -31,6 +31,7 @@ import org.apache.commons.lang3.StringUtils; import org.codehaus.plexus.util.DirectoryScanner; import org.eclipse.core.resources.ICommand; +import org.eclipse.buildship.core.internal.configuration.GradleProjectNature; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -52,6 +53,7 @@ import org.eclipse.jdt.ls.core.internal.managers.InternalBuildSupports; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; +import org.eclipse.m2e.core.internal.IMavenConstants; /** * @author Fred Bricon @@ -83,6 +85,14 @@ public static boolean isJavaProject(IProject project) { return hasNature(project, JavaCore.NATURE_ID); } + public static boolean isMavenProject(IProject project) { + return hasNature(project, IMavenConstants.NATURE_ID); + } + + public static boolean isGradleProject(IProject project) { + return hasNature(project, GradleProjectNature.ID); + } + public static boolean isGeneralJavaProject(IProject project) { return isJavaProject(project) && isInternalBuildSupport(BuildSupportManager.find(project).orElse(null)); } @@ -106,11 +116,7 @@ public static Map getJavaOptions(IProject project) { } public static List getGradleProjects() { - IBuildSupport buildSupport = BuildSupportManager.find("Gradle").get(); - return Stream - .of(getAllProjects()) - .filter(buildSupport::applies) - .collect(Collectors.toList()); + return Stream.of(getAllProjects()).filter(ProjectUtils::isGradleProject).collect(Collectors.toList()); } public static IJavaProject[] getJavaProjects() { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleBuildSupport.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleBuildSupport.java index 98abed9ad3..2e4331db8e 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleBuildSupport.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleBuildSupport.java @@ -25,7 +25,6 @@ import org.eclipse.buildship.core.GradleBuild; import org.eclipse.buildship.core.GradleCore; import org.eclipse.buildship.core.internal.CorePlugin; -import org.eclipse.buildship.core.internal.configuration.GradleProjectNature; import org.eclipse.buildship.core.internal.launch.GradleClasspathProvider; import org.eclipse.buildship.core.internal.preferences.PersistentModel; import org.eclipse.buildship.core.internal.util.file.FileUtils; @@ -67,7 +66,7 @@ public class GradleBuildSupport implements IBuildSupport { @Override public boolean applies(IProject project) { - return ProjectUtils.hasNature(project, GradleProjectNature.ID); + return ProjectUtils.isGradleProject(project); } @Override @@ -113,7 +112,7 @@ private boolean isRoot(IProject project, GradleBuild gradleBuild, IProgressMonit @Override public boolean isBuildFile(IResource resource) { if (resource != null && resource.getType() == IResource.FILE && (resource.getName().endsWith(GRADLE_SUFFIX) || resource.getName().equals(GRADLE_PROPERTIES)) - && applies(resource.getProject())) { + && ProjectUtils.isGradleProject(resource.getProject())) { try { if (!ProjectUtils.isJavaProject(resource.getProject())) { return true; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporter.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporter.java index 9a033fdf8f..be9b4e3d7c 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporter.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporter.java @@ -98,7 +98,7 @@ public boolean applies(IProgressMonitor monitor) throws CoreException { .addExclusions("**/build")//default gradle build dir .addExclusions("**/bin"); for (IProject project : ProjectUtils.getAllProjects()) { - if (!BuildSupportManager.find("Gradle").get().applies(project)) { + if (!ProjectUtils.isGradleProject(project)) { String path = project.getLocation().toOSString(); gradleDetector.addExclusions(path); } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupport.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupport.java index 82f23e7ec3..00e4a4b1f6 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupport.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupport.java @@ -33,7 +33,6 @@ import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.CHANGE_TYPE; import org.eclipse.m2e.core.MavenPlugin; -import org.eclipse.m2e.core.internal.IMavenConstants; import org.eclipse.m2e.core.internal.MavenPluginActivator; import org.eclipse.m2e.core.internal.project.ProjectConfigurationManager; import org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager; @@ -68,7 +67,7 @@ public MavenBuildSupport() { @Override public boolean applies(IProject project) { - return ProjectUtils.hasNature(project, IMavenConstants.NATURE_ID); + return ProjectUtils.isMavenProject(project); } @Override @@ -94,7 +93,7 @@ public void update(IProject project, boolean force, IProgressMonitor monitor) th } public void collectProjects(Collection projects, IProject project, IProgressMonitor monitor) { - if (!project.isOpen() || !applies(project)) { + if (!project.isOpen() || !ProjectUtils.isMavenProject(project)) { return; } projects.add(project); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporter.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporter.java index fd0efafce1..ffc90bec9e 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporter.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporter.java @@ -90,10 +90,7 @@ public boolean applies(IProgressMonitor monitor) throws OperationCanceledExcepti .addExclusions("**/target"); //default maven build dir //@formatter:on for (IProject project : ProjectUtils.getAllProjects()) { - // MavenBuildSupport must be available, otherwise the whole system is broken. - IBuildSupport buildSupport = BuildSupportManager.find("Maven").get(); - - if (!buildSupport.applies(project)) { + if (!ProjectUtils.isMavenProject(project)) { String path = project.getLocation().toOSString(); mavenDetector.addExclusions(path); } @@ -154,7 +151,7 @@ public void importToWorkspace(IProgressMonitor monitor) throws CoreException, Op } else { IProject project = container.getProject(); boolean valid = !ProjectUtils.isJavaProject(project) || project.getFile(IJavaProject.CLASSPATH_FILE_NAME).exists(); - if (BuildSupportManager.find("Maven").get().applies(project) && valid) { + if (ProjectUtils.isMavenProject(project) && valid) { projects.add(container.getProject()); } else if (project != null) { //Project doesn't have the Maven nature, so we (re)import it diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractGradleBasedTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractGradleBasedTest.java index 7ad0254caf..adab1faf69 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractGradleBasedTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractGradleBasedTest.java @@ -19,6 +19,7 @@ import static org.junit.Assert.assertTrue; import org.eclipse.core.resources.IProject; +import org.eclipse.jdt.ls.core.internal.ProjectUtils; /** * @author Fred Bricon @@ -42,7 +43,7 @@ protected IProject importGradleProject(String name) throws Exception { protected void assertIsGradleProject(IProject project) { assertNotNull(project); - assertTrue(project.getName() + " is missing the Gradle nature", BuildSupportManager.find("Gradle").get().applies(project)); + assertTrue(project.getName() + " is missing the Gradle nature", ProjectUtils.isGradleProject(project)); } } diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractMavenBasedTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractMavenBasedTest.java index df399c7949..386dce1f58 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractMavenBasedTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/AbstractMavenBasedTest.java @@ -19,6 +19,7 @@ import static org.junit.Assert.assertTrue; import org.eclipse.core.resources.IProject; +import org.eclipse.jdt.ls.core.internal.ProjectUtils; /** * @author Fred Bricon @@ -52,7 +53,7 @@ protected IProject importSimpleJavaProject() throws Exception { protected void assertIsMavenProject(IProject project) { assertNotNull(project); - assertTrue(project.getName() + " is missing the Maven nature", BuildSupportManager.find("Maven").get().applies(project)); + assertTrue(project.getName() + " is missing the Maven nature", ProjectUtils.isMavenProject(project)); } protected String comment(String s, String from, String to) { diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporterTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporterTest.java index 6b95e0d37f..541cbaee74 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporterTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporterTest.java @@ -166,7 +166,7 @@ public void testDisableGradleWrapper() throws Exception { assertEquals(2, projects.size());//default + 1 eclipse projects IProject eclipse = WorkspaceHelper.getProject("eclipsegradle"); assertNotNull(eclipse); - assertTrue(eclipse.getName() + " does not have the Gradle nature", BuildSupportManager.find("Gradle").get().applies(eclipse)); + assertTrue(eclipse.getName() + " does not have the Gradle nature", ProjectUtils.isGradleProject(eclipse)); } finally { JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setGradleWrapperEnabled(enabled); JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setGradleVersion(gradleVersion); @@ -185,7 +185,7 @@ public void testGradleUserHome() throws Exception { assertEquals(2, projects.size());//default + 1 eclipse projects IProject project = WorkspaceHelper.getProject("simple-gradle"); assertNotNull(project); - assertTrue(project.getName() + " does not have the Gradle nature", BuildSupportManager.find("Gradle").get().applies(project)); + assertTrue(project.getName() + " does not have the Gradle nature", ProjectUtils.isGradleProject(project)); assertTrue(gradleUserHome.exists()); ProjectConfiguration projectConfiguration = CorePlugin.configurationManager().loadProjectConfiguration(project); assertEquals(gradleUserHome, projectConfiguration.getBuildConfiguration().getGradleUserHome()); @@ -259,7 +259,7 @@ public void testDisableImportGradle() throws Exception { assertEquals(2, projects.size());//default + 1 eclipse projects IProject eclipse = WorkspaceHelper.getProject("eclipse"); assertNotNull(eclipse); - assertFalse(eclipse.getName() + " has the Gradle nature", BuildSupportManager.find("Gradle").get().applies(eclipse)); + assertFalse(eclipse.getName() + " has the Gradle nature", ProjectUtils.isGradleProject(eclipse)); } finally { JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setImportGradleEnabled(enabled); } diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupportTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupportTest.java index c8de0d2ed5..701fde61e1 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupportTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenBuildSupportTest.java @@ -46,6 +46,7 @@ import org.eclipse.jdt.ls.core.internal.DependencyUtil; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.JobHelpers; +import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.ResourceUtils; import org.eclipse.jdt.ls.core.internal.SourceContentProvider; import org.eclipse.jdt.ls.core.internal.WorkspaceHelper; @@ -226,11 +227,11 @@ public void testUpdateSnapshots() throws Exception { public void testBatchImport() throws Exception { IProject project = importMavenProject("batch"); waitForBackgroundJobs(); - assertTrue(BuildSupportManager.find("Maven").get().applies(project)); + assertTrue(ProjectUtils.isMavenProject(project)); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); assertEquals(root.getProjects().length, 14); project = root.getProject("batchchild"); - assertTrue(BuildSupportManager.find("Maven").get().applies(project)); + assertTrue(ProjectUtils.isMavenProject(project)); } protected void testNonStandardCompilerId(String projectName) throws Exception { diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java index dd152c6a17..4c5555ade1 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java @@ -41,6 +41,7 @@ import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; +import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.WorkspaceHelper; import org.eclipse.jdt.ls.core.internal.handlers.ProgressReporterManager; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.CHANGE_TYPE; @@ -142,7 +143,7 @@ public void testDisableMaven() throws Exception { assertEquals(2, projects.size());//default + 1 eclipse projects IProject eclipse = WorkspaceHelper.getProject("eclipse"); assertNotNull(eclipse); - assertFalse(eclipse.getName() + " has the Maven nature", BuildSupportManager.find("Maven").get().applies(eclipse)); + assertFalse(eclipse.getName() + " has the Maven nature", ProjectUtils.isMavenProject(eclipse)); } finally { JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setImportMavenEnabled(enabled); } From b4523f1bea56313ff34a04eb4671fb267ed0315c Mon Sep 17 00:00:00 2001 From: Siarhei Leanavets Date: Tue, 13 Apr 2021 15:44:38 +0300 Subject: [PATCH 4/4] Refactoring Signed-off-by: Siarhei Leanavets --- .../src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java | 5 +++-- .../jdt/ls/core/internal/commands/BuildPathCommand.java | 2 +- .../jdt/ls/core/internal/managers/BuildSupportManager.java | 4 ---- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java index f657ff01c7..c5d58e2802 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ProjectUtils.java @@ -23,6 +23,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -30,8 +31,8 @@ import org.apache.commons.lang3.StringUtils; import org.codehaus.plexus.util.DirectoryScanner; -import org.eclipse.core.resources.ICommand; import org.eclipse.buildship.core.internal.configuration.GradleProjectNature; +import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -99,7 +100,7 @@ public static boolean isGeneralJavaProject(IProject project) { public static boolean isInternalBuildSupport(IBuildSupport buildSupport) { return buildSupport != null && Arrays.stream(InternalBuildSupports.values()) - .anyMatch(bsn -> buildSupport.buildToolName().equals(bsn.toString())); + .anyMatch(bsn -> Objects.equals(buildSupport.buildToolName(), bsn.toString())); } public static String getJavaSourceLevel(IProject project) { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommand.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommand.java index 56f86fbcad..995eb69035 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommand.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/BuildPathCommand.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018 Microsoft Corporation and others. + * Copyright (c) 2018-2021 Microsoft Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java index 2bdfcb30b2..193a522aa8 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/BuildSupportManager.java @@ -12,8 +12,6 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.managers; - - import java.util.List; import java.util.Optional; import java.util.function.Predicate; @@ -51,8 +49,6 @@ public static Optional find(String buildToolName) { return instance.find(bs -> bs.buildToolName().equalsIgnoreCase(buildToolName)); } - ///////// - private Optional find(Predicate predicate) { return obtainBuildSupports().stream().filter(predicate).findFirst(); }