From 5a74b8a7384d38ba63a210a16ce20aa29bc453bb Mon Sep 17 00:00:00 2001 From: Gavin King Date: Thu, 2 Jan 2025 22:54:08 +0100 Subject: [PATCH] HHH-18714 add an explicit type check instead of the cast to raw also: - get rid another use of a raw type and warning suppression - change Boolean -> boolean --- .../domain/internal/JpaMetamodelImpl.java | 97 +++++++------------ 1 file changed, 37 insertions(+), 60 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java index bf8b133df9a8..13359f68454e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java @@ -21,6 +21,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; +import org.hibernate.AnnotationException; import org.hibernate.boot.model.NamedEntityGraphDefinition; import org.hibernate.boot.query.NamedQueryDefinition; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; @@ -501,7 +502,7 @@ private void applyNamedEntityGraphs(Collection named } final NamedEntityGraph namedEntityGraph = definition.getAnnotation(); - final RootGraphImpl entityGraph = + final RootGraphImplementor entityGraph = createEntityGraph( namedEntityGraph, definition.getRegisteredName(), @@ -513,24 +514,26 @@ private void applyNamedEntityGraphs(Collection named } } - private RootGraphImpl createEntityGraph( + private RootGraphImplementor createEntityGraph( NamedEntityGraph namedEntityGraph, String registeredName, EntityDomainType entityType, boolean includeAllAttributes) { - final RootGraphImpl entityGraph = + final RootGraphImplementor entityGraph = createRootGraph( registeredName, entityType, includeAllAttributes ); if ( namedEntityGraph.subclassSubgraphs() != null ) { - for ( var subclassSubgraph : namedEntityGraph.subclassSubgraphs() ) { - GraphImplementor subgraph = (GraphImplementor) entityGraph.addTreatedSubgraph( - (Class) subclassSubgraph.type() ); - - applyNamedAttributeNodes( - subclassSubgraph.attributeNodes(), - namedEntityGraph, - subgraph - ); + for ( NamedSubgraph subclassSubgraph : namedEntityGraph.subclassSubgraphs() ) { + final Class subgraphType = subclassSubgraph.type(); + final Class graphJavaType = entityGraph.getGraphedType().getJavaType(); + if ( !graphJavaType.isAssignableFrom( subgraphType ) ) { + throw new AnnotationException( "Named subgraph type '" + subgraphType.getName() + + "' is not a subtype of the graph type '" + graphJavaType.getName() + "'" ); + } + @SuppressWarnings("unchecked") // Safe, because we just checked + final Class subtype = (Class) subgraphType; + final GraphImplementor subgraph = entityGraph.addTreatedSubgraph( subtype ); + applyNamedAttributeNodes( subclassSubgraph.attributeNodes(), namedEntityGraph, subgraph ); } } @@ -541,7 +544,7 @@ private RootGraphImpl createEntityGraph( return entityGraph; } - private static RootGraphImpl createRootGraph( + private static RootGraphImplementor createRootGraph( String name, EntityDomainType entityType, boolean includeAllAttributes) { final RootGraphImpl entityGraph = new RootGraphImpl<>( name, entityType ); if ( includeAllAttributes ) { @@ -558,8 +561,8 @@ private void applyNamedAttributeNodes( GraphImplementor graphNode) { for ( NamedAttributeNode namedAttributeNode : namedAttributeNodes ) { final String value = namedAttributeNode.value(); - final AttributeNodeImplementor attributeNode = (AttributeNodeImplementor) graphNode.addAttributeNode( - value ); + final AttributeNodeImplementor attributeNode = + (AttributeNodeImplementor) graphNode.addAttributeNode( value ); if ( isNotEmpty( namedAttributeNode.subgraph() ) ) { applyNamedSubgraphs( @@ -580,43 +583,36 @@ private void applyNamedAttributeNodes( } } - @SuppressWarnings({ "unchecked", "rawtypes" }) private void applyNamedSubgraphs( NamedEntityGraph namedEntityGraph, String subgraphName, - AttributeNodeImplementor attributeNode, Boolean isKeySubGraph) { + AttributeNodeImplementor attributeNode, + boolean isKeySubGraph) { for ( NamedSubgraph namedSubgraph : namedEntityGraph.subgraphs() ) { if ( subgraphName.equals( namedSubgraph.name() ) ) { - final var isDefaultSubgraphType = namedSubgraph.type().equals( void.class ); - final Class subGraphType = isDefaultSubgraphType ? null : namedSubgraph.type(); - - final SubGraphImplementor subgraph = makeAttributeNodeSubgraph( - attributeNode, isKeySubGraph, - subGraphType - ); - - applyNamedAttributeNodes( - namedSubgraph.attributeNodes(), - namedEntityGraph, - subgraph - ); + final boolean isDefaultSubgraphType = namedSubgraph.type().equals( void.class ); + final Class subGraphType = isDefaultSubgraphType ? null : namedSubgraph.type(); + final SubGraphImplementor subgraph = + makeAttributeNodeSubgraph( attributeNode, isKeySubGraph, subGraphType ); + applyNamedAttributeNodes( namedSubgraph.attributeNodes(), namedEntityGraph, subgraph ); } } } private static SubGraphImplementor makeAttributeNodeSubgraph( AttributeNodeImplementor attributeNode, - Boolean isKeySubGraph, - Class subGraphType) { - + boolean isKeySubGraph, + Class subGraphType) { if ( isKeySubGraph ) { - return subGraphType != null ? attributeNode.makeKeySubGraph( subGraphType ) + return subGraphType != null + ? attributeNode.makeKeySubGraph( subGraphType ) : attributeNode.makeKeySubGraph(); } - - return subGraphType != null ? - attributeNode.makeSubGraph( subGraphType ) : - attributeNode.makeSubGraph(); + else { + return subGraphType != null + ? attributeNode.makeSubGraph( subGraphType ) + : attributeNode.makeSubGraph(); + } } private Class resolveRequestedClass(String entityName) { @@ -783,30 +779,11 @@ public void processJpa( private void populateStaticMetamodel(MetadataImplementor bootMetamodel, MetadataContext context) { bootMetamodel.visitNamedHqlQueryDefinitions( definition - -> injectTypedQueryReference( - definition, - namedQueryMetamodelClass( - definition, - context - ) - ) ); + -> injectTypedQueryReference( definition, namedQueryMetamodelClass( definition, context ) ) ); bootMetamodel.visitNamedNativeQueryDefinitions( definition - -> injectTypedQueryReference( - definition, - namedQueryMetamodelClass( - definition, - context - ) - ) ); + -> injectTypedQueryReference( definition, namedQueryMetamodelClass( definition, context ) ) ); bootMetamodel.getNamedEntityGraphs().values().forEach( definition - -> injectEntityGraph( - definition, - graphMetamodelClass( - definition, - context - ), - this - ) ); + -> injectEntityGraph( definition, graphMetamodelClass( definition, context ), this ) ); } private Class namedQueryMetamodelClass(NamedQueryDefinition definition, MetadataContext context) {