1111import java .util .Collection ;
1212import java .util .Collections ;
1313import java .util .List ;
14+ import java .util .Map ;
1415
1516import jakarta .persistence .PersistenceConfiguration ;
1617import org .checkerframework .checker .nullness .qual .NonNull ;
2021import org .hibernate .boot .jaxb .internal .MappingBinder ;
2122import org .hibernate .boot .jaxb .spi .Binding ;
2223import org .hibernate .boot .jaxb .spi .JaxbBindableMappingDescriptor ;
23- import org .hibernate .boot .scan .spi .ScanningResult ;
2424import org .hibernate .boot .settings .BootstrapSettingsResolver ;
2525import org .hibernate .boot .settings .ResolvedBootstrapSettings ;
2626import org .hibernate .internal .util .StringHelper ;
2727import org .hibernate .jpa .HibernatePersistenceConfiguration ;
2828import org .hibernate .jpa .boot .spi .PersistenceUnitDescriptor ;
29- import org .hibernate .models .spi .ModelsContext ;
3029import org .hibernate .models .spi .ClassDetails ;
3130
3231/// Model resources available to categorization.
@@ -77,6 +76,27 @@ public Collection<Binding<? extends JaxbBindableMappingDescriptor>> xmlMappings(
7776 public static AvailableResources from (
7877 PersistenceUnitDescriptor persistenceUnitDescriptor ,
7978 AvailableResourcesContext context ) {
79+ return from (
80+ persistenceUnitDescriptor ,
81+ context ,
82+ new BootstrapSettingsResolver ().resolve ( persistenceUnitDescriptor , Map .of () )
83+ );
84+ }
85+
86+ /// Creates available resources from Hibernate's descriptor for persistence-unit
87+ /// information.
88+ ///
89+ /// Managed class names are resolved through the supplied model context. Mapping
90+ /// file names are located through the bootstrap class-loading service and bound
91+ /// immediately when XML mappings are enabled.
92+ ///
93+ /// @param persistenceUnitDescriptor The persistence-unit wrapper
94+ /// @param context Context used to resolve model details and load resources
95+ /// @param bootstrapSettings Resolved bootstrap settings used during source collection
96+ public static AvailableResources from (
97+ PersistenceUnitDescriptor persistenceUnitDescriptor ,
98+ AvailableResourcesContext context ,
99+ ResolvedBootstrapSettings bootstrapSettings ) {
80100 var classLoading = context .getClassLoaderService ();
81101 var classDetailsRegistry = context .modelsContext ().getClassDetailsRegistry ();
82102
@@ -93,7 +113,8 @@ public static AvailableResources from(
93113 } );
94114
95115 final List <Binding <? extends JaxbBindableMappingDescriptor >> xmlBindings ;
96- if ( persistenceUnitDescriptor .getMappingFileNames ().isEmpty () ) {
116+ if ( !bootstrapSettings .mappingSettings ().xmlMappingEnabled ()
117+ || persistenceUnitDescriptor .getMappingFileNames ().isEmpty () ) {
97118 xmlBindings = Collections .emptyList ();
98119 }
99120 else {
@@ -119,9 +140,9 @@ public static AvailableResources from(
119140 /// Creates available resources from Hibernate's JPA
120141 /// {@link HibernatePersistenceConfiguration} extension.
121142 ///
122- /// Explicit managed classes and mapping files are included. Archive scanning is
123- /// applied here based on [HibernatePersistenceConfiguration#rootUrl()] and
124- /// [HibernatePersistenceConfiguration#jarFileUrls()].
143+ /// The configuration is first adapted to [BootstrapSourceContributions], which
144+ /// includes archive scanning based on [HibernatePersistenceConfiguration#rootUrl()]
145+ /// and [HibernatePersistenceConfiguration#jarFileUrls()].
125146 ///
126147 /// @param persistenceConfiguration The PersistenceConfiguration
127148 /// @param context Context used to resolve model details and load resources
@@ -138,9 +159,9 @@ public static AvailableResources from(
138159 /// Creates available resources from Hibernate's JPA
139160 /// {@link HibernatePersistenceConfiguration} extension.
140161 ///
141- /// Explicit managed classes and mapping files are included. Archive scanning is
142- /// applied here based on [HibernatePersistenceConfiguration#rootUrl()] and
143- /// [HibernatePersistenceConfiguration#jarFileUrls()].
162+ /// The configuration is first adapted to [BootstrapSourceContributions], which
163+ /// includes archive scanning based on [HibernatePersistenceConfiguration#rootUrl()]
164+ /// and [HibernatePersistenceConfiguration#jarFileUrls()].
144165 ///
145166 /// @param persistenceConfiguration The PersistenceConfiguration
146167 /// @param context Context used to resolve model details and load resources
@@ -149,45 +170,75 @@ public static AvailableResources from(
149170 HibernatePersistenceConfiguration persistenceConfiguration ,
150171 AvailableResourcesContext context ,
151172 ResolvedBootstrapSettings bootstrapSettings ) {
173+ return from (
174+ BootstrapSourceContributions .from (
175+ persistenceConfiguration ,
176+ bootstrapSettings ,
177+ context .getClassLoaderService ()
178+ ),
179+ context ,
180+ bootstrapSettings
181+ );
182+ }
183+
184+ /// Creates available resources from neutral bootstrap source contributions.
185+ ///
186+ /// Explicit and discovered managed classes, package metadata, and mapping files
187+ /// are included. Source discovery, including archive scanning, is expected to
188+ /// have already happened before these contributions are consumed.
189+ ///
190+ /// @param sourceContributions Source declarations from a bootstrap entry point
191+ /// @param context Context used to resolve model details and load resources
192+ /// @param bootstrapSettings Resolved bootstrap settings used during source collection
193+ public static AvailableResources from (
194+ BootstrapSourceContributions sourceContributions ,
195+ AvailableResourcesContext context ,
196+ ResolvedBootstrapSettings bootstrapSettings ) {
152197 final var classLoading = context .getClassLoaderService ();
153198 final var classDetailsRegistry = context .modelsContext ().getClassDetailsRegistry ();
154199 final var mappingFileBinder = context .createMappingBinder ();
155200
156201 var managedClassDetails = new ArrayList <ClassDetails >();
157202 var packageDetailsList = new ArrayList <ClassDetails >();
158- persistenceConfiguration .managedClasses ().forEach ( (managedClass ) -> {
203+ sourceContributions .managedClasses ().forEach ( (managedClass ) -> {
159204 applyClassDetails (
160205 classDetailsRegistry .resolveClassDetails ( managedClass .getName () ),
161206 managedClassDetails ,
162207 packageDetailsList
163208 );
164209 } );
165-
166- final ScanningResult scanningResult = HibernatePersistenceConfigurationScanner .performScanning (
167- persistenceConfiguration ,
168- bootstrapSettings ,
169- classLoading
170- );
171- applyDiscoveredClassDetails (
172- scanningResult ,
173- context .modelsContext (),
174- managedClassDetails ,
175- packageDetailsList
176- );
210+ sourceContributions .managedClassNames ().forEach ( (managedClassName ) -> {
211+ applyClassDetails (
212+ classDetailsRegistry .resolveClassDetails ( managedClassName ),
213+ managedClassDetails ,
214+ packageDetailsList
215+ );
216+ } );
217+ sourceContributions .packageNames ().forEach ( (packageName ) -> {
218+ applyClassDetails (
219+ classDetailsRegistry .resolveClassDetails ( packageName + ".package-info" ),
220+ managedClassDetails ,
221+ packageDetailsList
222+ );
223+ } );
177224
178225 final var xmlBindings = new ArrayList <Binding <? extends JaxbBindableMappingDescriptor >>();
179- persistenceConfiguration .mappingFiles ().forEach ( (mappingFile ) -> {
180- try (var mappingFileStream = classLoading .locateResourceStream ( mappingFile )) {
181- xmlBindings .add ( mappingFileBinder .bind (
182- mappingFileStream ,
183- new Origin ( SourceType .RESOURCE , mappingFile )
184- ) );
185- }
186- catch (IOException e ) {
187- throw new RuntimeException ( "Error accessing mapping file - " + mappingFile , e );
188- }
189- } );
190- applyDiscoveredXmlMappings ( scanningResult , mappingFileBinder , xmlBindings );
226+ if ( bootstrapSettings .mappingSettings ().xmlMappingEnabled () ) {
227+ sourceContributions .mappingFiles ().forEach ( (mappingFile ) -> {
228+ try (var mappingFileStream = classLoading .locateResourceStream ( mappingFile )) {
229+ xmlBindings .add ( mappingFileBinder .bind (
230+ mappingFileStream ,
231+ new Origin ( SourceType .RESOURCE , mappingFile )
232+ ) );
233+ }
234+ catch (IOException e ) {
235+ throw new RuntimeException ( "Error accessing mapping file - " + mappingFile , e );
236+ }
237+ } );
238+ sourceContributions .mappingFileUris ().forEach ( (mappingFileUri ) -> {
239+ xmlBindings .add ( bindMappingFile ( mappingFileUri , mappingFileBinder ) );
240+ } );
241+ }
191242
192243 return new AvailableResources ( managedClassDetails , packageDetailsList , xmlBindings );
193244 }
@@ -302,37 +353,6 @@ else if ( classDetails.getClassName().endsWith( "package-info" ) ) {
302353 }
303354 }
304355
305- private static void applyDiscoveredClassDetails (
306- ScanningResult scanningResult ,
307- ModelsContext modelsContext ,
308- Collection <ClassDetails > managedClassDetails ,
309- Collection <ClassDetails > packageDetailsList ) {
310- var classDetailsRegistry = modelsContext .getClassDetailsRegistry ();
311- scanningResult .discoveredClasses ().forEach ( (className ) -> {
312- applyClassDetails (
313- classDetailsRegistry .resolveClassDetails ( className ),
314- managedClassDetails ,
315- packageDetailsList
316- );
317- } );
318- scanningResult .discoveredPackages ().forEach ( (packageName ) -> {
319- applyClassDetails (
320- classDetailsRegistry .resolveClassDetails ( packageName + ".package-info" ),
321- managedClassDetails ,
322- packageDetailsList
323- );
324- } );
325- }
326-
327- private static void applyDiscoveredXmlMappings (
328- ScanningResult scanningResult ,
329- MappingBinder mappingFileBinder ,
330- Collection <Binding <? extends JaxbBindableMappingDescriptor >> xmlBindings ) {
331- scanningResult .mappingFiles ().forEach ( (mappingFile ) -> {
332- xmlBindings .add ( bindMappingFile ( mappingFile , mappingFileBinder ) );
333- } );
334- }
335-
336356 private static Binding <? extends JaxbBindableMappingDescriptor > bindMappingFile (
337357 URI mappingFile ,
338358 MappingBinder mappingFileBinder ) {
0 commit comments