Skip to content

Commit 09c74f4

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 2acb937 commit 09c74f4

File tree

8 files changed

+168
-28
lines changed

8 files changed

+168
-28
lines changed
Lines changed: 20 additions & 0 deletions
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+
}
Lines changed: 18 additions & 0 deletions
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+
}
Lines changed: 23 additions & 0 deletions
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: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -812,8 +812,11 @@ public MockJpaMetamodelImpl() {
812812
public EntityDomainType<?> entity(String entityName) {
813813
if ( isEntityDefined(entityName) ) {
814814
final TypeElement entityClass = findEntityClass( entityName );
815-
final String entityTypeName = entityClass == null ? entityName : entityClass.getQualifiedName().toString();
816-
return new MockEntityDomainType<>(entityName, new MockJavaType<>( entityTypeName ));
815+
final String entityTypeName =
816+
entityClass == null
817+
? entityName
818+
: entityClass.getQualifiedName().toString();
819+
return new MockEntityDomainType<>(new MockJavaType<>(entityTypeName), entityName);
817820
}
818821
else {
819822
return null;
@@ -862,7 +865,7 @@ public <X> ManagedDomainType<X> findManagedType(Class<X> cls) {
862865
@Override
863866
public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
864867
if ( isEntityDefined( cls.getName() ) ) {
865-
return new MockEntityDomainType<>( cls.getName(), new MockJavaType<X>( cls.getName() ));
868+
return new MockEntityDomainType<>(new MockJavaType<>(cls.getName()));
866869
}
867870
else {
868871
return null;
@@ -945,8 +948,13 @@ public PersistentAttribute<X,?> findDeclaredAttribute(String name) {
945948

946949
class MockEntityDomainType<X> extends EntityTypeImpl<X> {
947950

948-
public MockEntityDomainType(String entityName, JavaType<X> javaType) {
949-
super(entityName, entityName, false, true, false, javaType, null,
951+
public MockEntityDomainType(JavaType<X> javaType) {
952+
this(javaType, getJpaEntityName(javaType.getTypeName()));
953+
}
954+
955+
public MockEntityDomainType(JavaType<X> javaType, String jpaEntityName) {
956+
super(javaType.getTypeName(), jpaEntityName,
957+
false, true, false, javaType, null,
950958
metamodel.getJpaMetamodel());
951959
}
952960

@@ -1027,10 +1035,14 @@ public SqmPathSource<?> findSubPathSource(String name, boolean includeSubtypes)
10271035
return (SqmPathSource<?>) superattribute;
10281036
}
10291037
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);
1038+
final MockEntityPersister entityPersister = entry.getValue();
1039+
if (!entityPersister.getEntityName().equals(getHibernateEntityName())
1040+
&& isSubtype(entityPersister.getEntityName(), getHibernateEntityName())) {
1041+
final MockEntityDomainType<Object> entityDomainType =
1042+
new MockEntityDomainType<>(new MockJavaType<>(entityPersister.getEntityName()),
1043+
entityPersister.getJpaEntityName());
1044+
final PersistentAttribute<? super Object, ?> subattribute =
1045+
entityDomainType.findAttribute(name);
10341046
if (subattribute != null) {
10351047
return (SqmPathSource<?>) subattribute;
10361048
}
@@ -1063,6 +1075,8 @@ public PersistentAttribute<X,?> findDeclaredAttribute(String name) {
10631075
}
10641076
}
10651077

1078+
protected abstract String getJpaEntityName(String typeName);
1079+
10661080
private AbstractAttribute createAttribute(String name, String entityName, Type type, ManagedDomainType<?> owner) {
10671081
if (type==null) {
10681082
throw new UnsupportedOperationException(entityName + "." + name);
@@ -1076,7 +1090,7 @@ else if ( type.isEntityType() ) {
10761090
owner,
10771091
name,
10781092
AttributeClassification.MANY_TO_ONE,
1079-
new MockEntityDomainType<>(type.getName(), new MockJavaType<>(type.getName())),
1093+
new MockEntityDomainType<>(new MockJavaType<>(type.getName())),
10801094
null,
10811095
null,
10821096
false,
@@ -1131,12 +1145,17 @@ private DomainType<?> getMapKeyDomainType(String entityName, CollectionType coll
11311145
return getDomainType(entityName, collectionType, owner, keyType);
11321146
}
11331147

1134-
private DomainType<?> getDomainType(String entityName, CollectionType collectionType, ManagedDomainType<?> owner, Type elementType) {
1148+
private DomainType<?> getDomainType(
1149+
String entityName, CollectionType collectionType, ManagedDomainType<?> owner, Type elementType) {
11351150
if ( elementType.isEntityType() ) {
11361151
final String associatedEntityName = collectionType.getAssociatedEntityName(MockSessionFactory.this);
11371152
final TypeElement associatedEntityEntityClass = findEntityClass( associatedEntityName );
1138-
final String associatedEntityTypeName = associatedEntityEntityClass == null ? associatedEntityName : associatedEntityEntityClass.getQualifiedName().toString();
1139-
return new MockEntityDomainType<>(associatedEntityName, new MockJavaType<>(associatedEntityTypeName));
1153+
final String associatedEntityTypeName =
1154+
associatedEntityEntityClass == null
1155+
? associatedEntityName
1156+
: associatedEntityEntityClass.getQualifiedName().toString();
1157+
//TODO: looks wrong
1158+
return new MockEntityDomainType<>(new MockJavaType<>(associatedEntityTypeName), associatedEntityName);
11401159
}
11411160
else if ( elementType.isComponentType() ) {
11421161
final CompositeType compositeType = (CompositeType) elementType;

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

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ public String getRootEntityName() {
380380
}
381381
superclass = typeElement.getSuperclass();
382382
}
383-
return ProcessorSessionFactory.getEntityName(result);
383+
return getHibernateEntityName(result);
384384
}
385385

386386
@Override
@@ -587,7 +587,7 @@ private static boolean isMatchingEntity(Element symbol, String entityName) {
587587
if (symbol.getKind() == ElementKind.CLASS) {
588588
final TypeElement type = (TypeElement) symbol;
589589
return isEntity(type)
590-
&& getEntityName(type).equals(entityName);
590+
&& getJpaEntityName(type).equals(entityName);
591591
}
592592
else {
593593
return false;
@@ -873,7 +873,12 @@ private static AccessType getAccessType(TypeElement type, AccessType defaultAcce
873873
}
874874
}
875875

876-
static String getEntityName(TypeElement type) {
876+
@Override
877+
protected String getJpaEntityName(String typeName) {
878+
return getJpaEntityName(findClassByQualifiedName(typeName));
879+
}
880+
881+
static String getJpaEntityName(TypeElement type) {
877882
if ( type == null ) {
878883
return null;
879884
}
@@ -886,11 +891,27 @@ static String getEntityName(TypeElement type) {
886891
else {
887892
final String name = (String)
888893
getAnnotationMember(entityAnnotation, "name");
889-
//entity names are unqualified class names
894+
//JPA entity names are unqualified class names
890895
return name==null ? simpleName(type) : name;
891896
}
892897
}
893898

899+
static String getHibernateEntityName(TypeElement type) {
900+
if ( type == null ) {
901+
return null;
902+
}
903+
final AnnotationMirror entityAnnotation =
904+
getAnnotation(type, "Entity");
905+
if (entityAnnotation==null) {
906+
//not an entity!
907+
return null;
908+
}
909+
else {
910+
//entity names are qualified class names
911+
return qualifiedName(type);
912+
}
913+
}
914+
894915
private TypeMirror getCollectionElementType(Element property) {
895916
final DeclaredType declaredType = (DeclaredType) memberType(property);
896917
final List<? extends TypeMirror> typeArguments = declaredType.getTypeArguments();
@@ -910,8 +931,8 @@ private static String getToOneTargetEntity(Element property) {
910931
: classType;
911932
final Element element = asElement(targetType);
912933
return element != null && element.getKind() == ElementKind.CLASS
913-
//entity names are unqualified class names
914-
? getEntityName((TypeElement) element)
934+
//entity names are qualified class names
935+
? getHibernateEntityName((TypeElement) element)
915936
: null;
916937
}
917938

@@ -925,8 +946,8 @@ private String getToManyTargetEntityName(Element property) {
925946
: classType;
926947
final Element element = asElement(targetType);
927948
return element != null && element.getKind() == ElementKind.CLASS
928-
//entity names are unqualified class names
929-
? getEntityName((TypeElement) element)
949+
//entity names are qualified class names
950+
? getHibernateEntityName((TypeElement) element)
930951
: null;
931952
}
932953

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import javax.lang.model.type.TypeKind;
3030
import javax.lang.model.type.TypeMirror;
3131

32-
import static org.hibernate.processor.validation.ProcessorSessionFactory.getEntityName;
32+
import static org.hibernate.processor.validation.ProcessorSessionFactory.getHibernateEntityName;
3333
import static org.hibernate.processor.validation.ProcessorSessionFactory.isEntity;
3434

3535

@@ -109,7 +109,7 @@ private static SemanticQueryBuilder<?> createSemanticQueryBuilder(
109109
final String typeName = typeElement.getQualifiedName().toString();
110110
final String shortName = typeElement.getSimpleName().toString();
111111
return isEntity( typeElement )
112-
? new SemanticQueryBuilder<>( typeName, shortName, getEntityName(typeElement), CREATION_OPTIONS, factory, hql )
112+
? new SemanticQueryBuilder<>( typeName, shortName, getHibernateEntityName(typeElement), CREATION_OPTIONS, factory, hql )
113113
: new SemanticQueryBuilder<>( typeName, shortName, Object[].class, CREATION_OPTIONS, factory, hql );
114114
}
115115
else {

0 commit comments

Comments
 (0)