diff --git a/hibernate-core/src/main/java/org/hibernate/boot/archive/scan/internal/ScannerLogger.java b/hibernate-core/src/main/java/org/hibernate/boot/archive/scan/internal/ScannerLogger.java new file mode 100644 index 000000000000..929459ccdb07 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/boot/archive/scan/internal/ScannerLogger.java @@ -0,0 +1,46 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.boot.archive.scan.internal; + +import org.hibernate.boot.BootLogging; +import org.hibernate.internal.log.SubSystemLogging; +import org.jboss.logging.BasicLogger; +import org.jboss.logging.Logger; +import org.jboss.logging.annotations.LogMessage; +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageLogger; +import org.jboss.logging.annotations.ValidIdRange; + +import java.lang.invoke.MethodHandles; +import java.net.URL; + +/** + * Logging related to {@linkplain org.hibernate.boot.archive.scan.spi.Scanner scanning}. + * + * @author Gavin King + */ +@MessageLogger(projectCode = "HHH") +@SubSystemLogging( + name = ScannerLogger.NAME, + description = "Logging related to scanning" +) +@ValidIdRange(min = 60000, max = 60100) +public interface ScannerLogger extends BasicLogger { + String NAME = BootLogging.NAME + ".scan"; + + ScannerLogger SCANNER_LOGGER = Logger.getMessageLogger( MethodHandles.lookup(), ScannerLogger.class, NAME ); + + @LogMessage(level = Logger.Level.WARN) + @Message(id = 60001, value = "Multiple ScannerFactory services available; using '%s'") + void multipleScannerFactoriesAvailable(String scannerClassName); + + @LogMessage(level = Logger.Level.DEBUG) + @Message(id = 60002, value = "No ScannerFactory available; to enable scanning add 'hibernate-scan-jandex' dependency or supply a custom ScannerFactory") + void noScannerFactoryAvailable(); + + @LogMessage(level = Logger.Level.DEBUG) + @Message(id = 60003, value = "Unable to resolve class [%s] named in persistence unit [%s]") + void unableToResolveClass(String className, URL rootUrl); +} diff --git a/hibernate-core/src/main/java/org/hibernate/boot/archive/scan/spi/Scanner.java b/hibernate-core/src/main/java/org/hibernate/boot/archive/scan/spi/Scanner.java index 2c77aa9a2234..60faf7d3ab8c 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/archive/scan/spi/Scanner.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/archive/scan/spi/Scanner.java @@ -35,8 +35,8 @@ public interface Scanner { /** * @deprecated (since 7.0) Not used; no replacement. */ - @Deprecated - default void setArchiveDescriptorFactory(ArchiveDescriptorFactory archiveDescriptorFactory){ + @Deprecated(since = "7.0", forRemoval = true) + default void setArchiveDescriptorFactory(ArchiveDescriptorFactory archiveDescriptorFactory) { throw new UnsupportedOperationException(); } } 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 0953e502db35..76651ce90cfc 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,15 +4,12 @@ */ package org.hibernate.boot.model.process.internal; -import java.lang.reflect.Constructor; import java.net.URL; import java.util.ArrayList; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Set; -import jakarta.persistence.AttributeConverter; import org.hibernate.boot.MappingException; import org.hibernate.boot.archive.internal.StandardArchiveDescriptorFactory; import org.hibernate.boot.archive.internal.UrlInputStreamAccess; @@ -36,7 +33,7 @@ import org.hibernate.boot.spi.ClassLoaderAccess; import org.hibernate.boot.spi.XmlMappingBinderAccess; -import org.jboss.logging.Logger; +import static org.hibernate.boot.archive.scan.internal.ScannerLogger.SCANNER_LOGGER; /** * Coordinates the process of executing {@link Scanner} (if enabled) @@ -45,7 +42,6 @@ * @author Steve Ebersole */ public class ScanningCoordinator { - private static final Logger log = Logger.getLogger( ScanningCoordinator.class ); /** * Singleton access @@ -59,53 +55,25 @@ public void coordinateScan( ManagedResourcesImpl managedResources, BootstrapContext bootstrapContext, XmlMappingBinderAccess xmlMappingBinderAccess) { - if ( bootstrapContext.getScanEnvironment() == null ) { - return; + if ( bootstrapContext.getScanEnvironment() != null ) { + // NOTE: the idea with JandexInitializer/JandexInitManager was to allow adding classes + // to the index as we discovered them via scanning and . Currently + final Scanner scanner = buildScanner( bootstrapContext ); + final ScanResult scanResult = scanner.scan( + bootstrapContext.getScanEnvironment(), + bootstrapContext.getScanOptions(), + StandardScanParameters.INSTANCE + ); + + applyScanResultsToManagedResources( managedResources, scanResult, bootstrapContext, xmlMappingBinderAccess ); } - - final ClassLoaderAccess classLoaderAccess = new ClassLoaderAccessImpl( - bootstrapContext.getJpaTempClassLoader(), - bootstrapContext.getClassLoaderService() - ); - - // NOTE : the idea with JandexInitializer/JandexInitManager was to allow adding classes - // to the index as we discovered them via scanning and . Currently - final Scanner scanner = buildScanner( bootstrapContext, classLoaderAccess ); - final ScanResult scanResult = scanner.scan( - bootstrapContext.getScanEnvironment(), - bootstrapContext.getScanOptions(), - StandardScanParameters.INSTANCE - ); - - applyScanResultsToManagedResources( managedResources, scanResult, bootstrapContext, xmlMappingBinderAccess ); } - private static final Class[] SINGLE_ARG = new Class[] { ArchiveDescriptorFactory.class }; - - @SuppressWarnings("unchecked") - private static Scanner buildScanner(BootstrapContext bootstrapContext, ClassLoaderAccess classLoaderAccess) { + private static Scanner buildScanner(BootstrapContext bootstrapContext) { final Object scannerSetting = bootstrapContext.getScanner(); final ArchiveDescriptorFactory archiveDescriptorFactory = bootstrapContext.getArchiveDescriptorFactory(); - if ( scannerSetting == null ) { - // No custom Scanner specified, use the StandardScanner - final Iterator iterator = - bootstrapContext.getClassLoaderService() - .loadJavaServices( ScannerFactory.class ) - .iterator(); - if ( iterator.hasNext() ) { - final ScannerFactory factory = iterator.next(); - final Scanner scanner = factory.getScanner( archiveDescriptorFactory ); - if ( iterator.hasNext() ) { - log.warn("Multiple ScannerFactory services available; using '" - + scanner.getClass().getName() + "'"); - } - return scanner; - } - else { - log.debug("No ScannerFactory available; to enable scanning add 'hibernate-scan-jandex' dependency or supply a custom ScannerFactory"); - return new DisabledScanner(); - } + return getStandardScanner( bootstrapContext, archiveDescriptorFactory ); } else { if ( scannerSetting instanceof Scanner scanner ) { @@ -120,79 +88,120 @@ private static Scanner buildScanner(BootstrapContext bootstrapContext, ClassLoad } return scanner; } - - final Class scannerImplClass; - if ( scannerSetting instanceof Class ) { - scannerImplClass = (Class) scannerSetting; - } else { - scannerImplClass = classLoaderAccess.classForName( scannerSetting.toString() ); + return createScanner( archiveDescriptorFactory, + scannerClass( bootstrapContext, scannerSetting ) ); + } + } + } + + private static Class scannerClass( + BootstrapContext bootstrapContext, Object scannerSetting) { + if ( scannerSetting instanceof Class scannerSettingClass ) { + if ( !Scanner.class.isAssignableFrom( scannerSettingClass ) ) { + throw new IllegalArgumentException( + "Configuration provided a custom scanner class '" + + scannerSettingClass.getName() + + "' which does not implement 'Scanner'" + ); } + return scannerSettingClass.asSubclass( Scanner.class ); + } + else { + final ClassLoaderAccess classLoaderAccess = new ClassLoaderAccessImpl( + bootstrapContext.getJpaTempClassLoader(), + bootstrapContext.getClassLoaderService() + ); + return classLoaderAccess.classForName( scannerSetting.toString() ); + } + } + private static Scanner createScanner( + ArchiveDescriptorFactory archiveDescriptorFactory, + Class scannerImplClass) { - if ( archiveDescriptorFactory != null ) { - // find the single-arg constructor - it's an error if none exists + final var SINGLE_ARG = new Class[] { ArchiveDescriptorFactory.class }; + + if ( archiveDescriptorFactory != null ) { + // find the single-arg constructor - it's an error if none exists + try { + final var constructor = scannerImplClass.getConstructor( SINGLE_ARG ); try { - final Constructor constructor = scannerImplClass.getConstructor( SINGLE_ARG ); - try { - return constructor.newInstance( archiveDescriptorFactory ); - } - catch (Exception e) { - throw new IllegalStateException( - "Error trying to instantiate custom specified Scanner [" + - scannerImplClass.getName() + "]", - e - ); - } + return constructor.newInstance( archiveDescriptorFactory ); } - catch (NoSuchMethodException e) { - throw new IllegalArgumentException( - "Configuration named a custom Scanner and a custom ArchiveDescriptorFactory, but " + - "Scanner impl did not define a constructor accepting ArchiveDescriptorFactory" + catch (Exception e) { + throw new IllegalStateException( + "Error instantiating custom scanner class '" + + scannerImplClass.getName() + "'", + e ); } } - else { - // could be either ctor form... - // find the single-arg constructor - its an error if none exists + catch (NoSuchMethodException e) { + throw new IllegalArgumentException( + "Configuration specified a custom scanner class and a custom ArchiveDescriptorFactory, but " + + "Scanner implementation does not have a constructor accepting ArchiveDescriptorFactory" + ); + } + } + else { + // could be either ctor form... + // find the single-arg constructor - it's an error if none exists + try { + final var constructor = scannerImplClass.getConstructor( SINGLE_ARG ); + try { + return constructor.newInstance( StandardArchiveDescriptorFactory.INSTANCE ); + } + catch (Exception e) { + throw new IllegalStateException( + "Error instantiating custom scanner class '" + + scannerImplClass.getName() + "'", + e + ); + } + } + catch (NoSuchMethodException e) { try { - final Constructor constructor = scannerImplClass.getConstructor( SINGLE_ARG ); + final var constructor = scannerImplClass.getConstructor(); try { - return constructor.newInstance( StandardArchiveDescriptorFactory.INSTANCE ); + return constructor.newInstance(); } - catch (Exception e) { + catch (Exception e2) { throw new IllegalStateException( - "Error trying to instantiate custom specified Scanner [" + - scannerImplClass.getName() + "]", - e + "Error instantiating custom scanner class '" + + scannerImplClass.getName() + "'", + e2 ); } } - catch (NoSuchMethodException e) { - try { - final Constructor constructor = scannerImplClass.getConstructor(); - try { - return constructor.newInstance(); - } - catch (Exception e2) { - throw new IllegalStateException( - "Error trying to instantiate custom specified Scanner [" + - scannerImplClass.getName() + "]", - e2 - ); - } - } - catch (NoSuchMethodException ignore) { - throw new IllegalArgumentException( - "Configuration named a custom Scanner, but we were unable to locate " + - "an appropriate constructor" - ); - } + catch (NoSuchMethodException ignore) { + throw new IllegalArgumentException( + "Configuration specified a custom scanner class with no appropriate constructor" + ); } } } } + private static Scanner getStandardScanner( + BootstrapContext bootstrapContext, + ArchiveDescriptorFactory archiveDescriptorFactory) { + // No custom Scanner specified, use the StandardScanner + final var scannerFactories = + bootstrapContext.getClassLoaderService() + .loadJavaServices( ScannerFactory.class ); + for ( ScannerFactory scannerFactory : scannerFactories ) { + final Scanner scanner = scannerFactory.getScanner( archiveDescriptorFactory ); + if ( scannerFactories.size() > 1 ) { + SCANNER_LOGGER.multipleScannerFactoriesAvailable(scanner.getClass().getName()); + } + return scanner; + } + + SCANNER_LOGGER.noScannerFactoryAvailable(); + return new DisabledScanner(); + } + public void applyScanResultsToManagedResources( ManagedResourcesImpl managedResources, ScanResult scanResult, @@ -220,30 +229,28 @@ public void applyScanResultsToManagedResources( for ( String name : nonLocatedMappingFileNames ) { 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, + new Origin( SourceType.RESOURCE, name ) ); } - final UrlInputStreamAccess inputStreamAccess = new UrlInputStreamAccess( url ); - managedResources.addXmlBinding( xmlMappingBinderAccess.bind( inputStreamAccess ) ); + managedResources.addXmlBinding( xmlMappingBinderAccess.bind( new UrlInputStreamAccess( url ) ) ); } } // classes and packages ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - final List unresolvedListedClassNames = scanEnvironment.getExplicitlyListedClassNames() == null - ? new ArrayList<>() - : new ArrayList<>( scanEnvironment.getExplicitlyListedClassNames() ); + final List explicitlyListedClassNames = scanEnvironment.getExplicitlyListedClassNames(); + final List unresolvedListedClassNames = + explicitlyListedClassNames == null + ? new ArrayList<>() + : new ArrayList<>( explicitlyListedClassNames ); for ( ClassDescriptor classDescriptor : scanResult.getLocatedClasses() ) { if ( classDescriptor.getCategorization() == ClassDescriptor.Categorization.CONVERTER ) { // converter classes are safe to load because we never enhance them, // and notice we use the ClassLoaderService specifically, not the temp ClassLoader (if any) - final Class> converterClass = - classLoaderService.classForName( classDescriptor.getName() ); managedResources.addAttributeConverterDefinition( - ConverterDescriptors.of( converterClass, bootstrapContext.getClassmateContext() ) + ConverterDescriptors.of( classLoaderService.classForName( classDescriptor.getName() ), + bootstrapContext.getClassmateContext() ) ); } else if ( classDescriptor.getCategorization() == ClassDescriptor.Categorization.MODEL ) { @@ -252,49 +259,49 @@ else if ( classDescriptor.getCategorization() == ClassDescriptor.Categorization. unresolvedListedClassNames.remove( classDescriptor.getName() ); } - // IMPL NOTE: "explicitlyListedClassNames" can contain class or package names... + // IMPL NOTE: 'explicitlyListedClassNames' can contain both class and package names for ( PackageDescriptor packageDescriptor : scanResult.getLocatedPackages() ) { managedResources.addAnnotatedPackageName( packageDescriptor.getName() ); unresolvedListedClassNames.remove( packageDescriptor.getName() ); } for ( String unresolvedListedClassName : unresolvedListedClassNames ) { - // because the explicit list can contain either class names or package names - // we need to check for both here... + // because the explicit list can contain both class names and package names, + // we need to check for both possibilities here // First, try it as a class name - final String classFileName = unresolvedListedClassName.replace( '.', '/' ) + ".class"; - final URL classFileUrl = classLoaderService.locateResource( classFileName ); + final URL classFileUrl = + classLoaderService.locateResource( classFileName( unresolvedListedClassName ) ); if ( classFileUrl != null ) { managedResources.addAnnotatedClassName( unresolvedListedClassName ); - continue; } - - // Then, try it as a package name - final String packageInfoFileName = unresolvedListedClassName.replace( '.', '/' ) + "/package-info.class"; - final URL packageInfoFileUrl = classLoaderService.locateResource( packageInfoFileName ); - if ( packageInfoFileUrl != null ) { - managedResources.addAnnotatedPackageName( unresolvedListedClassName ); - continue; + else { + // Then, try it as a package name + final URL packageInfoFileUrl = + classLoaderService.locateResource( packageInfoFileName( unresolvedListedClassName ) ); + if ( packageInfoFileUrl != null ) { + managedResources.addAnnotatedPackageName( unresolvedListedClassName ); + } + else { + // Last, try it by loading the class + try { + final Class clazz = classLoaderService.classForName( unresolvedListedClassName ); + managedResources.addAnnotatedClassReference( clazz ); + } + catch (ClassLoadingException ignore) { + // ignore this error + SCANNER_LOGGER.unableToResolveClass( unresolvedListedClassName, scanEnvironment.getRootUrl() ); + } + } } + } + } - // Last, try it by loading the class - try { - Class clazz = classLoaderService.classForName( unresolvedListedClassName ); - managedResources.addAnnotatedClassReference( clazz ); - continue; - } - catch (ClassLoadingException ignore) { - // ignore this error - } + private static String packageInfoFileName(String unresolvedListedClassName) { + return unresolvedListedClassName.replace( '.', '/' ) + "/package-info.class"; + } - if ( log.isDebugEnabled() ) { - log.debugf( - "Unable to resolve class [%s] named in persistence unit [%s]", - unresolvedListedClassName, - scanEnvironment.getRootUrl() - ); - } - } + private static String classFileName(String unresolvedListedClassName) { + return unresolvedListedClassName.replace( '.', '/' ) + ".class"; } } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/util/cache/InternalCacheFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/util/cache/InternalCacheFactoryImpl.java index 581c32794024..ed6cf704e8d9 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/util/cache/InternalCacheFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/util/cache/InternalCacheFactoryImpl.java @@ -8,6 +8,6 @@ final class InternalCacheFactoryImpl implements InternalCacheFactory { @Override public InternalCache createInternalCache(int intendedApproximateSize) { - return new LegacyInternalCacheImplementation( intendedApproximateSize ); + return new LegacyInternalCacheImplementation<>( intendedApproximateSize ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/BootLoggingTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/BootLoggingTests.java index cef132a43412..05e30d4a9629 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/BootLoggingTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/BootLoggingTests.java @@ -33,7 +33,6 @@ * * @author Steve Ebersole */ -@SuppressWarnings("JUnitMalformedDeclaration") @MessageKeyInspection( messageKey = "HHH10001005", logger = @Logger( loggerName = ConnectionInfoLogger.LOGGER_NAME ) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/SessionFactoryNamingTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/SessionFactoryNamingTests.java index 55aafee120c6..b9b228c7b5f3 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/SessionFactoryNamingTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/SessionFactoryNamingTests.java @@ -23,7 +23,6 @@ /** * @author Steve Ebersole */ -@SuppressWarnings("JUnitMalformedDeclaration") @MessageKeyInspection( messageKey = "HHH020277", logger = @Logger( loggerName = SessionFactoryRegistryMessageLogger.LOGGER_NAME ) @@ -41,10 +40,6 @@ void testExplicitJndiName(SessionFactoryScope scope, MessageKeyWatcher logWatche assertThat( logWatcher.wasTriggered() ).isTrue(); } - - - - @Test @DomainModel @ServiceRegistry( settings = @Setting( name = AvailableSettings.SESSION_FACTORY_NAME_IS_JNDI, value = "true" ) ) 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 e0d4461ae34b..2e5b4d75c92c 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 @@ -6,8 +6,7 @@ import java.net.MalformedURLException; import java.net.URL; -import java.util.Arrays; -import java.util.Collections; +import java.util.List; import org.hibernate.archive.scan.internal.ClassDescriptorImpl; import org.hibernate.boot.archive.scan.internal.DisabledScanner; @@ -16,9 +15,8 @@ import org.hibernate.archive.scan.internal.ScanResultImpl; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.archive.internal.ByteArrayInputStreamAccess; +import org.hibernate.boot.archive.scan.internal.ScannerLogger; import org.hibernate.boot.archive.scan.spi.ClassDescriptor; -import org.hibernate.boot.archive.scan.spi.MappingFileDescriptor; -import org.hibernate.boot.archive.scan.spi.PackageDescriptor; import org.hibernate.boot.archive.scan.spi.ScanEnvironment; import org.hibernate.boot.archive.scan.spi.ScanOptions; import org.hibernate.boot.archive.scan.spi.ScanParameters; @@ -46,7 +44,9 @@ import org.mockito.Mockito; -import static org.junit.Assert.assertEquals; +import static java.util.Collections.singleton; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.same; @@ -59,8 +59,8 @@ * @author Petteri Pitkanen */ @MessageKeyInspection( - messageKey = "Unable to resolve class [a.b.C] named in persistence unit", - logger = @Logger( loggerNameClass = ScanningCoordinator.class ) + messageKey = "HHH060003", + logger = @Logger(loggerName = ScannerLogger.NAME) ) public class ScanningCoordinatorTest { @@ -94,8 +94,7 @@ public void init() { when( metadataBuildingOptions.isXmlMappingEnabled() ).thenReturn( true ); - when( scanEnvironment.getExplicitlyListedClassNames() ).thenReturn( - Arrays.asList( "a.b.C" ) ); + when( scanEnvironment.getExplicitlyListedClassNames() ).thenReturn( List.of( "a.b.C" ) ); when( classLoaderService.classForName( eq( "a.b.C" ) ) ).thenThrow( ClassLoadingException.class ); when( classLoaderService.locateResource( eq( "a/b/c.class" ) ) ).thenReturn( null ); @@ -111,13 +110,14 @@ public void testApplyScanResultsToManagedResourcesWithNullRootUrl(MessageKeyWatc bootstrapContext, xmlMappingBinderAccess ); - assertEquals( "Unable to resolve class [a.b.C] named in persistence unit [null]", watcher.getFirstTriggeredMessage() ); + assertTrue( watcher.wasTriggered() ); } @Test public void testApplyScanResultsToManagedResourcesWithNotNullRootUrl(MessageKeyWatcher watcher) throws MalformedURLException { - when( scanEnvironment.getRootUrl() ).thenReturn( new URL( "http://http://hibernate.org/" ) ); + when( scanEnvironment.getRootUrl() ) + .thenReturn( new URL( "http://http://hibernate.org/" ) ); ScanningCoordinator.INSTANCE.applyScanResultsToManagedResources( managedResources, @@ -125,14 +125,13 @@ public void testApplyScanResultsToManagedResourcesWithNotNullRootUrl(MessageKeyW bootstrapContext, xmlMappingBinderAccess ); - assertEquals( "Unable to resolve class [a.b.C] named in persistence unit [http://http://hibernate.org/]", watcher.getFirstTriggeredMessage() ); + assertTrue( watcher.wasTriggered() ); } @Test @JiraKey(value = "HHH-14473") public void testApplyScanResultsToManagedResultsWhileExplicitClassNameLoadable() { - Class expectedClass = Object.class; - when( classLoaderService.classForName( eq( "a.b.C" ) ) ).thenReturn( expectedClass ); + when( classLoaderService.classForName( eq( "a.b.C" ) ) ).thenReturn( Object.class ); ScanningCoordinator.INSTANCE.applyScanResultsToManagedResources( managedResources, @@ -142,7 +141,7 @@ public void testApplyScanResultsToManagedResultsWhileExplicitClassNameLoadable() ); verify( managedResources, times( 0 ) ).addAnnotatedClassName( any() ); - verify( managedResources, times( 1 ) ).addAnnotatedClassReference( same( expectedClass ) ); + verify( managedResources, times( 1 ) ).addAnnotatedClassReference( same( Object.class ) ); verify( classLoaderService, times( 1 ) ).classForName( eq( "a.b.C" ) ); } @@ -155,16 +154,13 @@ public void testManagedResourcesAfterCoordinateScanWithDisabledScanner() { @Test @JiraKey(value = "HHH-12505") public void testManagedResourcesAfterCoordinateScanWithCustomEnabledScanner() { - final Scanner scanner = new Scanner() { - @Override - public ScanResult scan(final ScanEnvironment environment, final ScanOptions options, final ScanParameters parameters) { - final InputStreamAccess dummyInputStreamAccess = new ByteArrayInputStreamAccess( "dummy", new byte[0] ); - return new ScanResultImpl( - Collections.singleton( new PackageDescriptorImpl( "dummy", dummyInputStreamAccess ) ), - Collections.singleton( new ClassDescriptorImpl( "dummy", ClassDescriptor.Categorization.MODEL, dummyInputStreamAccess ) ), - Collections.singleton( new MappingFileDescriptorImpl( "dummy", dummyInputStreamAccess ) ) - ); - } + final Scanner scanner = (environment, options, parameters) -> { + final InputStreamAccess dummyInputStreamAccess = new ByteArrayInputStreamAccess( "dummy", new byte[0] ); + return new ScanResultImpl( + singleton( new PackageDescriptorImpl( "dummy", dummyInputStreamAccess ) ), + singleton( new ClassDescriptorImpl( "dummy", ClassDescriptor.Categorization.MODEL, dummyInputStreamAccess ) ), + singleton( new MappingFileDescriptorImpl( "dummy", dummyInputStreamAccess ) ) + ); }; assertManagedResourcesAfterCoordinateScanWithScanner( scanner, false ); } @@ -173,19 +169,20 @@ public ScanResult scan(final ScanEnvironment environment, final ScanOptions opti @JiraKey(value = "HHH-10778") public void testManagedResourcesAfterCoordinateScanWithConverterScanner() { - when( classLoaderService.classForName( "converter" ) ).thenReturn( (Class) IntegerToVarcharConverter.class ); + when( (Class) classLoaderService.classForName( "converter" ) ) + .thenReturn( IntegerToVarcharConverter.class ); final Scanner scanner = (ScanEnvironment environment, ScanOptions options, ScanParameters parameters) -> { final InputStreamAccess dummyInputStreamAccess = new ByteArrayInputStreamAccess( "dummy", new byte[0] ); return new ScanResultImpl( - Collections.singleton( new PackageDescriptorImpl( "dummy", dummyInputStreamAccess ) ), - Collections.singleton( new ClassDescriptorImpl( + singleton( new PackageDescriptorImpl( "dummy", dummyInputStreamAccess ) ), + singleton( new ClassDescriptorImpl( "converter", ClassDescriptor.Categorization.CONVERTER, dummyInputStreamAccess ) ), - Collections.singleton( new MappingFileDescriptorImpl( "dummy", dummyInputStreamAccess ) ) + singleton( new MappingFileDescriptorImpl( "dummy", dummyInputStreamAccess ) ) ); }; @@ -200,9 +197,8 @@ public void testManagedResourcesAfterCoordinateScanWithConverterScanner() { assertEquals( "a.b.C", scanEnvironment.getExplicitlyListedClassNames().get( 0 ) ); assertEquals( 1, managedResources.getAttributeConverterDescriptors().size() ); - ConverterDescriptor attributeConverterInfo = managedResources.getAttributeConverterDescriptors() - .iterator() - .next(); + ConverterDescriptor attributeConverterInfo = + managedResources.getAttributeConverterDescriptors().iterator().next(); assertEquals( IntegerToVarcharConverter.class, attributeConverterInfo.getAttributeConverterClass() ); } @@ -221,8 +217,8 @@ private void assertManagedResourcesAfterCoordinateScanWithScanner(final Scanner assertEquals( 1, scanEnvironment.getExplicitlyListedClassNames().size() ); assertEquals( "a.b.C", scanEnvironment.getExplicitlyListedClassNames().get( 0 ) ); - assertEquals( true, managedResources.getAttributeConverterDescriptors().isEmpty() ); - assertEquals( true, managedResources.getAnnotatedClassReferences().isEmpty() ); + assertTrue( managedResources.getAttributeConverterDescriptors().isEmpty() ); + assertTrue( managedResources.getAnnotatedClassReferences().isEmpty() ); assertEquals( expectedIsManagedResourcesEmpty, managedResources.getAnnotatedClassNames().isEmpty() ); assertEquals( expectedIsManagedResourcesEmpty, managedResources.getAnnotatedPackageNames().isEmpty() ); assertEquals( expectedIsManagedResourcesEmpty, managedResources.getXmlMappingBindings().isEmpty() ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/env/LobCreationCheckSkipTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/env/LobCreationCheckSkipTest.java index 801aecc8cac2..e4d0ec49f267 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/env/LobCreationCheckSkipTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/env/LobCreationCheckSkipTest.java @@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertFalse; +import static org.junit.jupiter.api.Assertions.assertFalse; /** * @author Vlad Mihalcea diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaCreateDropExtraWarningsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaCreateDropExtraWarningsTest.java index 0d0c3878a5ba..23757595e6d1 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaCreateDropExtraWarningsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaCreateDropExtraWarningsTest.java @@ -4,12 +4,10 @@ */ package org.hibernate.orm.test.jpa.schemagen; -import static org.assertj.core.api.Assertions.assertThat; - +import jakarta.persistence.EntityManagerFactory; import org.hibernate.SessionFactory; import org.hibernate.dialect.PostgreSQLDialect; -import org.hibernate.engine.jdbc.spi.SqlExceptionHelper; - +import org.hibernate.engine.jdbc.spi.SQLExceptionLogging; import org.hibernate.testing.orm.junit.EntityManagerFactoryBasedFunctionalTest; import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.orm.junit.Logger; @@ -18,11 +16,13 @@ import org.hibernate.testing.orm.junit.RequiresDialect; import org.junit.jupiter.api.Test; -import jakarta.persistence.EntityManagerFactory; +import static org.junit.jupiter.api.Assertions.assertFalse; @JiraKey("HHH-18296") -@MessageKeyInspection(messageKey = "SQL Warning", logger = @Logger(loggerNameClass = SqlExceptionHelper.class)) -@RequiresDialect(value = PostgreSQLDialect.class, comment = "Only the PostgreSQL driver is known to generate 'success' warnings on table drop") +@MessageKeyInspection(messageKey = "HHH", + logger = @Logger(loggerName = SQLExceptionLogging.WARN_NAME)) +@RequiresDialect(value = PostgreSQLDialect.class, + comment = "Only the PostgreSQL driver is known to generate 'success' warnings on table drop") public class SchemaCreateDropExtraWarningsTest extends EntityManagerFactoryBasedFunctionalTest { @Override @@ -35,15 +35,13 @@ public void testNoWarning(MessageKeyWatcher watcher) { // Create the emf in test, so that we can capture logs try ( EntityManagerFactory emf = produceEntityManagerFactory() ) { // No warnings on startup - assertThat( watcher.getTriggeredMessages() ) - .isEmpty(); + assertFalse( watcher.wasTriggered() ); emf.unwrap( SessionFactory.class ) .getSchemaManager() .dropMappedObjects( false ); // No warnings on explicit drop - assertThat( watcher.getTriggeredMessages() ) - .isEmpty(); + assertFalse( watcher.wasTriggered() ); } } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/OrdinalEnumTypeTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/OrdinalEnumTypeTest.java index 95f3593096d9..5180041d8e28 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/OrdinalEnumTypeTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/OrdinalEnumTypeTest.java @@ -23,7 +23,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Vlad Mihacea diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/VarcharEnumTypeTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/VarcharEnumTypeTest.java index 50fe2ff4ba87..2a0b6bf4d821 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/VarcharEnumTypeTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/VarcharEnumTypeTest.java @@ -23,7 +23,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; @MessageKeyInspection( logger = @Logger( loggerName = JdbcBindingLogging.NAME ), diff --git a/hibernate-core/src/test/resources/log4j2.properties b/hibernate-core/src/test/resources/log4j2.properties index 44f216dbb16d..bf3f5eca5ca5 100644 --- a/hibernate-core/src/test/resources/log4j2.properties +++ b/hibernate-core/src/test/resources/log4j2.properties @@ -121,7 +121,7 @@ logger.merged-entity-copies.name=org.hibernate.event.internal.EntityCopyAllowedL ### provide information about merged entity copies. #logger.merged-entity-copies.level=debug -logger.scanning-coordinator.name=org.hibernate.boot.model.process.internal.ScanningCoordinator +logger.scanning-coordinator.name=org.hibernate.orm.boot.scan logger.scanning-coordinator.level=debug logger.abstract-persistent-collection.name=org.hibernate.collection.spi.AbstractPersistentCollection logger.abstract-persistent-collection.level=debug diff --git a/hibernate-scan-jandex/src/main/java/org/hibernate/archive/scan/spi/AbstractScannerImpl.java b/hibernate-scan-jandex/src/main/java/org/hibernate/archive/scan/spi/AbstractScannerImpl.java index dd8b8cc29a39..fcbb3cd6766f 100644 --- a/hibernate-scan-jandex/src/main/java/org/hibernate/archive/scan/spi/AbstractScannerImpl.java +++ b/hibernate-scan-jandex/src/main/java/org/hibernate/archive/scan/spi/AbstractScannerImpl.java @@ -77,16 +77,6 @@ private ArchiveDescriptor buildArchiveDescriptor( return descriptor; } - /** - * Handle <jar-file/> references from a persistence.xml file. - * - * JPA allows for to be specific - * @return The resolved non-root URL - */ - protected URL resolveNonRootUrl(URL url) { - return null; - } - // This needs to be protected and attributes/constructor visible in case // a custom scanner needs to override validateReuse. protected static class ArchiveDescriptorInfo { diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/logger/LogInspectionHelper.java b/hibernate-testing/src/main/java/org/hibernate/testing/logger/LogInspectionHelper.java index 649340ac8b05..eebfc3c9baff 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/logger/LogInspectionHelper.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/logger/LogInspectionHelper.java @@ -32,9 +32,8 @@ public static void clearAllListeners(BasicLogger log) { } private static Log4J2DelegatingLogger convertType(BasicLogger log) { - if ( log instanceof DelegatingBasicLogger) { + if ( log instanceof DelegatingBasicLogger wrapper) { //Most loggers generated via the annotation processor are of this type - DelegatingBasicLogger wrapper = (DelegatingBasicLogger) log; try { return extractFromWrapper( wrapper ); } diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/MessageKeyWatcherImpl.java b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/MessageKeyWatcherImpl.java index 76b28472fdd9..681b2a2609ff 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/MessageKeyWatcherImpl.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/MessageKeyWatcherImpl.java @@ -33,7 +33,7 @@ public void addLogger(org.hibernate.testing.orm.junit.Logger loggerAnn) { if ( loggerAnn.loggerNameClass() != void.class ) { logger = Logger.getLogger( loggerAnn.loggerNameClass() ); } - else if ( ! "".equals( loggerAnn.loggerName().trim() ) ) { + else if ( !loggerAnn.loggerName().trim().isEmpty() ) { logger = Logger.getLogger( loggerAnn.loggerName().trim() ); } else { @@ -52,7 +52,7 @@ public static String loggerKey(org.hibernate.testing.orm.junit.Logger loggerAnn) if ( loggerAnn.loggerNameClass() != void.class ) { logger = Logger.getLogger( loggerAnn.loggerNameClass() ); } - else if ( ! "".equals( loggerAnn.loggerName().trim() ) ) { + else if ( !loggerAnn.loggerName().trim().isEmpty() ) { logger = Logger.getLogger( loggerAnn.loggerName().trim() ); } else {