From 88f0d8b53a60ef099ea0e194ba8709b05b4731e7 Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Thu, 7 Aug 2025 10:31:43 -0500 Subject: [PATCH] HHH-19692 - Drop org.hibernate.boot.jaxb.spi.XmlSource --- .../org/hibernate/boot/MetadataSources.java | 74 +++++---- .../jaxb/internal/CacheableFileXmlSource.java | 150 ++++++++++-------- .../boot/jaxb/internal/FileXmlSource.java | 43 +++-- .../internal/InputStreamAccessXmlSource.java | 49 ++++-- .../jaxb/internal/InputStreamXmlSource.java | 63 +++++--- .../jaxb/internal/JarFileEntryXmlSource.java | 75 ++++++--- .../jaxb/internal/JaxpSourceXmlSource.java | 29 ---- .../boot/jaxb/internal/UrlXmlSource.java | 74 +++++++-- .../boot/jaxb/internal/XmlSources.java | 147 ----------------- .../spi/JaxbBindableMappingDescriptor.java | 4 +- .../hibernate/boot/jaxb/spi/XmlSource.java | 30 ---- .../process/internal/ScanningCoordinator.java | 32 ++-- .../boot/spi/XmlMappingBinderAccess.java | 76 ++++----- .../xml/ejb3/PreParsedOrmXmlTest.java | 3 +- .../scanning/ScanningCoordinatorTest.java | 4 + 15 files changed, 394 insertions(+), 459 deletions(-) delete mode 100644 hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/JaxpSourceXmlSource.java delete mode 100644 hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/XmlSources.java delete mode 100644 hibernate-core/src/main/java/org/hibernate/boot/jaxb/spi/XmlSource.java diff --git a/hibernate-core/src/main/java/org/hibernate/boot/MetadataSources.java b/hibernate-core/src/main/java/org/hibernate/boot/MetadataSources.java index 48a6b5187487..4879626636a5 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/MetadataSources.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/MetadataSources.java @@ -4,27 +4,20 @@ */ package org.hibernate.boot; -import java.io.File; -import java.io.InputStream; -import java.io.Serializable; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; - import org.hibernate.HibernateException; import org.hibernate.Internal; import org.hibernate.boot.archive.spi.InputStreamAccess; import org.hibernate.boot.internal.MetadataBuilderImpl; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmHibernateMapping; -import org.hibernate.boot.jaxb.internal.XmlSources; +import org.hibernate.boot.jaxb.internal.CacheableFileXmlSource; +import org.hibernate.boot.jaxb.internal.FileXmlSource; +import org.hibernate.boot.jaxb.internal.InputStreamAccessXmlSource; +import org.hibernate.boot.jaxb.internal.InputStreamXmlSource; +import org.hibernate.boot.jaxb.internal.JarFileEntryXmlSource; +import org.hibernate.boot.jaxb.internal.UrlXmlSource; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.jaxb.spi.Binding; import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; -import org.hibernate.boot.jaxb.spi.XmlSource; import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistry; @@ -36,6 +29,17 @@ import org.hibernate.service.ServiceRegistry; import org.hibernate.type.SerializationException; +import java.io.File; +import java.io.InputStream; +import java.io.Serializable; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + import static java.util.Collections.addAll; import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; @@ -358,9 +362,8 @@ public MetadataSources addPackage(Package packageRef) { * @return this (for method chaining purposes) */ public MetadataSources addResource(String name) { - final XmlSource xmlSource = XmlSources.fromResource( name, classLoaderService ); final XmlMappingBinderAccess binderAccess = getXmlMappingBinderAccess(); - addXmlBinding( xmlSource.doBind( binderAccess.getMappingBinder() ) ); + addXmlBinding( UrlXmlSource.fromResource( name, classLoaderService, binderAccess.getMappingBinder() ) ); return this; } @@ -388,9 +391,8 @@ public MetadataSources addFile(String path) { * @return this (for method chaining purposes) */ public MetadataSources addFile(File file) { - final XmlSource xmlSource = XmlSources.fromFile( file ); final XmlMappingBinderAccess binderAccess = getXmlMappingBinderAccess(); - addXmlBinding( xmlSource.doBind( binderAccess.getMappingBinder() ) ); + addXmlBinding( FileXmlSource.fromFile( file, binderAccess.getMappingBinder() ) ); return this; } @@ -510,9 +512,13 @@ public MetadataSources addCacheableFile(File file) { * @return this (for method chaining purposes) */ public MetadataSources addCacheableFile(File file, File cacheDirectory) { - final XmlSource xmlSource = XmlSources.fromCacheableFile( file, cacheDirectory ); final XmlMappingBinderAccess binderAccess = getXmlMappingBinderAccess(); - addXmlBinding( xmlSource.doBind( binderAccess.getMappingBinder() ) ); + addXmlBinding( CacheableFileXmlSource.fromCacheableFile( + file, + cacheDirectory, + false, + binderAccess.getMappingBinder() + ) ); return this; } @@ -530,9 +536,13 @@ public MetadataSources addCacheableFile(File file, File cacheDirectory) { * @throws MappingNotFoundException Indicates that the cached file was not found or was not usable. */ public MetadataSources addCacheableFileStrictly(File file) throws SerializationException { - final XmlSource xmlSource = XmlSources.fromCacheableFile( file, true ); final XmlMappingBinderAccess binderAccess = getXmlMappingBinderAccess(); - addXmlBinding( xmlSource.doBind( binderAccess.getMappingBinder() ) ); + addXmlBinding( CacheableFileXmlSource.fromCacheableFile( + file, + null, + true, + binderAccess.getMappingBinder() + ) ); return this; } @@ -550,9 +560,13 @@ public MetadataSources addCacheableFileStrictly(File file) throws SerializationE * @throws MappingNotFoundException Indicates that the cached file was not found or was not usable. */ public MetadataSources addCacheableFileStrictly(File file, File cacheDir) throws SerializationException { - final XmlSource xmlSource = XmlSources.fromCacheableFile( file, cacheDir, true ); final XmlMappingBinderAccess binderAccess = getXmlMappingBinderAccess(); - addXmlBinding( xmlSource.doBind( binderAccess.getMappingBinder() ) ); + addXmlBinding( CacheableFileXmlSource.fromCacheableFile( + file, + cacheDir, + true, + binderAccess.getMappingBinder() + ) ); return this; } @@ -564,9 +578,8 @@ public MetadataSources addCacheableFileStrictly(File file, File cacheDir) throws * @return this (for method chaining purposes) */ public MetadataSources addInputStream(InputStreamAccess xmlInputStreamAccess) { - final XmlSource xmlSource = XmlSources.fromStream( xmlInputStreamAccess ); final XmlMappingBinderAccess binderAccess = getXmlMappingBinderAccess(); - addXmlBinding( xmlSource.doBind( binderAccess.getMappingBinder() ) ); + addXmlBinding( InputStreamAccessXmlSource.fromStreamAccess( xmlInputStreamAccess, binderAccess.getMappingBinder() ) ); return this; } @@ -578,9 +591,8 @@ public MetadataSources addInputStream(InputStreamAccess xmlInputStreamAccess) { * @return this (for method chaining purposes) */ public MetadataSources addInputStream(InputStream xmlInputStream) { - final XmlSource xmlSource = XmlSources.fromStream( xmlInputStream ); final XmlMappingBinderAccess binderAccess = getXmlMappingBinderAccess(); - addXmlBinding( xmlSource.doBind( binderAccess.getMappingBinder() ) ); + addXmlBinding( InputStreamXmlSource.fromStream( xmlInputStream, binderAccess.getMappingBinder() ) ); return this; } @@ -592,9 +604,8 @@ public MetadataSources addInputStream(InputStream xmlInputStream) { * @return this (for method chaining purposes) */ public MetadataSources addURL(URL url) { - final XmlSource xmlSource = XmlSources.fromUrl( url ); final XmlMappingBinderAccess binderAccess = getXmlMappingBinderAccess(); - addXmlBinding( xmlSource.doBind( binderAccess.getMappingBinder() ) ); + addXmlBinding( UrlXmlSource.fromUrl( url, binderAccess.getMappingBinder() ) ); return this; } @@ -610,10 +621,7 @@ public MetadataSources addURL(URL url) { */ public MetadataSources addJar(File jar) { final XmlMappingBinderAccess binderAccess = getXmlMappingBinderAccess(); - XmlSources.fromJar( - jar, - xmlSource -> addXmlBinding( xmlSource.doBind( binderAccess.getMappingBinder() ) ) - ); + JarFileEntryXmlSource.fromJar( jar, binderAccess.getMappingBinder(), this::addXmlBinding ); return this; } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/CacheableFileXmlSource.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/CacheableFileXmlSource.java index 0cfa4a06d2e6..15109c4cb83b 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/CacheableFileXmlSource.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/CacheableFileXmlSource.java @@ -4,85 +4,74 @@ */ package org.hibernate.boot.jaxb.internal; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.Serializable; - import org.hibernate.boot.MappingException; import org.hibernate.boot.jaxb.Origin; import org.hibernate.boot.jaxb.SourceType; -import org.hibernate.boot.jaxb.spi.Binder; import org.hibernate.boot.jaxb.spi.Binding; -import org.hibernate.boot.jaxb.spi.XmlSource; +import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.util.SerializationHelper; import org.hibernate.type.SerializationException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; + /** + * Support for creating a mapping {@linkplain Binding binding} from "cached" XML files. + *

+ * This is a legacy feature, caching a serialized form of the {@linkplain JaxbBindableMappingDescriptor JAXB model} + * into a file for later use. While not deprecated per se, its use is discouraged. + * + * @see MappingBinder + * * @author Steve Ebersole */ -public class CacheableFileXmlSource extends XmlSource { +public class CacheableFileXmlSource { private static final CoreMessageLogger log = CoreLogging.messageLogger( CacheableFileXmlSource.class ); - private final File xmlFile; - private final File serFile; - private final boolean strict; - - public CacheableFileXmlSource(Origin origin, File xmlFile, File cachedFileDir, boolean strict) { - super( origin ); - this.xmlFile = xmlFile; - this.strict = strict; - - this.serFile = new File( cachedFileDir, xmlFile.getName() + ".bin" ); - - if ( strict ) { - if ( !serFile.exists() ) { - throw new MappingException( - String.format( "Cached file [%s] could not be found", origin.getName() ), - origin - ); - } - if ( isSerfileObsolete() ) { - throw new MappingException( - String.format( "Cached file [%s] could not be used as the mapping file is newer", origin.getName() ), - origin - ); - } - } + public static Binding fromCacheableFile( + File xmlFile, + File serLocation, + boolean strict, + MappingBinder binder) { + final Origin origin = new Origin( SourceType.FILE, xmlFile.getAbsolutePath() ); + return fromCacheableFile( xmlFile, serLocation, origin, strict, binder ); } - public static File determineCachedFile(File xmlFile) { - return new File( xmlFile.getAbsolutePath() + ".bin" ); - } + public static Binding fromCacheableFile( + File xmlFile, + File serLocation, + Origin origin, + boolean strict, + MappingBinder binder) { + final File serFile = resolveSerFile( xmlFile, serLocation ); - @Override - public Binding doBind(Binder binder) { if ( strict ) { try { - return new Binding<>( readSerFile(), getOrigin() ); + return new Binding<>( readSerFile( serFile ), origin ); } catch ( SerializationException e ) { throw new MappingException( - String.format( "Unable to deserialize from cached file [%s]", getOrigin().getName() ) , + String.format( "Unable to deserialize from cached file [%s]", origin.getName() ) , e, - getOrigin() + origin ); } catch ( FileNotFoundException e ) { throw new MappingException( - String.format( "Unable to locate cached file [%s]", getOrigin().getName() ) , + String.format( "Unable to locate cached file [%s]", origin.getName() ) , e, - getOrigin() + origin ); } } else { - if ( !isSerfileObsolete() ) { + if ( !isSerfileObsolete( xmlFile, serFile ) ) { try { - return new Binding<>( readSerFile(), getOrigin() ); + return new Binding<>( readSerFile( serFile ), origin ); } catch ( SerializationException e ) { log.unableToDeserializeCache( serFile.getName(), e ); @@ -96,32 +85,59 @@ public Binding doBind(Binder binder) { } log.readingMappingsFromFile( xmlFile.getPath() ); - final Binding binding = FileXmlSource.doBind( binder, xmlFile, getOrigin() ); + final Binding binding = FileXmlSource.fromFile( xmlFile, binder ); - writeSerFile( binding ); + writeSerFile( binding.getRoot(), xmlFile, serFile ); return binding; } } - private T readSerFile() throws SerializationException, FileNotFoundException { - log.readingCachedMappings( serFile ); - return SerializationHelper.deserialize( new FileInputStream( serFile ) ); + /** + * Determine the ser file for a given mapping XML file. + * + * @param xmlFile The source mapping XML file + * @param serLocation The location details about the ser file. Can be one of 3 things:

+ * + * @return The ser file reference. + */ + public static File resolveSerFile(File xmlFile, File serLocation) { + if ( serLocation == null ) { + return determineCachedFile( xmlFile ); + } + if ( serLocation.isDirectory() ) { + return determineCachedFile( xmlFile, serLocation ); + } + assert serLocation.isFile(); + return serLocation; } - private void writeSerFile(Object binding) { - writeSerFile( (Serializable) binding, xmlFile, serFile ); + public static File determineCachedFile(File xmlFile) { + return new File( xmlFile.getAbsolutePath() + ".bin" ); } - private static void writeSerFile(Serializable binding, File xmlFile, File serFile) { - if ( binding instanceof Binding bindingWrapper ) { - binding = (Serializable) bindingWrapper.getRoot(); - } + public static File determineCachedFile(File xmlFile, File serDirectory) { + return new File( serDirectory, xmlFile.getName() + ".bin" ); + } + + private static T readSerFile(File serFile) throws SerializationException, FileNotFoundException { + log.readingCachedMappings( serFile ); + return SerializationHelper.deserialize( new FileInputStream( serFile ) ); + } + + private static void writeSerFile( + T jaxbModel, + File xmlFile, + File serFile) { try ( FileOutputStream fos = new FileOutputStream( serFile ) ) { if ( log.isTraceEnabled() ) { log.tracef( "Writing cache file for: %s to: %s", xmlFile.getAbsolutePath(), serFile.getAbsolutePath() ); } - SerializationHelper.serialize( binding, fos ); + SerializationHelper.serialize( jaxbModel, fos ); boolean success = serFile.setLastModified( System.currentTimeMillis() ); if ( !success ) { log.warn( "Could not update cacheable hbm.xml bin file timestamp" ); @@ -132,21 +148,19 @@ private static void writeSerFile(Serializable binding, File xmlFile, File serFil } } - public static void createSerFile(File xmlFile, Binder binder) { + public static void createSerFile(File xmlFile, MappingBinder binder) { createSerFile( xmlFile, determineCachedFile( xmlFile ), binder ); } - public static void createSerFile(File xmlFile, File outputFile, Binder binder) { - final Origin origin = new Origin( SourceType.FILE, xmlFile.getAbsolutePath() ); - writeSerFile( - FileXmlSource.doBind( binder, xmlFile, origin ), - xmlFile, - outputFile - ); + public static void createSerFile(File xmlFile, File outputFile, MappingBinder binder) { + final Binding binding = FileXmlSource.fromFile( xmlFile, binder ); + writeSerFile( binding.getRoot(), xmlFile, outputFile ); } - private boolean isSerfileObsolete() { - return xmlFile.exists() && serFile.exists() && xmlFile.lastModified() > serFile.lastModified(); + public static boolean isSerfileObsolete(File xmlFile, File serFile) { + return xmlFile.exists() + && serFile.exists() + && xmlFile.lastModified() > serFile.lastModified(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/FileXmlSource.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/FileXmlSource.java index 90a04a9ffb66..2a4fc09328c5 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/FileXmlSource.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/FileXmlSource.java @@ -4,33 +4,41 @@ */ package org.hibernate.boot.jaxb.internal; +import org.hibernate.boot.MappingNotFoundException; +import org.hibernate.boot.jaxb.Origin; +import org.hibernate.boot.jaxb.SourceType; +import org.hibernate.boot.jaxb.spi.Binding; +import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; -import org.hibernate.boot.MappingNotFoundException; -import org.hibernate.boot.jaxb.Origin; -import org.hibernate.boot.jaxb.spi.Binder; -import org.hibernate.boot.jaxb.spi.Binding; -import org.hibernate.boot.jaxb.spi.XmlSource; +import static org.hibernate.boot.jaxb.JaxbLogger.JAXB_LOGGER; /** + * Support for processing mapping XML from a {@linkplain File} reference. + * + * @see MappingBinder + * * @author Steve Ebersole */ -public class FileXmlSource extends XmlSource { - private final File file; +public class FileXmlSource { + /** + * Create a mapping {@linkplain Binding binding} from a File reference. + */ + public static Binding fromFile( + File file, + MappingBinder mappingBinder) { + final String filePath = file.getPath(); + JAXB_LOGGER.tracef( "Reading mappings from file: %s", filePath ); - public FileXmlSource(Origin origin, File file) { - super( origin ); - this.file = file; - } + final Origin origin = new Origin( SourceType.FILE, filePath ); - @Override - public Binding doBind(Binder binder) { - return doBind( binder, file, getOrigin() ); - } + if ( !file.exists() ) { + throw new MappingNotFoundException( origin ); + } - public static Binding doBind(Binder binder, File file, Origin origin) { final FileInputStream fis; try { fis = new FileInputStream( file ); @@ -38,6 +46,7 @@ public static Binding doBind(Binder binder, File file, Origin origin) catch ( FileNotFoundException e ) { throw new MappingNotFoundException( e, origin ); } - return InputStreamXmlSource.doBind( binder, fis, origin, true ); + + return InputStreamXmlSource.fromStream( fis, origin, true, mappingBinder ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/InputStreamAccessXmlSource.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/InputStreamAccessXmlSource.java index 9d97286e88c4..408044409a1b 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/InputStreamAccessXmlSource.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/InputStreamAccessXmlSource.java @@ -6,29 +6,48 @@ import org.hibernate.boot.archive.spi.InputStreamAccess; import org.hibernate.boot.jaxb.Origin; -import org.hibernate.boot.jaxb.spi.Binder; +import org.hibernate.boot.jaxb.SourceType; import org.hibernate.boot.jaxb.spi.Binding; -import org.hibernate.boot.jaxb.spi.XmlSource; +import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; + +import static org.hibernate.boot.jaxb.JaxbLogger.JAXB_LOGGER; /** + * Support for processing mapping XML from a {@linkplain InputStreamAccess} reference. + * * @author Steve Ebersole + * + * @see MappingBinder */ -public class InputStreamAccessXmlSource extends XmlSource { - private final InputStreamAccess inputStreamAccess; - - public InputStreamAccessXmlSource(Origin origin, InputStreamAccess inputStreamAccess) { - super( origin ); - this.inputStreamAccess = inputStreamAccess; +public class InputStreamAccessXmlSource { + /** + * Create a mapping {@linkplain Binding binding} from an input stream. + * + * @apiNote This method does not close the given {@code inputStream}. + */ + public static Binding fromStreamAccess( + InputStreamAccess inputStreamAccess, + MappingBinder mappingBinder) { + return fromStreamAccess( + inputStreamAccess, + new Origin( SourceType.INPUT_STREAM, inputStreamAccess.getStreamName() ), + mappingBinder + ); } - @Override - public Binding doBind(Binder binder) { - return doBind( binder, inputStreamAccess, getOrigin() ); - } + /** + * Create a mapping {@linkplain Binding binding} from an input stream. + * + * @apiNote This method does not close the given {@code inputStream}. + */ + public static Binding fromStreamAccess( + InputStreamAccess inputStreamAccess, + Origin origin, + MappingBinder mappingBinder) { + JAXB_LOGGER.trace( "reading mappings from InputStreamAccess" ); - public static Binding doBind(Binder binder, InputStreamAccess inputStreamAccess, Origin origin) { - return inputStreamAccess.fromStream( - inputStream -> binder.bind( inputStream, origin ) + return inputStreamAccess.fromStream( (stream) -> + InputStreamXmlSource.fromStream( stream, origin, false, mappingBinder ) ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/InputStreamXmlSource.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/InputStreamXmlSource.java index c7ad607f2ec4..cc3a711b1da6 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/InputStreamXmlSource.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/InputStreamXmlSource.java @@ -4,41 +4,54 @@ */ package org.hibernate.boot.jaxb.internal; -import java.io.IOException; -import java.io.InputStream; - import org.hibernate.boot.InvalidMappingException; import org.hibernate.boot.jaxb.Origin; -import org.hibernate.boot.jaxb.spi.Binder; +import org.hibernate.boot.jaxb.SourceType; import org.hibernate.boot.jaxb.spi.Binding; -import org.hibernate.boot.jaxb.spi.XmlSource; -import org.hibernate.internal.CoreLogging; +import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; -import org.jboss.logging.Logger; +import java.io.IOException; +import java.io.InputStream; + +import static org.hibernate.boot.jaxb.JaxbLogger.JAXB_LOGGER; /** + * Support for processing mapping XML from a {@linkplain InputStream} reference. + * + * @see MappingBinder + * * @author Steve Ebersole */ -public class InputStreamXmlSource extends XmlSource { - private static final Logger log = CoreLogging.logger( InputStreamXmlSource.class ); - - private final InputStream inputStream; - private final boolean autoClose; - - public InputStreamXmlSource(Origin origin, InputStream inputStream, boolean autoClose) { - super( origin ); - this.inputStream = inputStream; - this.autoClose = autoClose; - } +public class InputStreamXmlSource { + /** + * Create a mapping {@linkplain Binding binding} from an input stream. + * + * @apiNote This method does not close the given {@code inputStream}. + */ + public static Binding fromStream( + InputStream inputStream, + MappingBinder mappingBinder) { + JAXB_LOGGER.trace( "reading mappings from InputStream" ); - @Override - public Binding doBind(Binder binder) { - return doBind( binder, inputStream, getOrigin(), autoClose ); + final Origin origin = new Origin( SourceType.INPUT_STREAM, null ); + return fromStream( inputStream, origin, false, mappingBinder ); } - public static Binding doBind(Binder binder, InputStream inputStream, Origin origin, boolean autoClose) { + /** + * Utility form to create a {@linkplain Binding binding} from an input source. + * + * @param stream The stream from which to read the mappings + * @param origin Description of the source from which the stream came + * @param autoClose Whether to {@linkplain InputStream#close() close} the stream after we have processed it + * @param binder The JAXB binder to use + */ + public static Binding fromStream( + InputStream stream, + Origin origin, + boolean autoClose, + MappingBinder binder) { try { - return binder.bind( inputStream, origin ); + return binder.bind( stream, origin ); } catch ( Exception e ) { throw new InvalidMappingException( origin, e ); @@ -46,10 +59,10 @@ public static Binding doBind(Binder binder, InputStream inputStream, O finally { if ( autoClose ) { try { - inputStream.close(); + stream.close(); } catch ( IOException ignore ) { - log.trace( "Was unable to close input stream" ); + JAXB_LOGGER.trace( "Was unable to close input stream" ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/JarFileEntryXmlSource.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/JarFileEntryXmlSource.java index 34c02faf378f..47e0140dc870 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/JarFileEntryXmlSource.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/JarFileEntryXmlSource.java @@ -4,35 +4,72 @@ */ package org.hibernate.boot.jaxb.internal; +import org.hibernate.boot.MappingException; +import org.hibernate.boot.MappingNotFoundException; +import org.hibernate.boot.jaxb.Origin; +import org.hibernate.boot.jaxb.SourceType; +import org.hibernate.boot.jaxb.spi.Binding; +import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; + +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.Enumeration; +import java.util.function.Consumer; +import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.zip.ZipEntry; -import org.hibernate.boot.MappingException; -import org.hibernate.boot.jaxb.Origin; -import org.hibernate.boot.jaxb.spi.Binder; -import org.hibernate.boot.jaxb.spi.Binding; -import org.hibernate.boot.jaxb.spi.XmlSource; +import static org.hibernate.boot.jaxb.JaxbLogger.JAXB_LOGGER; /** + * Support for creating a mapping {@linkplain Binding binding} from a JAR file entry. + * + * @see MappingBinder + * * @author Steve Ebersole */ -public class JarFileEntryXmlSource extends XmlSource { - private final JarFile jarFile; - private final ZipEntry jarFileEntry; +public class JarFileEntryXmlSource { - public JarFileEntryXmlSource( - Origin origin, - JarFile jarFile, - ZipEntry jarFileEntry) { - super( origin ); - this.jarFile = jarFile; - this.jarFileEntry = jarFileEntry; + /** + * Create a mapping {@linkplain Binding binding} for each entry in a JAR file that + * is a {@code hbm.xml} mapping file. This binding is then handed back to the given + * consumer. + * + * @apiNote Assumes that any file named {@code *.hbm.xml} is a mapping document. + * Does not support {@code orm.xml} files. + */ + public static void fromJar( + File jar, + MappingBinder mappingBinder, + Consumer> consumer) { + JAXB_LOGGER.tracef( "Seeking mapping documents in jar file: %s", jar.getName() ); + + final Origin origin = new Origin( SourceType.JAR, jar.getAbsolutePath() ); + + try ( JarFile jarFile = new JarFile(jar) ) { + final Enumeration entries = jarFile.entries(); + while ( entries.hasMoreElements() ) { + final JarEntry jarEntry = entries.nextElement(); + if ( jarEntry.getName().endsWith(".hbm.xml") ) { + JAXB_LOGGER.tracef( "Found 'hbm.xml' mapping in jar: %s", jarEntry.getName() ); + consumer.accept( fromJarEntry( jarFile, jarEntry, origin, mappingBinder ) ); + } + } + } + catch ( IOException e ) { + throw new MappingNotFoundException( e, origin ); + } } - @Override - public Binding doBind(Binder binder) { + /** + * Create a mapping {@linkplain Binding binding} from a JAR file entry. + */ + public static Binding fromJarEntry( + JarFile jarFile, + ZipEntry jarFileEntry, + Origin origin, + MappingBinder mappingBinder) { final InputStream stream; try { stream = jarFile.getInputStream( jarFileEntry ); @@ -45,10 +82,10 @@ public Binding doBind(Binder binder) { jarFileEntry.getName() ), e, - getOrigin() + origin ); } - return InputStreamXmlSource.doBind( binder, stream, getOrigin(), true ); + return InputStreamXmlSource.fromStream( stream, origin, true, mappingBinder ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/JaxpSourceXmlSource.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/JaxpSourceXmlSource.java deleted file mode 100644 index bb42a14ee221..000000000000 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/JaxpSourceXmlSource.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.boot.jaxb.internal; - -import javax.xml.transform.Source; - -import org.hibernate.boot.jaxb.Origin; -import org.hibernate.boot.jaxb.spi.Binder; -import org.hibernate.boot.jaxb.spi.Binding; -import org.hibernate.boot.jaxb.spi.XmlSource; - -/** - * @author Steve Ebersole - */ -public class JaxpSourceXmlSource extends XmlSource { - private final Source jaxpSource; - - public JaxpSourceXmlSource(Origin origin, Source jaxpSource) { - super( origin ); - this.jaxpSource = jaxpSource; - } - - @Override - public Binding doBind(Binder binder) { - return binder.bind( jaxpSource, getOrigin() ); - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/UrlXmlSource.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/UrlXmlSource.java index 97345f87fcf0..cdfb97aefc28 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/UrlXmlSource.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/UrlXmlSource.java @@ -4,41 +4,83 @@ */ package org.hibernate.boot.jaxb.internal; +import org.hibernate.boot.MappingException; +import org.hibernate.boot.MappingNotFoundException; +import org.hibernate.boot.jaxb.Origin; +import org.hibernate.boot.jaxb.SourceType; +import org.hibernate.boot.jaxb.spi.Binding; +import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; +import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; + import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.UnknownHostException; -import org.hibernate.boot.MappingException; -import org.hibernate.boot.MappingNotFoundException; -import org.hibernate.boot.jaxb.Origin; -import org.hibernate.boot.jaxb.spi.Binder; -import org.hibernate.boot.jaxb.spi.Binding; -import org.hibernate.boot.jaxb.spi.XmlSource; +import static org.hibernate.boot.jaxb.JaxbLogger.JAXB_LOGGER; /** + * Support for processing mapping XML from a {@linkplain URL} reference. + * + * @see MappingBinder + * * @author Steve Ebersole */ -public class UrlXmlSource extends XmlSource { +public class UrlXmlSource { + /** + * Create a mapping {@linkplain Binding binding} from a classpath resource (via URL). + * + * @see #fromUrl(URL, Origin, MappingBinder) + */ + public static Binding fromResource( + String resourceName, + ClassLoaderService classLoaderService, + MappingBinder mappingBinder) { + JAXB_LOGGER.tracef( "Reading mappings from resource: %s", resourceName ); + + final Origin origin = new Origin( SourceType.RESOURCE, resourceName ); + final URL url = classLoaderService.locateResource( resourceName ); + if ( url == null ) { + throw new MappingNotFoundException( origin ); + } - private final URL url; + return fromUrl( url, origin, mappingBinder ); + } - public UrlXmlSource(Origin origin, URL url) { - super( origin ); - this.url = url; + /** + * Create a mapping {@linkplain Binding binding} from a URL + * + * @see #fromUrl(URL, Origin, MappingBinder) + */ + public static Binding fromUrl( + URL url, + MappingBinder mappingBinder) { + final Origin origin = new Origin( SourceType.URL, url.toExternalForm() ); + return fromUrl( url, origin, mappingBinder ); } - @Override - public Binding doBind(Binder binder) { + /** + * Create a mapping {@linkplain Binding binding} from a URL + * + * @param url The url from which to read the mapping information + * @param origin Description of the source from which the url came + * @param binder The JAXB binder to use + */ + public static Binding fromUrl( + URL url, + Origin origin, + MappingBinder binder) { + JAXB_LOGGER.tracef( "Reading mapping document from URL: %s", origin.getName() ); + try { InputStream stream = url.openStream(); - return InputStreamXmlSource.doBind( binder, stream, getOrigin(), true ); + return InputStreamXmlSource.fromStream( stream, origin, true, binder ); } catch (UnknownHostException e) { - throw new MappingNotFoundException( "Invalid URL", e, getOrigin() ); + throw new MappingNotFoundException( "Invalid URL", e, origin ); } catch (IOException e) { - throw new MappingException( "Unable to open URL InputStream", e, getOrigin() ); + throw new MappingException( "Unable to open URL InputStream", e, origin ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/XmlSources.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/XmlSources.java deleted file mode 100644 index fdc653f33fdd..000000000000 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/XmlSources.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.boot.jaxb.internal; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.Enumeration; -import java.util.function.Consumer; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import javax.xml.transform.dom.DOMSource; - -import org.hibernate.boot.MappingNotFoundException; -import org.hibernate.boot.archive.spi.InputStreamAccess; -import org.hibernate.boot.jaxb.Origin; -import org.hibernate.boot.jaxb.SourceType; -import org.hibernate.boot.jaxb.spi.XmlSource; -import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; - -import org.w3c.dom.Document; - -import static org.hibernate.boot.jaxb.JaxbLogger.JAXB_LOGGER; - -/** - * Helper for building and handling {@link XmlSource} references. - *

- * An {@code XmlSource} represents an XML document containing - * O/R mapping metadata, either a JPA {@code orm.xml} file, or a - * Hibernate {@code .hbm.xml} file. - * - * @author Steve Ebersole - */ -public class XmlSources { - /** - * Create an {@link XmlSource} from a named resource - */ - public static XmlSource fromResource(String resourceName, ClassLoaderService classLoaderService) { - JAXB_LOGGER.tracef( "Reading mappings from resource: %s", resourceName ); - - final Origin origin = new Origin( SourceType.RESOURCE, resourceName ); - final URL url = classLoaderService.locateResource( resourceName ); - if ( url == null ) { - throw new MappingNotFoundException( origin ); - } - - return new UrlXmlSource( origin, url ); - } - - /** - * Create an {@link XmlSource} from a URL - */ - public static XmlSource fromUrl(URL url) { - final String urlExternalForm = url.toExternalForm(); - JAXB_LOGGER.tracef( "Reading mapping document from URL: %s", urlExternalForm ); - - final Origin origin = new Origin( SourceType.URL, urlExternalForm ); - return new UrlXmlSource( origin, url ); - } - - public static XmlSource fromFile(File file) { - final String filePath = file.getPath(); - JAXB_LOGGER.tracef( "Reading mappings from file: %s", filePath ); - - final Origin origin = new Origin( SourceType.FILE, filePath ); - - if ( !file.exists() ) { - throw new MappingNotFoundException( origin ); - } - - return new FileXmlSource( origin, file ); - } - - public static XmlSource fromCacheableFile(File file) { - return fromCacheableFile( file, file.getParentFile() ); - } - - public static XmlSource fromCacheableFile(File file, File cacheableDir) { - return fromCacheableFile( file, cacheableDir, false ); - } - - public static XmlSource fromCacheableFile(File file, boolean strict) { - return fromCacheableFile( file, file.getParentFile(), strict ); - } - - public static XmlSource fromCacheableFile(File file, File cacheableDir, boolean strict) { - final String filePath = file.getPath(); - JAXB_LOGGER.tracef( "Reading mappings from cacheable file: %s", filePath ); - - final Origin origin = new Origin( SourceType.FILE, filePath ); - return new CacheableFileXmlSource( origin, file, cacheableDir, strict ); - } - - public static XmlSource fromStream(InputStreamAccess inputStreamAccess) { - final String streamName = inputStreamAccess.getStreamName(); - JAXB_LOGGER.tracef( "Reading mappings from InputStreamAccess: %s", streamName ); - - final Origin origin = new Origin( SourceType.INPUT_STREAM, streamName ); - return new InputStreamAccessXmlSource( origin, inputStreamAccess ); - } - - public static XmlSource fromStream(InputStream inputStream) { - JAXB_LOGGER.trace( "reading mappings from InputStream" ); - - final Origin origin = new Origin( SourceType.INPUT_STREAM, null ); - return new InputStreamXmlSource( origin, inputStream, false ); - } - - public static XmlSource fromDocument(Document document) { - JAXB_LOGGER.trace( "reading mappings from DOM" ); - final Origin origin = new Origin( SourceType.DOM, Origin.UNKNOWN_FILE_PATH ); - return new JaxpSourceXmlSource( origin, new DOMSource( document ) ); - } - - /** - * Read all {@code .hbm.xml} mappings from a jar file and pass them - * to the given {@link Consumer}. - *

- * Assumes that any file named {@code *.hbm.xml} is a mapping document. - * This method does not support {@code orm.xml} files! - * - * @param jar a jar file - * @param consumer a consumer of the resulting {@linkplain XmlSource XML sources} - */ - public static void fromJar(File jar, Consumer consumer) { - JAXB_LOGGER.tracef( "Seeking mapping documents in jar file: %s", jar.getName() ); - - final Origin origin = new Origin( SourceType.JAR, jar.getAbsolutePath() ); - - try ( JarFile jarFile = new JarFile(jar) ) { - final Enumeration entries = jarFile.entries(); - while ( entries.hasMoreElements() ) { - final JarEntry jarEntry = entries.nextElement(); - if ( jarEntry.getName().endsWith(".hbm.xml") ) { - JAXB_LOGGER.tracef( "Found 'hbm.xml' mapping in jar: %s", jarEntry.getName() ); - consumer.accept( new JarFileEntryXmlSource( origin, jarFile, jarEntry ) ); - } - } - } - catch ( IOException e ) { - throw new MappingNotFoundException( e, origin ); - } - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/spi/JaxbBindableMappingDescriptor.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/spi/JaxbBindableMappingDescriptor.java index 2d74e3c3f272..831a700f35ed 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/spi/JaxbBindableMappingDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/spi/JaxbBindableMappingDescriptor.java @@ -4,6 +4,8 @@ */ package org.hibernate.boot.jaxb.spi; +import java.io.Serializable; + /** * Common type for things that can get be bound to a {@link Binding} for * mapping documents. @@ -13,5 +15,5 @@ * * @author Steve Ebersole */ -public interface JaxbBindableMappingDescriptor { +public interface JaxbBindableMappingDescriptor extends Serializable { } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/spi/XmlSource.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/spi/XmlSource.java deleted file mode 100644 index 799567bcb319..000000000000 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/spi/XmlSource.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.boot.jaxb.spi; - -import org.hibernate.boot.jaxb.Origin; - -/** - * An XML document containing O/R mapping metadata, either: - *

    - *
  • a JPA {@code orm.xml} file, or - *
  • a Hibernate {@code .hbm.xml} file. - *
- * - * @author Steve Ebersole - */ -public abstract class XmlSource { - private final Origin origin; - - protected XmlSource(Origin origin) { - this.origin = origin; - } - - public Origin getOrigin() { - return origin; - } - - public abstract Binding doBind(Binder binder); -} diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/process/internal/ScanningCoordinator.java b/hibernate-core/src/main/java/org/hibernate/boot/model/process/internal/ScanningCoordinator.java index 76651ce90cfc..a6bc6eae4043 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/process/internal/ScanningCoordinator.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/process/internal/ScanningCoordinator.java @@ -4,12 +4,6 @@ */ package org.hibernate.boot.model.process.internal; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import org.hibernate.boot.MappingException; import org.hibernate.boot.archive.internal.StandardArchiveDescriptorFactory; import org.hibernate.boot.archive.internal.UrlInputStreamAccess; @@ -26,6 +20,8 @@ import org.hibernate.boot.internal.ClassLoaderAccessImpl; import org.hibernate.boot.jaxb.Origin; import org.hibernate.boot.jaxb.SourceType; +import org.hibernate.boot.jaxb.internal.InputStreamAccessXmlSource; +import org.hibernate.boot.jaxb.spi.Binding; import org.hibernate.boot.model.convert.internal.ConverterDescriptors; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; @@ -33,6 +29,12 @@ import org.hibernate.boot.spi.ClassLoaderAccess; import org.hibernate.boot.spi.XmlMappingBinderAccess; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import static org.hibernate.boot.archive.scan.internal.ScannerLogger.SCANNER_LOGGER; /** @@ -222,17 +224,27 @@ public void applyScanResultsToManagedResources( if ( xmlMappingBinderAccess != null ) { // xml mapping is not disabled for ( MappingFileDescriptor mappingFileDescriptor : scanResult.getLocatedMappingFiles() ) { - managedResources.addXmlBinding( xmlMappingBinderAccess.bind( mappingFileDescriptor.getStreamAccess() ) ); + //noinspection unchecked,rawtypes + managedResources.addXmlBinding( (Binding) InputStreamAccessXmlSource.fromStreamAccess( + mappingFileDescriptor.getStreamAccess(), + xmlMappingBinderAccess.getMappingBinder() + ) ); nonLocatedMappingFileNames.remove( mappingFileDescriptor.getName() ); } for ( String name : nonLocatedMappingFileNames ) { + final Origin origin = new Origin( SourceType.RESOURCE, name ); final URL url = classLoaderService.locateResource( name ); if ( url == null ) { - throw new MappingException( "Unable to resolve explicitly named mapping file: " + name, - new Origin( SourceType.RESOURCE, name ) ); + throw new MappingException( "Unable to resolve explicitly named mapping file: " + name, origin ); } - managedResources.addXmlBinding( xmlMappingBinderAccess.bind( new UrlInputStreamAccess( url ) ) ); + final UrlInputStreamAccess urlInputStreamAccess = new UrlInputStreamAccess( url ); + //noinspection unchecked,rawtypes + managedResources.addXmlBinding( (Binding) InputStreamAccessXmlSource.fromStreamAccess( + urlInputStreamAccess, + origin, + xmlMappingBinderAccess.getMappingBinder() + ) ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/spi/XmlMappingBinderAccess.java b/hibernate-core/src/main/java/org/hibernate/boot/spi/XmlMappingBinderAccess.java index 896f6d1ee9c6..41e2aa140bc8 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/spi/XmlMappingBinderAccess.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/spi/XmlMappingBinderAccess.java @@ -4,37 +4,31 @@ */ package org.hibernate.boot.spi; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.function.Function; - -import org.hibernate.boot.MappingNotFoundException; import org.hibernate.boot.archive.spi.InputStreamAccess; -import org.hibernate.boot.jaxb.Origin; -import org.hibernate.boot.jaxb.SourceType; import org.hibernate.boot.jaxb.internal.FileXmlSource; +import org.hibernate.boot.jaxb.internal.InputStreamAccessXmlSource; import org.hibernate.boot.jaxb.internal.InputStreamXmlSource; import org.hibernate.boot.jaxb.internal.MappingBinder; import org.hibernate.boot.jaxb.internal.UrlXmlSource; -import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; import org.hibernate.boot.jaxb.spi.Binding; +import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.service.ServiceRegistry; -import org.jboss.logging.Logger; +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.function.Function; /** - * Holds the XML binder and a classloader used for binding mappings. + * Holds the XML binder and a classloader used for binding mappings, as well + * as access to methods to perform binding of sources of mapping XML. * * @apiNote This class is very poorly named. * * @author Steve Ebersole */ public class XmlMappingBinderAccess { - private static final Logger LOG = Logger.getLogger( XmlMappingBinderAccess.class ); - private final ClassLoaderService classLoaderService; private final MappingBinder mappingBinder; @@ -54,65 +48,51 @@ public MappingBinder getMappingBinder() { /** * Create a {@linkplain Binding binding} from a named URL resource + * + * @see UrlXmlSource#fromUrl */ public Binding bind(String resource) { - LOG.tracef( "Reading mappings from resource: %s", resource ); - final Origin origin = new Origin( SourceType.RESOURCE, resource ); - final URL url = classLoaderService.locateResource( resource ); - if ( url == null ) { - throw new MappingNotFoundException( origin ); - } - return new UrlXmlSource( origin, url ).doBind( getMappingBinder() ); + //noinspection unchecked,rawtypes + return (Binding) UrlXmlSource.fromResource( resource, classLoaderService, getMappingBinder() ); } /** * Create a {@linkplain Binding binding} from a File reference + * + * @see FileXmlSource#fromFile */ public Binding bind(File file) { - final Origin origin = new Origin( SourceType.FILE, file.getPath() ); - LOG.tracef( "Reading mappings from file: %s", origin.getName() ); - if ( !file.exists() ) { - throw new MappingNotFoundException( origin ); - } - return new FileXmlSource( origin, file ).doBind( getMappingBinder() ); + //noinspection unchecked,rawtypes + return (Binding) FileXmlSource.fromFile( file, getMappingBinder() ); } /** * Create a {@linkplain Binding binding} from an input stream + * + * @see InputStreamAccessXmlSource#fromStreamAccess */ public Binding bind(InputStreamAccess xmlInputStreamAccess) { - LOG.tracef( "Reading mappings from InputStreamAccess: %s", xmlInputStreamAccess.getStreamName() ); - final Origin origin = new Origin( SourceType.INPUT_STREAM, xmlInputStreamAccess.getStreamName() ); - final InputStream xmlInputStream = xmlInputStreamAccess.accessInputStream(); - try { - return new InputStreamXmlSource( origin, xmlInputStream, false ).doBind( mappingBinder ); - } - finally { - try { - xmlInputStream.close(); - } - catch (IOException e) { - LOG.debugf( "Unable to close InputStream obtained from InputStreamAccess : %s", xmlInputStreamAccess.getStreamName() ); - } - } + //noinspection unchecked,rawtypes + return (Binding) InputStreamAccessXmlSource.fromStreamAccess( xmlInputStreamAccess, getMappingBinder() ); } /** * Create a {@linkplain Binding binding} from an input stream + * + * @see InputStreamXmlSource#fromStream */ public Binding bind(InputStream xmlInputStream) { - LOG.trace( "Reading mappings from InputStream" ); - final Origin origin = new Origin( SourceType.INPUT_STREAM, null ); - return new InputStreamXmlSource( origin, xmlInputStream, false ).doBind( getMappingBinder() ); + //noinspection unchecked,rawtypes + return (Binding) InputStreamXmlSource.fromStream( xmlInputStream, getMappingBinder() ); } /** * Create a {@linkplain Binding binding} from a URL + * + * @see UrlXmlSource#fromUrl */ public Binding bind(URL url) { - final String urlExternalForm = url.toExternalForm(); - LOG.tracef( "Reading mapping document from URL: %s", urlExternalForm ); - final Origin origin = new Origin( SourceType.URL, urlExternalForm ); - return new UrlXmlSource( origin, url ).doBind( getMappingBinder() ); + //noinspection unchecked,rawtypes + return (Binding) UrlXmlSource.fromUrl( url, getMappingBinder() ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/PreParsedOrmXmlTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/PreParsedOrmXmlTest.java index b6c0e7f080c7..7837cc580d9f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/PreParsedOrmXmlTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/PreParsedOrmXmlTest.java @@ -8,6 +8,7 @@ import java.io.InputStream; import java.io.UncheckedIOException; +import org.hibernate.boot.jaxb.internal.InputStreamXmlSource; import org.hibernate.boot.jaxb.spi.Binding; import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; import org.hibernate.cfg.Configuration; @@ -38,7 +39,7 @@ protected void addMappings(Configuration configuration) { super.addMappings( configuration ); try (InputStream xmlStream = Thread.currentThread().getContextClassLoader() .getResourceAsStream( "org/hibernate/orm/test/annotations/xml/ejb3/pre-parsed-orm.xml" )) { - Binding parsed = configuration.getXmlMappingBinderAccess().bind( xmlStream ); + Binding parsed = InputStreamXmlSource.fromStream( xmlStream, configuration.getXmlMappingBinderAccess().getMappingBinder() ); configuration.addXmlMapping( parsed ); } catch (IOException e) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/scanning/ScanningCoordinatorTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/scanning/ScanningCoordinatorTest.java index 2e5b4d75c92c..96282cf8fd79 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/scanning/ScanningCoordinatorTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/scanning/ScanningCoordinatorTest.java @@ -23,6 +23,7 @@ import org.hibernate.boot.archive.scan.spi.ScanResult; import org.hibernate.boot.archive.scan.spi.Scanner; import org.hibernate.boot.archive.spi.InputStreamAccess; +import org.hibernate.boot.jaxb.internal.MappingBinder; import org.hibernate.boot.spi.ClassmateContext; import org.hibernate.boot.model.convert.spi.ConverterDescriptor; import org.hibernate.boot.model.process.internal.ManagedResourcesImpl; @@ -69,6 +70,7 @@ public class ScanningCoordinatorTest { private BootstrapContext bootstrapContext = Mockito.mock( BootstrapContext.class ); private ClassmateContext classmateContext = new ClassmateContext(); private XmlMappingBinderAccess xmlMappingBinderAccess = Mockito.mock( XmlMappingBinderAccess.class ); + private MappingBinder mappingBinder = Mockito.mock( MappingBinder.class ); private MetadataBuildingOptions metadataBuildingOptions = Mockito.mock( MetadataBuildingOptions.class ); private ScanEnvironment scanEnvironment = Mockito.mock( ScanEnvironment.class ); @@ -92,6 +94,8 @@ public void init() { when( serviceRegistry.requireService( ClassLoaderService.class ) ).thenReturn( classLoaderService ); when( bootstrapContext.getClassLoaderService() ).thenReturn( classLoaderService ); + when( xmlMappingBinderAccess.getMappingBinder() ).thenReturn( mappingBinder ); + when( metadataBuildingOptions.isXmlMappingEnabled() ).thenReturn( true ); when( scanEnvironment.getExplicitlyListedClassNames() ).thenReturn( List.of( "a.b.C" ) );