7
7
package org .hibernate .jpa .event .internal ;
8
8
9
9
import java .util .HashMap ;
10
+ import java .util .Map ;
11
+
10
12
import jakarta .persistence .PersistenceException ;
11
13
12
14
import org .hibernate .internal .util .collections .ArrayHelper ;
15
+ import org .hibernate .internal .util .collections .MapBackedClassValue ;
13
16
import org .hibernate .jpa .event .spi .Callback ;
17
+ import org .hibernate .jpa .event .spi .CallbackRegistry ;
14
18
import org .hibernate .jpa .event .spi .CallbackType ;
15
19
16
20
/**
17
21
* Keep track of all lifecycle callbacks and listeners for a given persistence unit
18
22
*
19
23
* @author <a href="mailto:[email protected] ">Kabir Khan</a>
20
24
* @author Steve Ebersole
25
+ * @author Sanne Grinovero
21
26
*/
22
- final class CallbackRegistryImpl implements CallbackRegistryImplementor {
23
- private final HashMap <Class <?>, Callback []> preCreates = new HashMap <>();
24
- private final HashMap <Class <?>, Callback []> postCreates = new HashMap <>();
25
- private final HashMap <Class <?>, Callback []> preRemoves = new HashMap <>();
26
- private final HashMap <Class <?>, Callback []> postRemoves = new HashMap <>();
27
- private final HashMap <Class <?>, Callback []> preUpdates = new HashMap <>();
28
- private final HashMap <Class <?>, Callback []> postUpdates = new HashMap <>();
29
- private final HashMap <Class <?>, Callback []> postLoads = new HashMap <>();
27
+ final class CallbackRegistryImpl implements CallbackRegistry {
28
+
29
+ private final MapBackedClassValue <Callback []> preCreates ;
30
+ private final MapBackedClassValue <Callback []> postCreates ;
31
+ private final MapBackedClassValue <Callback []> preRemoves ;
32
+ private final MapBackedClassValue <Callback []> postRemoves ;
33
+ private final MapBackedClassValue <Callback []> preUpdates ;
34
+ private final MapBackedClassValue <Callback []> postUpdates ;
35
+ private final MapBackedClassValue <Callback []> postLoads ;
36
+
37
+ public CallbackRegistryImpl (
38
+ Map <Class <?>, Callback []> preCreates ,
39
+ Map <Class <?>, Callback []> postCreates ,
40
+ Map <Class <?>, Callback []> preRemoves ,
41
+ Map <Class <?>, Callback []> postRemoves ,
42
+ Map <Class <?>, Callback []> preUpdates ,
43
+ Map <Class <?>, Callback []> postUpdates ,
44
+ Map <Class <?>, Callback []> postLoads ) {
45
+ this .preCreates = new MapBackedClassValue <>( preCreates );
46
+ this .postCreates = new MapBackedClassValue <>( postCreates );
47
+ this .preRemoves = new MapBackedClassValue <>( preRemoves );
48
+ this .postRemoves = new MapBackedClassValue <>( postRemoves );
49
+ this .preUpdates = new MapBackedClassValue <>( preUpdates );
50
+ this .postUpdates = new MapBackedClassValue <>( postUpdates );
51
+ this .postLoads = new MapBackedClassValue <>( postLoads );
52
+ }
30
53
31
54
@ Override
32
55
public boolean hasRegisteredCallbacks (Class <?> entityClass , CallbackType callbackType ) {
33
- final HashMap < Class <?>, Callback []> map = determineAppropriateCallbackMap ( callbackType );
56
+ final MapBackedClassValue < Callback []> map = determineAppropriateCallbackMap ( callbackType );
34
57
return notEmpty ( map .get ( entityClass ) );
35
58
}
36
59
37
- @ Override
38
- public void registerCallbacks (Class <?> entityClass , Callback [] callbacks ) {
39
- if ( callbacks == null || callbacks .length == 0 ) {
40
- return ;
41
- }
42
-
43
- for ( Callback callback : callbacks ) {
44
- final HashMap <Class <?>, Callback []> map = determineAppropriateCallbackMap ( callback .getCallbackType () );
45
- Callback [] entityCallbacks = map .get ( entityClass );
46
- if ( entityCallbacks == null ) {
47
- entityCallbacks = new Callback [0 ];
48
- }
49
- entityCallbacks = ArrayHelper .join ( entityCallbacks , callback );
50
- map .put ( entityClass , entityCallbacks );
51
- }
52
- }
53
-
54
60
@ Override
55
61
public void preCreate (Object bean ) {
56
62
callback ( preCreates .get ( bean .getClass () ), bean );
@@ -90,6 +96,17 @@ public boolean postLoad(Object bean) {
90
96
return callback ( postLoads .get ( bean .getClass () ), bean );
91
97
}
92
98
99
+ @ Override
100
+ public void release () {
101
+ this .preCreates .dispose ();
102
+ this .postCreates .dispose ();
103
+ this .preRemoves .dispose ();
104
+ this .postRemoves .dispose ();
105
+ this .preUpdates .dispose ();
106
+ this .postUpdates .dispose ();
107
+ this .postLoads .dispose ();
108
+ }
109
+
93
110
private boolean callback (Callback [] callbacks , Object bean ) {
94
111
if ( callbacks != null && callbacks .length != 0 ) {
95
112
for ( Callback callback : callbacks ) {
@@ -102,7 +119,7 @@ private boolean callback(Callback[] callbacks, Object bean) {
102
119
}
103
120
}
104
121
105
- private HashMap < Class <?>, Callback []> determineAppropriateCallbackMap (CallbackType callbackType ) {
122
+ private MapBackedClassValue < Callback []> determineAppropriateCallbackMap (CallbackType callbackType ) {
106
123
if ( callbackType == CallbackType .PRE_PERSIST ) {
107
124
return preCreates ;
108
125
}
@@ -134,16 +151,66 @@ private HashMap<Class<?>, Callback[]> determineAppropriateCallbackMap(CallbackTy
134
151
throw new PersistenceException ( "Unrecognized JPA callback type [" + callbackType + "]" );
135
152
}
136
153
137
- public void release () {
138
- preCreates .clear ();
139
- postCreates .clear ();
154
+ public static class Builder {
155
+ private final Map <Class <?>, Callback []> preCreates = new HashMap <>();
156
+ private final Map <Class <?>, Callback []> postCreates = new HashMap <>();
157
+ private final Map <Class <?>, Callback []> preRemoves = new HashMap <>();
158
+ private final Map <Class <?>, Callback []> postRemoves = new HashMap <>();
159
+ private final Map <Class <?>, Callback []> preUpdates = new HashMap <>();
160
+ private final Map <Class <?>, Callback []> postUpdates = new HashMap <>();
161
+ private final Map <Class <?>, Callback []> postLoads = new HashMap <>();
162
+
163
+ public void registerCallbacks (Class <?> entityClass , Callback [] callbacks ) {
164
+ if ( callbacks == null || callbacks .length == 0 ) {
165
+ return ;
166
+ }
140
167
141
- preRemoves .clear ();
142
- postRemoves .clear ();
168
+ for ( Callback callback : callbacks ) {
169
+ final Map <Class <?>, Callback []> map = determineAppropriateCallbackMap ( callback .getCallbackType () );
170
+ Callback [] entityCallbacks = map .get ( entityClass );
171
+ if ( entityCallbacks == null ) {
172
+ entityCallbacks = new Callback [0 ];
173
+ }
174
+ entityCallbacks = ArrayHelper .join ( entityCallbacks , callback );
175
+ map .put ( entityClass , entityCallbacks );
176
+ }
177
+ }
143
178
144
- preUpdates .clear ();
145
- postUpdates .clear ();
179
+ private Map <Class <?>, Callback []> determineAppropriateCallbackMap (CallbackType callbackType ) {
180
+ if ( callbackType == CallbackType .PRE_PERSIST ) {
181
+ return preCreates ;
182
+ }
183
+
184
+ if ( callbackType == CallbackType .POST_PERSIST ) {
185
+ return postCreates ;
186
+ }
187
+
188
+ if ( callbackType == CallbackType .PRE_REMOVE ) {
189
+ return preRemoves ;
190
+ }
191
+
192
+ if ( callbackType == CallbackType .POST_REMOVE ) {
193
+ return postRemoves ;
194
+ }
195
+
196
+ if ( callbackType == CallbackType .PRE_UPDATE ) {
197
+ return preUpdates ;
198
+ }
199
+
200
+ if ( callbackType == CallbackType .POST_UPDATE ) {
201
+ return postUpdates ;
202
+ }
203
+
204
+ if ( callbackType == CallbackType .POST_LOAD ) {
205
+ return postLoads ;
206
+ }
207
+
208
+ throw new PersistenceException ( "Unrecognized JPA callback type [" + callbackType + "]" );
209
+ }
210
+
211
+ protected CallbackRegistryImpl build () {
212
+ return new CallbackRegistryImpl ( preCreates , postCreates , preRemoves , postRemoves , preUpdates , postUpdates , postLoads );
213
+ }
146
214
147
- postLoads .clear ();
148
215
}
149
216
}
0 commit comments