Skip to content

Commit c0bdf6f

Browse files
committed
Avoid unnecessary Gradle re-synch on restart
Signed-off-by: Fred Bricon <[email protected]>
1 parent 9519b76 commit c0bdf6f

File tree

1 file changed

+45
-38
lines changed

1 file changed

+45
-38
lines changed

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradleProjectImporter.java

+45-38
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
import java.io.FilenameFilter;
1919
import java.nio.file.Files;
2020
import java.nio.file.Path;
21-
import java.util.ArrayList;
2221
import java.util.Collection;
2322
import java.util.List;
2423
import java.util.Map;
2524
import java.util.Properties;
2625

26+
import org.apache.commons.lang3.StringUtils;
2727
import org.eclipse.buildship.core.BuildConfiguration;
2828
import org.eclipse.buildship.core.GradleCore;
2929
import org.eclipse.buildship.core.GradleDistribution;
@@ -44,6 +44,7 @@
4444
import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
4545
import org.eclipse.jdt.ls.core.internal.ProjectUtils;
4646
import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager;
47+
import org.eclipse.jdt.ls.core.internal.preferences.Preferences;
4748
import org.eclipse.jdt.ls.internal.gradle.checksums.ValidationResult;
4849
import org.eclipse.jdt.ls.internal.gradle.checksums.WrapperValidator;
4950
import org.eclipse.lsp4j.ExecuteCommandParams;
@@ -54,6 +55,7 @@
5455
* @author Fred Bricon
5556
*
5657
*/
58+
@SuppressWarnings("restriction")
5759
public class GradleProjectImporter extends AbstractProjectImporter {
5860

5961
public static final String GRADLE_HOME = "GRADLE_HOME";
@@ -87,14 +89,15 @@ public boolean applies(IProgressMonitor monitor) throws CoreException {
8789
if (rootFolder == null) {
8890
return false;
8991
}
90-
PreferenceManager preferencesManager = JavaLanguageServerPlugin.getPreferencesManager();
91-
if (preferencesManager != null && !preferencesManager.getPreferences().isImportGradleEnabled()) {
92+
Preferences preferences = getPreferences();
93+
if (!preferences.isImportGradleEnabled()) {
9294
return false;
9395
}
9496
if (directories == null) {
9597
BasicFileDetector gradleDetector = new BasicFileDetector(rootFolder.toPath(), BUILD_GRADLE_DESCRIPTOR)
9698
.includeNested(false)
97-
.addExclusions("**/build");//default gradle build dir
99+
.addExclusions("**/build")//default gradle build dir
100+
.addExclusions("**/bin");
98101
directories = gradleDetector.scan(monitor);
99102
}
100103
return !directories.isEmpty();
@@ -117,16 +120,18 @@ public void importToWorkspace(IProgressMonitor monitor) throws CoreException {
117120
subMonitor.done();
118121
}
119122

120-
private void importDir(Path rootFolder, IProgressMonitor monitor) {
123+
private void importDir(Path projectFolder, IProgressMonitor monitor) {
121124
if (monitor.isCanceled()) {
122125
return;
123126
}
124-
startSynchronization(rootFolder, monitor);
127+
startSynchronization(projectFolder, monitor);
125128
}
126129

130+
127131
public static GradleDistribution getGradleDistribution(Path rootFolder) {
128132
PreferenceManager preferencesManager = JavaLanguageServerPlugin.getPreferencesManager();
129-
if (preferencesManager != null && preferencesManager.getPreferences().isGradleWrapperEnabled() && Files.exists(rootFolder.resolve("gradlew"))) {
133+
Preferences preferences = getPreferences();
134+
if (preferencesManager != null && preferences.isGradleWrapperEnabled() && Files.exists(rootFolder.resolve("gradlew"))) {
130135
WrapperValidator validator = new WrapperValidator();
131136
try {
132137
ValidationResult result = validator.checkWrapper(rootFolder.toFile().getAbsolutePath());
@@ -143,7 +148,8 @@ public static GradleDistribution getGradleDistribution(Path rootFolder) {
143148
pm.getConnection().sendNotification(params);
144149
} else {
145150
//@formatter:off
146-
String message = GRADLE_WRAPPER_CHEKSUM_WARNING_TEMPLATE.replaceAll("@wrapper@", result.getWrapperJar()).replaceAll("@checksum@", result.getChecksum());
151+
String message = GRADLE_WRAPPER_CHEKSUM_WARNING_TEMPLATE.replaceAll("@wrapper@", result.getWrapperJar())
152+
.replaceAll("@checksum@", result.getChecksum());
147153
//@formatter:on
148154
pm.getConnection().showMessage(new MessageParams(MessageType.Error, message));
149155
}
@@ -154,10 +160,10 @@ public static GradleDistribution getGradleDistribution(Path rootFolder) {
154160
JavaLanguageServerPlugin.logException(e.getMessage(), e);
155161
}
156162
}
157-
if (preferencesManager != null && preferencesManager.getPreferences().getGradleVersion() != null) {
163+
if (StringUtils.isNotBlank(preferences.getGradleVersion())) {
158164
List<GradleVersion> versions = CorePlugin.publishedGradleVersions().getVersions();
159165
GradleVersion gradleVersion = null;
160-
String versionString = preferencesManager.getPreferences().getGradleVersion();
166+
String versionString = preferences.getGradleVersion();
161167
GradleVersion requiredVersion = GradleVersion.version(versionString);
162168
for (GradleVersion version : versions) {
163169
if (version.compareTo(requiredVersion) == 0) {
@@ -184,8 +190,9 @@ public static File getGradleHomeFile() {
184190
}
185191

186192
public static File getGradleHomeFile(Map<String, String> env, Properties sysprops) {
187-
if (JavaLanguageServerPlugin.getPreferencesManager() != null && JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getGradleHome() != null) {
188-
return new File(JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getGradleHome());
193+
Preferences preferences = getPreferences();
194+
if (StringUtils.isNotBlank(preferences.getGradleHome())) {
195+
return new File(preferences.getGradleHome());
189196
}
190197
String gradleHome = env.get(GRADLE_HOME);
191198
if (gradleHome == null || !new File(gradleHome).isDirectory()) {
@@ -201,9 +208,9 @@ public static File getGradleHomeFile(Map<String, String> env, Properties sysprop
201208
}
202209

203210
public static File getGradleUserHomeFile() {
204-
if (JavaLanguageServerPlugin.getPreferencesManager() != null && JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getGradleUserHome() != null
205-
&& !JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getGradleUserHome().isEmpty()) {
206-
return new File(JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getGradleUserHome());
211+
Preferences preferences = getPreferences();
212+
if (StringUtils.isNotBlank(preferences.getGradleUserHome())) {
213+
return new File(preferences.getGradleUserHome());
207214
}
208215
String gradleUserHome = System.getenv().get(GRADLE_USER_HOME);
209216
if (gradleUserHome == null) {
@@ -212,19 +219,11 @@ public static File getGradleUserHomeFile() {
212219
return (gradleUserHome == null || gradleUserHome.isEmpty()) ? null : new File(gradleUserHome);
213220
}
214221

215-
protected void startSynchronization(Path rootFolder, IProgressMonitor monitor) {
216-
File location = rootFolder.toFile();
222+
protected void startSynchronization(Path projectFolder, IProgressMonitor monitor) {
223+
File location = projectFolder.toFile();
217224
boolean shouldSynchronize = shouldSynchronize(location);
218-
List<IProject> projects = ProjectUtils.getGradleProjects();
219-
for (IProject project : projects) {
220-
File projectDir = project.getLocation() == null ? null : project.getLocation().toFile();
221-
if (location.equals(projectDir)) {
222-
shouldSynchronize = checkGradlePersistence(shouldSynchronize, project, projectDir);
223-
break;
224-
}
225-
}
226225
if (shouldSynchronize) {
227-
BuildConfiguration build = getBuildConfiguration(rootFolder);
226+
BuildConfiguration build = getBuildConfiguration(projectFolder);
228227
SynchronizationResult result = GradleCore.getWorkspace().createBuild(build).synchronize(monitor);
229228
if (!result.getStatus().isOK()) {
230229
JavaLanguageServerPlugin.log(result.getStatus());
@@ -236,16 +235,17 @@ public static BuildConfiguration getBuildConfiguration(Path rootFolder) {
236235
GradleDistribution distribution = getGradleDistribution(rootFolder);
237236
IVMInstall javaDefaultRuntime = JavaRuntime.getDefaultVMInstall();
238237
File javaHome;
238+
Preferences preferences = getPreferences();
239239
if (javaDefaultRuntime != null && javaDefaultRuntime.getVMRunner(ILaunchManager.RUN_MODE) != null) {
240240
javaHome = javaDefaultRuntime.getInstallLocation();
241241
} else {
242-
String javaHomeStr = JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getJavaHome();
242+
String javaHomeStr = preferences.getJavaHome();
243243
javaHome = javaHomeStr == null ? null : new File(javaHomeStr);
244244
}
245245
File gradleUserHome = getGradleUserHomeFile();
246-
List<String> gradleArguments = JavaLanguageServerPlugin.getPreferencesManager() != null ? JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getGradleArguments() : new ArrayList<>();
247-
List<String> gradleJvmArguments = JavaLanguageServerPlugin.getPreferencesManager() != null ? JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getGradleJvmArguments() : new ArrayList<>();
248-
boolean offlineMode = JavaLanguageServerPlugin.getPreferencesManager() != null ? JavaLanguageServerPlugin.getPreferencesManager().getPreferences().isImportGradleOfflineEnabled() : false;
246+
List<String> gradleArguments = preferences.getGradleArguments();
247+
List<String> gradleJvmArguments = preferences.getGradleJvmArguments();
248+
boolean offlineMode = preferences.isImportGradleOfflineEnabled();
249249
boolean overrideWorkspaceConfiguration = !(distribution instanceof WrapperGradleDistribution) || offlineMode || (gradleArguments != null && !gradleArguments.isEmpty()) || (gradleJvmArguments != null && !gradleJvmArguments.isEmpty())
250250
|| gradleUserHome != null || javaHome != null;
251251
// @formatter:off
@@ -263,22 +263,25 @@ public static BuildConfiguration getBuildConfiguration(Path rootFolder) {
263263
}
264264

265265
public static boolean shouldSynchronize(File location) {
266-
boolean shouldSynchronize = true;
267-
List<IProject> projects = ProjectUtils.getGradleProjects();
268-
for (IProject project : projects) {
266+
for (IProject project : ProjectUtils.getGradleProjects()) {
269267
File projectDir = project.getLocation() == null ? null : project.getLocation().toFile();
270268
if (location.equals(projectDir)) {
271-
shouldSynchronize = checkGradlePersistence(shouldSynchronize, project, projectDir);
272-
break;
269+
boolean shouldSynchronize = checkGradlePersistence(project, projectDir);
270+
if (shouldSynchronize) {
271+
JavaLanguageServerPlugin.logInfo(project.getName() + " was modified since last time the workspace was opened, must be synchronized");
272+
}
273+
return shouldSynchronize;
273274
}
274275
}
275-
return shouldSynchronize;
276+
JavaLanguageServerPlugin.logInfo("No previous Gradle project at " + location + ", it must be synchronized");
277+
return true;
276278
}
277279

278-
private static boolean checkGradlePersistence(boolean shouldSynchronize, IProject project, File projectDir) {
279-
if (!ProjectUtils.isJavaProject(project) || !project.getFile(IJavaProject.CLASSPATH_FILE_NAME).exists()) {
280+
private static boolean checkGradlePersistence(IProject project, File projectDir) {
281+
if (ProjectUtils.isJavaProject(project) && !project.getFile(IJavaProject.CLASSPATH_FILE_NAME).exists()) {
280282
return true;
281283
}
284+
boolean shouldSynchronize = false;
282285
PersistentModel model = CorePlugin.modelPersistence().loadModel(project);
283286
if (model.isPresent()) {
284287
File persistentFile = CorePlugin.getInstance().getStateLocation().append("project-preferences").append(project.getName()).toFile();
@@ -306,4 +309,8 @@ public boolean accept(File dir, String name) {
306309
public void reset() {
307310
}
308311

312+
private static Preferences getPreferences() {
313+
return (JavaLanguageServerPlugin.getPreferencesManager() == null || JavaLanguageServerPlugin.getPreferencesManager().getPreferences() == null) ? new Preferences() : JavaLanguageServerPlugin.getPreferencesManager().getPreferences();
314+
}
315+
309316
}

0 commit comments

Comments
 (0)