diff --git a/eclipse-distribution/org.springframework.boot.ide.branding/.classpath b/eclipse-distribution/org.springframework.boot.ide.branding/.classpath new file mode 100644 index 000000000..5508535a4 --- /dev/null +++ b/eclipse-distribution/org.springframework.boot.ide.branding/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/.classpath b/eclipse-extensions/org.springframework.ide.eclipse.buildship30/.classpath index 48c13c3d2..cf36b5611 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/.classpath +++ b/eclipse-extensions/org.springframework.ide.eclipse.buildship30/.classpath @@ -2,7 +2,6 @@ - diff --git a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/META-INF/MANIFEST.MF b/eclipse-extensions/org.springframework.ide.eclipse.buildship30/META-INF/MANIFEST.MF index 500639f44..0a1d14b27 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/META-INF/MANIFEST.MF +++ b/eclipse-extensions/org.springframework.ide.eclipse.buildship30/META-INF/MANIFEST.MF @@ -18,8 +18,7 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.ui.workbench, com.google.guava, org.springsource.ide.eclipse.commons.livexp, - org.springframework.ide.eclipse.boot;bundle-version="3.9.12" + org.springframework.ide.eclipse.boot;bundle-version="3.9.12", + org.springframework.tooling.gradle Import-Package: org.apache.commons.io -Bundle-ClassPath: gradle-plugin/sts-gradle-model-plugin.jar, - . Bundle-Activator: org.springframework.ide.eclipse.buildship30.Buildship30Plugin diff --git a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/build.properties b/eclipse-extensions/org.springframework.ide.eclipse.buildship30/build.properties index 71a157c37..0d14f69c7 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/build.properties +++ b/eclipse-extensions/org.springframework.ide.eclipse.buildship30/build.properties @@ -1,10 +1,6 @@ -source.. = src/ output.. = bin/ bin.includes = META-INF/,\ - .,\ plugin.properties,\ plugin.xml,\ - about.html,\ - gradle-plugin/sts-gradle-model-plugin.jar,\ - gradle-plugin/init.gradle + about.html diff --git a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/pom.xml b/eclipse-extensions/org.springframework.ide.eclipse.buildship30/pom.xml index faf5e5ba9..894b4ef1b 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/pom.xml +++ b/eclipse-extensions/org.springframework.ide.eclipse.buildship30/pom.xml @@ -65,69 +65,6 @@ - - org.apache.maven.plugins - maven-clean-plugin - - - - ${project.basedir}/gradle-plugin - - *.jar - - - - - - - - org.codehaus.mojo - exec-maven-plugin - - - sts-gradle-model-build - generate-resources - - ${project.basedir}/../sts-gradle-model-plugin/sts-gradle-model-plugin - ${gradle.executable} - - clean - build - -S - - - - exec - - - - - - - maven-resources-plugin - - - copy-sts-gradle-model-jars - process-resources - - copy-resources - - - - ${project.basedir}/gradle-plugin - - - ${project.basedir}/../sts-gradle-model-plugin/sts-gradle-model-plugin/build/libs/ - - ${gradle.model-plugin.artifactId}.jar - - - - - - - - org.eclipse.tycho target-platform-configuration diff --git a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/src/org/springframework/ide/eclipse/buildship30/GradleSpringBootProject.java b/eclipse-extensions/org.springframework.ide.eclipse.buildship30/src/org/springframework/ide/eclipse/buildship30/GradleSpringBootProject.java index fdc4e15ad..62d4beecd 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/src/org/springframework/ide/eclipse/buildship30/GradleSpringBootProject.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.buildship30/src/org/springframework/ide/eclipse/buildship30/GradleSpringBootProject.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2020 Pivotal, Inc. + * Copyright (c) 2020, 2024 Pivotal, 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 @@ -11,9 +11,6 @@ package org.springframework.ide.eclipse.buildship30; import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -25,7 +22,6 @@ import org.eclipse.buildship.core.internal.workspace.NewProjectHandler; import org.eclipse.buildship.core.internal.workspace.SynchronizationJob; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.gradle.tooling.ModelBuilder; @@ -39,6 +35,7 @@ import org.springframework.ide.eclipse.boot.core.initializr.InitializrService; import org.springframework.ide.eclipse.boot.core.initializr.InitializrUrl; import org.springframework.ide.eclipse.boot.core.internal.SpringBootProject; import org.springframework.ide.eclipse.boot.util.DependencyDelta; +import org.springframework.tooling.gradle.StsGradleToolingModelBuilder; import org.springsource.ide.eclipse.commons.livexp.util.Log; import com.google.common.base.Supplier; @@ -54,11 +51,6 @@ public class GradleSpringBootProject extends SpringBootProject { private static final String WAR_PKG_NATURE = "org.eclipse.wst.common.project.facet.core.nature"; - private static final Supplier cacheFolderSupplier = Suppliers.memoize(() -> { - IPath iPath = Buildship30Plugin.getDefault().getStateLocation().makeAbsolute(); - return iPath.toFile().toPath().resolve("gradle-plugin"); - }); - private static class GradleModels { EclipseProject eclipseProject; StsToolingModel stsToolingModel; @@ -117,13 +109,12 @@ public class GradleSpringBootProject extends SpringBootProject { if (build.isPresent()) { try { return build.get().withConnection(connection -> { - ModelBuilder stsModelBuilder = connection.model(StsToolingModel.class) - .withArguments("--init-script", getInitScript().toString()); + ModelBuilder stsModelBuilder = StsGradleToolingModelBuilder.getModelBuilder(connection, project.getLocation().toFile(), null); return new GradleModels(connection.model(EclipseProject.class).get(), stsModelBuilder.get()); }, new NullProgressMonitor()); - } catch (Exception e) { - Log.log(e); + } catch (Throwable t) { + Log.log(t); return null; } } @@ -252,29 +243,4 @@ public class GradleSpringBootProject extends SpringBootProject { throw new UnsupportedOperationException("Not implemented!"); } - private Path getInitScript() { - Path cacheFolder = cacheFolderSupplier.get(); - Path initScript = cacheFolder.resolve("init.gradle"); - Path jarPath = cacheFolder.resolve("sts-gradle-model-plugin.jar"); - if (!Files.isDirectory(cacheFolder)) { - cacheFolder.toFile().mkdirs(); - } - if (!Files.exists(initScript)) { - try { - Files.copy(getClass().getResourceAsStream("/gradle-plugin/init.gradle"), initScript); - } catch (IOException e) { - Log.log(e); - } - } - if (!Files.exists(jarPath)) { - try { - Files.copy(getClass().getResourceAsStream("/gradle-plugin/sts-gradle-model-plugin.jar"), - jarPath); - } catch (IOException e) { - Log.log(e); - } - } - return initScript; - } - } diff --git a/eclipse-language-servers/org.springframework.tooling.ls.integration.repository/category.xml b/eclipse-language-servers/org.springframework.tooling.ls.integration.repository/category.xml index e8066cbda..a4ff964b3 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.integration.repository/category.xml +++ b/eclipse-language-servers/org.springframework.tooling.ls.integration.repository/category.xml @@ -2,90 +2,92 @@ - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/.classpath b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/.classpath new file mode 100644 index 000000000..ece7033b6 --- /dev/null +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/.gitignore b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/.gitignore new file mode 100644 index 000000000..638900b5b --- /dev/null +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/.gitignore @@ -0,0 +1 @@ +/gradle-plugin/*.jar \ No newline at end of file diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/.project b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/.project new file mode 100644 index 000000000..5ff8ad162 --- /dev/null +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/.project @@ -0,0 +1,28 @@ + + + org.springframework.tooling.gradle + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/META-INF/MANIFEST.MF b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/META-INF/MANIFEST.MF new file mode 100644 index 000000000..1f0950250 --- /dev/null +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/META-INF/MANIFEST.MF @@ -0,0 +1,15 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: STS Gradle Model +Bundle-SymbolicName: org.springframework.tooling.gradle;singleton:=true +Bundle-Version: 4.22.0.qualifier +Export-Package: org.springframework.tooling.gradle, + sts.model.plugin +Require-Bundle: org.eclipse.core.runtime, + org.eclipse.buildship.core;bundle-version="3.0.0" +Automatic-Module-Name: org.springframework.tooling.gradle +Bundle-ActivationPolicy: lazy +Bundle-Activator: org.springframework.tooling.gradle.StsGradlePlugin +Bundle-ClassPath: ., + gradle-plugin/sts-gradle-model-plugin.jar +Bundle-RequiredExecutionEnvironment: JavaSE-17 diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/build.properties b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/build.properties new file mode 100644 index 000000000..dc1b52ec8 --- /dev/null +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/build.properties @@ -0,0 +1,7 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + gradle-plugin/sts-gradle-model-plugin.jar, \ + gradle-plugin/init.gradle + diff --git a/eclipse-extensions/org.springframework.ide.eclipse.buildship30/gradle-plugin/init.gradle b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/gradle-plugin/init.gradle similarity index 100% rename from eclipse-extensions/org.springframework.ide.eclipse.buildship30/gradle-plugin/init.gradle rename to headless-services/jdt-ls-extension/org.springframework.tooling.gradle/gradle-plugin/init.gradle diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/pom.xml b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/pom.xml new file mode 100644 index 000000000..5671f98d2 --- /dev/null +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/pom.xml @@ -0,0 +1,74 @@ + + 4.0.0 + eclipse-plugin + org.springframework.ide.vscode + org.springframework.tooling.gradle + 4.22.0-SNAPSHOT + org.springframework.tooling.gradle + + + org.springframework.tooling + jdt-ls-extension-parent + 0.0.1-SNAPSHOT + ../pom.xml + + + + + org.springframework.ide + sts-gradle-model-plugin + 1.0.0 + + + + + + + + org.apache.maven.plugins + maven-clean-plugin + 3.0.0 + + + + ${project.basedir}/gradle-plugin + + *.jar + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-sts-gradle-model-jars + initialize + + copy + + + + + org.springframework.ide + sts-gradle-model-plugin + true + ${basedir}/gradle-plugin + + + true + true + true + + + + + + + diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/src/org/springframework/tooling/gradle/StsGradlePlugin.java b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/src/org/springframework/tooling/gradle/StsGradlePlugin.java new file mode 100644 index 000000000..444ae4c0f --- /dev/null +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/src/org/springframework/tooling/gradle/StsGradlePlugin.java @@ -0,0 +1,26 @@ +package org.springframework.tooling.gradle; + +import org.eclipse.core.runtime.Plugin; +import org.osgi.framework.BundleContext; + +public class StsGradlePlugin extends Plugin { + + private static StsGradlePlugin plugin; + + static StsGradlePlugin getDefault() { + return plugin; + } + + @Override + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + @Override + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + +} diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/src/org/springframework/tooling/gradle/StsGradleToolingModelBuilder.java b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/src/org/springframework/tooling/gradle/StsGradleToolingModelBuilder.java new file mode 100644 index 000000000..ac07efca9 --- /dev/null +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.gradle/src/org/springframework/tooling/gradle/StsGradleToolingModelBuilder.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2024 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.gradle; + +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.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.IPath; +import org.gradle.tooling.ModelBuilder; +import org.gradle.tooling.ProjectConnection; + +import sts.model.plugin.StsToolingModel; + +public class StsGradleToolingModelBuilder { + + private static Path initScript = null; + + private static Path getCacheFolder() { + IPath iPath = StsGradlePlugin.getDefault().getStateLocation().makeAbsolute(); + return iPath.toFile().toPath().resolve("gradle-plugin"); + }; + + private static Path getInitScript() { + if (initScript == null) { + Path cacheFolder = getCacheFolder(); + initScript = cacheFolder.resolve("init.gradle"); + Path jarPath = cacheFolder.resolve("sts-gradle-model-plugin.jar"); + if (!Files.isDirectory(cacheFolder)) { + cacheFolder.toFile().mkdirs(); + } + if (!Files.exists(initScript)) { + try { + Files.copy(StsGradleToolingModelBuilder.class.getResourceAsStream("/gradle-plugin/init.gradle"), + initScript, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + StsGradlePlugin.getDefault().getLog().error("Failed to copy '/gradle-plugin/init.gradle'", e); + } + } + if (!Files.exists(jarPath)) { + try { + Files.copy(StsGradleToolingModelBuilder.class + .getResourceAsStream("/gradle-plugin/sts-gradle-model-plugin.jar"), jarPath, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + StsGradlePlugin.getDefault().getLog() + .error("Failed to copy '/gradle-plugin/sts-gradle-model-plugin.jar'", e); + } + } + } + return initScript; + } + + public static ModelBuilder getModelBuilder(ProjectConnection connection, File projectDir, File buildFile) { + List arguments = new ArrayList<>(); + if (buildFile != null && buildFile.exists()) { + arguments.add("-b"); + arguments.add(buildFile.getAbsolutePath()); + } + arguments.add("--init-script"); + arguments.add(getInitScript().toString()); + ModelBuilder modelBuilder = connection.model(StsToolingModel.class); + modelBuilder.withArguments(arguments); + return modelBuilder; + } + +} diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathUtil.java b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathUtil.java index 836ff6be6..a5222d78d 100644 --- a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathUtil.java +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathUtil.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018, 2023 Pivotal, Inc. + * Copyright (c) 2018, 2024 Pivotal, 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 @@ -225,7 +225,7 @@ public class ClasspathUtil { } } - public static ProjectBuild createProjectBuild(IJavaProject jp) { + public static ProjectBuild createProjectBuild(IJavaProject jp, Logger logger) { // try { boolean likelyGradle = false; boolean likelyMaven = false; @@ -239,7 +239,16 @@ public class ClasspathUtil { if (!g.exists()) { g = jp.getProject().getFile("build.gradle.kts"); } - return new ProjectBuild(ProjectBuild.GRADLE_PROJECT_TYPE, g.exists() ? g.getLocationURI().toASCIIString() : null, null); + // TODO: TestJars support requires GAV of a project. To be added properly later as it needs optimizations +// Optional optGav = GradleCore.getWorkspace().getBuild(jp.getProject()).flatMap(build -> { +// try { +// return Optional.of(build.withConnection(conn -> StsGradleToolingModelBuilder.getModelBuilder(conn, jp.getProject().getLocation().toFile(), null).get(), new NullProgressMonitor())); +// } catch (Exception e) { +// logger.log(e); +// return Optional.empty(); +// } +// }).map(m -> new Gav(m.group(), m.artifact(), m.version())); + return ProjectBuild.createGradleBuild(g.exists() ? g.getLocationURI().toASCIIString() : null, /*optGav.orElse(null)*/null); } else { try { for (IClasspathEntry e : jp.getRawClasspath()) { diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/SendClasspathNotificationsJob.java b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/SendClasspathNotificationsJob.java index f3f485fb4..283474e6a 100644 --- a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/SendClasspathNotificationsJob.java +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/SendClasspathNotificationsJob.java @@ -143,7 +143,7 @@ public class SendClasspathNotificationsJob extends Job { logger.log(e); } } - bufferMessage(projectLoc, deleted, projectName, classpath, ClasspathUtil.createProjectBuild(jp)); + bufferMessage(projectLoc, deleted, projectName, classpath, ClasspathUtil.createProjectBuild(jp, logger)); } } flush(); diff --git a/headless-services/jdt-ls-extension/pom.xml b/headless-services/jdt-ls-extension/pom.xml index 2cb12d125..9754121d8 100644 --- a/headless-services/jdt-ls-extension/pom.xml +++ b/headless-services/jdt-ls-extension/pom.xml @@ -39,6 +39,7 @@ + org.springframework.tooling.gradle org.springframework.tooling.jdt.ls.extension org.springframework.tooling.jdt.ls.commons org.springframework.tooling.jdt.ls.commons.test diff --git a/headless-services/pom.xml b/headless-services/pom.xml index 10cdde31e..b15352af8 100644 --- a/headless-services/pom.xml +++ b/headless-services/pom.xml @@ -10,6 +10,7 @@ aggregator + sts-gradle-model-plugin commons manifest-yaml-language-server concourse-language-server diff --git a/headless-services/sts-gradle-model-plugin/.gitignore b/headless-services/sts-gradle-model-plugin/.gitignore new file mode 100644 index 000000000..bfe9b1fcb --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/.gitignore @@ -0,0 +1,6 @@ +/**/.gradle/ +/**/.project +/**/.classpath +/**/.settings/ +.DS_Store +/**/.DS_Store \ No newline at end of file diff --git a/headless-services/sts-gradle-model-plugin/invocation/build.gradle b/headless-services/sts-gradle-model-plugin/invocation/build.gradle new file mode 100644 index 000000000..e2d0cf69f --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/invocation/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'application' + +repositories { + maven { + url "$projectDir/../repo" + } + maven { + url 'https://repo.gradle.org/gradle/libs-releases-local' + } + mavenCentral() +} + +dependencies { + compile files('../sts-model-plugin/build/libs/sts-model-plugin-1.0.0-SNAPSHOT.jar') + compile "org.gradle:gradle-tooling-api:6.2.2" + runtime 'org.slf4j:slf4j-simple:1.7.5' +} + +mainClassName = 'org.gradle.sample.toolingapi.ToolingApiRunner' \ No newline at end of file diff --git a/headless-services/sts-gradle-model-plugin/invocation/src/main/java/org/gradle/sample/toolingapi/ToolingApiRunner.java b/headless-services/sts-gradle-model-plugin/invocation/src/main/java/org/gradle/sample/toolingapi/ToolingApiRunner.java new file mode 100644 index 000000000..b328deef0 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/invocation/src/main/java/org/gradle/sample/toolingapi/ToolingApiRunner.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, 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: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.gradle.sample.toolingapi; + +import java.io.File; + +import org.gradle.tooling.GradleConnector; +import org.gradle.tooling.ModelBuilder; +import org.gradle.tooling.ProjectConnection; + +import sts.model.plugin.StsToolingModel; + +public class ToolingApiRunner { + public static void main(String[] args) { + GradleConnector connector = GradleConnector.newConnector(); + connector.forProjectDirectory(new File("../sample")); + ProjectConnection connection = null; + + try { + connection = connector.connect(); + ModelBuilder customModelBuilder = connection.model(StsToolingModel.class); + customModelBuilder.withArguments("--init-script", "/Users/aboyko/Documents/runtime-STS/.metadata/.plugins/org.springframework.ide.eclipse.buildship30/gradle-plugin/init.gradle"); + StsToolingModel model = customModelBuilder.get(); + System.out.println("Group=" + model.group() + " artifact=" + model.artifact() + " version=" + model.version()); + assert model.version() != null; + } finally { + if(connection != null) { + connection.close(); + } + } + } +} \ No newline at end of file diff --git a/headless-services/sts-gradle-model-plugin/pom.xml b/headless-services/sts-gradle-model-plugin/pom.xml new file mode 100644 index 000000000..69419ab6c --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/pom.xml @@ -0,0 +1,54 @@ + + 4.0.0 + + org.springframework.ide.vscode + sts-gradle-model-plugin-wrapper + pom + 1.53.0-SNAPSHOT + sts-gradle-model-plugin-wrapper + + + + + org.codehaus.mojo + exec-maven-plugin + + + test + test + + ${project.basedir}/sts-gradle-model-plugin/ + ./gradlew + + test + -i + + + + exec + + + + install + install + + ${project.basedir}/sts-gradle-model-plugin/ + ./gradlew + + clean + build + publishToMavenLocal + + + + exec + + + + + + + + diff --git a/headless-services/sts-gradle-model-plugin/sample/build.gradle b/headless-services/sts-gradle-model-plugin/sample/build.gradle new file mode 100644 index 000000000..46e17e0c7 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sample/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'org.springframework.boot' version '2.3.0.M2' + id 'io.spring.dependency-management' version '1.0.9.RELEASE' + id 'java' +} + +group = 'com.example' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '17' + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() + maven { url 'https://repo.spring.io/milestone' } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-activemq' + implementation 'org.springframework.boot:spring-boot-starter-web' + annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' + testImplementation('org.springframework.boot:spring-boot-starter-test') { + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + } +} + +test { + useJUnitPlatform() +} diff --git a/headless-services/sts-gradle-model-plugin/sample/init.gradle b/headless-services/sts-gradle-model-plugin/sample/init.gradle new file mode 100644 index 000000000..8dbc54fc7 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sample/init.gradle @@ -0,0 +1,9 @@ +initscript { + dependencies { + classpath files('../sts-gradle-model-plugin/build/libs/sts-gradle-model-plugin-1.0.0-SNAPSHOT.jar') + } +} + +allprojects { + apply plugin: sts.model.plugin.StsModelPlugin +} \ No newline at end of file diff --git a/headless-services/sts-gradle-model-plugin/sample/settings.gradle b/headless-services/sts-gradle-model-plugin/sample/settings.gradle new file mode 100644 index 000000000..873fde5b1 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sample/settings.gradle @@ -0,0 +1,14 @@ +pluginManagement { + repositories { + maven { url 'https://repo.spring.io/milestone' } + gradlePluginPortal() + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == 'org.springframework.boot') { + useModule("org.springframework.boot:spring-boot-gradle-plugin:${requested.version}") + } + } + } +} +rootProject.name = 'demo-gradle-jar' diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/.gitignore b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/.gitignore new file mode 100644 index 000000000..1b6985c00 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/.gitignore @@ -0,0 +1,5 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/build.gradle b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/build.gradle new file mode 100644 index 000000000..d90a876bb --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/build.gradle @@ -0,0 +1,24 @@ +plugins { + id 'java-library' + id 'maven-publish' +} + +dependencies { + implementation gradleApi() +} + +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + } + } +} + +compileJava { + sourceCompatibility = '17' + targetCompatibility = '17' +} + +group = "org.springframework.ide" +version = "1.0.0" diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradle/wrapper/gradle-wrapper.jar b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..cc4fdc293 Binary files /dev/null and b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradle/wrapper/gradle-wrapper.jar differ diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradle/wrapper/gradle-wrapper.properties b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..a59520664 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradlew b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradlew new file mode 100755 index 000000000..2fe81a7d9 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradlew.bat b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradlew.bat new file mode 100644 index 000000000..9618d8d96 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/settings.gradle b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/settings.gradle new file mode 100644 index 000000000..4b3f46b99 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/settings.gradle @@ -0,0 +1,10 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/6.0/userguide/multi_project_builds.html + */ + +rootProject.name = 'sts-gradle-model-plugin' diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/DefaultModel.java b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/DefaultModel.java new file mode 100644 index 000000000..da364455f --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/DefaultModel.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, 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: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package sts.model.plugin; + +import java.io.Serializable; + +class DefaultModel implements StsToolingModel, Serializable { + + private static final long serialVersionUID = 725626813912256658L; + + String version; + String group; + String artifact; + + @Override + public String version() { + return version; + } + + @Override + public String group() { + return group; + } + + @Override + public String artifact() { + return artifact; + } + +} diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/StsModelBuilder.java b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/StsModelBuilder.java new file mode 100644 index 000000000..c9211aa60 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/StsModelBuilder.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, 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: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package sts.model.plugin; + +import org.gradle.api.Project; +import org.gradle.tooling.provider.model.ToolingModelBuilder; + +public class StsModelBuilder implements ToolingModelBuilder { + + @Override + public StsToolingModel buildAll(String modelName, Project project) { + DefaultModel model = new DefaultModel(); + if (project.getVersion() != null) { + model.version = project.getVersion().toString(); + } + if (project.getGroup() != null) { + model.group = project.getGroup().toString(); + } + if (project.getName() != null) { + model.artifact = project.getName(); + } + return model; + } + + @Override + public boolean canBuild(String modelName) { + return StsToolingModel.class.getName().equals(modelName); + } + +} diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/StsModelPlugin.java b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/StsModelPlugin.java new file mode 100644 index 000000000..0b8e7e603 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/StsModelPlugin.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, 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: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package sts.model.plugin; + +import javax.inject.Inject; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry; + +public class StsModelPlugin implements Plugin { + + private final ToolingModelBuilderRegistry registry; + + @Inject + public StsModelPlugin(ToolingModelBuilderRegistry registry) { + this.registry = registry; + } + + @Override + public void apply(Project project) { + registry.register(new StsModelBuilder()); + } + +} diff --git a/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/StsToolingModel.java b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/StsToolingModel.java new file mode 100644 index 000000000..d6d028048 --- /dev/null +++ b/headless-services/sts-gradle-model-plugin/sts-gradle-model-plugin/src/main/java/sts/model/plugin/StsToolingModel.java @@ -0,0 +1,17 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, 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: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package sts.model.plugin; + +public interface StsToolingModel { + String version(); + String group(); + String artifact(); +}