7
7
import java .util .HashMap ;
8
8
import java .util .Map ;
9
9
10
- import jakarta .persistence .PersistenceException ;
11
10
12
11
import org .hibernate .internal .build .AllowReflection ;
13
12
import org .hibernate .internal .util .collections .ArrayHelper ;
26
25
*/
27
26
final class CallbackRegistryImpl implements CallbackRegistry {
28
27
29
- private final ReadOnlyMap <Class ,Callback []> preCreates ;
30
- private final ReadOnlyMap <Class ,Callback []> postCreates ;
31
- private final ReadOnlyMap <Class ,Callback []> preRemoves ;
32
- private final ReadOnlyMap <Class ,Callback []> postRemoves ;
33
- private final ReadOnlyMap <Class ,Callback []> preUpdates ;
34
- private final ReadOnlyMap <Class ,Callback []> postUpdates ;
35
- private final ReadOnlyMap <Class ,Callback []> postLoads ;
28
+ private final ReadOnlyMap <Class <?> ,Callback []> preCreates ;
29
+ private final ReadOnlyMap <Class <?> ,Callback []> postCreates ;
30
+ private final ReadOnlyMap <Class <?> ,Callback []> preRemoves ;
31
+ private final ReadOnlyMap <Class <?> ,Callback []> postRemoves ;
32
+ private final ReadOnlyMap <Class <?> ,Callback []> preUpdates ;
33
+ private final ReadOnlyMap <Class <?> ,Callback []> postUpdates ;
34
+ private final ReadOnlyMap <Class <?> ,Callback []> postLoads ;
36
35
37
36
public CallbackRegistryImpl (
38
37
Map <Class <?>, Callback []> preCreates ,
@@ -51,19 +50,15 @@ public CallbackRegistryImpl(
51
50
this .postLoads = createBackingMap ( postLoads );
52
51
}
53
52
54
- private static ReadOnlyMap <Class , Callback []> createBackingMap (final Map <Class <?>, Callback []> src ) {
55
- if ( src == null || src .isEmpty () ) {
56
- return ReadOnlyMap .EMPTY ;
57
- }
58
- else {
59
- return new MapBackedClassValue <>( src );
60
- }
53
+ private static ReadOnlyMap <Class <?>, Callback []> createBackingMap (final Map <Class <?>, Callback []> src ) {
54
+ return src == null || src .isEmpty ()
55
+ ? ReadOnlyMap .EMPTY
56
+ : new MapBackedClassValue <>( src );
61
57
}
62
58
63
59
@ Override
64
60
public boolean hasRegisteredCallbacks (Class <?> entityClass , CallbackType callbackType ) {
65
- final ReadOnlyMap <Class ,Callback []> map = determineAppropriateCallbackMap ( callbackType );
66
- return notEmpty ( map .get ( entityClass ) );
61
+ return notEmpty ( getCallbackMap ( callbackType ).get ( entityClass ) );
67
62
}
68
63
69
64
@ Override
@@ -128,39 +123,21 @@ private boolean callback(Callback[] callbacks, Object bean) {
128
123
}
129
124
}
130
125
131
- private ReadOnlyMap <Class ,Callback []> determineAppropriateCallbackMap (CallbackType callbackType ) {
132
- if ( callbackType == CallbackType .PRE_PERSIST ) {
133
- return preCreates ;
134
- }
135
-
136
- if ( callbackType == CallbackType .POST_PERSIST ) {
137
- return postCreates ;
138
- }
139
-
140
- if ( callbackType == CallbackType .PRE_REMOVE ) {
141
- return preRemoves ;
142
- }
143
-
144
- if ( callbackType == CallbackType .POST_REMOVE ) {
145
- return postRemoves ;
146
- }
147
-
148
- if ( callbackType == CallbackType .PRE_UPDATE ) {
149
- return preUpdates ;
150
- }
151
-
152
- if ( callbackType == CallbackType .POST_UPDATE ) {
153
- return postUpdates ;
154
- }
155
-
156
- if ( callbackType == CallbackType .POST_LOAD ) {
157
- return postLoads ;
158
- }
159
-
160
- throw new PersistenceException ( "Unrecognized JPA callback type [" + callbackType + "]" );
126
+ private ReadOnlyMap <Class <?>,Callback []> getCallbackMap (CallbackType callbackType ) {
127
+ return switch ( callbackType ) {
128
+ case PRE_PERSIST -> preCreates ;
129
+ case POST_PERSIST -> postCreates ;
130
+ case PRE_REMOVE -> preRemoves ;
131
+ case POST_REMOVE -> postRemoves ;
132
+ case PRE_UPDATE -> preUpdates ;
133
+ case POST_UPDATE -> postUpdates ;
134
+ case POST_LOAD -> postLoads ;
135
+ };
161
136
}
162
137
163
138
public static class Builder {
139
+ private static final Callback [] NO_CALLBACKS = new Callback [0 ];
140
+
164
141
private final Map <Class <?>, Callback []> preCreates = new HashMap <>();
165
142
private final Map <Class <?>, Callback []> postCreates = new HashMap <>();
166
143
private final Map <Class <?>, Callback []> preRemoves = new HashMap <>();
@@ -173,50 +150,30 @@ public static class Builder {
173
150
public void registerCallbacks (Class <?> entityClass , Callback [] callbacks ) {
174
151
if ( callbacks != null ) {
175
152
for ( Callback callback : callbacks ) {
176
- final Map <Class <?>, Callback []> map = determineAppropriateCallbackMap ( callback .getCallbackType () );
177
- Callback [] entityCallbacks = map .get ( entityClass );
178
- if ( entityCallbacks == null ) {
179
- entityCallbacks = new Callback [0 ];
180
- }
181
- entityCallbacks = ArrayHelper .join ( entityCallbacks , callback );
182
- map .put ( entityClass , entityCallbacks );
153
+ addCallback ( entityClass , callback );
183
154
}
184
155
}
185
156
}
186
157
187
- private Map <Class <?>, Callback []> determineAppropriateCallbackMap (CallbackType callbackType ) {
188
- if ( callbackType == CallbackType .PRE_PERSIST ) {
189
- return preCreates ;
190
- }
191
-
192
- if ( callbackType == CallbackType .POST_PERSIST ) {
193
- return postCreates ;
194
- }
195
-
196
- if ( callbackType == CallbackType .PRE_REMOVE ) {
197
- return preRemoves ;
198
- }
199
-
200
- if ( callbackType == CallbackType .POST_REMOVE ) {
201
- return postRemoves ;
202
- }
203
-
204
- if ( callbackType == CallbackType .PRE_UPDATE ) {
205
- return preUpdates ;
206
- }
207
-
208
- if ( callbackType == CallbackType .POST_UPDATE ) {
209
- return postUpdates ;
210
- }
211
-
212
- if ( callbackType == CallbackType .POST_LOAD ) {
213
- return postLoads ;
214
- }
158
+ public void addCallback (Class <?> entityClass , Callback callback ) {
159
+ final var callbackMap = getCallbackMap ( callback .getCallbackType () );
160
+ final Callback [] existingCallbacks = callbackMap .getOrDefault ( entityClass , NO_CALLBACKS );
161
+ callbackMap .put ( entityClass , ArrayHelper .add ( existingCallbacks , callback ) );
162
+ }
215
163
216
- throw new PersistenceException ( "Unrecognized JPA callback type [" + callbackType + "]" );
164
+ private Map <Class <?>, Callback []> getCallbackMap (CallbackType callbackType ) {
165
+ return switch ( callbackType ) {
166
+ case PRE_PERSIST -> preCreates ;
167
+ case POST_PERSIST -> postCreates ;
168
+ case PRE_REMOVE -> preRemoves ;
169
+ case POST_REMOVE -> postRemoves ;
170
+ case PRE_UPDATE -> preUpdates ;
171
+ case POST_UPDATE -> postUpdates ;
172
+ case POST_LOAD -> postLoads ;
173
+ };
217
174
}
218
175
219
- protected CallbackRegistryImpl build () {
176
+ protected CallbackRegistry build () {
220
177
return new CallbackRegistryImpl ( preCreates , postCreates , preRemoves , postRemoves , preUpdates , postUpdates , postLoads );
221
178
}
222
179
0 commit comments