@ -16,8 +16,9 @@
@@ -16,8 +16,9 @@
package org.springframework.boot.gradle.plugin ;
import org.cyclonedx.gradle.CycloneDxPlugin ;
import org.cyclonedx.gradle.CycloneDxTask ;
import org.cyclonedx.gradle.CyclonedxAggregateTask ;
import org.cyclonedx.gradle.CyclonedxPlugin ;
import org.cyclonedx.model.Component ;
import org.gradle.api.Action ;
import org.gradle.api.Plugin ;
import org.gradle.api.Project ;
@ -34,78 +35,83 @@ import org.springframework.boot.gradle.tasks.bundling.BootJar;
@@ -34,78 +35,83 @@ import org.springframework.boot.gradle.tasks.bundling.BootJar;
import org.springframework.boot.gradle.tasks.bundling.BootWar ;
/ * *
* { @link Action } that is executed in response to the { @link CycloneD xPlugin } being
* { @link Action } that is executed in response to the { @link Cycloned xPlugin } being
* applied .
*
* @author Moritz Halbritter
* @author Andy Wilkinson
* /
final class CycloneD xPluginAction implements PluginApplicationAction {
final class Cycloned xPluginAction implements PluginApplicationAction {
@Override
public Class < ? extends Plugin < ? extends Project > > getPluginClass ( ) {
return CycloneD xPlugin . class ;
return Cycloned xPlugin . class ;
}
@Override
public void execute ( Project project ) {
TaskProvider < CycloneDx Task > cycloneDxTaskProvider = project . getTasks ( )
. named ( "cyclonedxBom" , CycloneDx Task . class ) ;
configureCycloneDxTask ( cycloneDxTaskProvider ) ;
TaskProvider < CyclonedxAggregate Task > cycloneDxTaskProvider = project . getTasks ( )
. named ( "cyclonedxBom" , CyclonedxAggregate Task . class ) ;
configureCycloneDxTask ( cycloneDxTaskProvider , project ) ;
configureJavaPlugin ( project , cycloneDxTaskProvider ) ;
configureSpringBootPlugin ( project , cycloneDxTaskProvider ) ;
}
private void configureCycloneDxTask ( TaskProvider < CycloneDx Task > taskProvider ) {
private void configureCycloneDxTask ( TaskProvider < CyclonedxAggregate Task > taskProvider , Project project ) {
taskProvider . configure ( ( task ) - > {
task . getProjectType ( ) . convention ( "application" ) ;
task . getOutputFormat ( ) . convention ( "json" ) ;
task . getOutputName ( ) . convention ( "application.cdx" ) ;
task . getProjectType ( ) . convention ( Component . Type . APPLICATION ) ;
task . getXmlOutput ( ) . unsetConvention ( ) ;
task . getJsonOutput ( )
. convention ( project . getLayout ( ) . getBuildDirectory ( ) . file ( "reports/cyclonedx/application.cdx.json" ) ) ;
task . getIncludeLicenseText ( ) . convention ( false ) ;
} ) ;
}
private void configureJavaPlugin ( Project project , TaskProvider < CycloneDx Task > cycloneDxTaskProvider ) {
private void configureJavaPlugin ( Project project , TaskProvider < CyclonedxAggregate Task > cycloneDxTaskProvider ) {
configurePlugin ( project , JavaPlugin . class , ( javaPlugin ) - > {
JavaPluginExtension javaPluginExtension = project . getExtensions ( ) . getByType ( JavaPluginExtension . class ) ;
SourceSet main = javaPluginExtension . getSourceSets ( ) . getByName ( SourceSet . MAIN_SOURCE_SET_NAME ) ;
configureTask ( project , main . getProcessResourcesTaskName ( ) , Copy . class , ( copy ) - > {
copy . dependsOn ( cycloneDxTaskProvider ) ;
Provider < String > sbomFileName = cycloneDxTaskProvider
. map ( ( cycloneDxTask ) - > cycloneDxTask . getOutputName ( ) . get ( ) + getSbomExtension ( cycloneDxTask ) ) ;
copy . from ( cycloneDxTaskProvider , ( spec ) - > spec . include ( sbomFileName . get ( ) ) . into ( "META-INF/sbom" ) ) ;
Provider < String > sbomFileName = cycloneDxTaskProvider . flatMap (
( cycloneDxTask ) - > cycloneDxTask . getJsonOutput ( ) . map ( ( file ) - > file . getAsFile ( ) . getName ( ) ) ) ;
copy . from ( cycloneDxTaskProvider ,
( spec ) - > spec . include ( ( element ) - > element . getName ( ) . equals ( sbomFileName . get ( ) ) )
. into ( "META-INF/sbom" ) ) ;
} ) ;
} ) ;
}
private void configureSpringBootPlugin ( Project project , TaskProvider < CycloneDxTask > cycloneDxTaskProvider ) {
private void configureSpringBootPlugin ( Project project ,
TaskProvider < CyclonedxAggregateTask > cycloneDxTaskProvider ) {
configurePlugin ( project , SpringBootPlugin . class , ( springBootPlugin ) - > {
configureBootJarTask ( project , cycloneDxTaskProvider ) ;
configureBootWarTask ( project , cycloneDxTaskProvider ) ;
} ) ;
}
private void configureBootJarTask ( Project project , TaskProvider < CycloneDx Task > cycloneDxTaskProvider ) {
private void configureBootJarTask ( Project project , TaskProvider < CyclonedxAggregate Task > cycloneDxTaskProvider ) {
configureTask ( project , SpringBootPlugin . BOOT_JAR_TASK_NAME , BootJar . class ,
( bootJar ) - > configureBootJarTask ( bootJar , cycloneDxTaskProvider ) ) ;
}
private void configureBootWarTask ( Project project , TaskProvider < CycloneDx Task > cycloneDxTaskProvider ) {
private void configureBootWarTask ( Project project , TaskProvider < CyclonedxAggregate Task > cycloneDxTaskProvider ) {
configureTask ( project , SpringBootPlugin . BOOT_WAR_TASK_NAME , BootWar . class ,
( bootWar ) - > configureBootWarTask ( bootWar , cycloneDxTaskProvider ) ) ;
}
private void configureBootJarTask ( BootJar task , TaskProvider < CycloneDx Task > cycloneDxTaskProvider ) {
private void configureBootJarTask ( BootJar task , TaskProvider < CyclonedxAggregate Task > cycloneDxTaskProvider ) {
configureJarTask ( task , cycloneDxTaskProvider , "" ) ;
}
private void configureBootWarTask ( BootWar task , TaskProvider < CycloneDx Task > cycloneDxTaskProvider ) {
private void configureBootWarTask ( BootWar task , TaskProvider < CyclonedxAggregate Task > cycloneDxTaskProvider ) {
configureJarTask ( task , cycloneDxTaskProvider , "WEB-INF/classes/" ) ;
}
private void configureJarTask ( Jar task , TaskProvider < CycloneDx Task > cycloneDxTaskProvider ,
private void configureJarTask ( Jar task , TaskProvider < CyclonedxAggregate Task > cycloneDxTaskProvider ,
String sbomLocationPrefix ) {
Provider < String > sbomFileName = cycloneDxTaskProvider . map ( ( cycloneDxTask ) - > "META-INF/sbom/"
+ cycloneDxTask . getOutputName ( ) . get ( ) + getSbomExtension ( cycloneDxTask ) ) ;
Provider < String > sbomFileName = cycloneDxTaskProvider
. map ( ( cycloneDxTask ) - > "META-INF/sbom/" + cycloneDxTask . getJson Output ( ) . get ( ) . getAsFile ( ) . getName ( ) ) ;
task . manifest ( ( manifest ) - > {
manifest . getAttributes ( ) . put ( "Sbom-Format" , "CycloneDX" ) ;
manifest . getAttributes ( )
@ -113,14 +119,6 @@ final class CycloneDxPluginAction implements PluginApplicationAction {
@@ -113,14 +119,6 @@ final class CycloneDxPluginAction implements PluginApplicationAction {
} ) ;
}
private String getSbomExtension ( CycloneDxTask task ) {
String format = task . getOutputFormat ( ) . get ( ) ;
if ( "all" . equals ( format ) ) {
return ".json" ;
}
return "." + format ;
}
private < T extends Task > void configureTask ( Project project , String name , Class < T > type , Action < T > action ) {
project . getTasks ( ) . withType ( type ) . configureEach ( ( task ) - > {
if ( task . getName ( ) . equals ( name ) ) {