Skip to content

Commit 2b30994

Browse files
committed
#83 - Add more "metadata" to ClassDetails
1 parent 1bf76b6 commit 2b30994

File tree

8 files changed

+137
-10
lines changed

8 files changed

+137
-10
lines changed

src/main/java/org/hibernate/models/internal/SimpleClassDetails.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,16 @@ public boolean isAbstract() {
8585
return ModifierUtils.isAbstract( clazz.getModifiers() );
8686
}
8787

88+
@Override
89+
public boolean isInterface() {
90+
return clazz.isInterface();
91+
}
92+
93+
@Override
94+
public boolean isEnum() {
95+
return clazz.isEnum();
96+
}
97+
8898
@Override
8999
public boolean isRecord() {
90100
return clazz.isRecord();

src/main/java/org/hibernate/models/internal/dynamic/DynamicClassDetails.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,18 @@ public boolean isAbstract() {
9999
return isAbstract;
100100
}
101101

102+
@Override
103+
public boolean isInterface() {
104+
// we never consider dynamic classes as interfaces
105+
return false;
106+
}
107+
108+
@Override
109+
public boolean isEnum() {
110+
// a dynamic enum makes no sense
111+
return false;
112+
}
113+
102114
@Override
103115
public boolean isRecord() {
104116
return false;

src/main/java/org/hibernate/models/internal/jandex/JandexClassDetails.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,16 @@ public boolean isAbstract() {
134134
return Modifier.isAbstract( classInfo.flags() );
135135
}
136136

137+
@Override
138+
public boolean isInterface() {
139+
return classInfo.isInterface();
140+
}
141+
142+
@Override
143+
public boolean isEnum() {
144+
return classInfo.isEnum();
145+
}
146+
137147
@Override
138148
public boolean isRecord() {
139149
return classInfo.isRecord();

src/main/java/org/hibernate/models/internal/jdk/JdkClassDetails.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ public class JdkClassDetails extends AbstractJdkAnnotationTarget implements Clas
4040
private final Class<?> managedClass;
4141

4242
private final ClassDetails superClass;
43-
private TypeDetails genericSuperType;
4443
private List<TypeDetails> interfaces;
44+
private TypeDetails genericSuperType;
4545
private List<TypeVariableDetails> typeParameters;
4646

4747
private List<FieldDetails> fields;
@@ -61,19 +61,20 @@ public JdkClassDetails(
6161
super( managedClass::getAnnotations, modelContext );
6262
this.name = name;
6363
this.managedClass = managedClass;
64+
this.superClass = determineSuperClass( managedClass, modelContext );
65+
}
6466

65-
final ClassDetailsRegistry classDetailsRegistry = modelContext.getClassDetailsRegistry();
66-
67+
private static ClassDetails determineSuperClass(Class<?> managedClass, SourceModelBuildingContext modelContext) {
6768
final Class<?> superclass = managedClass.getSuperclass();
6869
if ( superclass == null ) {
69-
superClass = null;
70-
}
71-
else {
72-
superClass = classDetailsRegistry.resolveClassDetails(
73-
superclass.getName(),
74-
(n) -> JdkBuilders.buildClassDetailsStatic( superclass, modelContext )
75-
);
70+
return null;
7671
}
72+
73+
final ClassDetailsRegistry classDetailsRegistry = modelContext.getClassDetailsRegistry();
74+
return classDetailsRegistry.resolveClassDetails(
75+
superclass.getName(),
76+
(n) -> JdkBuilders.buildClassDetailsStatic( superclass, modelContext )
77+
);
7778
}
7879

7980
@Override
@@ -102,6 +103,16 @@ public boolean isAbstract() {
102103
return Modifier.isAbstract( managedClass.getModifiers() );
103104
}
104105

106+
@Override
107+
public boolean isInterface() {
108+
return managedClass.isInterface();
109+
}
110+
111+
@Override
112+
public boolean isEnum() {
113+
return managedClass.isEnum();
114+
}
115+
105116
@Override
106117
public boolean isRecord() {
107118
return managedClass.isRecord();

src/main/java/org/hibernate/models/spi/ClassDetails.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ default Kind getKind() {
7878
*/
7979
boolean isAbstract();
8080

81+
/**
82+
* Whether this class is an interface
83+
*/
84+
boolean isInterface();
85+
86+
/**
87+
* Whether this class is an enum
88+
*/
89+
boolean isEnum();
90+
8191
/**
8292
* Where the class is a Java record
8393
*/
@@ -88,6 +98,9 @@ default Kind getKind() {
8898
*/
8999
ClassDetails getSuperClass();
90100

101+
/**
102+
* Generic type information for this class.
103+
*/
91104
TypeDetails getGenericSuperType();
92105

93106
/**
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
* Copyright: Red Hat Inc. and Hibernate Authors
6+
*/
7+
8+
package org.hibernate.models.classes;
9+
10+
/**
11+
* @author Steve Ebersole
12+
*/
13+
public enum AnEnum {
14+
A,B,C
15+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
* Copyright: Red Hat Inc. and Hibernate Authors
6+
*/
7+
8+
package org.hibernate.models.classes;
9+
10+
import org.hibernate.models.SourceModelTestHelper;
11+
import org.hibernate.models.internal.SourceModelBuildingContextImpl;
12+
import org.hibernate.models.spi.ClassDetails;
13+
import org.hibernate.models.spi.ClassDetailsRegistry;
14+
15+
import org.junit.jupiter.api.Test;
16+
17+
import org.jboss.jandex.Index;
18+
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
21+
/**
22+
* @author Steve Ebersole
23+
*/
24+
public class EnumTests {
25+
@Test
26+
void basicEnumTestWithJandex() {
27+
final Index index = SourceModelTestHelper.buildJandexIndex( AnEnum.class );
28+
basicEnumTest( index );
29+
}
30+
31+
@Test
32+
void basicRootTestWithoutJandex() {
33+
basicEnumTest( null );
34+
}
35+
36+
private void basicEnumTest(Index index) {
37+
final SourceModelBuildingContextImpl buildingContext = SourceModelTestHelper.createBuildingContext(
38+
index,
39+
AnEnum.class
40+
);
41+
final ClassDetailsRegistry classDetailsRegistry = buildingContext.getClassDetailsRegistry();
42+
43+
final ClassDetails enumClassDetails = classDetailsRegistry.getClassDetails( AnEnum.class.getName() );
44+
assertThat( enumClassDetails.isEnum() ).isTrue();
45+
assertThat( enumClassDetails.isRecord() ).isFalse();
46+
assertThat( enumClassDetails.isInterface() ).isFalse();
47+
assertThat( enumClassDetails.isAbstract() ).isFalse();
48+
}
49+
}

src/test/java/org/hibernate/models/classes/InheritanceTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ void testIsImplementorWithoutJandex() {
175175
private void testIsImplementor(Index index) {
176176
final SourceModelBuildingContextImpl buildingContext = SourceModelTestHelper.createBuildingContext(
177177
index,
178+
Intf.class,
178179
RootClass.class,
179180
TrunkClass.class,
180181
BranchClass.class,
@@ -185,12 +186,18 @@ private void testIsImplementor(Index index) {
185186
final ClassDetails rootClassDetails = classDetailsRegistry.getClassDetails( RootClass.class.getName() );
186187
assertThat( rootClassDetails.isImplementor( Intf.class ) ).isFalse();
187188
assertThat( rootClassDetails.getSuperClass() ).isSameAs( ClassDetails.OBJECT_CLASS_DETAILS );
189+
assertThat( rootClassDetails.isInterface() ).isFalse();
188190

189191
final ClassDetails branchClassDetails = classDetailsRegistry.getClassDetails( BranchClass.class.getName() );
190192
assertThat( branchClassDetails.isImplementor( Intf.class ) ).isTrue();
193+
assertThat( branchClassDetails.isInterface() ).isFalse();
191194

192195
final ClassDetails leafClassDetails = classDetailsRegistry.getClassDetails( LeafClass.class.getName() );
193196
assertThat( leafClassDetails.isImplementor( Intf.class ) ).isTrue();
197+
assertThat( leafClassDetails.isInterface() ).isFalse();
198+
199+
final ClassDetails interfaceDetails = classDetailsRegistry.getClassDetails( Intf.class.getName() );
200+
assertThat( interfaceDetails.isInterface() ).isTrue();
194201
}
195202

196203
@Test

0 commit comments

Comments
 (0)