Skip to content

Commit 3cf203b

Browse files
committed
#59 - Add safe cast methods
1 parent 7492b52 commit 3cf203b

25 files changed

+573
-249
lines changed

build.gradle

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@ dependencies {
2323
annotationProcessor libs.logging
2424
annotationProcessor libs.loggingAnnotations
2525

26+
testImplementation jakartaLibs.jpa
2627
testImplementation testLibs.junit5Api
2728
testImplementation testLibs.assertjCore
28-
testImplementation platform( libs.hibernatePlatform )
29-
testImplementation libs.hibernateCore
3029

3130
testRuntimeOnly testLibs.junit5Engine
3231
testRuntimeOnly testLibs.log4j

settings.gradle

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,6 @@ dependencyResolutionManagement {
4646
def classmateVersion = version "classmate", "1.5.1"
4747
library( "classmate", "com.fasterxml", "classmate" ).versionRef( classmateVersion )
4848

49-
def hcannVersion = version "hcann", "6.0.6.Final"
50-
library( "hcann", "org.hibernate.common", "hibernate-commons-annotations" ).versionRef( hcannVersion )
51-
52-
def hibernateVersion = version "hibernateOrm", "7.0.0-SNAPSHOT"
53-
library( "hibernatePlatform", "org.hibernate.orm", "hibernate-platform" ).versionRef( hibernateVersion )
54-
// withoutVersion assuming that the platform is applied
55-
library( "hibernateCore", "org.hibernate.orm", "hibernate-core" ).withoutVersion()
56-
library( "hibernateTesting", "org.hibernate.orm", "hibernate-testing" ).withoutVersion()
57-
5849
def jacksonVersion = version "jackson", "2.14.1"
5950
library( "jackson", "com.fasterxml.jackson.core", "jackson-databind" ).versionRef( jacksonVersion )
6051
library( "jacksonXml", "com.fasterxml.jackson.dataformat", "jackson-dataformat-xml" ).versionRef( jacksonVersion )
@@ -71,8 +62,8 @@ dependencyResolutionManagement {
7162
library( "loggingProcessor", "org.jboss.logging", "jboss-logging-processor" ).versionRef( jbossLoggingToolVersion )
7263
}
7364
jakartaLibs {
74-
// withoutVersion to pick up the version used with Hibernate ORM (libs.hibernatePlatform)
75-
library( "jpa", "jakarta.persistence", "jakarta.persistence-api" ).withoutVersion()
65+
def jpaVersion = version "jpa", "3.2.0-B02"
66+
library( "jpa", "jakarta.persistence", "jakarta.persistence-api" ).versionRef( jpaVersion )
7667

7768
def injectVersion = version "inject", "2.0.1"
7869
def jaxbApiVersion = version "jaxbApi", "4.0.0"
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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;
9+
10+
/**
11+
* @author Steve Ebersole
12+
*/
13+
public class IllegalCastException extends ModelsException {
14+
public IllegalCastException(String message) {
15+
super( message );
16+
}
17+
18+
public IllegalCastException(String message, Throwable cause) {
19+
super( message, cause );
20+
}
21+
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@
1515
import org.hibernate.models.spi.AnnotationUsage;
1616
import org.hibernate.models.spi.FieldDetails;
1717
import org.hibernate.models.spi.MethodDetails;
18-
import org.hibernate.models.spi.MutableAnnotationTarget;
1918
import org.hibernate.models.spi.MutableClassDetails;
2019

2120
/**
2221
* @author Steve Ebersole
2322
*/
24-
public interface ClassDetailsSupport extends MutableClassDetails, AnnotationTargetSupport, MutableAnnotationTarget {
23+
public interface ClassDetailsSupport extends MutableClassDetails, AnnotationTargetSupport {
2524

2625
@Override
2726
default void forEachField(IndexedConsumer<FieldDetails> consumer) {

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@
1010
import java.util.EnumSet;
1111
import java.util.List;
1212

13+
import org.hibernate.models.IllegalCastException;
1314
import org.hibernate.models.internal.AnnotationHelper;
1415
import org.hibernate.models.spi.AnnotationDescriptor;
1516
import org.hibernate.models.spi.AttributeDescriptor;
17+
import org.hibernate.models.spi.MutableClassDetails;
18+
import org.hibernate.models.spi.MutableMemberDetails;
1619
import org.hibernate.models.spi.SourceModelBuildingContext;
1720

1821
import static org.hibernate.models.internal.jdk.JdkBuilders.extractAttributeDescriptors;
@@ -81,4 +84,14 @@ public List<AttributeDescriptor<?>> getAttributes() {
8184
public String getName() {
8285
return annotationType.getName();
8386
}
87+
88+
@Override
89+
public MutableClassDetails asClassDetails() {
90+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to ClassDetails" );
91+
}
92+
93+
@Override
94+
public MutableMemberDetails asMemberDetails() {
95+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to MemberDetails" );
96+
}
8497
}

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.List;
1313
import java.util.function.Consumer;
1414

15+
import org.hibernate.models.IllegalCastException;
1516
import org.hibernate.models.UnknownAnnotationAttributeException;
1617
import org.hibernate.models.internal.dynamic.DynamicAnnotationUsage;
1718

@@ -128,4 +129,35 @@ default MutableAnnotationUsage<A> createUsage(
128129

129130
return usage;
130131
}
132+
133+
@Override
134+
default <X extends Annotation> AnnotationDescriptor<X> asAnnotationDescriptor() {
135+
//noinspection unchecked
136+
return (AnnotationDescriptor<X>) this;
137+
}
138+
139+
@Override
140+
default ClassDetails asClassDetails() {
141+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to a ClassDetails" );
142+
}
143+
144+
@Override
145+
default MemberDetails asMemberDetails() {
146+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to a MemberDetails" );
147+
}
148+
149+
@Override
150+
default FieldDetails asFieldDetails() {
151+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to a FieldDetails" );
152+
}
153+
154+
@Override
155+
default MethodDetails asMethodDetails() {
156+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to a MethodDetails" );
157+
}
158+
159+
@Override
160+
default RecordComponentDetails asRecordComponentDetails() {
161+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to a RecordComponentDetails" );
162+
}
131163
}

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.function.Consumer;
1717

1818
import org.hibernate.models.AnnotationAccessException;
19+
import org.hibernate.models.IllegalCastException;
1920

2021
/**
2122
* Abstract for something where an annotation can be {@linkplain AnnotationUsage used}.
@@ -283,6 +284,48 @@ default <T, A extends Annotation> T fromAnnotations(
283284
return null;
284285
}
285286

287+
/**
288+
* Safe cast method for cases when the {@linkplain #getKind() target} is an {@linkplain Kind#ANNOTATION annotation}.
289+
*
290+
* @throws IllegalCastException If the target is not an annotation
291+
*/
292+
<A extends Annotation> AnnotationDescriptor<A> asAnnotationDescriptor();
293+
294+
/**
295+
* Safe cast method for cases when the {@linkplain #getKind() target} is a {@linkplain Kind#CLASS class}.
296+
*
297+
* @throws IllegalCastException If the target is not a class
298+
*/
299+
ClassDetails asClassDetails();
300+
301+
/**
302+
* Safe cast method for cases when the {@linkplain #getKind() target} is a {@linkplain Kind#FIELD field}, {@linkplain Kind#METHOD method} or {@linkplain Kind#RECORD_COMPONENT record component}.
303+
*
304+
* @throws IllegalCastException If the target is not a member
305+
*/
306+
MemberDetails asMemberDetails();
307+
308+
/**
309+
* Safe cast method for cases when the {@linkplain #getKind() target} is a {@linkplain Kind#FIELD field}.
310+
*
311+
* @throws IllegalCastException If the target is not a field
312+
*/
313+
FieldDetails asFieldDetails();
314+
315+
/**
316+
* Safe cast method for cases when the {@linkplain #getKind() target} is a {@linkplain Kind#METHOD method}.
317+
*
318+
* @throws IllegalCastException If the target is not a method
319+
*/
320+
MethodDetails asMethodDetails();
321+
322+
/**
323+
* Safe cast method for cases when the {@linkplain #getKind() target} is a {@linkplain Kind#RECORD_COMPONENT record component}.
324+
*
325+
* @throws IllegalCastException If the target is not a record component
326+
*/
327+
RecordComponentDetails asRecordComponentDetails();
328+
286329
/**
287330
* Subset of {@linkplain ElementType annotation targets} supported for mapping annotations
288331
*/

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
*/
77
package org.hibernate.models.spi;
88

9+
import java.lang.annotation.Annotation;
910
import java.util.List;
1011
import java.util.function.Predicate;
1112

13+
import org.hibernate.models.IllegalCastException;
1214
import org.hibernate.models.internal.SimpleClassDetails;
1315
import org.hibernate.models.internal.util.IndexedConsumer;
1416

@@ -238,4 +240,34 @@ default RecordComponentDetails findRecordComponentByName(String name) {
238240
* Know what you are doing before calling this method
239241
*/
240242
<X> Class<X> toJavaClass();
243+
244+
@Override
245+
default ClassDetails asClassDetails() {
246+
return this;
247+
}
248+
249+
@Override
250+
default <A extends Annotation> AnnotationDescriptor<A> asAnnotationDescriptor() {
251+
throw new IllegalCastException( "ClassDetails cannot be cast to AnnotationDescriptor" );
252+
}
253+
254+
@Override
255+
default MemberDetails asMemberDetails() {
256+
throw new IllegalCastException( "ClassDetails cannot be cast to MemberDescriptor" );
257+
}
258+
259+
@Override
260+
default FieldDetails asFieldDetails() {
261+
throw new IllegalCastException( "ClassDetails cannot be cast to FieldDetails" );
262+
}
263+
264+
@Override
265+
default MethodDetails asMethodDetails() {
266+
throw new IllegalCastException( "ClassDetails cannot be cast to MethodDetails" );
267+
}
268+
269+
@Override
270+
default RecordComponentDetails asRecordComponentDetails() {
271+
throw new IllegalCastException( "ClassDetails cannot be cast to RecordComponentDetails" );
272+
}
241273
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package org.hibernate.models.spi;
88

9+
import org.hibernate.models.IllegalCastException;
910
import org.hibernate.models.internal.ModifierUtils;
1011

1112
/**
@@ -28,4 +29,19 @@ default String resolveAttributeName() {
2829
default boolean isPersistable() {
2930
return ModifierUtils.hasPersistableFieldModifiers( getModifiers() );
3031
}
32+
33+
@Override
34+
default FieldDetails asFieldDetails() {
35+
return this;
36+
}
37+
38+
@Override
39+
default MethodDetails asMethodDetails() {
40+
throw new IllegalCastException( "FieldDetails cannot be cast to MethodDetails" );
41+
}
42+
43+
@Override
44+
default RecordComponentDetails asRecordComponentDetails() {
45+
throw new IllegalCastException( "FieldDetails cannot be cast to RecordComponentDetails" );
46+
}
3147
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
*/
77
package org.hibernate.models.spi;
88

9+
import java.lang.annotation.Annotation;
910
import java.lang.reflect.Member;
1011
import java.util.Collection;
1112
import java.util.Map;
1213

14+
import org.hibernate.models.IllegalCastException;
1315
import org.hibernate.models.internal.CollectionElementSwitch;
1416
import org.hibernate.models.internal.MapKeySwitch;
1517
import org.hibernate.models.internal.MapValueSwitch;
@@ -262,6 +264,22 @@ default ClassBasedTypeDetails resolveRelativeClassType(TypeVariableScope contain
262264
return TypeDetailsHelper.resolveRelativeClassType( getType(), container );
263265
}
264266

267+
268+
@Override
269+
default MemberDetails asMemberDetails() {
270+
return this;
271+
}
272+
273+
@Override
274+
default <A extends Annotation> AnnotationDescriptor<A> asAnnotationDescriptor() {
275+
throw new IllegalCastException( "MemberDetails cannot be cast to an AnnotationDescriptor" );
276+
}
277+
278+
@Override
279+
default ClassDetails asClassDetails() {
280+
throw new IllegalCastException( "MemberDetails cannot be cast to a ClassDetails" );
281+
}
282+
265283
enum Visibility {
266284
PUBLIC,
267285
PROTECTED,

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import java.beans.Introspector;
1010
import java.util.List;
1111

12+
import org.hibernate.models.IllegalCastException;
13+
1214
import static org.hibernate.models.internal.ModifierUtils.hasPersistableMethodModifiers;
1315

1416
/**
@@ -53,4 +55,19 @@ else if ( methodName.startsWith( "get" ) ) {
5355

5456
return null;
5557
}
58+
59+
@Override
60+
default FieldDetails asFieldDetails() {
61+
throw new IllegalCastException( "MethodDetails cannot be cast to FieldDetails" );
62+
}
63+
64+
@Override
65+
default MethodDetails asMethodDetails() {
66+
return this;
67+
}
68+
69+
@Override
70+
default RecordComponentDetails asRecordComponentDetails() {
71+
throw new IllegalCastException( "MethodDetails cannot be cast to RecordComponentDetails" );
72+
}
5673
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,10 @@ default <A extends Annotation> MutableAnnotationUsage<A> applyAnnotationUsage(
5757
addAnnotationUsage( usage );
5858
return usage;
5959
}
60+
61+
@Override
62+
MutableClassDetails asClassDetails();
63+
64+
@Override
65+
MutableMemberDetails asMemberDetails();
6066
}

0 commit comments

Comments
 (0)