15
15
import org .hibernate .boot .registry .classloading .spi .ClassLoaderService ;
16
16
import org .hibernate .boot .spi .MetadataBuildingContext ;
17
17
import org .hibernate .boot .spi .MetadataImplementor ;
18
- import org .hibernate .internal .util .collections .CollectionHelper ;
19
18
import org .hibernate .metamodel .spi .ImplicitDiscriminatorStrategy ;
20
19
import org .hibernate .resource .beans .internal .FallbackBeanInstanceProducer ;
21
20
import org .hibernate .resource .beans .spi .ManagedBean ;
33
32
import org .hibernate .usertype .ParameterizedType ;
34
33
import org .hibernate .usertype .UserCollectionType ;
35
34
36
- import static org .hibernate .metamodel .mapping .MappingModelCreationLogging .MAPPING_MODEL_CREATION_MESSAGE_LOGGER ;
35
+ import static org .hibernate .internal .util .PropertiesHelper .map ;
36
+ import static org .hibernate .internal .util .collections .CollectionHelper .isNotEmpty ;
37
37
38
38
/**
39
39
* @author Steve Ebersole
@@ -51,47 +51,59 @@ public static CollectionType customCollection(
51
51
String role ,
52
52
String propertyRef ,
53
53
MetadataImplementor metadata ) {
54
- final Class <? extends UserCollectionType > userCollectionTypeClass =
55
- metadata .getMetadataBuildingOptions ().getServiceRegistry ()
56
- .requireService ( ClassLoaderService .class )
57
- .classForName ( typeName );
58
-
59
- final boolean hasParameters = CollectionHelper .isNotEmpty ( typeParameters );
60
- final ManagedBean <? extends UserCollectionType > userTypeBean ;
61
-
62
- if ( !metadata .getMetadataBuildingOptions ().isAllowExtensionsInCdi () ) {
63
- //noinspection unchecked,rawtypes
64
- userTypeBean = createLocalUserCollectionTypeBean (
65
- role ,
66
- userCollectionTypeClass ,
67
- hasParameters ,
68
- (Map ) typeParameters
69
- );
70
- }
71
- else {
72
- final ManagedBean <? extends UserCollectionType > userCollectionTypeBean =
73
- getManagedBeanRegistry ( metadata ).getBean ( userCollectionTypeClass );
74
-
75
- if ( hasParameters ) {
76
- if ( ParameterizedType .class .isAssignableFrom ( userCollectionTypeBean .getBeanClass () ) ) {
77
- // create a copy of the parameters and create a bean wrapper to delay injecting
78
- // the parameters, thereby delaying the need to resolve the instance from the
79
- // wrapped bean
80
- final Properties copy = new Properties ();
81
- copy .putAll ( typeParameters );
82
- userTypeBean = new DelayedParameterizedTypeBean <>( userCollectionTypeBean , copy );
83
- }
84
- else {
85
- throwIgnoredCollectionTypeParameters ( role , userCollectionTypeClass );
86
- userTypeBean = userCollectionTypeBean ;
87
- }
54
+ final ManagedBean <? extends UserCollectionType > userTypeBean =
55
+ createUserTypeBean ( role , classForName ( typeName , metadata ), map ( typeParameters ), metadata );
56
+ return new CustomCollectionType ( userTypeBean , role , propertyRef );
57
+ }
58
+
59
+ private static ManagedBean <? extends UserCollectionType > createUserTypeBean (
60
+ String role ,
61
+ Class <? extends UserCollectionType > userCollectionTypeClass ,
62
+ Map <String , ?> parameters ,
63
+ MetadataImplementor metadata ) {
64
+ return metadata .getMetadataBuildingOptions ().isAllowExtensionsInCdi ()
65
+ ? createSharedUserTypeBean ( role , userCollectionTypeClass , parameters , metadata )
66
+ : createLocalUserTypeBean ( role , userCollectionTypeClass , parameters );
67
+ }
68
+
69
+ public static ManagedBean <? extends UserCollectionType > createCustomTypeBean (
70
+ String role ,
71
+ Class <? extends UserCollectionType > implementation ,
72
+ Map <String , ?> parameters ,
73
+ MetadataBuildingContext context ) {
74
+ // if deferred container access is enabled, we locally create the user-type
75
+ return context .getBuildingOptions ().isAllowExtensionsInCdi ()
76
+ ? createSharedUserTypeBean ( role , implementation , parameters , context .getMetadataCollector () )
77
+ : createLocalUserTypeBean ( role , implementation , parameters );
78
+ }
79
+
80
+ private static ManagedBean <? extends UserCollectionType > createSharedUserTypeBean (
81
+ String role ,
82
+ Class <? extends UserCollectionType > userCollectionTypeClass ,
83
+ Map <String , ?> parameters ,
84
+ MetadataImplementor metadata ) {
85
+ final ManagedBean <? extends UserCollectionType > managedBean =
86
+ getManagedBeanRegistry ( metadata ).getBean ( userCollectionTypeClass );
87
+ if ( isNotEmpty ( parameters ) ) {
88
+ if ( ParameterizedType .class .isAssignableFrom ( managedBean .getBeanClass () ) ) {
89
+ // create a copy of the parameters and create a bean wrapper to delay injecting
90
+ // the parameters, thereby delaying the need to resolve the instance from the
91
+ // wrapped bean
92
+ final Properties copy = new Properties ();
93
+ copy .putAll ( parameters );
94
+ return new DelayedParameterizedTypeBean <>( managedBean , copy );
88
95
}
89
96
else {
90
- userTypeBean = userCollectionTypeBean ;
97
+ throwIgnoredCollectionTypeParameters ( role , userCollectionTypeClass ) ;
91
98
}
92
99
}
100
+ return managedBean ;
101
+ }
93
102
94
- return new CustomCollectionType ( userTypeBean , role , propertyRef );
103
+ private static Class <UserCollectionType > classForName (String typeName , MetadataImplementor metadata ) {
104
+ return metadata .getMetadataBuildingOptions ().getServiceRegistry ()
105
+ .requireService ( ClassLoaderService .class )
106
+ .classForName ( typeName );
95
107
}
96
108
97
109
private static ManagedBeanRegistry getManagedBeanRegistry (MetadataImplementor metadata ) {
@@ -109,11 +121,8 @@ public static void injectParameters(Object type, Properties parameters) {
109
121
parameterizedType .setParameterValues ( parameters == null ? EMPTY_PROPERTIES : parameters );
110
122
}
111
123
else if ( parameters != null && !parameters .isEmpty () ) {
112
- // TODO: should this throw?
113
- MAPPING_MODEL_CREATION_MESSAGE_LOGGER .debugf (
114
- "UserCollectionType impl does not implement ParameterizedType but parameters were present : `%s`" ,
115
- type .getClass ().getName ()
116
- );
124
+ throw new MappingException ( "'UserType' implementation '" + type .getClass ().getName ()
125
+ + "' does not implement 'ParameterizedType' but parameters were provided" );
117
126
}
118
127
}
119
128
@@ -201,16 +210,14 @@ public static OneToOneType oneToOne(
201
210
);
202
211
}
203
212
204
- public static ManagedBean <UserCollectionType > createLocalUserCollectionTypeBean (
213
+ private static ManagedBean <UserCollectionType > createLocalUserTypeBean (
205
214
String role ,
206
215
Class <? extends UserCollectionType > implementation ,
207
- boolean hasParameters ,
208
216
Map <String , ?> parameters ) {
209
217
final UserCollectionType userCollectionType =
210
218
FallbackBeanInstanceProducer .INSTANCE .produceBeanInstance ( implementation );
211
-
212
- if ( hasParameters ) {
213
- // `CollectionType declared parameters - inject them
219
+ if ( isNotEmpty ( parameters ) ) {
220
+ // CollectionType declared parameters - inject them
214
221
if ( userCollectionType instanceof ParameterizedType parameterizedType ) {
215
222
final Properties properties = new Properties ();
216
223
properties .putAll ( parameters );
@@ -220,7 +227,6 @@ public static ManagedBean<UserCollectionType> createLocalUserCollectionTypeBean(
220
227
throwIgnoredCollectionTypeParameters ( role , implementation );
221
228
}
222
229
}
223
-
224
230
return new ProvidedInstanceManagedBeanImpl <>( userCollectionType );
225
231
}
226
232
0 commit comments