11package org .hibernate .reactive .env ;
22
3- import 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 ;
9-
103import org .gradle .api .Plugin ;
4+ import org .gradle .api .artifacts .VersionCatalog ;
5+ import org .gradle .api .artifacts .VersionCatalogsExtension ;
6+ import org .gradle .api .provider .Provider ;
117import org .gradle .api .Project ;
128
139/**
1410 * Build plugin which applies some DSL extensions to the Project. Currently, these
1511 * extensions are all related to version.
1612 *
1713 * @author Steve Ebersole
14+ * @author Rey Acosta (Kingg22)
1815 */
1916public class VersionsPlugin implements Plugin <Project > {
2017 public static final String VERSION_FILE = "versionFile" ;
@@ -28,137 +25,144 @@ public class VersionsPlugin implements Plugin<Project> {
2825 public static final String SKIP_ORM_VERSION_PARSING = "skipOrmVersionParsing" ;
2926
3027 public static final String RELATIVE_FILE = "gradle/version.properties" ;
31- public static final String RELATIVE_CATALOG = "gradle/libs.versions.toml" ;
32-
33- @ Override
34- public void apply (Project project ) {
35- final File versionFile = project .getRootProject ().file ( RELATIVE_FILE );
36- project .getExtensions ().add ( VERSION_FILE , versionFile );
37-
38- final ProjectVersion releaseVersion = determineReleaseVersion ( project );
39- final ProjectVersion developmentVersion = determineDevelopmentVersion ( project );
40- final ProjectVersion projectVersion = determineProjectVersion ( project , releaseVersion , versionFile );
41-
42- project .getLogger ().lifecycle ( "Project version: {} ({})" , projectVersion .getFullName (), projectVersion .getFamily () );
43- project .getExtensions ().add ( PROJECT_VERSION , projectVersion );
44-
45- if ( releaseVersion != null ) {
46- project .getLogger ().lifecycle ( "Release version: {} ({})" , releaseVersion .getFullName (), releaseVersion .getFamily () );
47- project .getExtensions ().add ( RELEASE_VERSION , releaseVersion );
48- }
49- else {
50- project .getLogger ().lifecycle ( "Release version: n/a" );
51- }
52-
53- if ( developmentVersion != null ) {
54- project .getLogger ().lifecycle ( "Development version: {} ({})" , developmentVersion .getFullName (), developmentVersion .getFamily () );
55- project .getExtensions ().add ( DEVELOPMENT_VERSION , developmentVersion );
56- }
57- else {
58- project .getLogger ().lifecycle ( "Development version: n/a" );
59- }
60-
61- final VersionsTomlParser tomlParser = new VersionsTomlParser ( project .getRootProject ().file ( RELATIVE_CATALOG ) );
62- final String ormVersionString = determineOrmVersion ( project , tomlParser );
63- final Object ormVersion = resolveOrmVersion ( ormVersionString , project );
64- project .getLogger ().lifecycle ( "ORM version: {}" , ormVersion );
65- project .getExtensions ().add ( ORM_VERSION , ormVersion );
66-
67- final Object ormPluginVersion = determineOrmPluginVersion ( ormVersion , project , tomlParser );
68- project .getLogger ().lifecycle ( "ORM Gradle plugin version: {}" , ormPluginVersion );
69- project .getExtensions ().add ( ORM_PLUGIN_VERSION , ormPluginVersion );
70- }
71-
72- private ProjectVersion determineReleaseVersion (Project project ) {
73- if ( project .hasProperty ( RELEASE_VERSION ) ) {
74- final Object version = project .property ( RELEASE_VERSION );
75- if ( version != null ) {
76- return new ProjectVersion ( (String ) version );
77- }
78- }
79- return null ;
80- }
81-
82- private ProjectVersion determineDevelopmentVersion (Project project ) {
83- if ( project .hasProperty ( DEVELOPMENT_VERSION ) ) {
84- final Object version = project .property ( DEVELOPMENT_VERSION );
85- if ( version != null ) {
86- return new ProjectVersion ( (String ) version );
87- }
88- }
89- return null ;
90- }
91-
92- public static ProjectVersion determineProjectVersion (Project project , ProjectVersion releaseVersion , File versionFile ) {
93- if ( releaseVersion != null ) {
94- return releaseVersion ;
95- }
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" );
104- }
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" );
117- }
118-
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- }
127-
128- private String determineOrmVersion (Project project , VersionsTomlParser parser ) {
129- // Check if it has been set in the project
130- if ( project .hasProperty ( ORM_VERSION ) ) {
131- return (String ) project .property ( ORM_VERSION );
132- }
133-
134- // Check in the catalog
135- final String version = parser .read ( ORM_VERSION );
136- if ( version != null ) {
137- return version ;
138- }
139- throw new IllegalStateException ( "Hibernate ORM version not specified on project" );
140- }
141-
142- private Object resolveOrmVersion (String stringForm , Project project ) {
143- if ( project .hasProperty ( SKIP_ORM_VERSION_PARSING )
144- && Boolean .parseBoolean ( (String ) project .property ( SKIP_ORM_VERSION_PARSING ) ) ) {
145- return stringForm ;
146- }
147- return new ProjectVersion ( stringForm );
148- }
149-
150- private Object determineOrmPluginVersion (Object ormVersion , Project project , VersionsTomlParser parser ) {
151- // Check if it has been set in the project
152- if ( project .hasProperty ( ORM_PLUGIN_VERSION ) ) {
153- return project .property ( ORM_PLUGIN_VERSION );
154- }
155-
156- // Check in the catalog
157- final String version = parser .read ( ORM_PLUGIN_VERSION );
158- if ( version != null ) {
159- return version ;
160- }
161-
162- throw new IllegalStateException ( "Hibernate ORM Gradle plugin version not specified on project" );
163- }
28+
29+ @ Override
30+ public void apply (Project project ) {
31+ final var log = project .getLogger ();
32+
33+ // Expose the version file as an extension
34+ final var versionFile = project .getRootProject ().file ( RELATIVE_FILE );
35+ project .getExtensions ().add ( VERSION_FILE , versionFile );
36+
37+ // 1) release/development via -P if they come
38+ final var releaseVersion = determineReleaseVersion (project );
39+ final var developmentVersion = determineDevelopmentVersion (project );
40+
41+ // 2) read projectVersion from version.properties using ValueSource (cacheable)
42+ final var projectVersionString = project .getProviders ().of (
43+ VersionPropertiesSource .class , spec -> {
44+ final var rf = project .getLayout ()
45+ .getProjectDirectory ()
46+ .file ( RELATIVE_FILE );
47+ spec .getParameters ().getFile ().set (rf );
48+ }
49+ );
50+
51+ final var projectVersion = determineProjectVersion (
52+ project , releaseVersion , projectVersionString
53+ );
54+
55+ log .lifecycle ( "Project version: {} ({})" , projectVersion .getFullName (), projectVersion .getFamily () );
56+ project .getExtensions ().add ( PROJECT_VERSION , projectVersion );
57+
58+ if ( releaseVersion != null ) {
59+ log .lifecycle ( "Release version: {} ({})" , releaseVersion .getFullName (), releaseVersion .getFamily () );
60+ project .getExtensions ().add ( RELEASE_VERSION , releaseVersion );
61+ } else {
62+ log .lifecycle ( "Release version: n/a" );
63+ }
64+
65+ if ( developmentVersion != null ) {
66+ log .lifecycle ( "Development version: {} ({})" , developmentVersion .getFullName (), developmentVersion .getFamily () );
67+ project .getExtensions ().add ( DEVELOPMENT_VERSION , developmentVersion );
68+ } else {
69+ log .lifecycle ( "Development version: n/a" );
70+ }
71+
72+ // 3) Version Catalog ("libs") See local-build-plugins/settings.gradle
73+ final var catalogs = project .getExtensions ().getByType ( VersionCatalogsExtension .class );
74+ final var libs = catalogs .named ( "libs" );
75+
76+ final var ormVersionString = determineOrmVersion (project , libs );
77+ final var ormVersion = resolveOrmVersion (ormVersionString , project );
78+ log .lifecycle ( "ORM version: {}" , ormVersion );
79+ project .getExtensions ().add ( ORM_VERSION , ormVersion );
80+
81+ final var ormPluginVersion = determineOrmPluginVersion (ormVersion , project , libs );
82+ log .lifecycle ( "ORM Gradle plugin version: {}" , ormPluginVersion );
83+ project .getExtensions ().add ( ORM_PLUGIN_VERSION , ormPluginVersion );
84+ }
85+
86+ // --- Release / Development (with -P) --------------------------------------
87+ private ProjectVersion determineReleaseVersion (final Project project ) {
88+ if ( project .hasProperty ( RELEASE_VERSION ) ) {
89+ final var version = project .property ( RELEASE_VERSION );
90+ if ( version != null ) {
91+ return new ProjectVersion ((String ) version );
92+ }
93+ }
94+ return null ;
95+ }
96+
97+ private ProjectVersion determineDevelopmentVersion (final Project project ) {
98+ if ( project .hasProperty ( DEVELOPMENT_VERSION ) ) {
99+ final var version = project .property ( DEVELOPMENT_VERSION );
100+ if ( version != null ) {
101+ return new ProjectVersion ((String ) version );
102+ }
103+ }
104+ return null ;
105+ }
106+
107+ // --- Project version (ValueSource for configuration cache) ---------------
108+
109+ public static ProjectVersion determineProjectVersion (
110+ Project project ,
111+ ProjectVersion releaseVersion ,
112+ Provider <String > projectVersionString
113+ ) {
114+ if ( releaseVersion != null ) {
115+ return releaseVersion ;
116+ }
117+ // Si no hay release explícito, usamos el valor del archivo (vía ValueSource)
118+ final var fullName = projectVersionString .get ();
119+ if ( fullName .isEmpty () ) {
120+ final var file = project .getRootProject ().file (RELATIVE_FILE );
121+ throw new RuntimeException ( "Property 'projectVersion' is missing in " + file .getAbsolutePath () );
122+ }
123+ return new ProjectVersion (fullName );
124+ }
125+
126+ // --- ORM version from -P or catalogs ------------------------------------
127+
128+ private String determineOrmVersion (final Project project , final VersionCatalog libs ) {
129+ // -PhibernateOrmVersion have priority
130+ if ( project .hasProperty ( ORM_VERSION ) ) {
131+ return (String ) project .property ( ORM_VERSION );
132+ }
133+ // Find in Version Catalog
134+ final var vc = libs .findVersion ( ORM_VERSION );
135+ if ( vc .isPresent () ) {
136+ final var required = vc .get ().getRequiredVersion ();
137+ if ( !required .isEmpty () ) {
138+ return required ;
139+ }
140+ }
141+ throw new IllegalStateException ("Hibernate ORM version not specified on project" );
142+ }
143+
144+ private Object resolveOrmVersion (final String stringForm , final Project project ) {
145+ if ( project .hasProperty ( SKIP_ORM_VERSION_PARSING ) &&
146+ Boolean .parseBoolean ((String ) project .property ( SKIP_ORM_VERSION_PARSING ) )
147+ ) {
148+ return stringForm ;
149+ }
150+ return new ProjectVersion (stringForm );
151+ }
152+
153+ private Object determineOrmPluginVersion (final Object ormVersion , final Project project , final VersionCatalog libs ) {
154+ // -PhibernateOrmGradlePluginVersion have priority
155+ if ( project .hasProperty ( ORM_PLUGIN_VERSION ) ) {
156+ return project .property ( ORM_PLUGIN_VERSION );
157+ }
158+ // Find in Version Catalog
159+ final var vc = libs .findVersion ( ORM_PLUGIN_VERSION );
160+ if ( vc .isPresent () ) {
161+ final var required = vc .get ().getRequiredVersion ();
162+ if ( !required .isEmpty () ) {
163+ return required ;
164+ }
165+ }
166+ throw new IllegalStateException ("Hibernate ORM Gradle plugin version not specified on project" );
167+ }
164168}
0 commit comments