122122import org .hibernate .type .descriptor .jdbc .ObjectJdbcType ;
123123import org .hibernate .type .spi .TypeConfiguration ;
124124
125- import javax .lang .model .element .TypeElement ;
126125import java .util .HashMap ;
127126import java .util .List ;
128127import 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