From c65c5f0c95ef70f86b64111665777a280d9b05f2 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Wed, 19 Nov 2025 11:50:57 -0800 Subject: [PATCH 1/2] WIP: Refresh AOT data command for Eclipse Signed-off-by: BoykoAlex --- .../META-INF/MANIFEST.MF | 3 +- .../commands/ExecuteGradleTaskHandler.java | 98 +++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/commands/ExecuteGradleTaskHandler.java diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF index d285908bee..ddc3fdc59b 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF @@ -26,7 +26,8 @@ Require-Bundle: org.eclipse.jdt.launching;bundle-version="3.8.0", org.eclipse.swt, com.google.gson, org.eclipse.m2e.launching, - org.eclipse.m2e.core + org.eclipse.m2e.core, + org.eclipse.buildship.core Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Export-Package: org.springframework.tooling.ls.eclipse.commons, diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/commands/ExecuteGradleTaskHandler.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/commands/ExecuteGradleTaskHandler.java new file mode 100644 index 0000000000..6a0b952d3a --- /dev/null +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/commands/ExecuteGradleTaskHandler.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright (c) 2025 Broadcom, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Broadcom, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.tooling.ls.eclipse.commons.commands; + +import java.io.File; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; + +import org.eclipse.buildship.core.internal.CorePlugin; +import org.eclipse.buildship.core.internal.configuration.BuildConfiguration; +import org.eclipse.buildship.core.internal.launch.GradleRunConfigurationAttributes; +import org.eclipse.buildship.core.internal.util.variable.ExpressionUtils; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.debug.ui.DebugUITools; +import org.eclipse.lsp4e.LSPEclipseUtils; +import org.eclipse.lsp4e.command.LSPCommandHandler; +import org.eclipse.lsp4j.Command; + +import com.google.common.base.Optional; +import com.google.gson.Gson; + +@SuppressWarnings("restriction") +public class ExecuteGradleTaskHandler extends AbstractHandler { + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + Command cmd = new Gson().fromJson(event.getParameter(LSPCommandHandler.LSP_COMMAND_PARAMETER_ID), Command.class); + if (cmd != null) { + try { + String projectPath = (String) cmd.getArguments().get(0); + String task = (String) cmd.getArguments().get(1); + System.out.println("Project: '%s', task: '%s'".formatted(projectPath, task)); + + IResource projectFolder = LSPEclipseUtils.findResourceFor(Paths.get(projectPath).toUri()); + File workingFolder = projectFolder.getLocation().toFile(); + GradleRunConfigurationAttributes configurationAttributes = getRunConfigurationAttributes(workingFolder, workingFolder, Arrays.asList(task.split("\\s+"))); + + // create/reuse a launch configuration for the given attributes + ILaunchConfiguration launchConfig = CorePlugin.gradleLaunchConfigurationManager().getOrCreateRunConfiguration(configurationAttributes); + + DebugUITools.launch(launchConfig, ILaunchManager.RUN_MODE); + } catch (Exception e) { + throw new ExecutionException("Failed to execute Maven Goal command", e); + } + } + throw new ExecutionException("Maven Goal Execution command is invalid"); + } + + private static GradleRunConfigurationAttributes getRunConfigurationAttributes(File rootDir, File workingDir, List tasks) { + BuildConfiguration buildConfig = CorePlugin.configurationManager().loadBuildConfiguration(rootDir); + return new GradleRunConfigurationAttributes(tasks, + projectDirectoryExpression(workingDir), + buildConfig.getGradleDistribution().toString(), + gradleUserHomeExpression(buildConfig.getGradleUserHome()), + javaHomeExpression(buildConfig.getJavaHome()), + buildConfig.getJvmArguments(), + buildConfig.getArguments(), + buildConfig.isShowExecutionsView(), + buildConfig.isShowExecutionsView(), + buildConfig.isOverrideWorkspaceSettings(), + buildConfig.isOfflineMode(), + buildConfig.isBuildScansEnabled()); + } + + private static String projectDirectoryExpression(File rootProjectDir) { + // return the directory as an expression if the project is part of the workspace, otherwise + // return the absolute path of the project directory available on the Eclipse project model + Optional project = CorePlugin.workspaceOperations().findProjectByLocation(rootProjectDir); + if (project.isPresent()) { + return ExpressionUtils.encodeWorkspaceLocation(project.get()); + } else { + return rootProjectDir.getAbsolutePath(); + } + } + + private static String gradleUserHomeExpression(File gradleUserHome) { + return gradleUserHome == null ? "" : gradleUserHome.getAbsolutePath(); + } + + private static String javaHomeExpression(File javaHome) { + return javaHome == null ? "" : javaHome.getAbsolutePath(); + } +} From 4c3678529de45a569e20bb3fc19cf888122e7ff8 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Tue, 25 Nov 2025 11:08:28 -0800 Subject: [PATCH 2/2] Basic Gradle support for Spring Data AOT Signed-off-by: BoykoAlex --- .../META-INF/MANIFEST.MF | 3 +- .../plugin.xml | 22 ++++- .../commands/ExecuteGradleTaskHandler.java | 94 +++++++++++-------- .../commands/ExecuteMavenGoalHandler.java | 1 - .../boot/java/BuildCommandProvider.java | 2 + .../java/DefaultBuildCommandProvider.java | 46 ++++++++- .../boot/java/VSCodeBuildCommandProvider.java | 9 ++ ...RepositoryAotMetadataCodeLensProvider.java | 9 +- .../DataRepositoryAotMetadataService.java | 39 ++++++-- 9 files changed, 167 insertions(+), 58 deletions(-) diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF index ddc3fdc59b..1c23426b8c 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF @@ -27,7 +27,8 @@ Require-Bundle: org.eclipse.jdt.launching;bundle-version="3.8.0", com.google.gson, org.eclipse.m2e.launching, org.eclipse.m2e.core, - org.eclipse.buildship.core + org.eclipse.buildship.core, + org.gradle.toolingapi Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Export-Package: org.springframework.tooling.ls.eclipse.commons, diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml index 466b0b337c..1187dfb30a 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml @@ -111,6 +111,10 @@ class="org.springframework.tooling.ls.eclipse.commons.commands.ExecuteMavenGoalHandler" commandId="maven.goal.custom"> + + @@ -201,7 +205,23 @@ + name="Execute Maven Goal"> + + + + + + { + try { + return build.withConnection(conn -> conn.getModel(EclipseProject.class), + new NullProgressMonitor()); + } catch (Exception e) { + throw new RuntimeException( + "Failed to get Gradle EclipseProject model for project: " + project.getName(), e); + } + }).get(); - // create/reuse a launch configuration for the given attributes - ILaunchConfiguration launchConfig = CorePlugin.gradleLaunchConfigurationManager().getOrCreateRunConfiguration(configurationAttributes); + File rootDir = HierarchicalElementUtils.getRoot(gradleProject).getProjectDirectory(); + File workingDir = gradleProject.getProjectDirectory(); + GradleRunConfigurationAttributes configurationAttributes = getRunConfigurationAttributes(rootDir, + workingDir, Arrays.asList(task.split("\\s+"))); + + // create/reuse a launch configuration for the given attributes + ILaunchConfiguration launchConfig = CorePlugin.gradleLaunchConfigurationManager() + .getOrCreateRunConfiguration(configurationAttributes); DebugUITools.launch(launchConfig, ILaunchManager.RUN_MODE); } catch (Exception e) { @@ -61,38 +79,36 @@ public Object execute(ExecutionEvent event) throws ExecutionException { throw new ExecutionException("Maven Goal Execution command is invalid"); } - private static GradleRunConfigurationAttributes getRunConfigurationAttributes(File rootDir, File workingDir, List tasks) { - BuildConfiguration buildConfig = CorePlugin.configurationManager().loadBuildConfiguration(rootDir); - return new GradleRunConfigurationAttributes(tasks, - projectDirectoryExpression(workingDir), - buildConfig.getGradleDistribution().toString(), - gradleUserHomeExpression(buildConfig.getGradleUserHome()), - javaHomeExpression(buildConfig.getJavaHome()), - buildConfig.getJvmArguments(), - buildConfig.getArguments(), - buildConfig.isShowExecutionsView(), - buildConfig.isShowExecutionsView(), - buildConfig.isOverrideWorkspaceSettings(), - buildConfig.isOfflineMode(), - buildConfig.isBuildScansEnabled()); - } + private static GradleRunConfigurationAttributes getRunConfigurationAttributes(File rootDir, File workingDir, + List tasks) { + BuildConfiguration buildConfig = CorePlugin.configurationManager().loadBuildConfiguration(rootDir); + return new GradleRunConfigurationAttributes(tasks, projectDirectoryExpression(workingDir), + buildConfig.getGradleDistribution().toString(), + gradleUserHomeExpression(buildConfig.getGradleUserHome()), + javaHomeExpression(buildConfig.getJavaHome()), buildConfig.getJvmArguments(), + buildConfig.getArguments(), buildConfig.isShowExecutionsView(), buildConfig.isShowExecutionsView(), + buildConfig.isOverrideWorkspaceSettings(), buildConfig.isOfflineMode(), + buildConfig.isBuildScansEnabled()); + } - private static String projectDirectoryExpression(File rootProjectDir) { - // return the directory as an expression if the project is part of the workspace, otherwise - // return the absolute path of the project directory available on the Eclipse project model - Optional project = CorePlugin.workspaceOperations().findProjectByLocation(rootProjectDir); - if (project.isPresent()) { - return ExpressionUtils.encodeWorkspaceLocation(project.get()); - } else { - return rootProjectDir.getAbsolutePath(); - } - } + private static String projectDirectoryExpression(File rootProjectDir) { + // return the directory as an expression if the project is part of the + // workspace, otherwise + // return the absolute path of the project directory available on the Eclipse + // project model + Optional project = CorePlugin.workspaceOperations().findProjectByLocation(rootProjectDir); + if (project.isPresent()) { + return ExpressionUtils.encodeWorkspaceLocation(project.get()); + } else { + return rootProjectDir.getAbsolutePath(); + } + } - private static String gradleUserHomeExpression(File gradleUserHome) { - return gradleUserHome == null ? "" : gradleUserHome.getAbsolutePath(); - } + private static String gradleUserHomeExpression(File gradleUserHome) { + return gradleUserHome == null ? "" : gradleUserHome.getAbsolutePath(); + } - private static String javaHomeExpression(File javaHome) { - return javaHome == null ? "" : javaHome.getAbsolutePath(); - } + private static String javaHomeExpression(File javaHome) { + return javaHome == null ? "" : javaHome.getAbsolutePath(); + } } diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/commands/ExecuteMavenGoalHandler.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/commands/ExecuteMavenGoalHandler.java index a547d55eab..d04b7be77b 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/commands/ExecuteMavenGoalHandler.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/commands/ExecuteMavenGoalHandler.java @@ -52,7 +52,6 @@ public Object execute(ExecutionEvent event) throws ExecutionException { try { String pomPath = (String) cmd.getArguments().get(0); String goal = (String) cmd.getArguments().get(1); - System.out.println("Project: '%s', goal: '%s'".formatted(pomPath, goal)); IResource pomFile = LSPEclipseUtils.findResourceFor(Paths.get(pomPath).toUri()); ILaunchConfiguration launchConfig = createLaunchConfiguration(pomFile.getParent(), goal); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BuildCommandProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BuildCommandProvider.java index 4b9cbb08e9..a5223ec267 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BuildCommandProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BuildCommandProvider.java @@ -17,4 +17,6 @@ public interface BuildCommandProvider { Command executeMavenGoal(IJavaProject project, String goal); + Command executeGradleBuild(IJavaProject project, String command); + } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/DefaultBuildCommandProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/DefaultBuildCommandProvider.java index 7ab0b4759e..effecc2f68 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/DefaultBuildCommandProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/DefaultBuildCommandProvider.java @@ -28,16 +28,32 @@ public class DefaultBuildCommandProvider implements BuildCommandProvider { private static final String CMD_EXEC_MAVEN_GOAL = "sts.maven.goal"; + private static final String CMD_EXEC_GRADLE_BUILD = "sts.gradle.build"; private static final Object MAVEN_LOCK = new Object(); public DefaultBuildCommandProvider(SimpleLanguageServer server) { + + // Execute Maven Goal server.onCommand(CMD_EXEC_MAVEN_GOAL, params -> { String pomPath = extractString(params.getArguments().get(0)); String goal = extractString(params.getArguments().get(1)); return CompletableFuture.runAsync(() -> { try { - mavenRegenerateMetadata(Paths.get(pomPath), goal.trim().split("\\s+")).get(); + executeMaven(Paths.get(pomPath), goal.trim().split("\\s+")).get(); + } catch (Exception e) { + throw new CompletionException(e); + } + }); + }); + + // Execute Gradle Build + server.onCommand(CMD_EXEC_GRADLE_BUILD, params -> { + String gradleBuildPath = extractString(params.getArguments().get(0)); + String command = extractString(params.getArguments().get(1)); + return CompletableFuture.runAsync(() -> { + try { + executeGradle(Paths.get(gradleBuildPath), command.trim().split("\\s+")).get(); } catch (Exception e) { throw new CompletionException(e); } @@ -54,11 +70,20 @@ public Command executeMavenGoal(IJavaProject project, String goal) { return cmd; } + @Override + public Command executeGradleBuild(IJavaProject project, String command) { + Command cmd = new Command(); + cmd.setCommand(CMD_EXEC_GRADLE_BUILD); + cmd.setTitle("Execute Gradle Build"); + cmd.setArguments(List.of(Paths.get(project.getProjectBuild().getBuildFile()).toFile().toString(), command)); + return cmd; + } + private static String extractString(Object o) { return o instanceof JsonPrimitive ? ((JsonPrimitive) o).getAsString() : o.toString(); } - private CompletableFuture mavenRegenerateMetadata(Path pom, String[] goal) { + private CompletableFuture executeMaven(Path pom, String[] goal) { synchronized(MAVEN_LOCK) { String[] cmd = new String[1 + goal.length]; Path projectPath = pom.getParent(); @@ -77,5 +102,20 @@ private CompletableFuture mavenRegenerateMetadata(Path pom, String[] goal) } } - + private CompletableFuture executeGradle(Path gradleBuildPath, String[] command) { + String[] cmd = new String[1 + command.length]; + Path projectPath = gradleBuildPath.getParent(); + Path mvnw = projectPath.resolve(OS.isWindows() ? "gradlew.cmd" : "gradlew"); + cmd[0] = Files.isRegularFile(mvnw) ? mvnw.toFile().toString() : "gradle"; + System.arraycopy(command, 0, cmd, 1, command.length); + try { + return Runtime.getRuntime().exec(cmd, null, projectPath.toFile()).onExit().thenAccept(process -> { + if (process.exitValue() != 0) { + throw new CompletionException("Failed to execute Gradle build", new IllegalStateException("Errors running gradle command: %s".formatted(String.join(" ", cmd)))); + } + }); + } catch (IOException e) { + throw new CompletionException(e); + } + } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/VSCodeBuildCommandProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/VSCodeBuildCommandProvider.java index 842acac34a..e3096de82d 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/VSCodeBuildCommandProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/VSCodeBuildCommandProvider.java @@ -27,4 +27,13 @@ public Command executeMavenGoal(IJavaProject project, String goal) { return cmd; } + @Override + public Command executeGradleBuild(IJavaProject project, String command) { + Command cmd = new Command(); + cmd.setCommand("gradle.runBuild"); + cmd.setTitle("Execute Gradle Build"); + cmd.setArguments(List.of(Paths.get(project.getProjectBuild().getBuildFile()).toFile().toString(), command)); + return cmd; + } + } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataCodeLensProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataCodeLensProvider.java index f32d32aad0..28f64b9406 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataCodeLensProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataCodeLensProvider.java @@ -39,7 +39,6 @@ import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; -import org.springframework.ide.vscode.commons.protocol.java.ProjectBuild; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.AddAnnotationOverMethod; import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor; @@ -185,12 +184,10 @@ private List createCodeLenses(IJavaProject project, MethodDeclaration } private Optional createRefreshCodeLens(IJavaProject project, String title, Range range) { - if (ProjectBuild.MAVEN_PROJECT_TYPE.equals(project.getProjectBuild().getType())) { - Command refreshCmd = repositoryMetadataService.regenerateMetadataCommand(project); + return repositoryMetadataService.regenerateMetadataCommand(project).map(refreshCmd -> { refreshCmd.setTitle(title); - return Optional.of(new CodeLens(range, refreshCmd, null)); - } - return Optional.empty(); + return new CodeLens(range, refreshCmd, null); + }); } static FixDescriptor createFixDescriptor(IMethodBinding mb, String docUri, DataRepositoryModule module, IDataRepositoryAotMethodMetadata methodMetadata) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataService.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataService.java index bbd5af46d6..7b3fc45be4 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataService.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataService.java @@ -137,10 +137,20 @@ public DataRepositoryAotMetadataService(FileObserver fileObserver, JavaProjectFi public Optional getRepositoryMetadata(IJavaProject project, String repositoryType) { String metadataFilePath = repositoryType.replace('.', '/') + ".json"; - return IClasspathUtil.getOutputFolders(project.getClasspath()) - .map(outputFolder -> outputFolder.getParentFile().toPath().resolve("spring-aot/main/resources/").resolve(metadataFilePath)) - .findFirst() - .flatMap(filePath -> metadataCache.computeIfAbsent(filePath, this::readMetadataFile)); + switch (project.getProjectBuild().getType()) { + case ProjectBuild.MAVEN_PROJECT_TYPE: + return IClasspathUtil.getOutputFolders(project.getClasspath()) + .map(outputFolder -> outputFolder.getParentFile().toPath().resolve("spring-aot/main/resources/").resolve(metadataFilePath)) + .findFirst() + .flatMap(filePath -> metadataCache.computeIfAbsent(filePath, this::readMetadataFile)); + case ProjectBuild.GRADLE_PROJECT_TYPE: + return IClasspathUtil.getSourceFolders(project.getClasspath()) + .filter(f -> f.isDirectory() && "aotResources".equals(f.getName())) + .findFirst() + .map(f -> f.toPath().resolve(metadataFilePath)) + .flatMap(filePath -> metadataCache.computeIfAbsent(filePath, this::readMetadataFile)); + } + return Optional.empty(); } private Optional readMetadataFile(Path filePath) { @@ -154,7 +164,7 @@ private Optional readMetadataFile(Path filePath) { return Optional.empty(); } - public Command regenerateMetadataCommand(IJavaProject jp) { + Optional regenerateMetadataCommand(IJavaProject jp) { switch (jp.getProjectBuild().getType()) { case ProjectBuild.MAVEN_PROJECT_TYPE: List goal = new ArrayList<>(); @@ -170,9 +180,24 @@ public Command regenerateMetadataCommand(IJavaProject jp) { goal.add("compile"); } goal.add("org.springframework.boot:spring-boot-maven-plugin:process-aot"); - return buildCmds.executeMavenGoal(jp, String.join(" ", goal)); + return Optional.ofNullable(buildCmds.executeMavenGoal(jp, String.join(" ", goal))); +// case ProjectBuild.GRADLE_PROJECT_TYPE: +// List command = new ArrayList<>(); +// if (!IClasspathUtil.getOutputFolders(jp.getClasspath()).map(f -> f.toPath()).filter(Files::isDirectory).flatMap(d -> { +// try { +// return Files.walk(d); +// } catch (IOException e) { +// return Stream.empty(); +// } +// }).anyMatch(f -> Files.isRegularFile(f) && f.getFileName().toString().endsWith(".class"))) { +// // Check if source is compiled by checking that all output folders exist +// // If not compiled then add `build` task +// command.add("build"); +// } +// command.add("processAot"); +// return Optional.ofNullable(buildCmds.executeGradleBuild(jp, String.join(" ", command))); } - return null; + return Optional.empty(); } public void addListener(Consumer> listener) {