1
1
package org .hibernate .reactive .env ;
2
2
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
-
10
3
import 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 ;
11
7
import org .gradle .api .Project ;
12
8
13
9
/**
14
10
* Build plugin which applies some DSL extensions to the Project. Currently, these
15
11
* extensions are all related to version.
16
12
*
17
13
* @author Steve Ebersole
14
+ * @author Rey Acosta (Kingg22)
18
15
*/
19
16
public class VersionsPlugin implements Plugin <Project > {
20
17
public static final String VERSION_FILE = "versionFile" ;
@@ -28,137 +25,144 @@ public class VersionsPlugin implements Plugin<Project> {
28
25
public static final String SKIP_ORM_VERSION_PARSING = "skipOrmVersionParsing" ;
29
26
30
27
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
+ }
164
168
}
0 commit comments