Skip to content

Commit 7a808c8

Browse files
committed
chore: Properly react on instrumentPluginClasspath configuration
1 parent 88ce011 commit 7a808c8

File tree

3 files changed

+46
-37
lines changed

3 files changed

+46
-37
lines changed

buildSrc/src/main/groovy/InstrumentPlugin.groovy

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.gradle.api.Project
44
import org.gradle.api.file.ConfigurableFileCollection
55
import org.gradle.api.file.Directory
66
import org.gradle.api.file.DirectoryProperty
7+
import org.gradle.api.file.FileCollection
78
import org.gradle.api.invocation.BuildInvocationDetails
89
import org.gradle.api.logging.Logger
910
import org.gradle.api.logging.Logging
@@ -32,16 +33,17 @@ import java.util.regex.Matcher
3233
@SuppressWarnings('unused')
3334
class InstrumentPlugin implements Plugin<Project> {
3435
public static final String DEFAULT_JAVA_VERSION = 'default'
36+
public static final String INSTRUMENT_PLUGIN_CLASSPATH_CONFIGURATION = 'instrumentPluginClasspath'
3537
private final Logger logger = Logging.getLogger(InstrumentPlugin)
3638

3739
@Override
3840
void apply(Project project) {
3941
InstrumentExtension extension = project.extensions.create('instrument', InstrumentExtension)
4042

41-
project.pluginManager.withPlugin("java") {configurePostCompilationInstrumentation("java", project, extension) }
42-
project.pluginManager.withPlugin("kotlin") {configurePostCompilationInstrumentation("kotlin", project, extension) }
43-
project.pluginManager.withPlugin("scala") {configurePostCompilationInstrumentation("scala", project, extension) }
44-
project.pluginManager.withPlugin("groovy") {configurePostCompilationInstrumentation("groovy", project, extension) }
43+
project.pluginManager.withPlugin("java") { configurePostCompilationInstrumentation("java", project, extension) }
44+
project.pluginManager.withPlugin("kotlin") { configurePostCompilationInstrumentation("kotlin", project, extension) }
45+
project.pluginManager.withPlugin("scala") { configurePostCompilationInstrumentation("scala", project, extension) }
46+
project.pluginManager.withPlugin("groovy") { configurePostCompilationInstrumentation("groovy", project, extension) }
4547
}
4648

4749
private void configurePostCompilationInstrumentation(String language, Project project, InstrumentExtension extension) {
@@ -50,15 +52,15 @@ class InstrumentPlugin implements Plugin<Project> {
5052
sourceSets.configureEach { SourceSet sourceSet ->
5153
def sourceSetName = sourceSet.name
5254
logger.info("[InstrumentPlugin] source-set: $sourceSetName, language: $language")
53-
55+
5456
if (!sourceSetName.startsWith(SourceSet.MAIN_SOURCE_SET_NAME)) {
5557
logger.debug("[InstrumentPlugin] Skipping non-main source set {} for language {}", sourceSetName, language)
5658
return
5759
}
5860

5961
def compileTaskName = sourceSet.getCompileTaskName(language)
6062
logger.info("[InstrumentPlugin] compile task name: " + compileTaskName)
61-
63+
6264
// For each compile task, append an instrumenting post-processing step
6365
// Examples of compile tasks:
6466
// - compileJava,
@@ -68,9 +70,22 @@ class InstrumentPlugin implements Plugin<Project> {
6870
// - compileKotlin,
6971
// - compileScala,
7072
// - compileGroovy,
71-
project.tasks.named(compileTaskName, AbstractCompile) {
73+
def compileTasks = project.tasks.withType(AbstractCompile).matching {
74+
it.name == compileTaskName && !it.source.isEmpty()
75+
}
76+
77+
project.configurations.whenObjectAdded { pluginConfig ->
78+
if (pluginConfig.name == INSTRUMENT_PLUGIN_CLASSPATH_CONFIGURATION) {
79+
logger.info('[InstrumentPlugin] instrumentPluginClasspath configuration was created')
80+
compileTasks.configureEach {
81+
it.inputs.files(pluginConfig)
82+
}
83+
}
84+
}
85+
86+
compileTasks.configureEach {
7287
if (it.source.isEmpty()) {
73-
logger.info("[InstrumentPlugin] Skipping $compileTaskName for source set $sourceSetName as it has no source files")
88+
logger.debug("[InstrumentPlugin] Skipping $compileTaskName for source set $sourceSetName as it has no source files")
7489
return
7590
}
7691

@@ -90,17 +105,10 @@ class InstrumentPlugin implements Plugin<Project> {
90105
def plugins = extension.plugins
91106
it.inputs.property("plugins", plugins)
92107

93-
def pluginClassPath = project.objects.fileCollection()
94-
def instrumentConfiguration = project.configurations.findByName('instrumentPluginClasspath')
95-
if (instrumentConfiguration != null) {
96-
pluginClassPath.from(instrumentConfiguration)
97-
it.inputs.files(pluginClassPath)
98-
}
99-
100108
def compileTaskClasspath = it.classpath
101109
def rawClassesDir = it.destinationDirectory
102110

103-
def additionalClassPath = findAdditionalClassPath(extension, it.name)
111+
def additionalClassPath = findAdditionalClassPath(extension)
104112
it.inputs.files(additionalClassPath)
105113

106114
def instrumentingClassPath = project.objects.fileCollection()
@@ -117,7 +125,6 @@ class InstrumentPlugin implements Plugin<Project> {
117125
InstrumentPostProcessingAction,
118126
javaVersion,
119127
plugins,
120-
pluginClassPath,
121128
instrumentingClassPath,
122129
rawClassesDir,
123130
)
@@ -128,11 +135,11 @@ class InstrumentPlugin implements Plugin<Project> {
128135
}
129136
}
130137

131-
private static List<Provider<Directory>> findAdditionalClassPath(InstrumentExtension extension, String taskName) {
132-
return extension.additionalClasspath.getOrDefault(taskName, []).collect { dirProperty ->
138+
private static List<Provider<Directory>> findAdditionalClassPath(InstrumentExtension extension) {
139+
return extension.additionalClasspath.getOrDefault('instrumentJava', []).collect { dirProperty ->
133140
dirProperty.map {
134141
def fileName = it.asFile.name
135-
it.dir("../${fileName.replaceFirst('^main', 'raw')}")
142+
it.dir("../${fileName.replaceFirst('^main', 'raw')}") // TODO there's a hidden contract here
136143
}
137144
}
138145
}
@@ -148,48 +155,50 @@ abstract class InstrumentPostProcessingAction implements Action<AbstractCompile>
148155

149156
@Inject
150157
abstract Project getProject()
158+
151159
@Inject
152160
abstract JavaToolchainService getJavaToolchainService()
161+
153162
@Inject
154163
abstract BuildInvocationDetails getInvocationDetails()
164+
155165
@Inject
156166
abstract WorkerExecutor getWorkerExecutor()
157167

158168
final String javaVersion
159169
final ListProperty<String> plugins
160-
final ConfigurableFileCollection pluginClassPath
161-
final ConfigurableFileCollection instrumentingClassPath
170+
final FileCollection instrumentingClassPath
162171
final DirectoryProperty rawClassesDirectory
163172

164173
@Inject
165174
InstrumentPostProcessingAction(
166175
String javaVersion,
167176
ListProperty<String> plugins,
168-
ConfigurableFileCollection pluginClassPath,
169-
ConfigurableFileCollection instrumentingClassPath,
177+
FileCollection instrumentingClassPath,
170178
DirectoryProperty rawClassesDir
171179
) {
172180
this.javaVersion = javaVersion
173181
this.plugins = plugins
174-
this.pluginClassPath = pluginClassPath
175182
this.instrumentingClassPath = instrumentingClassPath
176183
this.rawClassesDirectory = rawClassesDir
177184
}
178185

179186
@Override
180187
void execute(AbstractCompile task) {
181188
logger.info(
182-
"values: " +
183-
"javaVersion=${javaVersion}, " +
184-
"plugins=${plugins.get()}, " +
185-
"pluginClassPath=${pluginClassPath.files}, " +
186-
"instrumentingClassPath=${instrumentingClassPath.files}, " +
187-
"rawClassesDirectory=${rawClassesDirectory.get().asFile}"
189+
"[InstrumentPostProcessingAction] About to instrument classes \n" +
190+
" javaVersion=${javaVersion}, \n" +
191+
" plugins=${plugins.get()}, \n" +
192+
" instrumentingClassPath=${instrumentingClassPath.files}, \n" +
193+
" rawClassesDirectory=${rawClassesDirectory.get().asFile}"
188194
)
189195
def postCompileAction = this
190196
workQueue().submit(InstrumentAction.class, parameters -> {
191197
parameters.buildStartedTime.set(invocationDetails.buildStartedTime)
192-
parameters.pluginClassPath.from(postCompileAction.pluginClassPath)
198+
parameters.pluginClassPath.from(
199+
project.configurations.findByName(InstrumentPlugin.INSTRUMENT_PLUGIN_CLASSPATH_CONFIGURATION)
200+
?: project.files()
201+
)
193202
parameters.plugins.set(postCompileAction.plugins)
194203
parameters.instrumentingClassPath.setFrom(postCompileAction.instrumentingClassPath)
195204
parameters.classesDirectory.set(postCompileAction.rawClassesDirectory)
@@ -249,12 +258,12 @@ abstract class InstrumentAction implements WorkAction<InstrumentWorkParameters>
249258
Path tmpSourceDir = parameters.tmpDirectory.get().asFile.toPath()
250259

251260
// Delete tmpSourceDir contents recursively
252-
if (tmpSourceDir.exists()) {
261+
if (Files.exists(tmpSourceDir)) {
253262
Files.walk(tmpSourceDir)
254263
.sorted(Comparator.reverseOrder())
255264
.forEach { p ->
256265
if (!p.equals(tmpSourceDir)) {
257-
java.nio.file.Files.deleteIfExists(p)
266+
Files.deleteIfExists(p)
258267
}
259268
}
260269
}
@@ -267,7 +276,7 @@ abstract class InstrumentAction implements WorkAction<InstrumentWorkParameters>
267276
)
268277

269278
ClassLoader instrumentingCL = createClassLoader(parameters.instrumentingClassPath, pluginCL)
270-
InstrumentingPlugin.instrumentClasses(plugins, instrumentingCL, tmpSourceDir, classesDirectory)
279+
InstrumentingPlugin.instrumentClasses(plugins, instrumentingCL, tmpSourceDir.toFile(), classesDirectory.toFile())
271280
}
272281

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

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ jar {
6161
from sourceSets.main_play25.output
6262
}
6363
project.afterEvaluate { p ->
64-
// instrumentJava.dependsOn compileMain_play25Java // TODO remove
64+
// instrumentJava.dependsOn compileMain_play25Java // TODO remove
6565
forbiddenApisMain_play25.dependsOn compileMain_play25Java
6666
}
6767
instrument {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ jar {
7777
}
7878
compileMain_play27Java.dependsOn compileJava
7979
project.afterEvaluate { p ->
80-
// instrumentJava.dependsOn compileMain_play27Java
80+
// instrumentJava.dependsOn compileMain_play27Java
8181
forbiddenApisMain_play27.dependsOn compileMain_play27Java
8282
}
8383
instrument {

0 commit comments

Comments
 (0)