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