diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/LinkResourceUtil.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/LinkResourceUtil.java
new file mode 100644
index 0000000000..ec799e2dbc
--- /dev/null
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/LinkResourceUtil.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2023 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
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.jdt.ls.core.internal.managers;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.StandardOpenOption;
+import java.nio.file.attribute.BasicFileAttributeView;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.stream.Stream;
+
+import org.eclipse.core.internal.preferences.EclipsePreferences;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaProject;
+
+class LinkResourceUtil {
+
+ private static final IPath METADATA_FOLDER_PATH = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(".projects");
+
+ private static boolean isNewer(Path file, Instant instant) throws CoreException {
+ try {
+ Instant creationInstant = Files.getFileAttributeView(file, BasicFileAttributeView.class).readAttributes().creationTime().toInstant();
+ // match accuracy
+ ChronoUnit smallestSupportedUnit = Stream.of(ChronoUnit.NANOS, ChronoUnit.MILLIS, ChronoUnit.SECONDS) // IMPORTANT: keeps units in Stream from finer to coarser
+ .filter(creationInstant::isSupported).filter(instant::isSupported) //
+ .findFirst().orElse(null);
+ if (Platform.OS_MACOSX.equals(Platform.getOS())) {
+ // macOS filesystem has second-only accuracy (despite Instant.isSupported returns)
+ smallestSupportedUnit = ChronoUnit.SECONDS;
+ }
+ if (smallestSupportedUnit != null) {
+ creationInstant.truncatedTo(smallestSupportedUnit);
+ instant.truncatedTo(smallestSupportedUnit);
+ } else {
+ throw new CoreException(Status.error("No supported time unit!"));
+ }
+ return creationInstant.equals(instant) || creationInstant.isAfter(instant);
+ } catch (IOException ex) {
+ throw new CoreException(Status.error(ex.getMessage(), ex));
+ }
+ }
+
+ /**
+ * Get the redirected path of the input path. The path will be redirected to
+ * the workspace's metadata folder ({@link LinkResourceUtil#METADATA_FOLDER_PATH}).
+ * @param projectName name of the project.
+ * @param path path needs to be redirected.
+ * @return the redirected path.
+ */
+ private static IPath getMetaDataFilePath(String projectName, IPath path) {
+ if (path.segmentCount() == 1) {
+ return METADATA_FOLDER_PATH.append(projectName).append(path);
+ }
+
+ String lastSegment = path.lastSegment();
+ if (IProjectDescription.DESCRIPTION_FILE_NAME.equals(lastSegment)) {
+ return METADATA_FOLDER_PATH.append(projectName).append(lastSegment);
+ }
+
+ return null;
+ }
+
+ private static void linkFolderIfNewer(IFolder settingsFolder, Instant instant) throws CoreException {
+ if (settingsFolder.isLinked()) {
+ return;
+ }
+ if (settingsFolder.exists() && !isNewer(settingsFolder.getLocation().toPath(), instant)) {
+ return;
+ }
+ if (!settingsFolder.exists()) {
+ // not existing yet, create link
+ File diskFolder = getMetaDataFilePath(settingsFolder.getProject().getName(), settingsFolder.getProjectRelativePath()).toFile();
+ diskFolder.mkdirs();
+ settingsFolder.createLink(diskFolder.toURI(), IResource.NONE, new NullProgressMonitor());
+ } else if (isNewer(settingsFolder.getLocation().toPath(), instant)) {
+ // already existing but not existing before import: move then link
+ File sourceFolder = settingsFolder.getLocation().toFile();
+ File targetFolder = getMetaDataFilePath(settingsFolder.getProject().getName(), settingsFolder.getProjectRelativePath()).toFile();
+ File parentTargetFolder = targetFolder.getParentFile();
+ if (!parentTargetFolder.isDirectory()) {
+ parentTargetFolder.mkdirs();
+ }
+ sourceFolder.renameTo(targetFolder);
+ settingsFolder.createLink(targetFolder.toURI(), IResource.REPLACE, new NullProgressMonitor());
+ }
+ }
+
+ private static void linkFileIfNewer(IFile metadataFile, Instant instant, String ifEmpty) throws CoreException {
+ if (metadataFile.isLinked()) {
+ return;
+ }
+ if (metadataFile.exists() && !isNewer(metadataFile.getLocation().toPath(), instant)) {
+ return;
+ }
+ File targetFile = getMetaDataFilePath(metadataFile.getProject().getName(), metadataFile.getProjectRelativePath()).toFile();
+ targetFile.getParentFile().mkdirs();
+ try {
+ if (metadataFile.exists()) {
+ Files.move(metadataFile.getLocation().toFile().toPath(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
+ } else {
+ Files.writeString(targetFile.toPath(), ifEmpty != null ? ifEmpty : "", StandardOpenOption.CREATE);
+ }
+ } catch (IOException ex) {
+ throw new CoreException(Status.error(ex.getMessage(), ex));
+ }
+ metadataFile.createLink(targetFile.toURI(), IResource.REPLACE, new NullProgressMonitor());
+ }
+
+ public static void linkMetadataResourcesIfNewer(IProject project, Instant instant) throws CoreException {
+ linkFileIfNewer(project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME), instant, null);
+ linkFolderIfNewer(project.getFolder(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME), instant);
+ linkFileIfNewer(project.getFile(IJavaProject.CLASSPATH_FILE_NAME), instant, null);
+ linkFileIfNewer(project.getFile(".factorypath"), instant, "");
+ }
+
+}
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 e04e83f4f6..31278abe6d 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
@@ -17,16 +17,19 @@
import java.io.File;
import java.net.URI;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
+import java.util.Set;
import java.util.TreeMap;
-import java.util.Map.Entry;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -145,6 +148,8 @@ private void updateEncoding(IProgressMonitor monitor) throws CoreException {
protected void importProjects(Collection rootPaths, IProgressMonitor monitor) throws CoreException, OperationCanceledException {
SubMonitor subMonitor = SubMonitor.convert(monitor, rootPaths.size() * 100);
MultiStatus importStatusCollection = new MultiStatus(IConstants.PLUGIN_ID, -1, "Failed to import projects", null);
+ IProject[] alreadyExistingProjects = ProjectsManager.getWorkspaceRoot().getProjects();
+ Instant importSessionStart = Instant.now();
for (IPath rootPath : rootPaths) {
File rootFolder = rootPath.toFile();
try {
@@ -163,6 +168,18 @@ protected void importProjects(Collection rootPaths, IProgressMonitor moni
JavaLanguageServerPlugin.logException("Failed to import projects", e);
}
}
+ if (!generatesMetadataFilesAtProjectRoot()) {
+ Set newProjects = new HashSet<>(Arrays.asList(getWorkspaceRoot().getProjects()));
+ newProjects.removeAll(Arrays.asList(alreadyExistingProjects));
+ for (IProject project : newProjects) {
+ try {
+ LinkResourceUtil.linkMetadataResourcesIfNewer(project, importSessionStart);
+ } catch (CoreException e) {
+ importStatusCollection.add(e.getStatus());
+ JavaLanguageServerPlugin.logException("Failed to import projects", e);
+ }
+ }
+ }
if (!importStatusCollection.isOK()) {
throw new CoreException(importStatusCollection);
}
@@ -349,10 +366,29 @@ public static IProject createJavaProject(IProject project, IProgressMonitor moni
return createJavaProject(project, null, "src", "bin", monitor);
}
+ /*
+ * ⚠ These value is duplicated in ProjectsManager as both bundles must remain independent,
+ * but the same dir should be used for .project or .settings/.classpath.
+ * So when updating one, think about updating the other.
+ */
+ public static final String GENERATES_METADATA_FILES_AT_PROJECT_ROOT = "java.import.generatesMetadataFilesAtProjectRoot";
+
+ /**
+ * Check whether the metadata files needs to be generated at project root.
+ */
+ public static boolean generatesMetadataFilesAtProjectRoot() {
+ String property = System.getProperty(GENERATES_METADATA_FILES_AT_PROJECT_ROOT);
+ if (property == null) {
+ return true;
+ }
+ return Boolean.parseBoolean(property);
+ }
+
public static IProject createJavaProject(IProject project, IPath projectLocation, String src, String bin, IProgressMonitor monitor) throws CoreException, OperationCanceledException {
if (project.exists()) {
return project;
}
+ Instant creationRequestInstant = Instant.now();
JavaLanguageServerPlugin.logInfo("Creating the Java project " + project.getName());
//Create project
IProjectDescription description = ResourcesPlugin.getWorkspace().newProjectDescription(project.getName());
@@ -400,6 +436,10 @@ public static IProject createJavaProject(IProject project, IPath projectLocation
//Add JVM to project class path
javaProject.setRawClasspath(classpaths.toArray(new IClasspathEntry[0]), monitor);
+ if (!generatesMetadataFilesAtProjectRoot()) {
+ LinkResourceUtil.linkMetadataResourcesIfNewer(project, creationRequestInstant);
+ }
+
JavaLanguageServerPlugin.logInfo("Finished creating the Java project " + project.getName());
return project;
}
@@ -434,6 +474,7 @@ public IStatus runInWorkspace(IProgressMonitor monitor) {
updateEncoding(monitor);
project.deleteMarkers(BUILD_FILE_MARKER_TYPE, false, IResource.DEPTH_ONE);
long elapsed = System.currentTimeMillis() - start;
+ replaceLinkedMetadataWithLocal(project);
JavaLanguageServerPlugin.logInfo("Updated " + projectName + " in " + elapsed + " ms");
} catch (Exception e) {
String msg = "Error updating " + projectName;
@@ -641,6 +682,13 @@ public void reportProjectsStatus() {
JavaLanguageServerPlugin.sendStatus(ServiceStatus.ProjectStatus, "OK");
}
}
+
+ private void replaceLinkedMetadataWithLocal(IProject p) throws CoreException {
+ if (new File(p.getLocation().toFile(), IJavaProject.CLASSPATH_FILE_NAME).exists() &&
+ p.getFile(IJavaProject.CLASSPATH_FILE_NAME).isLinked()) {
+ p.getFile(IJavaProject.CLASSPATH_FILE_NAME).delete(false, false, null);
+ }
+ }
class UpdateProjectsWorkspaceJob extends WorkspaceJob {
diff --git a/org.eclipse.jdt.ls.filesystem/.classpath b/org.eclipse.jdt.ls.filesystem/.classpath
deleted file mode 100644
index 5508535a40..0000000000
--- a/org.eclipse.jdt.ls.filesystem/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/org.eclipse.jdt.ls.filesystem/.project b/org.eclipse.jdt.ls.filesystem/.project
deleted file mode 100644
index d34fd35ec5..0000000000
--- a/org.eclipse.jdt.ls.filesystem/.project
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
- org.eclipse.jdt.ls.filesystem
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.pde.ManifestBuilder
-
-
-
-
- org.eclipse.pde.SchemaBuilder
-
-
-
-
- org.eclipse.m2e.core.maven2Builder
-
-
-
-
-
- org.eclipse.m2e.core.maven2Nature
- org.eclipse.pde.PluginNature
- org.eclipse.jdt.core.javanature
-
-
-
- 1675270185050
-
- 30
-
- org.eclipse.core.resources.regexFilterMatcher
- node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
-
-
-
-
diff --git a/org.eclipse.jdt.ls.filesystem/.settings/org.eclipse.core.resources.prefs b/org.eclipse.jdt.ls.filesystem/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 99f26c0203..0000000000
--- a/org.eclipse.jdt.ls.filesystem/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-encoding/=UTF-8
diff --git a/org.eclipse.jdt.ls.filesystem/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jdt.ls.filesystem/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 62ef3488cc..0000000000
--- a/org.eclipse.jdt.ls.filesystem/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,9 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
-org.eclipse.jdt.core.compiler.compliance=17
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
-org.eclipse.jdt.core.compiler.release=enabled
-org.eclipse.jdt.core.compiler.source=17
diff --git a/org.eclipse.jdt.ls.filesystem/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.jdt.ls.filesystem/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f1cb..0000000000
--- a/org.eclipse.jdt.ls.filesystem/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/org.eclipse.jdt.ls.filesystem/META-INF/MANIFEST.MF b/org.eclipse.jdt.ls.filesystem/META-INF/MANIFEST.MF
deleted file mode 100644
index 60849571ac..0000000000
--- a/org.eclipse.jdt.ls.filesystem/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-SymbolicName: org.eclipse.jdt.ls.filesystem;singleton:=true
-Bundle-Name: %Bundle-Name
-Bundle-Version: 1.30.0.qualifier
-Export-Package: org.eclipse.jdt.ls.core.internal.filesystem;x-friends:="org.eclipse.jdt.ls.tests"
-Bundle-Localization: plugin
-Bundle-Activator: org.eclipse.jdt.ls.core.internal.filesystem.JDTLSFilesystemActivator
-Bundle-Vendor: %Bundle-Vendor
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.filesystem;bundle-version="1.9.500",
- org.eclipse.core.resources;bundle-version="3.18.100",
- org.eclipse.jdt.core;bundle-version="3.32.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-17
-Automatic-Module-Name: org.eclipse.jdt.ls.application
-Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.jdt.ls.filesystem/build.properties b/org.eclipse.jdt.ls.filesystem/build.properties
deleted file mode 100644
index 0dc34f7833..0000000000
--- a/org.eclipse.jdt.ls.filesystem/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
- .,\
- plugin.xml,\
- plugin.properties
diff --git a/org.eclipse.jdt.ls.filesystem/plugin.properties b/org.eclipse.jdt.ls.filesystem/plugin.properties
deleted file mode 100644
index 1f57838980..0000000000
--- a/org.eclipse.jdt.ls.filesystem/plugin.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2016-2017 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
-# https://www.eclipse.org/legal/epl-2.0/
-#
-# SPDX-License-Identifier: EPL-2.0
-#
-# Contributors:
-# Red Hat Inc. - initial API and implementation
-###############################################################################
-Bundle-Vendor = Eclipse.org
-Bundle-Name = JDT Language Server - Core
\ No newline at end of file
diff --git a/org.eclipse.jdt.ls.filesystem/plugin.xml b/org.eclipse.jdt.ls.filesystem/plugin.xml
deleted file mode 100644
index 986a53bee5..0000000000
--- a/org.eclipse.jdt.ls.filesystem/plugin.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/org.eclipse.jdt.ls.filesystem/pom.xml b/org.eclipse.jdt.ls.filesystem/pom.xml
deleted file mode 100644
index 17e4f7fd71..0000000000
--- a/org.eclipse.jdt.ls.filesystem/pom.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
- 4.0.0
-
- org.eclipse.jdt.ls
- parent
- 1.30.0-SNAPSHOT
-
- org.eclipse.jdt.ls.filesystem
- eclipse-plugin
- ${base.name} :: Filesystem
-
diff --git a/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JDTLSFilesystemActivator.java b/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JDTLSFilesystemActivator.java
deleted file mode 100644
index 6b930e88fc..0000000000
--- a/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JDTLSFilesystemActivator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.jdt.ls.core.internal.filesystem;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-/*******************************************************************************
- * Copyright (c) 2022 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
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-public class JDTLSFilesystemActivator implements BundleActivator {
-
- private static BundleContext context;
-
- static BundleContext getContext() {
- return context;
- }
-
- public void start(BundleContext bundleContext) throws Exception {
- JDTLSFilesystemActivator.context = bundleContext;
- }
-
- public void stop(BundleContext bundleContext) throws Exception {
- JDTLSFilesystemActivator.context = null;
- }
-
-}
diff --git a/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFile.java b/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFile.java
deleted file mode 100644
index f5770486f3..0000000000
--- a/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFile.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Microsoft Corporation
- *******************************************************************************/
-
-package org.eclipse.jdt.ls.core.internal.filesystem;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.internal.filesystem.local.LocalFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-/**
- * JDT.LS's own implementation of files in the local operating system's file system.
- * The instance of this class will be returned by {@link JLSFileSystem}.
- */
-public class JLSFile extends LocalFile {
-
- public JLSFile(File file) {
- super(file);
- }
-
- /**
- * {@inheritDoc}
- *
- *
- * Since the metadata files may be redirected into the workspace,
- * we override the method to make sure those files are not missed.
- *
- */
- @Override
- public String[] childNames(int options, IProgressMonitor monitor) {
- String[] childNames = super.childNames(options, monitor);
- if (JLSFsUtils.generatesMetadataFilesAtProjectRoot()) {
- return childNames;
- }
-
- IPath filePath = new Path(this.filePath);
- String projectName = JLSFsUtils.getProjectNameIfLocationIsProjectRoot(filePath);
- if (projectName == null) {
- return childNames;
- }
-
- Set childNameSet = new LinkedHashSet<>(Arrays.asList(childNames));
- for (String fileName : JLSFsUtils.METADATA_NAMES) {
- if (!childNameSet.contains(fileName) &&
- JLSFsUtils.METADATA_FOLDER_PATH.append(projectName).append(fileName).toFile().exists()) {
- childNameSet.add(fileName);
- }
- }
-
- return childNameSet.toArray(String[]::new);
- }
-
- @Override
- public IFileStore getChild(String name) {
- IPath path = new Path(this.filePath).append(name);
- if (JLSFsUtils.shouldStoreInMetadataArea(path)) {
- IPath containerPath = JLSFsUtils.getContainerPath(path);
- String projectName = JLSFsUtils.getProjectNameIfLocationIsProjectRoot(containerPath);
- if (projectName == null) {
- return new JLSFile(new File(file, name));
- }
- IPath redirectedPath = JLSFsUtils.getMetaDataFilePath(projectName, new Path(name));
- if (redirectedPath != null) {
- return new JLSFile(redirectedPath.toFile());
- }
- }
-
- return new JLSFile(new File(file, name));
- }
-
- @Override
- public IFileStore getFileStore(IPath path) {
- IPath fullPath = new Path(this.filePath).append(path);
- if (JLSFsUtils.shouldStoreInMetadataArea(fullPath)) {
- IPath containerPath = JLSFsUtils.getContainerPath(fullPath);
- String projectName = JLSFsUtils.getProjectNameIfLocationIsProjectRoot(containerPath);
- if (projectName == null) {
- return new JLSFile(fullPath.toFile());
- }
- IPath redirectedPath = JLSFsUtils.getMetaDataFilePath(projectName, path);
- if (redirectedPath != null) {
- return new JLSFile(redirectedPath.toFile());
- }
- }
-
- return new JLSFile(fullPath.toFile());
- }
-}
diff --git a/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFileSystem.java b/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFileSystem.java
deleted file mode 100644
index 7e0d8682c7..0000000000
--- a/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFileSystem.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Microsoft Corporation
- *******************************************************************************/
-
-package org.eclipse.jdt.ls.core.internal.filesystem;
-
-import java.net.URI;
-import java.nio.file.Paths;
-
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.internal.filesystem.local.LocalFileSystem;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-/**
- * JDT.LS's own implementation of file system to handle the 'file' scheme uri.
- * The purpose of this implementation is to allow the project metadata files (.project, .classpath, .settings/)
- * can be persisted out of the project root.
- */
-public class JLSFileSystem extends LocalFileSystem {
-
- @Override
- public IFileStore getStore(IPath path) {
- if (JLSFsUtils.shouldStoreInMetadataArea(path)) {
- IPath containerPath = JLSFsUtils.getContainerPath(path);
- String projectName = JLSFsUtils.getProjectNameIfLocationIsProjectRoot(containerPath);
- if (projectName == null) {
- return new JLSFile(path.toFile());
- }
- IPath redirectedPath = JLSFsUtils.getMetaDataFilePath(projectName, path);
- if (redirectedPath != null) {
- return new JLSFile(redirectedPath.toFile());
- }
- }
- return new JLSFile(path.toFile());
- }
-
- @Override
- public IFileStore getStore(URI uri) {
- IPath path = filePathFromURI(uri.toString());
- return path == null ? super.getStore(uri) : getStore(path);
- }
-
- public static IPath filePathFromURI(String uriStr) {
- URI uri = URI.create(uriStr);
- return "file".equals(uri.getScheme()) ?
- Path.fromOSString(Paths.get(uri).toString()) :
- null;
- }
-
-}
diff --git a/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFsUtils.java b/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFsUtils.java
deleted file mode 100644
index b898ccda93..0000000000
--- a/org.eclipse.jdt.ls.filesystem/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFsUtils.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2021-2022 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
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Microsoft Corporation
- *******************************************************************************/
-
-package org.eclipse.jdt.ls.core.internal.filesystem;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
-
-import org.eclipse.core.internal.preferences.EclipsePreferences;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJavaProject;
-
-/**
- * Utilities of the file system implementation.
- */
-public class JLSFsUtils {
- private JLSFsUtils() {}
-
- static final IPath METADATA_FOLDER_PATH = ResourcesPlugin.getPlugin().getStateLocation().append(".projects");
-
- /**
- * The system property key to specify the file system mode.
- */
- static final String GENERATES_METADATA_FILES_AT_PROJECT_ROOT = "java.import.generatesMetadataFilesAtProjectRoot";
-
- static final String FACTORY_PATH = ".factorypath";
-
- /**
- * The metadata files
- */
- static final Set METADATA_NAMES = new HashSet<>(Arrays.asList(
- IProjectDescription.DESCRIPTION_FILE_NAME,
- EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME,
- IJavaProject.CLASSPATH_FILE_NAME,
- FACTORY_PATH
- ));
-
- /**
- * Determine whether the resource should be stored in workspace's metadata folder.
- *
- * The file will be stored in workspace's metadata folder when following conditions meet:
- *
- * - The system property shows that it's allowed to store them in workspace.
- * - The file belongs to the metadata file defined in {@link JLSFsUtils#METADATA_NAMES}.
- * - The project's root path does not contain the metadata file with the same name.
- *
- *
- *
- * @param location the path of the resource.
- * @return whether the resource needs to be stored in workspace's metadata folder.
- */
- static boolean shouldStoreInMetadataArea(IPath location) {
- if (generatesMetadataFilesAtProjectRoot()) {
- return false;
- }
-
- if (!isProjectMetadataFile(location)) {
- return false;
- }
-
- // do not redirect if the file already exists on disk
- if (location.toFile().exists()) {
- return false;
- } else if (location.lastSegment().endsWith(EclipsePreferences.PREFS_FILE_EXTENSION)) {
- location = location.removeLastSegments(1);
- return !location.toFile().exists();
- }
-
- return true;
- }
-
- /**
- * Check whether the given location points to a metadata file.
- * @param location file location.
- * @return whether the given location points to a metadata file.
- */
- static boolean isProjectMetadataFile(IPath location) {
- if (location == null || location.segmentCount() < 2) {
- return false;
- }
-
- if (location.lastSegment().endsWith(EclipsePreferences.PREFS_FILE_EXTENSION)) {
- location = location.removeLastSegments(1);
- }
-
- if (location.segmentCount() < 2) {
- return false;
- }
-
- if (!METADATA_NAMES.contains(location.lastSegment())) {
- return false;
- }
-
- return true;
- }
-
- /**
- * Get the container path of the given file path.
- * If the file path is a preferences file, the grand-parent container will be returned.
- * @param filePath the file path.
- */
- static IPath getContainerPath(IPath filePath) {
- if (filePath.lastSegment().endsWith(EclipsePreferences.PREFS_FILE_EXTENSION)) {
- filePath = filePath.removeLastSegments(1);
- }
- return filePath.removeLastSegments(1);
- }
-
- /**
- * Get the project name if the given path is a project root, or null
if
- * no project root can match the path.
- * @param location the location path.
- * @return The project name
- */
- static String getProjectNameIfLocationIsProjectRoot(IPath location) {
- IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
- for (IProject project : projects) {
- IPath projectLocation = project.getLocation();
- if (Objects.equals(projectLocation, location)) {
- return project.getName();
- }
- }
- return null;
- }
-
- /**
- * Get the redirected path of the input path. The path will be redirected to
- * the workspace's metadata folder ({@link JLSFsUtils#METADATA_FOLDER_PATH}).
- * @param projectName name of the project.
- * @param path path needs to be redirected.
- * @return the redirected path.
- */
- static IPath getMetaDataFilePath(String projectName, IPath path) {
- if (path.segmentCount() == 1) {
- return METADATA_FOLDER_PATH.append(projectName).append(path);
- }
-
- String lastSegment = path.lastSegment();
- if (METADATA_NAMES.contains(lastSegment)) {
- return METADATA_FOLDER_PATH.append(projectName).append(lastSegment);
- } else if (lastSegment.endsWith(EclipsePreferences.PREFS_FILE_EXTENSION)) {
- return METADATA_FOLDER_PATH.append(projectName)
- .append(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME)
- .append(lastSegment);
- }
-
- return null;
- }
-
- /**
- * Check whether the metadata files needs to be generated at project root.
- */
- public static boolean generatesMetadataFilesAtProjectRoot() {
- String property = System.getProperty(GENERATES_METADATA_FILES_AT_PROJECT_ROOT);
- if (property == null) {
- return true;
- }
- return Boolean.parseBoolean(property);
- }
-}
diff --git a/org.eclipse.jdt.ls.product/languageServer.product b/org.eclipse.jdt.ls.product/languageServer.product
index 3b97b4ff3b..bd56c391f1 100644
--- a/org.eclipse.jdt.ls.product/languageServer.product
+++ b/org.eclipse.jdt.ls.product/languageServer.product
@@ -54,7 +54,6 @@
-
diff --git a/org.eclipse.jdt.ls.product/syntaxServer.product b/org.eclipse.jdt.ls.product/syntaxServer.product
index b4eed3bd6d..abb42d1cee 100644
--- a/org.eclipse.jdt.ls.product/syntaxServer.product
+++ b/org.eclipse.jdt.ls.product/syntaxServer.product
@@ -27,7 +27,6 @@
-
@@ -48,7 +47,6 @@
-
diff --git a/org.eclipse.jdt.ls.tests/META-INF/MANIFEST.MF b/org.eclipse.jdt.ls.tests/META-INF/MANIFEST.MF
index e6fca9cf30..09a3a3972e 100644
--- a/org.eclipse.jdt.ls.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.ls.tests/META-INF/MANIFEST.MF
@@ -33,7 +33,6 @@ Require-Bundle: org.eclipse.jdt.ls.core,
org.eclipse.jdt.apt.pluggable.core,
org.eclipse.m2e.apt.core,
org.eclipse.buildship.core,
- org.mockito.mockito-core;bundle-version="4.3.1",
- org.eclipse.jdt.ls.filesystem;bundle-version="1.0.0"
+ org.mockito.mockito-core;bundle-version="4.3.1"
Bundle-Vendor: %Bundle-Vendor
Bundle-Activator: org.eclipse.jdt.ls.core.internal.JavaLanguageServerTestPlugin
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/EclipseProjectMetadataFileTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/EclipseProjectMetadataFileTest.java
index db3d5f70a9..219fa6b681 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/EclipseProjectMetadataFileTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/EclipseProjectMetadataFileTest.java
@@ -14,6 +14,7 @@
package org.eclipse.jdt.ls.core.internal.filesystem;
import static org.eclipse.jdt.ls.core.internal.WorkspaceHelper.getProject;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -21,6 +22,7 @@
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
+import java.util.List;
import org.eclipse.core.internal.preferences.EclipsePreferences;
import org.eclipse.core.internal.utils.FileUtil;
@@ -32,7 +34,9 @@
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.ls.core.internal.ProjectUtils;
import org.eclipse.jdt.ls.core.internal.managers.AbstractProjectsManagerBasedTest;
+import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager;
import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.CHANGE_TYPE;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -52,7 +56,12 @@ public static Collection data(){
@Before
public void setUp() {
- System.setProperty(JLSFsUtils.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, fsMode);
+ System.setProperty(ProjectsManager.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, fsMode);
+ }
+
+ @After
+ public void checkNoError() {
+ assertEquals(List.of(), logListener.getErrors());
}
@Test
@@ -67,16 +76,15 @@ public void testMetadataFileLocation() throws Exception {
IPath projectDescriptionPath = FileUtil.toPath(projectDescription.getLocationURI());
assertTrue(projectDescriptionPath.toFile().exists());
assertTrue(project.getLocation().isPrefixOf(projectDescriptionPath));
+ assertTrue(new File(project.getLocation().toFile(), IProjectDescription.DESCRIPTION_FILE_NAME).exists());
IFile classpath = project.getFile(IJavaProject.CLASSPATH_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath classpathPath = FileUtil.toPath(classpath.getLocationURI());
+ IPath classpathPath = classpath.getLocation();
assertTrue(classpathPath.toFile().exists());
assertTrue(project.getLocation().isPrefixOf(classpathPath));
IFile preferencesFile = project.getFile(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath preferencesPath = FileUtil.toPath(preferencesFile.getLocationURI());
+ IPath preferencesPath = preferencesFile.getLocation();
assertTrue(preferencesPath.toFile().exists());
assertTrue(project.getLocation().isPrefixOf(preferencesPath));
}
@@ -87,9 +95,8 @@ public void testDeleteClasspath() throws Exception {
importProjects("eclipse/" + name);
IProject project = getProject(name);
assertNotNull(project);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
IFile dotClasspath = project.getFile(IJavaProject.CLASSPATH_FILE_NAME);
- File file = FileUtil.toPath(dotClasspath.getLocationURI()).toFile();
+ File file = dotClasspath.getLocation().toFile();
assertTrue(file.exists());
file.delete();
projectsManager.fileChanged(file.toPath().toUri().toString(), CHANGE_TYPE.DELETED);
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/GradleProjectMetadataFileTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/GradleProjectMetadataFileTest.java
index 1fd2ab9cc8..37511906b3 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/GradleProjectMetadataFileTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/GradleProjectMetadataFileTest.java
@@ -23,6 +23,7 @@
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import org.eclipse.buildship.core.internal.CorePlugin;
@@ -41,6 +42,7 @@
import org.eclipse.jdt.ls.core.internal.ResourceUtils;
import org.eclipse.jdt.ls.core.internal.WorkspaceHelper;
import org.eclipse.jdt.ls.core.internal.managers.AbstractGradleBasedTest;
+import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager;
import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.CHANGE_TYPE;
import org.eclipse.jdt.ls.core.internal.preferences.Preferences.FeatureStatus;
import org.junit.Before;
@@ -62,7 +64,7 @@ public static Collection data(){
@Before
public void setup() throws Exception {
- System.setProperty(JLSFsUtils.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, fsMode);
+ System.setProperty(ProjectsManager.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, fsMode);
}
@Test
@@ -77,33 +79,35 @@ public void testMetadataFileLocation() throws Exception {
// workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
IPath projectDescriptionPath = FileUtil.toPath(projectDescription.getLocationURI());
assertTrue(projectDescriptionPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(projectDescriptionPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(projectDescriptionPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
+ assertEquals(ProjectsManager.generatesMetadataFilesAtProjectRoot(), new File(project.getLocation().toFile(), IProjectDescription.DESCRIPTION_FILE_NAME).exists());
IFile preferencesFile = project.getFile(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath preferencesPath = FileUtil.toPath(preferencesFile.getLocationURI());
+ IPath preferencesPath = preferencesFile.getLocation();
assertTrue(preferencesPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(preferencesPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(preferencesPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
+ assertEquals(ProjectsManager.generatesMetadataFilesAtProjectRoot(), new File(project.getLocation().toFile(), EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME).exists());
// then we check the sub-module
project = WorkspaceHelper.getProject("app");
projectDescription = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- projectDescriptionPath = FileUtil.toPath(projectDescription.getLocationURI());
+ projectDescriptionPath = projectDescription.getLocation();
assertTrue(projectDescriptionPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(projectDescriptionPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(projectDescriptionPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().append(IProjectDescription.DESCRIPTION_FILE_NAME).toFile().exists(), ProjectsManager.generatesMetadataFilesAtProjectRoot());
+ assertEquals(ProjectsManager.generatesMetadataFilesAtProjectRoot(), new File(project.getLocation().toFile(), IProjectDescription.DESCRIPTION_FILE_NAME).exists());
IFile classpath = project.getFile(IJavaProject.CLASSPATH_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath classpathPath = FileUtil.toPath(classpath.getLocationURI());
+ IPath classpathPath = classpath.getLocation();
assertTrue(classpathPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(classpathPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(classpathPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
+ assertEquals(ProjectsManager.generatesMetadataFilesAtProjectRoot(), new File(project.getLocation().toFile(), IJavaProject.CLASSPATH_FILE_NAME).exists());
preferencesFile = project.getFile(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- preferencesPath = FileUtil.toPath(preferencesFile.getLocationURI());
+ preferencesPath = preferencesFile.getLocation();
assertTrue(preferencesPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(preferencesPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(preferencesPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
+ assertEquals(ProjectsManager.generatesMetadataFilesAtProjectRoot(), new File(project.getLocation().toFile(), EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME).exists());
}
@Test
@@ -115,7 +119,7 @@ public void testMetadataFileLocation2() throws Exception {
waitForBackgroundJobs();
List markers = ResourceUtils.findMarkers(project, IMarker.SEVERITY_ERROR);
- assertTrue(markers.isEmpty());
+ assertEquals(Collections.emptyList(), markers);
}
@Test
@@ -149,8 +153,7 @@ public void testDeleteClasspath() throws Exception {
assertIsJavaProject(project);
assertIsGradleProject(project);
IFile dotClasspath = project.getFile(IJavaProject.CLASSPATH_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- File file = FileUtil.toPath(dotClasspath.getLocationURI()).toFile();
+ File file = dotClasspath.getLocation().toFile();
assertTrue(file.exists());
file.delete();
projectsManager.fileChanged(file.toPath().toUri().toString(), CHANGE_TYPE.DELETED);
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/InvisibleProjectMetadataFileTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/InvisibleProjectMetadataFileTest.java
index 2204ec78a3..cfc85bd527 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/InvisibleProjectMetadataFileTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/InvisibleProjectMetadataFileTest.java
@@ -19,17 +19,13 @@
import java.util.Arrays;
import java.util.Collection;
-import org.eclipse.core.internal.preferences.EclipsePreferences;
-import org.eclipse.core.internal.utils.FileUtil;
-import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.ls.core.internal.TestVMType;
import org.eclipse.jdt.ls.core.internal.managers.AbstractProjectsManagerBasedTest;
+import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -49,31 +45,7 @@ public static Collection data(){
@Before
public void setUp() {
- System.setProperty(JLSFsUtils.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, fsMode);
- }
-
- @Test
- public void testMetadataFileLocation() throws Exception {
- IProject project = copyAndImportFolder("singlefile/simple", "src/App.java");
- assertTrue(project.exists());
-
- IFile projectDescription = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath projectDescriptionPath = FileUtil.toPath(projectDescription.getLocationURI());
- assertTrue(projectDescriptionPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(projectDescriptionPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
-
- IFile classpath = project.getFile(IJavaProject.CLASSPATH_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath classpathPath = FileUtil.toPath(classpath.getLocationURI());
- assertTrue(classpathPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(classpathPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
-
- IFile preferencesFile = project.getFile(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath preferencesPath = FileUtil.toPath(preferencesFile.getLocationURI());
- assertTrue(preferencesPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(preferencesPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ System.setProperty(ProjectsManager.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, fsMode);
}
@Test
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFsUtilsTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFsUtilsTest.java
index 51699f796a..afb55e0ca8 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFsUtilsTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/JLSFsUtilsTest.java
@@ -16,23 +16,24 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager;
import org.junit.Test;
public class JLSFsUtilsTest {
@Test
public void testGeneratesMetadataFilesAtProjectRoot() {
- System.setProperty(JLSFsUtils.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, "true");
- assertTrue(JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ System.setProperty(ProjectsManager.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, "true");
+ assertTrue(ProjectsManager.generatesMetadataFilesAtProjectRoot());
}
@Test
public void testNotGeneratesMetadataFilesAtProjectRoot() {
- System.setProperty(JLSFsUtils.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, "false");
- assertFalse(JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ System.setProperty(ProjectsManager.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, "false");
+ assertFalse(ProjectsManager.generatesMetadataFilesAtProjectRoot());
}
@Test
public void testGeneratesMetadataFilesAtProjectRootWhenNotSet() {
- assertTrue(JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertTrue(ProjectsManager.generatesMetadataFilesAtProjectRoot());
}
}
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/MavenProjectMetadataFileTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/MavenProjectMetadataFileTest.java
index 1cda0e465d..c15f64a24a 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/MavenProjectMetadataFileTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/MavenProjectMetadataFileTest.java
@@ -26,7 +26,6 @@
import org.apache.commons.io.FileUtils;
import org.eclipse.core.internal.preferences.EclipsePreferences;
-import org.eclipse.core.internal.utils.FileUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
@@ -36,6 +35,7 @@
import org.eclipse.jdt.ls.core.internal.ResourceUtils;
import org.eclipse.jdt.ls.core.internal.WorkspaceHelper;
import org.eclipse.jdt.ls.core.internal.managers.AbstractMavenBasedTest;
+import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager;
import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.CHANGE_TYPE;
import org.junit.Before;
import org.junit.Test;
@@ -60,7 +60,7 @@ public static Collection data(){
@Before
public void setup() throws Exception {
- System.setProperty(JLSFsUtils.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, fsMode);
+ System.setProperty(ProjectsManager.GENERATES_METADATA_FILES_AT_PROJECT_ROOT, fsMode);
}
@Test
@@ -72,21 +72,24 @@ public void testMetadataFileLocation() throws Exception {
IFile projectDescription = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
// workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath projectDescriptionPath = FileUtil.toPath(projectDescription.getLocationURI());
+ IPath projectDescriptionPath = projectDescription.getLocation();
assertTrue(projectDescriptionPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(projectDescriptionPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(projectDescriptionPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().append(IProjectDescription.DESCRIPTION_FILE_NAME).toFile().exists(), ProjectsManager.generatesMetadataFilesAtProjectRoot());
+ assertEquals(ProjectsManager.generatesMetadataFilesAtProjectRoot(), new File(project.getLocation().toFile(), IProjectDescription.DESCRIPTION_FILE_NAME).exists());
IFile classpath = project.getFile(IJavaProject.CLASSPATH_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath classpathPath = FileUtil.toPath(classpath.getLocationURI());
+ IPath classpathPath = classpath.getLocation();
assertTrue(classpathPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(classpathPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(classpathPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
+ assertEquals(ProjectsManager.generatesMetadataFilesAtProjectRoot(), new File(project.getLocation().toFile(), IJavaProject.CLASSPATH_FILE_NAME).exists());
IFile preferencesFile = project.getFile(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME);
// workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath preferencesPath = FileUtil.toPath(preferencesFile.getLocationURI());
+ IPath preferencesPath = preferencesFile.getLocation();
assertTrue(preferencesPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(preferencesPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(preferencesPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
+ assertEquals(ProjectsManager.generatesMetadataFilesAtProjectRoot(), new File(project.getLocation().toFile(), EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME).exists());
}
@Test
@@ -117,7 +120,7 @@ public void testInvalidProject() throws Exception {
IFile projectFile = invalid.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
assertTrue(projectFile.exists());
// workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- File file = FileUtil.toPath(projectFile.getLocationURI()).toFile();
+ File file = projectFile.getLocation().toFile();
invalid.close(new NullProgressMonitor());
assertTrue(file.exists());
file.delete();
@@ -136,8 +139,7 @@ public void testDeleteClasspath() throws Exception {
assertIsJavaProject(project);
assertIsMavenProject(project);
IFile dotClasspath = project.getFile(IJavaProject.CLASSPATH_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- File file = FileUtil.toPath(dotClasspath.getLocationURI()).toFile();
+ File file = dotClasspath.getLocation().toFile();
assertTrue(file.exists());
file.delete();
projectsManager.fileChanged(file.toPath().toUri().toString(), CHANGE_TYPE.DELETED);
@@ -156,46 +158,40 @@ public void testFactoryPathFileLocation() throws Exception {
IFile projectDescription = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
// workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath projectDescriptionPath = FileUtil.toPath(projectDescription.getLocationURI());
+ IPath projectDescriptionPath = projectDescription.getLocation();
assertTrue(projectDescriptionPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(projectDescriptionPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(projectDescriptionPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
IFile classpath = project.getFile(IJavaProject.CLASSPATH_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath classpathPath = FileUtil.toPath(classpath.getLocationURI());
+ IPath classpathPath = classpath.getLocation();
assertTrue(classpathPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(classpathPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(classpathPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
IFile preferencesFile = project.getFile(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath preferencesPath = FileUtil.toPath(preferencesFile.getLocationURI());
+ IPath preferencesPath = preferencesFile.getLocation();
assertTrue(preferencesPath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(preferencesPath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(preferencesPath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
- IFile factoryPathFile = project.getFile(JLSFsUtils.FACTORY_PATH);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- IPath factoryPathFilePath = FileUtil.toPath(factoryPathFile.getLocationURI());
+ IFile factoryPathFile = project.getFile(".factorypath");
+ IPath factoryPathFilePath = factoryPathFile.getLocation();
assertTrue(factoryPathFilePath.toFile().exists());
- assertEquals(project.getLocation().isPrefixOf(factoryPathFilePath), JLSFsUtils.generatesMetadataFilesAtProjectRoot());
+ assertEquals(project.getLocation().isPrefixOf(factoryPathFilePath), ProjectsManager.generatesMetadataFilesAtProjectRoot());
}
@Test
public void testMultipleMetadataFile() throws Exception {
- if (JLSFsUtils.generatesMetadataFilesAtProjectRoot()) {
+ if (ProjectsManager.generatesMetadataFilesAtProjectRoot()) {
return;
}
String name = "quickstart2";
importProjects("maven/" + name);
IProject project = getProject(name);
IFile projectDescription = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- File projectDescriptionFile = FileUtil.toPath(projectDescription.getLocationURI()).toFile();
+ File projectDescriptionFile = projectDescription.getLocation().toFile();
IFile classpath = project.getFile(IJavaProject.CLASSPATH_FILE_NAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- File classpathPathFile = FileUtil.toPath(classpath.getLocationURI()).toFile();
+ File classpathPathFile = classpath.getLocation().toFile();
IFile preferencesFile = project.getFile(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME);
- // workaround to get the correct path, see: https://github.com/eclipse/eclipse.jdt.ls/pull/1900
- File preferencesPathFile = FileUtil.toPath(preferencesFile.getLocationURI()).toFile();
+ File preferencesPathFile = preferencesFile.getLocation().toFile();
FileUtils.copyFile(projectDescriptionFile, project.getLocation().append(IProjectDescription.DESCRIPTION_FILE_NAME).toFile());
FileUtils.copyFile(classpathPathFile, project.getLocation().append(IJavaProject.CLASSPATH_FILE_NAME).toFile());
FileUtils.copyDirectory(preferencesPathFile, project.getLocation().append(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME).toFile());
diff --git a/pom.xml b/pom.xml
index eb63ad9127..8d10496ae6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,7 +35,6 @@
org.eclipse.jdt.ls.target
org.eclipse.jdt.ls.core
- org.eclipse.jdt.ls.filesystem
org.eclipse.jdt.ls.tests
org.eclipse.jdt.ls.logback.appender
org.eclipse.jdt.ls.tests.syntaxserver