Skip to content

Commit 6677ebb

Browse files
committed
Introduce ide-provisioning-api and load implementation via custom classloader
1 parent 1d2a84d commit 6677ebb

File tree

10 files changed

+83
-7
lines changed

10 files changed

+83
-7
lines changed

build.gradle.kts

+19
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ description = "A tool to profile and benchmark Gradle builds"
2121

2222
val gradleRuntime by configurations.creating
2323
val profilerPlugins by configurations.creating
24+
val ideImplementation by configurations.creating
2425

2526
dependencies {
2627
implementation(libs.toolingApi)
@@ -42,6 +43,7 @@ dependencies {
4243
because("To write JSON output")
4344
}
4445
implementation(project(":client-protocol"))
46+
implementation(project(":ide-provisioning-api"))
4547

4648

4749
gradleRuntime(gradleApi())
@@ -52,6 +54,7 @@ dependencies {
5254
profilerPlugins(project(":studio-agent"))
5355
profilerPlugins(project(":heap-dump"))
5456
profilerPlugins(project(":studio-plugin"))
57+
ideImplementation(project(":ide-provisioning"))
5558

5659
runtimeOnly("org.slf4j:slf4j-simple:1.7.10")
5760
testImplementation(libs.bundles.testDependencies)
@@ -87,13 +90,29 @@ val generateHtmlReportJavaScript = tasks.register<NpxTask>("generateHtmlReportJa
8790
args.addAll(source.absolutePath, "--outfile", output.get().asFile.absolutePath)
8891
}
8992

93+
val listIdeProvisioningDependencies = tasks.register("listIdeProvisioningDependencies") {
94+
val input = ideImplementation.minus(gradleRuntime)
95+
val output = project.layout.buildDirectory.file("ide-provisioning/ide-provisioning.txt")
96+
inputs.files(input)
97+
outputs.file(output)
98+
doLast {
99+
output.get().asFile.writeText(input.joinToString("\n") { it.name })
100+
}
101+
}
102+
90103
tasks.processResources {
91104
into("META-INF/jars") {
92105
from(profilerPlugins.minus(gradleRuntime)) {
93106
// Removing the version from the JARs here, since they are referenced by name in production code.
94107
rename("""(.*)-\d\.\d.*\.jar""", "${'$'}1.jar")
95108
}
96109
}
110+
into("META-INF/jars") {
111+
from(ideImplementation.minus(gradleRuntime))
112+
}
113+
into("META-INF/classpath") {
114+
from(listIdeProvisioningDependencies)
115+
}
97116
from(generateHtmlReportJavaScript)
98117
}
99118

buildSrc/src/main/kotlin/profiler.java-library.gradle.kts

+7
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ repositories {
1414
}
1515
}
1616
mavenCentral()
17+
maven {
18+
url = uri("https://www.jetbrains.com/intellij-repository/releases")
19+
}
20+
maven {
21+
url = uri("https://cache-redirector.jetbrains.com/intellij-dependencies")
22+
}
23+
1724
}
1825

1926
java {

settings.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ include("client-protocol")
1414
include("instrumentation-support")
1515
include("studio-agent")
1616
include("studio-plugin")
17+
include("ide-provisioning-api")
1718
include("ide-provisioning")
1819

1920
rootProject.children.forEach {

src/main/java/org/gradle/profiler/instrument/GradleInstrumentation.java

+21
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44
import org.gradle.profiler.GeneratedInitScript;
55
import org.gradle.profiler.GradleArgsCalculator;
66

7+
import java.io.BufferedReader;
78
import java.io.File;
89
import java.io.IOException;
910
import java.io.InputStream;
11+
import java.io.InputStreamReader;
1012
import java.io.PrintWriter;
13+
import java.io.UncheckedIOException;
14+
import java.net.URL;
1115
import java.nio.file.Files;
1216
import java.nio.file.StandardCopyOption;
1317
import java.util.List;
18+
import java.util.stream.Collectors;
1419

1520
/**
1621
* Represents some instrumentation that uses Gradle APIs and that is injected by gradle-profiler.
@@ -56,4 +61,20 @@ public static File unpackPlugin(String jarName) {
5661
throw UncheckedException.throwAsUncheckedException(e);
5762
}
5863
}
64+
65+
public static URL[] getClasspath(String classPathName) {
66+
List<String> classpathJars = readLines("/META-INF/classpath/" + classPathName + ".txt");
67+
return classpathJars.stream()
68+
.map(jar -> GradleInstrumentation.class.getResource("/META-INF/jars/" + jar))
69+
.toArray(URL[]::new);
70+
}
71+
72+
private static List<String> readLines(String resourcePath) {
73+
try (BufferedReader reader = new BufferedReader(new InputStreamReader(GradleInstrumentation.class.getResourceAsStream(resourcePath)))) {
74+
return reader.lines()
75+
.collect(Collectors.toList());
76+
} catch (IOException e) {
77+
throw new UncheckedIOException(e);
78+
}
79+
}
5980
}

src/main/java/org/gradle/profiler/studio/AndroidStudioSyncAction.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@
22

33
import org.gradle.profiler.BuildAction;
44
import org.gradle.profiler.GradleClient;
5+
import org.gradle.profiler.ide.RunIde;
6+
import org.gradle.profiler.instrument.GradleInstrumentation;
57
import org.gradle.profiler.result.BuildActionResult;
6-
import org.gradle.profiler.studio.StudioGradleClient;
78

9+
import java.net.MalformedURLException;
10+
import java.net.URL;
11+
import java.net.URLClassLoader;
12+
import java.util.Arrays;
813
import java.util.List;
14+
import java.util.ServiceLoader;
915

1016
/**
1117
* A mock-up of Android studio sync.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
plugins {
2+
id("profiler.embedded-library")
3+
id("profiler.publication")
4+
}
5+
6+
description = "Api for IDE provisioning capabilities for Gradle profiler"
7+
8+
9+
java {
10+
toolchain {
11+
languageVersion.set(JavaLanguageVersion.of(8))
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.gradle.profiler.ide;
2+
3+
public interface RunIde {
4+
void run();
5+
}

subprojects/ide-provisioning/build.gradle.kts

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,18 @@
11
plugins {
22
id("profiler.embedded-library")
3-
id("profiler.publication")
43
kotlin("jvm") version "1.9.22"
54
}
65

76
description = "IDE provisioning capabilities for Gradle profiler"
87

9-
repositories {
10-
maven { url = uri("https://www.jetbrains.com/intellij-repository/releases") }
11-
maven { url = uri("https://cache-redirector.jetbrains.com/intellij-dependencies") }
12-
}
13-
148
java {
159
toolchain {
1610
languageVersion.set(JavaLanguageVersion.of(17))
1711
}
1812
}
1913

2014
dependencies {
15+
implementation(project(":ide-provisioning-api"))
2116
implementation(libs.ideStarter) {
2217
exclude(group = "io.ktor")
2318
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.gradle.profiler.ide;
2+
3+
public class RunIdeImpl implements RunIde {
4+
@Override
5+
public void run() {
6+
System.out.println("Running IDE");
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
org.gradle.profiler.ide.RunIdeImpl

0 commit comments

Comments
 (0)