Skip to content

Commit

Permalink
attempt to sort out mess of qualified vs unqualified names
Browse files Browse the repository at this point in the history
this stuff has been driving @cigaly nuts

incorporates test case from @cigaly
  • Loading branch information
gavinking committed Dec 18, 2024
1 parent 0221a94 commit d104e7c
Show file tree
Hide file tree
Showing 9 changed files with 184 additions and 91 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -154,10 +154,7 @@ public <X> ManagedDomainType<X> managedType(String typeName) {
return null;
}
final ManagedDomainType<?> managedType = managedTypeByName.get( entityName );
if ( !( managedType instanceof EntityDomainType<?> entityDomainType ) ) {
return null;
}
return entityDomainType;
return managedType instanceof EntityDomainType<?> entityDomainType ? entityDomainType : null;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.processor.test.data.processingorder;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;

@Entity
public class Post {
@Id
Integer id;

String posterId;

@ManyToOne
protected Topic topic;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.processor.test.data.processingorder;

import jakarta.data.repository.DataRepository;
import jakarta.data.repository.Query;
import jakarta.data.repository.Repository;

import java.util.List;

@Repository
public interface PostRepository extends DataRepository<Post, Integer> {

@Query("from Post p where p.topic=:topic")
List<Post> getPostsByTopic(Topic topic);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.processor.test.data.processingorder;

import org.hibernate.processor.test.util.CompilationTest;
import org.hibernate.processor.test.util.WithClasses;
import org.junit.Test;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import static org.hibernate.processor.test.util.TestUtil.assertMetamodelClassGeneratedFor;
import static org.hibernate.processor.test.util.TestUtil.assertPresenceOfMethodInMetamodelFor;
import static org.hibernate.processor.test.util.TestUtil.getMethodFromMetamodelFor;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

public class ProcessingOrderTest extends CompilationTest {
@Test
@WithClasses({Post.class, PostRepository.class, Topic.class})
public void test() {
assertMetamodelClassGeneratedFor( PostRepository.class );

assertPresenceOfMethodInMetamodelFor( PostRepository.class, "getPostsByTopic", Topic.class );
final Method method = getMethodFromMetamodelFor( PostRepository.class, "getPostsByTopic", Topic.class );
assertEquals( Topic.class, method.getParameterTypes()[0] );
if ( method.getGenericReturnType() instanceof ParameterizedType parameterizedType ) {
assertEquals( List.class, parameterizedType.getRawType() );
assertEquals( Post.class, parameterizedType.getActualTypeArguments()[0] );
}
else {
fail();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.processor.test.data.processingorder;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OrderBy;

import java.util.List;

@Entity
public class Topic {
@Id
Integer id;

@OneToMany(mappedBy = "topic", targetEntity = Post.class)
@OrderBy
private List<Post> posts;

}
Original file line number Diff line number Diff line change
Expand Up @@ -2723,11 +2723,12 @@ private boolean checkReturnedEntity(EntityDomainType<?> model, TypeMirror return
if ( returnType.getKind() == TypeKind.DECLARED ) {
final DeclaredType declaredType = (DeclaredType) returnType;
final TypeElement typeElement = (TypeElement) declaredType.asElement();
final AnnotationMirror mirror = getAnnotationMirror(typeElement, ENTITY );
if ( mirror != null ) {
final String entityName = entityName(declaredType, mirror);
return model.getHibernateEntityName().equals( entityName );
}
// final AnnotationMirror mirror = getAnnotationMirror(typeElement, ENTITY );
// if ( mirror != null ) {
// message( element, "entity return type '" + typeElement.getQualifiedName()
// + "' was not annotated '@Entity'", Diagnostic.Kind.WARNING );
// }
return typeElement.getQualifiedName().contentEquals( model.getHibernateEntityName() );
}
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,6 @@
import org.hibernate.type.descriptor.jdbc.ObjectJdbcType;
import org.hibernate.type.spi.TypeConfiguration;

import javax.lang.model.element.TypeElement;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -281,16 +280,16 @@ static CollectionType createCollectionType(String role, String name) {
*/
abstract MockCollectionPersister createMockCollectionPersister(String role);

abstract boolean isEntityDefined(String entityName);
abstract boolean isEntityDefined(String jpaEntityName);

abstract TypeElement findEntityClass(String entityName);

abstract String qualifyName(String entityName);
abstract String qualifyName(String jpaEntityName);

abstract boolean isAttributeDefined(String entityName, String fieldName);

abstract boolean isClassDefined(String qualifiedName);

protected abstract boolean isEntity(String entityName);

abstract boolean isEnum(String className);

abstract boolean isEnumConstant(String className, String terminal);
Expand Down Expand Up @@ -809,22 +808,16 @@ public MockJpaMetamodelImpl() {
}

@Override
public EntityDomainType<?> entity(String entityName) {
if ( isEntityDefined(entityName) ) {
final TypeElement entityClass = findEntityClass( entityName );
final String entityTypeName = entityClass == null ? entityName : entityClass.getQualifiedName().toString();
return new MockEntityDomainType<>(entityName, new MockJavaType<>( entityTypeName ));
public @Nullable EntityDomainType<?> findEntityType(@Nullable String jpaEntityName) {
final String entityTypeName = qualifyName(jpaEntityName);
if ( entityTypeName != null ) {
return new MockEntityDomainType<>(new MockJavaType<>(entityTypeName), jpaEntityName);
}
else {
return null;
}
}

@Override
public @Nullable EntityDomainType<?> findEntityType(@Nullable String entityName) {
return entity( entityName );
}

@Override
public String qualifyImportableName(String queryName) {
if (isClassDefined(queryName)) {
Expand All @@ -838,45 +831,22 @@ else if (isEntityDefined(queryName)) {
}
}

@Override
public <X> ManagedDomainType<X> managedType(String typeName) {
final ManagedDomainType<X> managedType = findManagedType( typeName );
if ( managedType == null ) {
throw new IllegalArgumentException("Not a managed type: " + typeName);
}
return managedType;
}

@Override
public @Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName) {
final String entityName = qualifyName( typeName );
//noinspection unchecked
return entityName == null ? null : (ManagedDomainType<X>) findEntityType( entityName );
// TODO: not every ManagedDomainType is an EntityDomainType!
return typeName == null ? null : new MockEntityDomainType<>(new MockJavaType<>(typeName));
}

@Override
public <X> ManagedDomainType<X> findManagedType(Class<X> cls) {
throw new UnsupportedOperationException("operation not supported");
return findManagedType( cls.getName() );
}

@Override
public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
if ( isEntityDefined( cls.getName() ) ) {
return new MockEntityDomainType<>( cls.getName(), new MockJavaType<X>( cls.getName() ));
}
else {
return null;
}
}

@Override
public <X> ManagedDomainType<X> managedType(Class<X> cls) {
throw new UnsupportedOperationException("operation not supported");
}

@Override
public <X> EntityDomainType<X> entity(Class<X> cls) {
throw new UnsupportedOperationException("operation not supported");
return !cls.isArray() && !cls.isPrimitive() && isEntity(cls.getName())
? new MockEntityDomainType<>(new MockJavaType<>(cls.getName()))
: null;
}

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

class MockEntityDomainType<X> extends EntityTypeImpl<X> {

public MockEntityDomainType(String entityName, JavaType<X> javaType) {
super(entityName, entityName, false, true, false, javaType, null,
public MockEntityDomainType(JavaType<X> javaType) {
this(javaType, getJpaEntityName(javaType.getTypeName()));
}

public MockEntityDomainType(JavaType<X> javaType, String jpaEntityName) {
super(javaType.getTypeName(), jpaEntityName,
false, true, false, javaType, null,
metamodel.getJpaMetamodel());
}

Expand Down Expand Up @@ -1027,10 +1002,14 @@ public SqmPathSource<?> findSubPathSource(String name, boolean includeSubtypes)
return (SqmPathSource<?>) superattribute;
}
for (Map.Entry<String, MockEntityPersister> entry : entityPersistersByName.entrySet()) {
if (!entry.getValue().getEntityName().equals(getHibernateEntityName())
&& isSubtype(entry.getValue().getEntityName(), getHibernateEntityName())) {
final PersistentAttribute<? super Object, ?> subattribute
= new MockEntityDomainType<>(entry.getValue().getEntityName(), new MockJavaType<>(entry.getValue().getEntityName()) ).findAttribute(name);
final MockEntityPersister entityPersister = entry.getValue();
if (!entityPersister.getEntityName().equals(getHibernateEntityName())
&& isSubtype(entityPersister.getEntityName(), getHibernateEntityName())) {
final MockEntityDomainType<Object> entityDomainType =
new MockEntityDomainType<>(new MockJavaType<>(entityPersister.getEntityName()),
entityPersister.getJpaEntityName());
final PersistentAttribute<? super Object, ?> subattribute =
entityDomainType.findAttribute(name);
if (subattribute != null) {
return (SqmPathSource<?>) subattribute;
}
Expand Down Expand Up @@ -1063,6 +1042,8 @@ public PersistentAttribute<X,?> findDeclaredAttribute(String name) {
}
}

protected abstract String getJpaEntityName(String typeName);

private AbstractAttribute createAttribute(String name, String entityName, Type type, ManagedDomainType<?> owner) {
if (type==null) {
throw new UnsupportedOperationException(entityName + "." + name);
Expand All @@ -1076,7 +1057,7 @@ else if ( type.isEntityType() ) {
owner,
name,
AttributeClassification.MANY_TO_ONE,
new MockEntityDomainType<>(type.getName(), new MockJavaType<>(type.getName())),
new MockEntityDomainType<>(new MockJavaType<>(type.getName())),
null,
null,
false,
Expand Down Expand Up @@ -1131,12 +1112,11 @@ private DomainType<?> getMapKeyDomainType(String entityName, CollectionType coll
return getDomainType(entityName, collectionType, owner, keyType);
}

private DomainType<?> getDomainType(String entityName, CollectionType collectionType, ManagedDomainType<?> owner, Type elementType) {
private DomainType<?> getDomainType(
String entityName, CollectionType collectionType, ManagedDomainType<?> owner, Type elementType) {
if ( elementType.isEntityType() ) {
final String associatedEntityName = collectionType.getAssociatedEntityName(MockSessionFactory.this);
final TypeElement associatedEntityEntityClass = findEntityClass( associatedEntityName );
final String associatedEntityTypeName = associatedEntityEntityClass == null ? associatedEntityName : associatedEntityEntityClass.getQualifiedName().toString();
return new MockEntityDomainType<>(associatedEntityName, new MockJavaType<>(associatedEntityTypeName));
final String associatedEntityName = collectionType.getAssociatedEntityName(this);
return new MockEntityDomainType<>(new MockJavaType<>(associatedEntityName));
}
else if ( elementType.isComponentType() ) {
final CompositeType compositeType = (CompositeType) elementType;
Expand Down
Loading

0 comments on commit d104e7c

Please sign in to comment.