21
21
import org .gradle .api .Action ;
22
22
import org .gradle .api .Plugin ;
23
23
import org .gradle .api .Project ;
24
+ import org .gradle .api .Task ;
25
+ import org .gradle .api .plugins .JavaPlugin ;
26
+ import org .gradle .api .plugins .JavaPluginExtension ;
27
+ import org .gradle .api .provider .Provider ;
28
+ import org .gradle .api .tasks .Copy ;
29
+ import org .gradle .api .tasks .SourceSet ;
24
30
import org .gradle .api .tasks .TaskProvider ;
31
+ import org .gradle .api .tasks .bundling .Jar ;
25
32
26
33
import org .springframework .boot .gradle .tasks .bundling .BootJar ;
34
+ import org .springframework .boot .gradle .tasks .bundling .BootWar ;
27
35
28
36
/**
29
37
* {@link Action} that is executed in response to the {@link CycloneDxPlugin} being
@@ -40,24 +48,69 @@ public Class<? extends Plugin<? extends Project>> getPluginClass() {
40
48
41
49
@ Override
42
50
public void execute (Project project ) {
43
- TaskProvider <CycloneDxTask > cyclonedxBom = project .getTasks ().named ("cyclonedxBom" , CycloneDxTask .class );
44
- cyclonedxBom .configure ((task ) -> {
51
+ TaskProvider <CycloneDxTask > cycloneDxTaskProvider = project .getTasks ()
52
+ .named ("cyclonedxBom" , CycloneDxTask .class );
53
+ configureCycloneDxTask (cycloneDxTaskProvider );
54
+ configureJavaPlugin (project , cycloneDxTaskProvider );
55
+ configureSpringBootPlugin (project , cycloneDxTaskProvider );
56
+ }
57
+
58
+ private void configureCycloneDxTask (TaskProvider <CycloneDxTask > taskProvider ) {
59
+ taskProvider .configure ((task ) -> {
45
60
task .getProjectType ().convention ("application" );
46
61
task .getOutputFormat ().convention ("json" );
47
62
task .getOutputName ().convention ("application.cdx" );
48
63
task .getIncludeLicenseText ().convention (false );
49
64
});
50
- project .getTasks ().named (SpringBootPlugin .BOOT_JAR_TASK_NAME , BootJar .class ).configure ((bootJar ) -> {
51
- CycloneDxTask cycloneDxTask = cyclonedxBom .get ();
52
- String sbomFileName = cycloneDxTask .getOutputName ().get () + getSbomExtension (cycloneDxTask );
53
- bootJar .from (cycloneDxTask , (spec ) -> spec .include (sbomFileName ).into ("META-INF/sbom" ));
54
- bootJar .manifest ((manifest ) -> {
55
- manifest .getAttributes ().put ("Sbom-Format" , "CycloneDX" );
56
- manifest .getAttributes ().put ("Sbom-Location" , "META-INF/sbom/" + sbomFileName );
65
+ }
66
+
67
+ private void configureJavaPlugin (Project project , TaskProvider <CycloneDxTask > cycloneDxTaskProvider ) {
68
+ configurePlugin (project , JavaPlugin .class , (javaPlugin ) -> {
69
+ JavaPluginExtension javaPluginExtension = project .getExtensions ().getByType (JavaPluginExtension .class );
70
+ SourceSet main = javaPluginExtension .getSourceSets ().getByName (SourceSet .MAIN_SOURCE_SET_NAME );
71
+ configureTask (project , main .getProcessResourcesTaskName (), Copy .class , (copy ) -> {
72
+ copy .dependsOn (cycloneDxTaskProvider );
73
+ Provider <String > sbomFileName = cycloneDxTaskProvider
74
+ .map ((cycloneDxTask ) -> cycloneDxTask .getOutputName ().get () + getSbomExtension (cycloneDxTask ));
75
+ copy .from (cycloneDxTaskProvider , (spec ) -> spec .include (sbomFileName .get ()).into ("META-INF/sbom" ));
57
76
});
58
77
});
59
78
}
60
79
80
+ private void configureSpringBootPlugin (Project project , TaskProvider <CycloneDxTask > cycloneDxTaskProvider ) {
81
+ configurePlugin (project , SpringBootPlugin .class , (springBootPlugin ) -> {
82
+ configureBootJarTask (project , cycloneDxTaskProvider );
83
+ configureBootWarTask (project , cycloneDxTaskProvider );
84
+ });
85
+ }
86
+
87
+ private void configureBootJarTask (Project project , TaskProvider <CycloneDxTask > cycloneDxTaskProvider ) {
88
+ configureTask (project , SpringBootPlugin .BOOT_JAR_TASK_NAME , BootJar .class ,
89
+ (bootJar ) -> configureBootJarTask (bootJar , cycloneDxTaskProvider ));
90
+ }
91
+
92
+ private void configureBootWarTask (Project project , TaskProvider <CycloneDxTask > cycloneDxTaskProvider ) {
93
+ configureTask (project , SpringBootPlugin .BOOT_WAR_TASK_NAME , BootWar .class ,
94
+ (bootWar ) -> configureBootWarTask (bootWar , cycloneDxTaskProvider ));
95
+ }
96
+
97
+ private void configureBootJarTask (BootJar task , TaskProvider <CycloneDxTask > cycloneDxTaskProvider ) {
98
+ configureJarTask (task , cycloneDxTaskProvider );
99
+ }
100
+
101
+ private void configureBootWarTask (BootWar task , TaskProvider <CycloneDxTask > cycloneDxTaskProvider ) {
102
+ configureJarTask (task , cycloneDxTaskProvider );
103
+ }
104
+
105
+ private void configureJarTask (Jar task , TaskProvider <CycloneDxTask > cycloneDxTaskProvider ) {
106
+ Provider <String > sbomFileName = cycloneDxTaskProvider .map ((cycloneDxTask ) -> "META-INF/sbom/"
107
+ + cycloneDxTask .getOutputName ().get () + getSbomExtension (cycloneDxTask ));
108
+ task .manifest ((manifest ) -> {
109
+ manifest .getAttributes ().put ("Sbom-Format" , "CycloneDX" );
110
+ manifest .getAttributes ().put ("Sbom-Location" , sbomFileName );
111
+ });
112
+ }
113
+
61
114
private String getSbomExtension (CycloneDxTask task ) {
62
115
String format = task .getOutputFormat ().get ();
63
116
if ("all" .equals (format )) {
@@ -66,4 +119,16 @@ private String getSbomExtension(CycloneDxTask task) {
66
119
return "." + format ;
67
120
}
68
121
122
+ private <T extends Task > void configureTask (Project project , String name , Class <T > type , Action <T > action ) {
123
+ project .getTasks ().withType (type ).configureEach ((task ) -> {
124
+ if (task .getName ().equals (name )) {
125
+ action .execute (task );
126
+ }
127
+ });
128
+ }
129
+
130
+ private <T extends Plugin <?>> void configurePlugin (Project project , Class <T > plugin , Action <T > action ) {
131
+ project .getPlugins ().withType (plugin , action );
132
+ }
133
+
69
134
}
0 commit comments