122
122
import org .hibernate .type .descriptor .jdbc .ObjectJdbcType ;
123
123
import org .hibernate .type .spi .TypeConfiguration ;
124
124
125
- import javax .lang .model .element .TypeElement ;
126
125
import java .util .HashMap ;
127
126
import java .util .List ;
128
127
import java .util .Map ;
@@ -281,16 +280,16 @@ static CollectionType createCollectionType(String role, String name) {
281
280
*/
282
281
abstract MockCollectionPersister createMockCollectionPersister (String role );
283
282
284
- abstract boolean isEntityDefined (String entityName );
283
+ abstract boolean isEntityDefined (String jpaEntityName );
285
284
286
- abstract TypeElement findEntityClass (String entityName );
287
-
288
- abstract String qualifyName (String entityName );
285
+ abstract String qualifyName (String jpaEntityName );
289
286
290
287
abstract boolean isAttributeDefined (String entityName , String fieldName );
291
288
292
289
abstract boolean isClassDefined (String qualifiedName );
293
290
291
+ protected abstract boolean isEntity (String entityName );
292
+
294
293
abstract boolean isEnum (String className );
295
294
296
295
abstract boolean isEnumConstant (String className , String terminal );
@@ -809,22 +808,16 @@ public MockJpaMetamodelImpl() {
809
808
}
810
809
811
810
@ 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 );
817
815
}
818
816
else {
819
817
return null ;
820
818
}
821
819
}
822
820
823
- @ Override
824
- public @ Nullable EntityDomainType <?> findEntityType (@ Nullable String entityName ) {
825
- return entity ( entityName );
826
- }
827
-
828
821
@ Override
829
822
public String qualifyImportableName (String queryName ) {
830
823
if (isClassDefined (queryName )) {
@@ -838,45 +831,22 @@ else if (isEntityDefined(queryName)) {
838
831
}
839
832
}
840
833
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
-
850
834
@ Override
851
835
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 ));
855
838
}
856
839
857
840
@ Override
858
841
public <X > ManagedDomainType <X > findManagedType (Class <X > cls ) {
859
- throw new UnsupportedOperationException ( "operation not supported" );
842
+ return findManagedType ( cls . getName () );
860
843
}
861
844
862
845
@ Override
863
846
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 ;
880
850
}
881
851
882
852
@ Override
@@ -945,8 +915,13 @@ public PersistentAttribute<X,?> findDeclaredAttribute(String name) {
945
915
946
916
class MockEntityDomainType <X > extends EntityTypeImpl <X > {
947
917
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 ,
950
925
metamodel .getJpaMetamodel ());
951
926
}
952
927
@@ -1027,10 +1002,14 @@ public SqmPathSource<?> findSubPathSource(String name, boolean includeSubtypes)
1027
1002
return (SqmPathSource <?>) superattribute ;
1028
1003
}
1029
1004
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 );
1034
1013
if (subattribute != null ) {
1035
1014
return (SqmPathSource <?>) subattribute ;
1036
1015
}
@@ -1063,6 +1042,8 @@ public PersistentAttribute<X,?> findDeclaredAttribute(String name) {
1063
1042
}
1064
1043
}
1065
1044
1045
+ protected abstract String getJpaEntityName (String typeName );
1046
+
1066
1047
private AbstractAttribute createAttribute (String name , String entityName , Type type , ManagedDomainType <?> owner ) {
1067
1048
if (type ==null ) {
1068
1049
throw new UnsupportedOperationException (entityName + "." + name );
@@ -1076,7 +1057,7 @@ else if ( type.isEntityType() ) {
1076
1057
owner ,
1077
1058
name ,
1078
1059
AttributeClassification .MANY_TO_ONE ,
1079
- new MockEntityDomainType <>(type . getName (), new MockJavaType <>(type .getName ())),
1060
+ new MockEntityDomainType <>(new MockJavaType <>(type .getName ())),
1080
1061
null ,
1081
1062
null ,
1082
1063
false ,
@@ -1131,12 +1112,11 @@ private DomainType<?> getMapKeyDomainType(String entityName, CollectionType coll
1131
1112
return getDomainType (entityName , collectionType , owner , keyType );
1132
1113
}
1133
1114
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 ) {
1135
1117
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 ));
1140
1120
}
1141
1121
else if ( elementType .isComponentType () ) {
1142
1122
final CompositeType compositeType = (CompositeType ) elementType ;
0 commit comments