1
1
package org .hibernate .reactive .env ;
2
2
3
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 ;
4
+ import java .util .Optional ;
9
5
10
6
import org .gradle .api .Plugin ;
11
7
import 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 ;
12
13
13
14
/**
14
15
* Build plugin which applies some DSL extensions to the Project. Currently, these
@@ -28,47 +29,71 @@ public class VersionsPlugin implements Plugin<Project> {
28
29
public static final String SKIP_ORM_VERSION_PARSING = "skipOrmVersionParsing" ;
29
30
30
31
public static final String RELATIVE_FILE = "gradle/version.properties" ;
31
- public static final String RELATIVE_CATALOG = "gradle/libs.versions.toml" ;
32
32
33
33
@ Override
34
34
public void apply (Project project ) {
35
+ final Logger log = project .getLogger ();
36
+
37
+ // Expose the version file as an extension
35
38
final File versionFile = project .getRootProject ().file ( RELATIVE_FILE );
36
39
project .getExtensions ().add ( VERSION_FILE , versionFile );
37
40
41
+ // 1) release/development via -P if they come
38
42
final ProjectVersion releaseVersion = determineReleaseVersion ( project );
39
43
final ProjectVersion developmentVersion = determineDevelopmentVersion ( project );
40
- final ProjectVersion projectVersion = determineProjectVersion ( project , releaseVersion , versionFile );
41
44
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 () );
43
60
project .getExtensions ().add ( PROJECT_VERSION , projectVersion );
44
61
45
62
if ( releaseVersion != null ) {
46
- project . getLogger () .lifecycle ( "Release version: {} ({})" , releaseVersion .getFullName (), releaseVersion .getFamily () );
63
+ log .lifecycle ( "Release version: {} ({})" , releaseVersion .getFullName (), releaseVersion .getFamily () );
47
64
project .getExtensions ().add ( RELEASE_VERSION , releaseVersion );
48
65
}
49
66
else {
50
- project . getLogger () .lifecycle ( "Release version: n/a" );
67
+ log .lifecycle ( "Release version: n/a" );
51
68
}
52
69
53
70
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
+ );
55
76
project .getExtensions ().add ( DEVELOPMENT_VERSION , developmentVersion );
56
77
}
57
78
else {
58
- project . getLogger () .lifecycle ( "Development version: n/a" );
79
+ log .lifecycle ( "Development version: n/a" );
59
80
}
60
81
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 );
63
87
final Object ormVersion = resolveOrmVersion ( ormVersionString , project );
64
- project . getLogger () .lifecycle ( "ORM version: {}" , ormVersion );
88
+ log .lifecycle ( "ORM version: {}" , ormVersion );
65
89
project .getExtensions ().add ( ORM_VERSION , ormVersion );
66
90
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 );
69
93
project .getExtensions ().add ( ORM_PLUGIN_VERSION , ormPluginVersion );
70
94
}
71
95
96
+ // --- Release / Development (with -P) --------------------------------------
72
97
private ProjectVersion determineReleaseVersion (Project project ) {
73
98
if ( project .hasProperty ( RELEASE_VERSION ) ) {
74
99
final Object version = project .property ( RELEASE_VERSION );
@@ -89,74 +114,66 @@ private ProjectVersion determineDevelopmentVersion(Project project) {
89
114
return null ;
90
115
}
91
116
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
+ ) {
93
124
if ( releaseVersion != null ) {
94
125
return releaseVersion ;
95
126
}
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 () );
104
132
}
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 );
117
134
}
118
135
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 ------------------------------------
127
137
128
- private String determineOrmVersion (Project project , VersionsTomlParser parser ) {
138
+ private String determineOrmVersion (Project project , VersionCatalog libs ) {
129
139
// Check if it has been set in the project
140
+ // -PhibernateOrmVersion have priority
130
141
if ( project .hasProperty ( ORM_VERSION ) ) {
131
142
return (String ) project .property ( ORM_VERSION );
132
143
}
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
+ }
138
151
}
139
152
throw new IllegalStateException ( "Hibernate ORM version not specified on project" );
140
153
}
141
154
142
155
private Object resolveOrmVersion (String stringForm , Project project ) {
143
156
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
+ ) {
145
159
return stringForm ;
146
160
}
147
161
return new ProjectVersion ( stringForm );
148
162
}
149
163
150
- private Object determineOrmPluginVersion (Object ormVersion , Project project , VersionsTomlParser parser ) {
164
+ private Object determineOrmPluginVersion (Object ormVersion , Project project , VersionCatalog libs ) {
151
165
// Check if it has been set in the project
166
+ // -PhibernateOrmGradlePluginVersion have priority
152
167
if ( project .hasProperty ( ORM_PLUGIN_VERSION ) ) {
153
168
return project .property ( ORM_PLUGIN_VERSION );
154
169
}
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
+ }
160
177
}
161
178
162
179
throw new IllegalStateException ( "Hibernate ORM Gradle plugin version not specified on project" );
0 commit comments