borinquenkid commented on code in PR #15568:
URL: https://github.com/apache/grails-core/pull/15568#discussion_r3453831239


##########
grails-data-hibernate7/grails-plugin/src/main/groovy/grails/test/hibernate/HibernateSpec.groovy:
##########
@@ -56,36 +74,124 @@ abstract class HibernateSpec extends Specification {
 
     @Shared @AutoCleanup HibernateDatastore hibernateDatastore
     @Shared PlatformTransactionManager transactionManager
+    @Shared HibernateProxyHandler proxyHandler = new HibernateProxyHandler()
+    @Shared @AutoCleanup('close') ApplicationContext applicationContext

Review Comment:
   Fixed — `'close'` removed.



##########
grails-data-hibernate7/grails-plugin/src/main/groovy/grails/test/hibernate/HibernateSpec.groovy:
##########
@@ -56,36 +74,124 @@ abstract class HibernateSpec extends Specification {
 
     @Shared @AutoCleanup HibernateDatastore hibernateDatastore
     @Shared PlatformTransactionManager transactionManager
+    @Shared HibernateProxyHandler proxyHandler = new HibernateProxyHandler()
+    @Shared @AutoCleanup('close') ApplicationContext applicationContext
 
-    void setupSpec() {
+    static class TestGrailsBytecodeProvider extends GrailsBytecodeProvider {
 
-        List<PropertySourceLoader> propertySourceLoaders = 
SpringFactoriesLoader.loadFactories(PropertySourceLoader, 
getClass().getClassLoader())
-        ResourceLoader resourceLoader = new DefaultResourceLoader()
-        MutablePropertySources propertySources = new MutablePropertySources()
-        PropertySourceLoader ymlLoader = propertySourceLoaders.find { 
it.getFileExtensions().toList().contains('yml') }
-        if (ymlLoader) {
-            load(resourceLoader, ymlLoader, 'application.yml').each {
-                propertySources.addLast(it)
-            }
-        }
-        PropertySourceLoader groovyLoader = propertySourceLoaders.find { 
it.getFileExtensions().toList().contains('groovy') }
-        if (groovyLoader) {
-            load(resourceLoader, groovyLoader, 'application.groovy').each {
-                propertySources.addLast(it)
+        @Override
+        @CompileStatic(TypeCheckingMode.SKIP)
+        protected ByteBuddyProxyHelper createProxyHelper() {
+            try {
+                def byteBuddyStateClass = 
Class.forName('org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState')
+                def byteBuddyStateConstructor = 
byteBuddyStateClass.getDeclaredConstructor()
+                byteBuddyStateConstructor.setAccessible(true)
+                def byteBuddyState = byteBuddyStateConstructor.newInstance()
+                return new ByteBuddyProxyHelper(byteBuddyState as 
org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState)
+            } catch (e) {
+                throw new RuntimeException('Failed to instantiate 
ByteBuddyState using reflection', e)
             }
         }
-        propertySources.addFirst(new MapPropertySource('defaults', 
getConfiguration()))
-        Config config = new PropertySourcesConfig(propertySources)
+    }
+
+    @CompileStatic(TypeCheckingMode.SKIP)
+    void setupSpec() {
+        Config config
         List<Class> domainClasses = getDomainClasses()
-        String packageName = getPackageToScan(config)
+        HibernateDatastoreSpringInitializer initializer
+
+        if (applicationContext == null) {
+            System.out.println('HibernateSpec: applicationContext is null, 
creating new one.')

Review Comment:
   Removed — all debug `println` calls are gone.



##########
grails-data-hibernate7/grails-plugin/src/main/groovy/grails/test/hibernate/HibernateSpec.groovy:
##########
@@ -56,36 +74,124 @@ abstract class HibernateSpec extends Specification {
 
     @Shared @AutoCleanup HibernateDatastore hibernateDatastore
     @Shared PlatformTransactionManager transactionManager
+    @Shared HibernateProxyHandler proxyHandler = new HibernateProxyHandler()
+    @Shared @AutoCleanup('close') ApplicationContext applicationContext
 
-    void setupSpec() {
+    static class TestGrailsBytecodeProvider extends GrailsBytecodeProvider {
 
-        List<PropertySourceLoader> propertySourceLoaders = 
SpringFactoriesLoader.loadFactories(PropertySourceLoader, 
getClass().getClassLoader())
-        ResourceLoader resourceLoader = new DefaultResourceLoader()
-        MutablePropertySources propertySources = new MutablePropertySources()
-        PropertySourceLoader ymlLoader = propertySourceLoaders.find { 
it.getFileExtensions().toList().contains('yml') }
-        if (ymlLoader) {
-            load(resourceLoader, ymlLoader, 'application.yml').each {
-                propertySources.addLast(it)
-            }
-        }
-        PropertySourceLoader groovyLoader = propertySourceLoaders.find { 
it.getFileExtensions().toList().contains('groovy') }
-        if (groovyLoader) {
-            load(resourceLoader, groovyLoader, 'application.groovy').each {
-                propertySources.addLast(it)
+        @Override
+        @CompileStatic(TypeCheckingMode.SKIP)
+        protected ByteBuddyProxyHelper createProxyHelper() {
+            try {
+                def byteBuddyStateClass = 
Class.forName('org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState')
+                def byteBuddyStateConstructor = 
byteBuddyStateClass.getDeclaredConstructor()
+                byteBuddyStateConstructor.setAccessible(true)
+                def byteBuddyState = byteBuddyStateConstructor.newInstance()
+                return new ByteBuddyProxyHelper(byteBuddyState as 
org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState)
+            } catch (e) {
+                throw new RuntimeException('Failed to instantiate 
ByteBuddyState using reflection', e)
             }
         }
-        propertySources.addFirst(new MapPropertySource('defaults', 
getConfiguration()))
-        Config config = new PropertySourcesConfig(propertySources)
+    }
+
+    @CompileStatic(TypeCheckingMode.SKIP)
+    void setupSpec() {
+        Config config
         List<Class> domainClasses = getDomainClasses()
-        String packageName = getPackageToScan(config)
+        HibernateDatastoreSpringInitializer initializer
+
+        if (applicationContext == null) {
+            System.out.println('HibernateSpec: applicationContext is null, 
creating new one.')
+            List<PropertySourceLoader> propertySourceLoaders = 
SpringFactoriesLoader.loadFactories(PropertySourceLoader, 
getClass().getClassLoader())
+            ResourceLoader resourceLoader = new DefaultResourceLoader()
+            MutablePropertySources propertySources = new 
MutablePropertySources()
+            PropertySourceLoader ymlLoader = propertySourceLoaders.find { 
it.getFileExtensions().toList().contains('yml') }
+            if (ymlLoader) {
+                load(resourceLoader, ymlLoader, 'application.yml').each {
+                    propertySources.addLast(it)
+                }
+            }
+            PropertySourceLoader groovyLoader = propertySourceLoaders.find { 
it.getFileExtensions().toList().contains('groovy') }
+            if (groovyLoader) {
+                load(resourceLoader, groovyLoader, 'application.groovy').each {
+                    propertySources.addLast(it)
+                }
+            }
+            propertySources.addFirst(new MapPropertySource('defaults', 
getConfiguration()))
+            config = new PropertySourcesConfig(propertySources)
+            PropertyResolver propertyResolver = 
DatastoreUtils.preparePropertyResolver(config)
+
+            if (!domainClasses) {
+                String packageName = getPackageToScan(config)
+                initializer = new 
HibernateDatastoreSpringInitializer(propertyResolver, packageName)
+            } else {
+                initializer = new 
HibernateDatastoreSpringInitializer(propertyResolver, domainClasses)
+            }
+
+            initializer.beanDefinitions = { ->
+                
dataSource(org.springframework.jdbc.datasource.DriverManagerDataSource) {
+                    driverClassName = 'org.h2.Driver'
+                    url = 'jdbc:h2:mem:test;DB_CLOSE_DELAY=-1'
+                    username = 'sa'
+                    password = ''
+                }
+                hibernateBytecodeProvider(TestGrailsBytecodeProvider)
+            }
 
-        if (!domainClasses) {
-            Package packageToScan = Package.getPackage(packageName) ?: 
getClass().getPackage()
-            hibernateDatastore = new HibernateDatastore((PropertyResolver) 
config, packageToScan)
+            applicationContext = initializer.configure()
         } else {
-            hibernateDatastore = new HibernateDatastore((PropertyResolver) 
config, domainClasses as Class[])
+            System.out.println("HibernateSpec: applicationContext already 
exists (${applicationContext.class.name}), registering beans.")

Review Comment:
   Removed.



##########
grails-data-hibernate7/grails-plugin/src/main/groovy/grails/test/hibernate/HibernateSpec.groovy:
##########
@@ -56,36 +74,124 @@ abstract class HibernateSpec extends Specification {
 
     @Shared @AutoCleanup HibernateDatastore hibernateDatastore
     @Shared PlatformTransactionManager transactionManager
+    @Shared HibernateProxyHandler proxyHandler = new HibernateProxyHandler()
+    @Shared @AutoCleanup('close') ApplicationContext applicationContext
 
-    void setupSpec() {
+    static class TestGrailsBytecodeProvider extends GrailsBytecodeProvider {
 
-        List<PropertySourceLoader> propertySourceLoaders = 
SpringFactoriesLoader.loadFactories(PropertySourceLoader, 
getClass().getClassLoader())
-        ResourceLoader resourceLoader = new DefaultResourceLoader()
-        MutablePropertySources propertySources = new MutablePropertySources()
-        PropertySourceLoader ymlLoader = propertySourceLoaders.find { 
it.getFileExtensions().toList().contains('yml') }
-        if (ymlLoader) {
-            load(resourceLoader, ymlLoader, 'application.yml').each {
-                propertySources.addLast(it)
-            }
-        }
-        PropertySourceLoader groovyLoader = propertySourceLoaders.find { 
it.getFileExtensions().toList().contains('groovy') }
-        if (groovyLoader) {
-            load(resourceLoader, groovyLoader, 'application.groovy').each {
-                propertySources.addLast(it)
+        @Override
+        @CompileStatic(TypeCheckingMode.SKIP)
+        protected ByteBuddyProxyHelper createProxyHelper() {
+            try {
+                def byteBuddyStateClass = 
Class.forName('org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState')
+                def byteBuddyStateConstructor = 
byteBuddyStateClass.getDeclaredConstructor()
+                byteBuddyStateConstructor.setAccessible(true)
+                def byteBuddyState = byteBuddyStateConstructor.newInstance()
+                return new ByteBuddyProxyHelper(byteBuddyState as 
org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState)
+            } catch (e) {
+                throw new RuntimeException('Failed to instantiate 
ByteBuddyState using reflection', e)
             }
         }
-        propertySources.addFirst(new MapPropertySource('defaults', 
getConfiguration()))
-        Config config = new PropertySourcesConfig(propertySources)
+    }
+
+    @CompileStatic(TypeCheckingMode.SKIP)
+    void setupSpec() {
+        Config config
         List<Class> domainClasses = getDomainClasses()
-        String packageName = getPackageToScan(config)
+        HibernateDatastoreSpringInitializer initializer
+
+        if (applicationContext == null) {
+            System.out.println('HibernateSpec: applicationContext is null, 
creating new one.')
+            List<PropertySourceLoader> propertySourceLoaders = 
SpringFactoriesLoader.loadFactories(PropertySourceLoader, 
getClass().getClassLoader())
+            ResourceLoader resourceLoader = new DefaultResourceLoader()
+            MutablePropertySources propertySources = new 
MutablePropertySources()
+            PropertySourceLoader ymlLoader = propertySourceLoaders.find { 
it.getFileExtensions().toList().contains('yml') }
+            if (ymlLoader) {
+                load(resourceLoader, ymlLoader, 'application.yml').each {
+                    propertySources.addLast(it)
+                }
+            }
+            PropertySourceLoader groovyLoader = propertySourceLoaders.find { 
it.getFileExtensions().toList().contains('groovy') }
+            if (groovyLoader) {
+                load(resourceLoader, groovyLoader, 'application.groovy').each {
+                    propertySources.addLast(it)
+                }
+            }
+            propertySources.addFirst(new MapPropertySource('defaults', 
getConfiguration()))
+            config = new PropertySourcesConfig(propertySources)
+            PropertyResolver propertyResolver = 
DatastoreUtils.preparePropertyResolver(config)
+
+            if (!domainClasses) {
+                String packageName = getPackageToScan(config)
+                initializer = new 
HibernateDatastoreSpringInitializer(propertyResolver, packageName)
+            } else {
+                initializer = new 
HibernateDatastoreSpringInitializer(propertyResolver, domainClasses)
+            }
+
+            initializer.beanDefinitions = { ->
+                
dataSource(org.springframework.jdbc.datasource.DriverManagerDataSource) {
+                    driverClassName = 'org.h2.Driver'
+                    url = 'jdbc:h2:mem:test;DB_CLOSE_DELAY=-1'
+                    username = 'sa'
+                    password = ''
+                }
+                hibernateBytecodeProvider(TestGrailsBytecodeProvider)
+            }
 
-        if (!domainClasses) {
-            Package packageToScan = Package.getPackage(packageName) ?: 
getClass().getPackage()
-            hibernateDatastore = new HibernateDatastore((PropertyResolver) 
config, packageToScan)
+            applicationContext = initializer.configure()
         } else {
-            hibernateDatastore = new HibernateDatastore((PropertyResolver) 
config, domainClasses as Class[])
+            System.out.println("HibernateSpec: applicationContext already 
exists (${applicationContext.class.name}), registering beans.")
+            // Context already exists (e.g. from ControllerUnitTest), register 
our beans into it
+            try {
+                config = applicationContext.getBean('grailsConfig', Config)
+            } catch (e) {
+                // Fallback: create a new config if grailsConfig bean is 
missing
+                System.out.println('HibernateSpec: grailsConfig bean not 
found, creating fallback.')

Review Comment:
   Removed.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to