Skip to content

Commit 340cee2

Browse files
barreirosebersole
authored andcommitted
HHH-10271 - Add ordinal() method to EventType and change EventListenerRegistryImpl to take advantage of that
1 parent 991ff26 commit 340cee2

File tree

2 files changed

+69
-50
lines changed

2 files changed

+69
-50
lines changed

hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerRegistryImpl.java

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package org.hibernate.event.service.internal;
88

99
import java.lang.reflect.Array;
10-
import java.util.Collections;
1110
import java.util.HashMap;
1211
import java.util.Map;
1312

@@ -80,11 +79,11 @@
8079
public 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
}

hibernate-core/src/main/java/org/hibernate/event/spi/EventType.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.Collection;
1313
import java.util.HashMap;
1414
import java.util.Map;
15+
import java.util.concurrent.atomic.AtomicInteger;
1516

1617
import org.hibernate.HibernateException;
1718

@@ -20,7 +21,10 @@
2021
*
2122
* @author Steve Ebersole
2223
*/
23-
public class EventType<T> {
24+
public final class EventType<T> {
25+
26+
private static AtomicInteger typeCounter = new AtomicInteger( 0 );
27+
2428
public static final EventType<LoadEventListener> LOAD = create( "load", LoadEventListener.class );
2529
public static final EventType<ResolveNaturalIdEventListener> RESOLVE_NATURAL_ID = create( "resolve-natural-id", ResolveNaturalIdEventListener.class );
2630

@@ -131,13 +135,14 @@ public static Collection<EventType> values() {
131135
return EVENT_TYPE_BY_NAME_MAP.values();
132136
}
133137

134-
135138
private final String eventName;
136139
private final Class<? extends T> baseListenerInterface;
140+
private final int ordinal;
137141

138142
private EventType(String eventName, Class<? extends T> baseListenerInterface) {
139143
this.eventName = eventName;
140144
this.baseListenerInterface = baseListenerInterface;
145+
this.ordinal = typeCounter.getAndIncrement();
141146
}
142147

143148
public String eventName() {
@@ -152,4 +157,17 @@ public Class baseListenerInterface() {
152157
public String toString() {
153158
return eventName();
154159
}
160+
161+
/**
162+
* EventType is effectively an enumeration. Since there is a known, limited number of possible types, we expose an
163+
* ordinal for each in order to be able to efficiently do associations elsewhere in the codebase (array vs. Map)
164+
*
165+
* For the total number of types, see {@link #values()}
166+
*
167+
* @return An unique ordinal for this {@link EventType}, starting at 0 and up to the number of distinct events
168+
*/
169+
public int ordinal() {
170+
return ordinal;
171+
}
172+
155173
}

0 commit comments

Comments
 (0)