77package org .hibernate .event .service .internal ;
88
99import java .lang .reflect .Array ;
10- import java .util .Collections ;
1110import java .util .HashMap ;
1211import java .util .Map ;
1312
8079public class EventListenerRegistryImpl implements EventListenerRegistry {
8180 private Map <Class ,Object > listenerClassToInstanceMap = new HashMap <Class , Object >();
8281
83- private Map < EventType , EventListenerGroupImpl > registeredEventListenersMap = prepareListenerMap ();
82+ private EventListenerGroupImpl [] registeredEventListeners = prepareListenerAssociation ();
8483
8584 @ SuppressWarnings ({ "unchecked" })
8685 public <T > EventListenerGroupImpl <T > getEventListenerGroup (EventType <T > eventType ) {
87- EventListenerGroupImpl <T > listeners = registeredEventListenersMap . get ( eventType ) ;
86+ EventListenerGroupImpl <T > listeners = registeredEventListeners [ eventType . ordinal () ] ;
8887 if ( listeners == null ) {
8988 throw new HibernateException ( "Unable to find listeners for type [" + eventType .eventName () + "]" );
9089 }
@@ -93,8 +92,10 @@ public <T> EventListenerGroupImpl<T> getEventListenerGroup(EventType<T> eventTyp
9392
9493 @ Override
9594 public void addDuplicationStrategy (DuplicationStrategy strategy ) {
96- for ( EventListenerGroupImpl group : registeredEventListenersMap .values () ) {
97- group .addDuplicationStrategy ( strategy );
95+ for ( EventListenerGroupImpl group : registeredEventListeners ) {
96+ if ( group != null ) {
97+ group .addDuplicationStrategy ( strategy );
98+ }
9899 }
99100 }
100101
@@ -165,252 +166,252 @@ public <T> void prependListeners(EventType<T> type, T... listeners) {
165166 getEventListenerGroup ( type ).prependListeners ( listeners );
166167 }
167168
168- private static Map < EventType , EventListenerGroupImpl > prepareListenerMap () {
169- final Map < EventType , EventListenerGroupImpl > workMap = new HashMap < EventType , EventListenerGroupImpl >() ;
169+ private static EventListenerGroupImpl [] prepareListenerAssociation () {
170+ EventListenerGroupImpl [] listenerArray = new EventListenerGroupImpl [ EventType . values (). size () ] ;
170171
171172 // auto-flush listeners
172173 prepareListeners (
173174 AUTO_FLUSH ,
174175 new DefaultAutoFlushEventListener (),
175- workMap
176+ listenerArray
176177 );
177178
178179 // create listeners
179180 prepareListeners (
180181 PERSIST ,
181182 new DefaultPersistEventListener (),
182- workMap
183+ listenerArray
183184 );
184185
185186 // create-onflush listeners
186187 prepareListeners (
187188 PERSIST_ONFLUSH ,
188189 new DefaultPersistOnFlushEventListener (),
189- workMap
190+ listenerArray
190191 );
191192
192193 // delete listeners
193194 prepareListeners (
194195 DELETE ,
195196 new DefaultDeleteEventListener (),
196- workMap
197+ listenerArray
197198 );
198199
199200 // dirty-check listeners
200201 prepareListeners (
201202 DIRTY_CHECK ,
202203 new DefaultDirtyCheckEventListener (),
203- workMap
204+ listenerArray
204205 );
205206
206207 // evict listeners
207208 prepareListeners (
208209 EVICT ,
209210 new DefaultEvictEventListener (),
210- workMap
211+ listenerArray
211212 );
212213
213214 prepareListeners (
214215 CLEAR ,
215- workMap
216+ listenerArray
216217 );
217218
218219 // flush listeners
219220 prepareListeners (
220221 FLUSH ,
221222 new DefaultFlushEventListener (),
222- workMap
223+ listenerArray
223224 );
224225
225226 // flush-entity listeners
226227 prepareListeners (
227228 FLUSH_ENTITY ,
228229 new DefaultFlushEntityEventListener (),
229- workMap
230+ listenerArray
230231 );
231232
232233 // load listeners
233234 prepareListeners (
234235 LOAD ,
235236 new DefaultLoadEventListener (),
236- workMap
237+ listenerArray
237238 );
238239
239240 // resolve natural-id listeners
240241 prepareListeners (
241242 RESOLVE_NATURAL_ID ,
242243 new DefaultResolveNaturalIdEventListener (),
243- workMap
244+ listenerArray
244245 );
245246
246247 // load-collection listeners
247248 prepareListeners (
248249 INIT_COLLECTION ,
249250 new DefaultInitializeCollectionEventListener (),
250- workMap
251+ listenerArray
251252 );
252253
253254 // lock listeners
254255 prepareListeners (
255256 LOCK ,
256257 new DefaultLockEventListener (),
257- workMap
258+ listenerArray
258259 );
259260
260261 // merge listeners
261262 prepareListeners (
262263 MERGE ,
263264 new DefaultMergeEventListener (),
264- workMap
265+ listenerArray
265266 );
266267
267268 // pre-collection-recreate listeners
268269 prepareListeners (
269270 PRE_COLLECTION_RECREATE ,
270- workMap
271+ listenerArray
271272 );
272273
273274 // pre-collection-remove listeners
274275 prepareListeners (
275276 PRE_COLLECTION_REMOVE ,
276- workMap
277+ listenerArray
277278 );
278279
279280 // pre-collection-update listeners
280281 prepareListeners (
281282 PRE_COLLECTION_UPDATE ,
282- workMap
283+ listenerArray
283284 );
284285
285286 // pre-delete listeners
286287 prepareListeners (
287288 PRE_DELETE ,
288- workMap
289+ listenerArray
289290 );
290291
291292 // pre-insert listeners
292293 prepareListeners (
293294 PRE_INSERT ,
294- workMap
295+ listenerArray
295296 );
296297
297298 // pre-load listeners
298299 prepareListeners (
299300 PRE_LOAD ,
300301 new DefaultPreLoadEventListener (),
301- workMap
302+ listenerArray
302303 );
303304
304305 // pre-update listeners
305306 prepareListeners (
306307 PRE_UPDATE ,
307- workMap
308+ listenerArray
308309 );
309310
310311 // post-collection-recreate listeners
311312 prepareListeners (
312313 POST_COLLECTION_RECREATE ,
313- workMap
314+ listenerArray
314315 );
315316
316317 // post-collection-remove listeners
317318 prepareListeners (
318319 POST_COLLECTION_REMOVE ,
319- workMap
320+ listenerArray
320321 );
321322
322323 // post-collection-update listeners
323324 prepareListeners (
324325 POST_COLLECTION_UPDATE ,
325- workMap
326+ listenerArray
326327 );
327328
328329 // post-commit-delete listeners
329330 prepareListeners (
330331 POST_COMMIT_DELETE ,
331- workMap
332+ listenerArray
332333 );
333334
334335 // post-commit-insert listeners
335336 prepareListeners (
336337 POST_COMMIT_INSERT ,
337- workMap
338+ listenerArray
338339 );
339340
340341 // post-commit-update listeners
341342 prepareListeners (
342343 POST_COMMIT_UPDATE ,
343- workMap
344+ listenerArray
344345 );
345346
346347 // post-delete listeners
347348 prepareListeners (
348349 POST_DELETE ,
349- workMap
350+ listenerArray
350351 );
351352
352353 // post-insert listeners
353354 prepareListeners (
354355 POST_INSERT ,
355- workMap
356+ listenerArray
356357 );
357358
358359 // post-load listeners
359360 prepareListeners (
360361 POST_LOAD ,
361362 new DefaultPostLoadEventListener (),
362- workMap
363+ listenerArray
363364 );
364365
365366 // post-update listeners
366367 prepareListeners (
367368 POST_UPDATE ,
368- workMap
369+ listenerArray
369370 );
370371
371372 // update listeners
372373 prepareListeners (
373374 UPDATE ,
374375 new DefaultUpdateEventListener (),
375- workMap
376+ listenerArray
376377 );
377378
378379 // refresh listeners
379380 prepareListeners (
380381 REFRESH ,
381382 new DefaultRefreshEventListener (),
382- workMap
383+ listenerArray
383384 );
384385
385386 // replicate listeners
386387 prepareListeners (
387388 REPLICATE ,
388389 new DefaultReplicateEventListener (),
389- workMap
390+ listenerArray
390391 );
391392
392393 // save listeners
393394 prepareListeners (
394395 SAVE ,
395396 new DefaultSaveEventListener (),
396- workMap
397+ listenerArray
397398 );
398399
399400 // save-update listeners
400401 prepareListeners (
401402 SAVE_UPDATE ,
402403 new DefaultSaveOrUpdateEventListener (),
403- workMap
404+ listenerArray
404405 );
405406
406- return Collections . unmodifiableMap ( workMap ) ;
407+ return listenerArray ;
407408 }
408409
409- private static <T > void prepareListeners (EventType <T > type , Map < EventType , EventListenerGroupImpl > map ) {
410- prepareListeners ( type , null , map );
410+ private static <T > void prepareListeners (EventType <T > type , EventListenerGroupImpl [] listenerArray ) {
411+ prepareListeners ( type , null , listenerArray );
411412 }
412413
413- private static <T > void prepareListeners (EventType <T > type , T defaultListener , Map < EventType , EventListenerGroupImpl > map ) {
414+ private static <T > void prepareListeners (EventType <T > type , T defaultListener , EventListenerGroupImpl [] listenerArray ) {
414415 final EventListenerGroupImpl <T > listenerGroup ;
415416 if ( type == EventType .POST_COMMIT_DELETE
416417 || type == EventType .POST_COMMIT_INSERT
@@ -424,7 +425,7 @@ private static <T> void prepareListeners(EventType<T> type, T defaultListener, M
424425 if ( defaultListener != null ) {
425426 listenerGroup .appendListener ( defaultListener );
426427 }
427- map . put ( type , listenerGroup ) ;
428+ listenerArray [ type . ordinal () ] = listenerGroup ;
428429 }
429430
430431}
0 commit comments