Skip to content

Commit 00680b3

Browse files
mbelladesebersole
authored andcommitted
HHH-18541 Migrate hibernate-envers from hcann to hibernate-models
1 parent f1d7d86 commit 00680b3

File tree

14 files changed

+382
-427
lines changed

14 files changed

+382
-427
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/convert/internal/ConverterHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ else if ( member instanceof Field ) {
6565
}
6666
}
6767
else {
68-
throw new HibernateException( "Unexpected java.lang.reflect.Member type from org.hibernate.annotations.common.reflection.java.JavaXMember : " + member );
68+
throw new HibernateException( "Unexpected java.lang.reflect.Member type from org.hibernate.models.spi.MemberDetails : " + member );
6969
}
7070

7171
throw new HibernateException(

hibernate-envers/hibernate-envers.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ dependencies {
1717
implementation jakartaLibs.jaxbApi
1818
implementation jakartaLibs.jaxb
1919
implementation libs.jandex
20-
implementation libs.hcann
20+
implementation libs.hibernateModels
2121

2222
compileOnly libs.ant
2323

hibernate-envers/src/main/java/org/hibernate/envers/boot/internal/EnversMetadataBuildingContextImpl.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@
66
*/
77
package org.hibernate.envers.boot.internal;
88

9-
import org.hibernate.annotations.common.reflection.ReflectionManager;
109
import org.hibernate.boot.model.TypeDefinitionRegistry;
1110
import org.hibernate.boot.model.naming.ObjectNameNormalizer;
1211
import org.hibernate.boot.spi.BootstrapContext;
1312
import org.hibernate.boot.spi.EffectiveMappingDefaults;
1413
import org.hibernate.boot.spi.InFlightMetadataCollector;
15-
import org.hibernate.boot.spi.MetadataBuildingContext;
1614
import org.hibernate.boot.spi.MetadataBuildingOptions;
1715
import org.hibernate.envers.boot.spi.EnversMetadataBuildingContext;
1816
import org.hibernate.envers.configuration.Configuration;
1917
import org.hibernate.envers.configuration.internal.MappingCollector;
2018
import org.hibernate.envers.configuration.internal.metadata.AuditEntityConfigurationRegistry;
2119
import org.hibernate.envers.configuration.internal.metadata.AuditEntityNameRegister;
20+
import org.hibernate.models.spi.ClassDetailsRegistry;
21+
import org.hibernate.models.spi.SourceModelBuildingContext;
2222
import org.hibernate.service.ServiceRegistry;
2323

2424
/**
@@ -102,8 +102,13 @@ public ServiceRegistry getServiceRegistry() {
102102
}
103103

104104
@Override
105-
public ReflectionManager getReflectionManager() {
106-
return configuration.getReflectionManager();
105+
public SourceModelBuildingContext getSourceModelBuildingContext() {
106+
return metadataCollector.getSourceModelBuildingContext();
107+
}
108+
109+
@Override
110+
public ClassDetailsRegistry getClassDetailsRegistry() {
111+
return metadataCollector.getClassDetailsRegistry();
107112
}
108113

109114
@Override

hibernate-envers/src/main/java/org/hibernate/envers/boot/internal/EnversServiceImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,19 +98,20 @@ public void initialize(
9898

9999
initialized = true;
100100

101+
final InFlightMetadataCollector metadataCollector = (InFlightMetadataCollector) metadata;
101102
this.serviceRegistry = metadata.getMetadataBuildingOptions().getServiceRegistry();
102103
this.classLoaderService = serviceRegistry.getService( ClassLoaderService.class );
103104

104105
final ConfigurationService cfgService = serviceRegistry.getService( ConfigurationService.class );
105106
final Properties properties = new Properties();
106107
properties.putAll( cfgService.getSettings() );
107108

108-
this.configuration = new Configuration( properties, this, metadata );
109+
this.configuration = new Configuration( properties, this, metadataCollector );
109110
this.auditProcessManager = new AuditProcessManager( configuration.getRevisionInfo().getRevisionInfoGenerator() );
110111

111112
final EnversMetadataBuildingContext metadataBuildingContext = new EnversMetadataBuildingContextImpl(
112113
configuration,
113-
(InFlightMetadataCollector) metadata,
114+
metadataCollector,
114115
effectiveMappingDefaults,
115116
mappingCollector
116117
);

hibernate-envers/src/main/java/org/hibernate/envers/boot/spi/EnversMetadataBuildingContext.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
*/
77
package org.hibernate.envers.boot.spi;
88

9-
import org.hibernate.annotations.common.reflection.ReflectionManager;
109
import org.hibernate.boot.spi.MetadataBuildingContext;
1110
import org.hibernate.envers.configuration.Configuration;
1211
import org.hibernate.envers.configuration.internal.MappingCollector;
1312
import org.hibernate.envers.configuration.internal.metadata.AuditEntityConfigurationRegistry;
1413
import org.hibernate.envers.configuration.internal.metadata.AuditEntityNameRegister;
14+
import org.hibernate.models.spi.ClassDetailsRegistry;
15+
import org.hibernate.models.spi.SourceModelBuildingContext;
1516
import org.hibernate.service.ServiceRegistry;
1617

1718
/**
@@ -26,7 +27,9 @@ public interface EnversMetadataBuildingContext extends MetadataBuildingContext {
2627

2728
ServiceRegistry getServiceRegistry();
2829

29-
ReflectionManager getReflectionManager();
30+
SourceModelBuildingContext getSourceModelBuildingContext();
31+
32+
ClassDetailsRegistry getClassDetailsRegistry();
3033

3134
AuditEntityNameRegister getAuditEntityNameRegistry();
3235

hibernate-envers/src/main/java/org/hibernate/envers/configuration/Configuration.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,9 @@
1111
import java.util.Properties;
1212
import java.util.concurrent.Callable;
1313

14-
import org.hibernate.annotations.common.reflection.ReflectionManager;
15-
import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
1614
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
1715
import org.hibernate.boot.registry.selector.spi.StrategySelector;
18-
import org.hibernate.boot.spi.MetadataImplementor;
16+
import org.hibernate.boot.spi.InFlightMetadataCollector;
1917
import org.hibernate.cfg.Environment;
2018
import org.hibernate.dialect.HSQLDialect;
2119
import org.hibernate.envers.RevisionListener;
@@ -75,7 +73,6 @@ public class Configuration {
7573
private final boolean globalLegacyRelationTargetNotFound;
7674

7775
private final boolean trackEntitiesChanged;
78-
private final JavaReflectionManager reflectionManager;
7976
private boolean trackEntitiesOverride;
8077

8178
private final String auditTablePrefix;
@@ -98,7 +95,7 @@ public class Configuration {
9895

9996
private final RevisionInfoConfiguration revisionInfo;
10097

101-
public Configuration(Properties properties, EnversService enversService, MetadataImplementor metadata) {
98+
public Configuration(Properties properties, EnversService enversService, InFlightMetadataCollector metadata) {
10299
this.enversService = enversService;
103100

104101
final ConfigurationProperties configProps = new ConfigurationProperties( properties );
@@ -185,14 +182,7 @@ public Configuration(Properties properties, EnversService enversService, Metadat
185182
revisionPropertyBasePath = originalIdPropertyName + "." + revisionFieldName + ".";
186183
revisionNumberPath = revisionPropertyBasePath + "id";
187184

188-
// todo: there are places that need bits built from the revinfo entity configuration
189-
// this exists here as a way to pass it down in an immutable way to any consumer of this class
190-
this.reflectionManager = new JavaReflectionManager();
191-
this.revisionInfo = new RevisionInfoConfiguration( this, metadata, reflectionManager );
192-
}
193-
194-
public JavaReflectionManager getReflectionManager() {
195-
return reflectionManager;
185+
this.revisionInfo = new RevisionInfoConfiguration( this, metadata );
196186
}
197187

198188
public boolean isGenerateRevisionsForCollections() {
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.envers.configuration.internal;
8+
9+
import java.util.List;
10+
11+
import org.hibernate.envers.configuration.internal.metadata.reader.PersistentPropertiesSource;
12+
import org.hibernate.models.internal.ClassTypeDetailsImpl;
13+
import org.hibernate.models.internal.ModifierUtils;
14+
import org.hibernate.models.internal.dynamic.DynamicFieldDetails;
15+
import org.hibernate.models.spi.ClassDetails;
16+
import org.hibernate.models.spi.FieldDetails;
17+
import org.hibernate.models.spi.MemberDetails;
18+
import org.hibernate.models.spi.MethodDetails;
19+
import org.hibernate.models.spi.SourceModelBuildingContext;
20+
import org.hibernate.models.spi.TypeDetails;
21+
22+
/**
23+
* Simple helper class to streamline hibernate-models interactions.
24+
*
25+
* @author Marco Belladelli
26+
*/
27+
public class ModelsHelper {
28+
/**
29+
* Provides a list of the provided class' {@link MemberDetails} based on the provided access type.
30+
*
31+
* @param classDetails The class details to extract the members from
32+
* @param accessType The access type to use, accepted values are {@code field}, {@code property} and {@code record}
33+
*
34+
* @return The list of member details
35+
*/
36+
public static List<? extends MemberDetails> getMemberDetails(ClassDetails classDetails, String accessType) {
37+
return switch ( accessType ) {
38+
case "field" -> classDetails.getFields();
39+
case "property" -> classDetails.getMethods();
40+
case "record" -> classDetails.getRecordComponents();
41+
default -> throw new IllegalArgumentException( "Unknown access type " + accessType );
42+
};
43+
}
44+
45+
/**
46+
* Retrieves the {@link MemberDetails member} of the class, being either the field or the getter,
47+
* with the provided name if one exists, {@code null} otherwise.
48+
*
49+
* @param classDetails The class details containing the desired member
50+
* @param name The name of the member to find
51+
*
52+
* @return The requested member, null if not found
53+
*/
54+
public static MemberDetails getMember(ClassDetails classDetails, String name) {
55+
final FieldDetails field = classDetails.findFieldByName( name );
56+
if ( field != null ) {
57+
return field;
58+
}
59+
60+
for ( MethodDetails method : classDetails.getMethods() ) {
61+
if ( method.resolveAttributeName().equals( name ) ) {
62+
return method;
63+
}
64+
}
65+
66+
return null;
67+
}
68+
69+
/**
70+
* Instantiates a {@link DynamicFieldDetails} from the provided properties source with the specified name
71+
*
72+
* @param propertiesSource The property source containing the virtual field
73+
* @param propertyName The property name of the dynamic field
74+
* @param sourceModelBuildingContext Context object for models
75+
*
76+
* @return The newly created dynamic field details
77+
*/
78+
public static FieldDetails dynamicFieldDetails(
79+
PersistentPropertiesSource propertiesSource,
80+
String propertyName,
81+
SourceModelBuildingContext sourceModelBuildingContext) {
82+
return new DynamicFieldDetails(
83+
propertyName,
84+
new ClassTypeDetailsImpl( propertiesSource.getClassDetails(), TypeDetails.Kind.CLASS ),
85+
propertiesSource.getClassDetails(),
86+
ModifierUtils.DYNAMIC_ATTRIBUTE_MODIFIERS,
87+
false,
88+
false,
89+
sourceModelBuildingContext
90+
);
91+
}
92+
}

0 commit comments

Comments
 (0)