Skip to content

Commit d104e7c

Browse files
committed
attempt to sort out mess of qualified vs unqualified names
this stuff has been driving @cigaly nuts incorporates test case from @cigaly
1 parent 0221a94 commit d104e7c

File tree

9 files changed

+184
-91
lines changed

9 files changed

+184
-91
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,7 @@ public <X> ManagedDomainType<X> managedType(String typeName) {
154154
return null;
155155
}
156156
final ManagedDomainType<?> managedType = managedTypeByName.get( entityName );
157-
if ( !( managedType instanceof EntityDomainType<?> entityDomainType ) ) {
158-
return null;
159-
}
160-
return entityDomainType;
157+
return managedType instanceof EntityDomainType<?> entityDomainType ? entityDomainType : null;
161158
}
162159

163160
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.processor.test.data.processingorder;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.ManyToOne;
10+
11+
@Entity
12+
public class Post {
13+
@Id
14+
Integer id;
15+
16+
String posterId;
17+
18+
@ManyToOne
19+
protected Topic topic;
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.processor.test.data.processingorder;
6+
7+
import jakarta.data.repository.DataRepository;
8+
import jakarta.data.repository.Query;
9+
import jakarta.data.repository.Repository;
10+
11+
import java.util.List;
12+
13+
@Repository
14+
public interface PostRepository extends DataRepository<Post, Integer> {
15+
16+
@Query("from Post p where p.topic=:topic")
17+
List<Post> getPostsByTopic(Topic topic);
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.processor.test.data.processingorder;
6+
7+
import org.hibernate.processor.test.util.CompilationTest;
8+
import org.hibernate.processor.test.util.WithClasses;
9+
import org.junit.Test;
10+
11+
import java.lang.reflect.Method;
12+
import java.lang.reflect.ParameterizedType;
13+
import java.util.List;
14+
15+
import static org.hibernate.processor.test.util.TestUtil.assertMetamodelClassGeneratedFor;
16+
import static org.hibernate.processor.test.util.TestUtil.assertPresenceOfMethodInMetamodelFor;
17+
import static org.hibernate.processor.test.util.TestUtil.getMethodFromMetamodelFor;
18+
import static org.junit.jupiter.api.Assertions.assertEquals;
19+
import static org.junit.jupiter.api.Assertions.fail;
20+
21+
public class ProcessingOrderTest extends CompilationTest {
22+
@Test
23+
@WithClasses({Post.class, PostRepository.class, Topic.class})
24+
public void test() {
25+
assertMetamodelClassGeneratedFor( PostRepository.class );
26+
27+
assertPresenceOfMethodInMetamodelFor( PostRepository.class, "getPostsByTopic", Topic.class );
28+
final Method method = getMethodFromMetamodelFor( PostRepository.class, "getPostsByTopic", Topic.class );
29+
assertEquals( Topic.class, method.getParameterTypes()[0] );
30+
if ( method.getGenericReturnType() instanceof ParameterizedType parameterizedType ) {
31+
assertEquals( List.class, parameterizedType.getRawType() );
32+
assertEquals( Post.class, parameterizedType.getActualTypeArguments()[0] );
33+
}
34+
else {
35+
fail();
36+
}
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.processor.test.data.processingorder;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.OneToMany;
10+
import jakarta.persistence.OrderBy;
11+
12+
import java.util.List;
13+
14+
@Entity
15+
public class Topic {
16+
@Id
17+
Integer id;
18+
19+
@OneToMany(mappedBy = "topic", targetEntity = Post.class)
20+
@OrderBy
21+
private List<Post> posts;
22+
23+
}

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2723,11 +2723,12 @@ private boolean checkReturnedEntity(EntityDomainType<?> model, TypeMirror return
27232723
if ( returnType.getKind() == TypeKind.DECLARED ) {
27242724
final DeclaredType declaredType = (DeclaredType) returnType;
27252725
final TypeElement typeElement = (TypeElement) declaredType.asElement();
2726-
final AnnotationMirror mirror = getAnnotationMirror(typeElement, ENTITY );
2727-
if ( mirror != null ) {
2728-
final String entityName = entityName(declaredType, mirror);
2729-
return model.getHibernateEntityName().equals( entityName );
2730-
}
2726+
// final AnnotationMirror mirror = getAnnotationMirror(typeElement, ENTITY );
2727+
// if ( mirror != null ) {
2728+
// message( element, "entity return type '" + typeElement.getQualifiedName()
2729+
// + "' was not annotated '@Entity'", Diagnostic.Kind.WARNING );
2730+
// }
2731+
return typeElement.getQualifiedName().contentEquals( model.getHibernateEntityName() );
27312732
}
27322733
return false;
27332734
}

tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java

Lines changed: 36 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@
122122
import org.hibernate.type.descriptor.jdbc.ObjectJdbcType;
123123
import org.hibernate.type.spi.TypeConfiguration;
124124

125-
import javax.lang.model.element.TypeElement;
126125
import java.util.HashMap;
127126
import java.util.List;
128127
import java.util.Map;
@@ -281,16 +280,16 @@ static CollectionType createCollectionType(String role, String name) {
281280
*/
282281
abstract MockCollectionPersister createMockCollectionPersister(String role);
283282

284-
abstract boolean isEntityDefined(String entityName);
283+
abstract boolean isEntityDefined(String jpaEntityName);
285284

286-
abstract TypeElement findEntityClass(String entityName);
287-
288-
abstract String qualifyName(String entityName);
285+
abstract String qualifyName(String jpaEntityName);
289286

290287
abstract boolean isAttributeDefined(String entityName, String fieldName);
291288

292289
abstract boolean isClassDefined(String qualifiedName);
293290

291+
protected abstract boolean isEntity(String entityName);
292+
294293
abstract boolean isEnum(String className);
295294

296295
abstract boolean isEnumConstant(String className, String terminal);
@@ -809,22 +808,16 @@ public MockJpaMetamodelImpl() {
809808
}
810809

811810
@Override
812-
public EntityDomainType<?> entity(String entityName) {
813-
if ( isEntityDefined(entityName) ) {
814-
final TypeElement entityClass = findEntityClass( entityName );
815-
final String entityTypeName = entityClass == null ? entityName : entityClass.getQualifiedName().toString();
816-
return new MockEntityDomainType<>(entityName, new MockJavaType<>( entityTypeName ));
811+
public @Nullable EntityDomainType<?> findEntityType(@Nullable String jpaEntityName) {
812+
final String entityTypeName = qualifyName(jpaEntityName);
813+
if ( entityTypeName != null ) {
814+
return new MockEntityDomainType<>(new MockJavaType<>(entityTypeName), jpaEntityName);
817815
}
818816
else {
819817
return null;
820818
}
821819
}
822820

823-
@Override
824-
public @Nullable EntityDomainType<?> findEntityType(@Nullable String entityName) {
825-
return entity( entityName );
826-
}
827-
828821
@Override
829822
public String qualifyImportableName(String queryName) {
830823
if (isClassDefined(queryName)) {
@@ -838,45 +831,22 @@ else if (isEntityDefined(queryName)) {
838831
}
839832
}
840833

841-
@Override
842-
public <X> ManagedDomainType<X> managedType(String typeName) {
843-
final ManagedDomainType<X> managedType = findManagedType( typeName );
844-
if ( managedType == null ) {
845-
throw new IllegalArgumentException("Not a managed type: " + typeName);
846-
}
847-
return managedType;
848-
}
849-
850834
@Override
851835
public @Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName) {
852-
final String entityName = qualifyName( typeName );
853-
//noinspection unchecked
854-
return entityName == null ? null : (ManagedDomainType<X>) findEntityType( entityName );
836+
// TODO: not every ManagedDomainType is an EntityDomainType!
837+
return typeName == null ? null : new MockEntityDomainType<>(new MockJavaType<>(typeName));
855838
}
856839

857840
@Override
858841
public <X> ManagedDomainType<X> findManagedType(Class<X> cls) {
859-
throw new UnsupportedOperationException("operation not supported");
842+
return findManagedType( cls.getName() );
860843
}
861844

862845
@Override
863846
public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
864-
if ( isEntityDefined( cls.getName() ) ) {
865-
return new MockEntityDomainType<>( cls.getName(), new MockJavaType<X>( cls.getName() ));
866-
}
867-
else {
868-
return null;
869-
}
870-
}
871-
872-
@Override
873-
public <X> ManagedDomainType<X> managedType(Class<X> cls) {
874-
throw new UnsupportedOperationException("operation not supported");
875-
}
876-
877-
@Override
878-
public <X> EntityDomainType<X> entity(Class<X> cls) {
879-
throw new UnsupportedOperationException("operation not supported");
847+
return !cls.isArray() && !cls.isPrimitive() && isEntity(cls.getName())
848+
? new MockEntityDomainType<>(new MockJavaType<>(cls.getName()))
849+
: null;
880850
}
881851

882852
@Override
@@ -945,8 +915,13 @@ public PersistentAttribute<X,?> findDeclaredAttribute(String name) {
945915

946916
class MockEntityDomainType<X> extends EntityTypeImpl<X> {
947917

948-
public MockEntityDomainType(String entityName, JavaType<X> javaType) {
949-
super(entityName, entityName, false, true, false, javaType, null,
918+
public MockEntityDomainType(JavaType<X> javaType) {
919+
this(javaType, getJpaEntityName(javaType.getTypeName()));
920+
}
921+
922+
public MockEntityDomainType(JavaType<X> javaType, String jpaEntityName) {
923+
super(javaType.getTypeName(), jpaEntityName,
924+
false, true, false, javaType, null,
950925
metamodel.getJpaMetamodel());
951926
}
952927

@@ -1027,10 +1002,14 @@ public SqmPathSource<?> findSubPathSource(String name, boolean includeSubtypes)
10271002
return (SqmPathSource<?>) superattribute;
10281003
}
10291004
for (Map.Entry<String, MockEntityPersister> entry : entityPersistersByName.entrySet()) {
1030-
if (!entry.getValue().getEntityName().equals(getHibernateEntityName())
1031-
&& isSubtype(entry.getValue().getEntityName(), getHibernateEntityName())) {
1032-
final PersistentAttribute<? super Object, ?> subattribute
1033-
= new MockEntityDomainType<>(entry.getValue().getEntityName(), new MockJavaType<>(entry.getValue().getEntityName()) ).findAttribute(name);
1005+
final MockEntityPersister entityPersister = entry.getValue();
1006+
if (!entityPersister.getEntityName().equals(getHibernateEntityName())
1007+
&& isSubtype(entityPersister.getEntityName(), getHibernateEntityName())) {
1008+
final MockEntityDomainType<Object> entityDomainType =
1009+
new MockEntityDomainType<>(new MockJavaType<>(entityPersister.getEntityName()),
1010+
entityPersister.getJpaEntityName());
1011+
final PersistentAttribute<? super Object, ?> subattribute =
1012+
entityDomainType.findAttribute(name);
10341013
if (subattribute != null) {
10351014
return (SqmPathSource<?>) subattribute;
10361015
}
@@ -1063,6 +1042,8 @@ public PersistentAttribute<X,?> findDeclaredAttribute(String name) {
10631042
}
10641043
}
10651044

1045+
protected abstract String getJpaEntityName(String typeName);
1046+
10661047
private AbstractAttribute createAttribute(String name, String entityName, Type type, ManagedDomainType<?> owner) {
10671048
if (type==null) {
10681049
throw new UnsupportedOperationException(entityName + "." + name);
@@ -1076,7 +1057,7 @@ else if ( type.isEntityType() ) {
10761057
owner,
10771058
name,
10781059
AttributeClassification.MANY_TO_ONE,
1079-
new MockEntityDomainType<>(type.getName(), new MockJavaType<>(type.getName())),
1060+
new MockEntityDomainType<>(new MockJavaType<>(type.getName())),
10801061
null,
10811062
null,
10821063
false,
@@ -1131,12 +1112,11 @@ private DomainType<?> getMapKeyDomainType(String entityName, CollectionType coll
11311112
return getDomainType(entityName, collectionType, owner, keyType);
11321113
}
11331114

1134-
private DomainType<?> getDomainType(String entityName, CollectionType collectionType, ManagedDomainType<?> owner, Type elementType) {
1115+
private DomainType<?> getDomainType(
1116+
String entityName, CollectionType collectionType, ManagedDomainType<?> owner, Type elementType) {
11351117
if ( elementType.isEntityType() ) {
1136-
final String associatedEntityName = collectionType.getAssociatedEntityName(MockSessionFactory.this);
1137-
final TypeElement associatedEntityEntityClass = findEntityClass( associatedEntityName );
1138-
final String associatedEntityTypeName = associatedEntityEntityClass == null ? associatedEntityName : associatedEntityEntityClass.getQualifiedName().toString();
1139-
return new MockEntityDomainType<>(associatedEntityName, new MockJavaType<>(associatedEntityTypeName));
1118+
final String associatedEntityName = collectionType.getAssociatedEntityName(this);
1119+
return new MockEntityDomainType<>(new MockJavaType<>(associatedEntityName));
11401120
}
11411121
else if ( elementType.isComponentType() ) {
11421122
final CompositeType compositeType = (CompositeType) elementType;

0 commit comments

Comments
 (0)