11package org .hibernate .reactive .env ;
22
33import java .io .File ;
4- import java .io .FileInputStream ;
5- import java .io .IOException ;
6- import java .io .InputStream ;
7- import java .util .Properties ;
8- import java .util .function .Consumer ;
4+ import java .util .Optional ;
95
106import org .gradle .api .Plugin ;
117import org .gradle .api .Project ;
8+ import org .gradle .api .artifacts .VersionCatalog ;
9+ import org .gradle .api .artifacts .VersionCatalogsExtension ;
10+ import org .gradle .api .artifacts .VersionConstraint ;
11+ import org .gradle .api .logging .Logger ;
12+ import org .gradle .api .provider .Provider ;
1213
1314/**
1415 * Build plugin which applies some DSL extensions to the Project. Currently, these
@@ -28,47 +29,71 @@ public class VersionsPlugin implements Plugin<Project> {
2829 public static final String SKIP_ORM_VERSION_PARSING = "skipOrmVersionParsing" ;
2930
3031 public static final String RELATIVE_FILE = "gradle/version.properties" ;
31- public static final String RELATIVE_CATALOG = "gradle/libs.versions.toml" ;
3232
3333 @ Override
3434 public void apply (Project project ) {
35+ final Logger log = project .getLogger ();
36+
37+ // Expose the version file as an extension
3538 final File versionFile = project .getRootProject ().file ( RELATIVE_FILE );
3639 project .getExtensions ().add ( VERSION_FILE , versionFile );
3740
41+ // 1) release/development via -P if they come
3842 final ProjectVersion releaseVersion = determineReleaseVersion ( project );
3943 final ProjectVersion developmentVersion = determineDevelopmentVersion ( project );
40- final ProjectVersion projectVersion = determineProjectVersion ( project , releaseVersion , versionFile );
4144
42- project .getLogger ().lifecycle ( "Project version: {} ({})" , projectVersion .getFullName (), projectVersion .getFamily () );
45+ // 2) read projectVersion from version.properties using ValueSource (cacheable)
46+ final var projectVersionString = project .getProviders ().of (
47+ VersionPropertiesSource .class , spec -> {
48+ final var rf = project .getLayout ()
49+ .getProjectDirectory ()
50+ .file ( RELATIVE_FILE );
51+ spec .getParameters ().getFile ().set ( rf );
52+ }
53+ );
54+
55+ final ProjectVersion projectVersion = determineProjectVersion (
56+ project , releaseVersion , projectVersionString
57+ );
58+
59+ log .lifecycle ( "Project version: {} ({})" , projectVersion .getFullName (), projectVersion .getFamily () );
4360 project .getExtensions ().add ( PROJECT_VERSION , projectVersion );
4461
4562 if ( releaseVersion != null ) {
46- project . getLogger () .lifecycle ( "Release version: {} ({})" , releaseVersion .getFullName (), releaseVersion .getFamily () );
63+ log .lifecycle ( "Release version: {} ({})" , releaseVersion .getFullName (), releaseVersion .getFamily () );
4764 project .getExtensions ().add ( RELEASE_VERSION , releaseVersion );
4865 }
4966 else {
50- project . getLogger () .lifecycle ( "Release version: n/a" );
67+ log .lifecycle ( "Release version: n/a" );
5168 }
5269
5370 if ( developmentVersion != null ) {
54- project .getLogger ().lifecycle ( "Development version: {} ({})" , developmentVersion .getFullName (), developmentVersion .getFamily () );
71+ log .lifecycle (
72+ "Development version: {} ({})" ,
73+ developmentVersion .getFullName (),
74+ developmentVersion .getFamily ()
75+ );
5576 project .getExtensions ().add ( DEVELOPMENT_VERSION , developmentVersion );
5677 }
5778 else {
58- project . getLogger () .lifecycle ( "Development version: n/a" );
79+ log .lifecycle ( "Development version: n/a" );
5980 }
6081
61- final VersionsTomlParser tomlParser = new VersionsTomlParser ( project .getRootProject ().file ( RELATIVE_CATALOG ) );
62- final String ormVersionString = determineOrmVersion ( project , tomlParser );
82+ // 3) Version Catalog ("libs") See local-build-plugins/settings.gradle
83+ final VersionCatalogsExtension catalogs = project .getExtensions ().getByType ( VersionCatalogsExtension .class );
84+ final VersionCatalog libs = catalogs .named ( "libs" );
85+
86+ final String ormVersionString = determineOrmVersion ( project , libs );
6387 final Object ormVersion = resolveOrmVersion ( ormVersionString , project );
64- project . getLogger () .lifecycle ( "ORM version: {}" , ormVersion );
88+ log .lifecycle ( "ORM version: {}" , ormVersion );
6589 project .getExtensions ().add ( ORM_VERSION , ormVersion );
6690
67- final Object ormPluginVersion = determineOrmPluginVersion ( ormVersion , project , tomlParser );
68- project . getLogger () .lifecycle ( "ORM Gradle plugin version: {}" , ormPluginVersion );
91+ final Object ormPluginVersion = determineOrmPluginVersion ( ormVersion , project , libs );
92+ log .lifecycle ( "ORM Gradle plugin version: {}" , ormPluginVersion );
6993 project .getExtensions ().add ( ORM_PLUGIN_VERSION , ormPluginVersion );
7094 }
7195
96+ // --- Release / Development (with -P) --------------------------------------
7297 private ProjectVersion determineReleaseVersion (Project project ) {
7398 if ( project .hasProperty ( RELEASE_VERSION ) ) {
7499 final Object version = project .property ( RELEASE_VERSION );
@@ -89,74 +114,66 @@ private ProjectVersion determineDevelopmentVersion(Project project) {
89114 return null ;
90115 }
91116
92- public static ProjectVersion determineProjectVersion (Project project , ProjectVersion releaseVersion , File versionFile ) {
117+ // --- Project version (ValueSource for configuration cache) ---------------
118+
119+ public static ProjectVersion determineProjectVersion (
120+ Project project ,
121+ ProjectVersion releaseVersion ,
122+ Provider <String > projectVersionString
123+ ) {
93124 if ( releaseVersion != null ) {
94125 return releaseVersion ;
95126 }
96-
97- final String fullName = readVersionProperties ( versionFile );
98- return new ProjectVersion ( fullName );
99- }
100-
101- private static String readVersionProperties (File file ) {
102- if ( !file .exists () ) {
103- throw new RuntimeException ( "Version file " + file .getAbsolutePath () + " does not exists" );
127+ // if don't have an explicit release, use value of file (with ValueSource)
128+ final String fullName = projectVersionString .get ();
129+ if ( fullName .isEmpty () ) {
130+ final var file = project .getRootProject ().file ( RELATIVE_FILE );
131+ throw new RuntimeException ( "Property 'projectVersion' is missing in " + file .getAbsolutePath () );
104132 }
105-
106- final Properties versionProperties = new Properties ();
107- withInputStream ( file , (stream ) -> {
108- try {
109- versionProperties .load ( stream );
110- }
111- catch (IOException e ) {
112- throw new RuntimeException ( "Unable to load properties from file - " + file .getAbsolutePath (), e );
113- }
114- } );
115-
116- return versionProperties .getProperty ( "projectVersion" );
133+ return new ProjectVersion ( fullName );
117134 }
118135
119- private static void withInputStream (File file , Consumer <InputStream > action ) {
120- try ( final FileInputStream stream = new FileInputStream ( file ) ) {
121- action .accept ( stream );
122- }
123- catch (IOException e ) {
124- throw new RuntimeException ( "Error reading file stream = " + file .getAbsolutePath (), e );
125- }
126- }
136+ // --- ORM version from -P or catalogs ------------------------------------
127137
128- private String determineOrmVersion (Project project , VersionsTomlParser parser ) {
138+ private String determineOrmVersion (Project project , VersionCatalog libs ) {
129139 // Check if it has been set in the project
140+ // -PhibernateOrmVersion have priority
130141 if ( project .hasProperty ( ORM_VERSION ) ) {
131142 return (String ) project .property ( ORM_VERSION );
132143 }
133-
134- // Check in the catalog
135- final String version = parser .read ( ORM_VERSION );
136- if ( version != null ) {
137- return version ;
144+ // Find in Version Catalog
145+ final Optional <VersionConstraint > vc = libs .findVersion ( ORM_VERSION );
146+ if ( vc .isPresent () ) {
147+ final String required = vc .get ().getRequiredVersion ();
148+ if ( !required .isEmpty () ) {
149+ return required ;
150+ }
138151 }
139152 throw new IllegalStateException ( "Hibernate ORM version not specified on project" );
140153 }
141154
142155 private Object resolveOrmVersion (String stringForm , Project project ) {
143156 if ( project .hasProperty ( SKIP_ORM_VERSION_PARSING )
144- && Boolean .parseBoolean ( (String ) project .property ( SKIP_ORM_VERSION_PARSING ) ) ) {
157+ && Boolean .parseBoolean ( (String ) project .property ( SKIP_ORM_VERSION_PARSING ) )
158+ ) {
145159 return stringForm ;
146160 }
147161 return new ProjectVersion ( stringForm );
148162 }
149163
150- private Object determineOrmPluginVersion (Object ormVersion , Project project , VersionsTomlParser parser ) {
164+ private Object determineOrmPluginVersion (Object ormVersion , Project project , VersionCatalog libs ) {
151165 // Check if it has been set in the project
166+ // -PhibernateOrmGradlePluginVersion have priority
152167 if ( project .hasProperty ( ORM_PLUGIN_VERSION ) ) {
153168 return project .property ( ORM_PLUGIN_VERSION );
154169 }
155-
156- // Check in the catalog
157- final String version = parser .read ( ORM_PLUGIN_VERSION );
158- if ( version != null ) {
159- return version ;
170+ // Find in Version Catalog
171+ final Optional <VersionConstraint > vc = libs .findVersion ( ORM_PLUGIN_VERSION );
172+ if ( vc .isPresent () ) {
173+ final String required = vc .get ().getRequiredVersion ();
174+ if ( !required .isEmpty () ) {
175+ return required ;
176+ }
160177 }
161178
162179 throw new IllegalStateException ( "Hibernate ORM Gradle plugin version not specified on project" );
0 commit comments