77import java .util .HashMap ;
88import java .util .Map ;
99
10- import jakarta .persistence .PersistenceException ;
1110
1211import org .hibernate .internal .build .AllowReflection ;
1312import org .hibernate .internal .util .collections .ArrayHelper ;
2625 */
2726final class CallbackRegistryImpl implements CallbackRegistry {
2827
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 ;
3635
3736 public CallbackRegistryImpl (
3837 Map <Class <?>, Callback []> preCreates ,
@@ -51,19 +50,15 @@ public CallbackRegistryImpl(
5150 this .postLoads = createBackingMap ( postLoads );
5251 }
5352
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 );
6157 }
6258
6359 @ Override
6460 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 ) );
6762 }
6863
6964 @ Override
@@ -128,39 +123,21 @@ private boolean callback(Callback[] callbacks, Object bean) {
128123 }
129124 }
130125
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+ };
161136 }
162137
163138 public static class Builder {
139+ private static final Callback [] NO_CALLBACKS = new Callback [0 ];
140+
164141 private final Map <Class <?>, Callback []> preCreates = new HashMap <>();
165142 private final Map <Class <?>, Callback []> postCreates = new HashMap <>();
166143 private final Map <Class <?>, Callback []> preRemoves = new HashMap <>();
@@ -173,50 +150,30 @@ public static class Builder {
173150 public void registerCallbacks (Class <?> entityClass , Callback [] callbacks ) {
174151 if ( callbacks != null ) {
175152 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 );
183154 }
184155 }
185156 }
186157
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+ }
215163
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+ };
217174 }
218175
219- protected CallbackRegistryImpl build () {
176+ protected CallbackRegistry build () {
220177 return new CallbackRegistryImpl ( preCreates , postCreates , preRemoves , postRemoves , preUpdates , postUpdates , postLoads );
221178 }
222179
0 commit comments