Skip to content

Commit 3c097f8

Browse files
committed
chore: Rework additional classpath and instrumenter classpath contributions to instrument plugin
1 parent 3094d50 commit 3c097f8

File tree

4 files changed

+68
-69
lines changed

4 files changed

+68
-69
lines changed

buildSrc/src/main/groovy/InstrumentPlugin.groovy

Lines changed: 34 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@ import org.gradle.api.Action
22
import org.gradle.api.Plugin
33
import org.gradle.api.Project
44
import org.gradle.api.file.ConfigurableFileCollection
5-
import org.gradle.api.file.Directory
65
import org.gradle.api.file.DirectoryProperty
76
import org.gradle.api.file.FileCollection
87
import org.gradle.api.invocation.BuildInvocationDetails
98
import org.gradle.api.logging.Logger
109
import org.gradle.api.logging.Logging
1110
import org.gradle.api.provider.ListProperty
1211
import org.gradle.api.provider.Property
13-
import org.gradle.api.provider.Provider
1412
import org.gradle.api.tasks.SourceSet
1513
import org.gradle.api.tasks.SourceSetContainer
1614
import org.gradle.api.tasks.compile.AbstractCompile
@@ -102,20 +100,21 @@ class InstrumentPlugin implements Plugin<Project> {
102100
javaVersion = javaVersion ?: DEFAULT_JAVA_VERSION // null not accepted
103101
it.inputs.property("javaVersion", javaVersion)
104102

105-
def plugins = extension.plugins
106-
it.inputs.property("plugins", plugins)
103+
it.inputs.property("plugins", extension.plugins)
107104

108-
def compileTaskClasspath = it.classpath
109-
def rawClassesDir = it.destinationDirectory
105+
it.inputs.files(extension.additionalClasspath)
110106

111-
def additionalClassPath = findAdditionalClassPath(extension)
112-
it.inputs.files(additionalClassPath)
107+
// Temporary location for raw (un-instrumented) classes
108+
DirectoryProperty tmpUninstrumentedClasses = project.objects.directoryProperty().value(
109+
project.layout.buildDirectory.dir("tmp/${it.name}-raw-classes")
110+
)
113111

114-
def instrumentingClassPath = project.objects.fileCollection()
112+
// Class path to use for instrumentation post-processing
113+
ConfigurableFileCollection instrumentingClassPath = project.objects.fileCollection()
115114
instrumentingClassPath.setFrom(
116-
compileTaskClasspath,
117-
rawClassesDir,
118-
additionalClassPath,
115+
it.classpath,
116+
extension.additionalClasspath,
117+
tmpUninstrumentedClasses
119118
)
120119

121120
// This were the post processing happens, i.e. were the instrumentation is applied
@@ -124,30 +123,22 @@ class InstrumentPlugin implements Plugin<Project> {
124123
project.objects.newInstance(
125124
InstrumentPostProcessingAction,
126125
javaVersion,
127-
plugins,
126+
extension.plugins,
128127
instrumentingClassPath,
129-
rawClassesDir,
128+
it.destinationDirectory,
129+
tmpUninstrumentedClasses
130130
)
131131
)
132132
logger.info("[InstrumentPlugin] Configured post-compile instrumentation for $compileTaskName for source-set $sourceSetName")
133133
}
134134
}
135135
}
136136
}
137-
138-
private static List<Provider<Directory>> findAdditionalClassPath(InstrumentExtension extension) {
139-
return extension.additionalClasspath.getOrDefault('instrumentJava', []).collect { dirProperty ->
140-
dirProperty.map {
141-
def fileName = it.asFile.name
142-
it.dir("../${fileName.replaceFirst('^main', 'raw')}") // TODO there's a hidden contract here
143-
}
144-
}
145-
}
146137
}
147138

148139
abstract class InstrumentExtension {
149140
abstract ListProperty<String> getPlugins()
150-
Map<String /* taskName */, List<DirectoryProperty>> additionalClasspath = [:]
141+
abstract ListProperty<DirectoryProperty> getAdditionalClasspath()
151142
}
152143

153144
abstract class InstrumentPostProcessingAction implements Action<AbstractCompile> {
@@ -165,22 +156,26 @@ abstract class InstrumentPostProcessingAction implements Action<AbstractCompile>
165156
@Inject
166157
abstract WorkerExecutor getWorkerExecutor()
167158

159+
// Those cannot be private other wise Groovy will fail at runtime with a missing property ex
168160
final String javaVersion
169161
final ListProperty<String> plugins
170162
final FileCollection instrumentingClassPath
171-
final DirectoryProperty rawClassesDirectory
163+
final DirectoryProperty compilerOutputDirectory
164+
final DirectoryProperty tmpDirectory
172165

173166
@Inject
174167
InstrumentPostProcessingAction(
175168
String javaVersion,
176169
ListProperty<String> plugins,
177170
FileCollection instrumentingClassPath,
178-
DirectoryProperty rawClassesDir
171+
DirectoryProperty compilerOutputDirectory,
172+
DirectoryProperty tmpDirectory
179173
) {
180174
this.javaVersion = javaVersion
181175
this.plugins = plugins
182176
this.instrumentingClassPath = instrumentingClassPath
183-
this.rawClassesDirectory = rawClassesDir
177+
this.compilerOutputDirectory = compilerOutputDirectory
178+
this.tmpDirectory = tmpDirectory
184179
}
185180

186181
@Override
@@ -190,7 +185,7 @@ abstract class InstrumentPostProcessingAction implements Action<AbstractCompile>
190185
" javaVersion=${javaVersion}, \n" +
191186
" plugins=${plugins.get()}, \n" +
192187
" instrumentingClassPath=${instrumentingClassPath.files}, \n" +
193-
" rawClassesDirectory=${rawClassesDirectory.get().asFile}"
188+
" rawClassesDirectory=${compilerOutputDirectory.get().asFile}"
194189
)
195190
def postCompileAction = this
196191
workQueue().submit(InstrumentAction.class, parameters -> {
@@ -201,8 +196,8 @@ abstract class InstrumentPostProcessingAction implements Action<AbstractCompile>
201196
)
202197
parameters.plugins.set(postCompileAction.plugins)
203198
parameters.instrumentingClassPath.setFrom(postCompileAction.instrumentingClassPath)
204-
parameters.classesDirectory.set(postCompileAction.rawClassesDirectory)
205-
parameters.tmpDirectory.set(project.layout.buildDirectory.dir("tmp/${task.name}-raw-classes"))
199+
parameters.compilerOutputDirectory.set(postCompileAction.compilerOutputDirectory)
200+
parameters.tmpDirectory.set(postCompileAction.tmpDirectory)
206201
})
207202
}
208203

@@ -227,7 +222,7 @@ interface InstrumentWorkParameters extends WorkParameters {
227222
ConfigurableFileCollection getPluginClassPath()
228223
ListProperty<String> getPlugins()
229224
ConfigurableFileCollection getInstrumentingClassPath()
230-
DirectoryProperty getClassesDirectory()
225+
DirectoryProperty getCompilerOutputDirectory()
231226
DirectoryProperty getTmpDirectory()
232227
}
233228

@@ -254,29 +249,29 @@ abstract class InstrumentAction implements WorkAction<InstrumentWorkParameters>
254249
}
255250
}
256251
}
257-
Path classesDirectory = parameters.classesDirectory.get().asFile.toPath()
258-
Path tmpSourceDir = parameters.tmpDirectory.get().asFile.toPath()
252+
Path classesDirectory = parameters.compilerOutputDirectory.get().asFile.toPath()
253+
Path tmpUninstrumentedDir = parameters.tmpDirectory.get().asFile.toPath()
259254

260-
// Delete tmpSourceDir contents recursively
261-
if (Files.exists(tmpSourceDir)) {
262-
Files.walk(tmpSourceDir)
255+
// Delete previous tmpSourceDir contents recursively
256+
if (Files.exists(tmpUninstrumentedDir)) {
257+
Files.walk(tmpUninstrumentedDir)
263258
.sorted(Comparator.reverseOrder())
264259
.forEach { p ->
265-
if (!p.equals(tmpSourceDir)) {
260+
if (!p.equals(tmpUninstrumentedDir)) {
266261
Files.deleteIfExists(p)
267262
}
268263
}
269264
}
270265

271266
Files.move(
272267
classesDirectory,
273-
tmpSourceDir,
268+
tmpUninstrumentedDir,
274269
StandardCopyOption.REPLACE_EXISTING,
275270
StandardCopyOption.ATOMIC_MOVE,
276271
)
277272

278273
ClassLoader instrumentingCL = createClassLoader(parameters.instrumentingClassPath, pluginCL)
279-
InstrumentingPlugin.instrumentClasses(plugins, instrumentingCL, tmpSourceDir.toFile(), classesDirectory.toFile())
274+
InstrumentingPlugin.instrumentClasses(plugins, instrumentingCL, tmpUninstrumentedDir.toFile(), classesDirectory.toFile())
280275
}
281276

282277
static ClassLoader createClassLoader(cp, parent = InstrumentAction.classLoader) {

dd-java-agent/instrumentation/jetty-9/build.gradle

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -85,26 +85,23 @@ jar {
8585
from sourceSets.main_jetty10.output
8686
}
8787

88-
List<DirectoryProperty> extraInstrumentJavaDirs = []
89-
['main_jetty904', 'main_jetty93', 'main_jetty9421', 'main_jetty10'].each {
90-
JavaCompile compileTask = tasks["compile${it.capitalize()}Java"]
91-
extraInstrumentJavaDirs << compileTask.destinationDirectory
92-
compileTask.dependsOn tasks['compileJava']
93-
project.afterEvaluate { p ->
94-
tasks["forbiddenApis${it.capitalize()}"].dependsOn("instrument${it.capitalize()}Java")
88+
['main_jetty904', 'main_jetty93', 'main_jetty9421', 'main_jetty10'].each { String sourceSet ->
89+
tasks.named("compile${sourceSet.capitalize()}Java", JavaCompile) {
90+
it.dependsOn tasks.named('compileJava')
91+
// the instrumenters are in main, but helpers/advice in possibly other sourceSets
92+
// The muzzle generator of references run as part of InstrumentJava needs access to
93+
// these extra classes. The task dependencies for instrumentJava are added above
94+
instrument.additionalClasspath.add(it.destinationDirectory)
9595
}
96-
}
9796

98-
instrument {
99-
// the instrumenters are in main, but helpers/advice in possibly other sourceSets
100-
// The muzzle generator of references run as part of InstrumentJava needs access to
101-
// these extra classes. The task dependencies for instrumentJava are added above
102-
additionalClasspath = [
103-
instrumentJava: extraInstrumentJavaDirs
104-
]
97+
project.afterEvaluate {
98+
tasks.named("forbiddenApis${sourceSet.capitalize()}") {
99+
it.dependsOn("compile${sourceSet.capitalize()}Java")
100+
}
101+
}
105102
}
106103

107-
tasks['compileMain_jetty10Java'].configure {
104+
tasks.named('compileMain_jetty10Java').configure {
108105
setJavaVersion(it, 11)
109106
}
110107

dd-java-agent/instrumentation/play-2.4/build.gradle

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ repositories {
4646
}
4747
}
4848

49-
tasks.withType(org.gradle.api.tasks.scala.ScalaCompile) {
49+
tasks.withType(ScalaCompile).configureEach {
5050
it.javaLauncher = getJavaLauncherFor(8)
5151
}
5252

@@ -60,14 +60,17 @@ sourceSets {
6060
jar {
6161
from sourceSets.main_play25.output
6262
}
63-
project.afterEvaluate { p ->
64-
// instrumentJava.dependsOn compileMain_play25Java // TODO remove
65-
forbiddenApisMain_play25.dependsOn compileMain_play25Java
63+
64+
project.afterEvaluate {
65+
tasks.named('forbiddenApisMain_play25') {
66+
dependsOn(tasks.named('compileMain_play25Java'))
67+
}
6668
}
69+
6770
instrument {
68-
additionalClasspath = [
69-
instrumentJava: compileMain_play25Java.destinationDirectory
70-
]
71+
additionalClasspath.add(
72+
tasks.named('compileMain_play25Java', AbstractCompile).map { it.destinationDirectory }
73+
)
7174
}
7275

7376
dependencies {

dd-java-agent/instrumentation/play-2.6/build.gradle

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,19 @@ sourceSets {
7575
jar {
7676
from sourceSets.main_play27.output
7777
}
78-
compileMain_play27Java.dependsOn compileJava
79-
project.afterEvaluate { p ->
80-
// instrumentJava.dependsOn compileMain_play27Java
81-
forbiddenApisMain_play27.dependsOn compileMain_play27Java
78+
tasks.named('compileMain_play27Java') {
79+
dependsOn(tasks.named('compileJava'))
8280
}
81+
project.afterEvaluate {
82+
tasks.named('forbiddenApisMain_play27') {
83+
dependsOn(tasks.named('compileMain_play27Java'))
84+
}
85+
}
86+
8387
instrument {
84-
additionalClasspath = [
85-
instrumentJava: compileMain_play27Java.destinationDirectory
86-
]
88+
additionalClasspath.add(
89+
tasks.named('compileMain_play27Java', AbstractCompile).map { it.destinationDirectory }
90+
)
8791
}
8892

8993
dependencies {

0 commit comments

Comments
 (0)