55package org .hibernate .event .spi ;
66
77import java .util .Collection ;
8- import java .util .Collections ;
98import java .util .HashMap ;
109import java .util .Map ;
1110import java .util .function .Consumer ;
1211
1312import org .hibernate .HibernateException ;
1413import org .hibernate .boot .registry .classloading .spi .ClassLoaderService ;
1514import org .hibernate .boot .spi .MetadataImplementor ;
15+ import org .hibernate .boot .spi .SessionFactoryOptions ;
1616import org .hibernate .engine .spi .SessionFactoryImplementor ;
1717import org .hibernate .event .service .internal .EventListenerRegistryImpl ;
1818import org .hibernate .event .service .spi .EventListenerGroup ;
1919import org .hibernate .event .service .spi .EventListenerRegistry ;
20- import org .hibernate .internal .util .collections .CollectionHelper ;
21- import org .hibernate .jpa .event .internal .CallbacksFactory ;
2220import org .hibernate .jpa .event .spi .CallbackRegistry ;
21+ import org .hibernate .service .spi .ServiceRegistryImplementor ;
2322import org .hibernate .service .spi .Stoppable ;
2423
24+ import static java .util .Collections .unmodifiableMap ;
25+ import static org .hibernate .internal .util .collections .CollectionHelper .isNotEmpty ;
26+ import static org .hibernate .jpa .event .internal .CallbacksFactory .buildCallbackRegistry ;
27+
2528/**
2629 * Composite for the things related to Hibernate's event system.
2730 *
@@ -36,102 +39,39 @@ public class EventEngine {
3639
3740 public EventEngine (MetadataImplementor mappings , SessionFactoryImplementor sessionFactory ) {
3841
42+ final SessionFactoryOptions sessionFactoryOptions = sessionFactory .getSessionFactoryOptions ();
43+ final ServiceRegistryImplementor serviceRegistry = sessionFactory .getServiceRegistry ();
44+
3945 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4046 // resolve (JPA) callback handlers
4147
42- callbackRegistry = CallbacksFactory .buildCallbackRegistry ( sessionFactory .getSessionFactoryOptions (),
43- sessionFactory .getServiceRegistry (), mappings .getEntityBindings () );
44-
48+ callbackRegistry = buildCallbackRegistry ( sessionFactoryOptions , serviceRegistry , mappings .getEntityBindings () );
4549
4650 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4751 // resolve event types and listeners
4852
49- final EventListenerRegistryImpl .Builder listenerRegistryBuilder = new EventListenerRegistryImpl .Builder (
50- callbackRegistry ,
51- sessionFactory .getSessionFactoryOptions ().isJpaBootstrap ()
52- );
53+ final EventListenerRegistryImpl .Builder listenerRegistryBuilder =
54+ new EventListenerRegistryImpl .Builder ( callbackRegistry , sessionFactoryOptions .isJpaBootstrap () );
5355
5456 final Map <String ,EventType <?>> eventTypes = new HashMap <>();
5557 EventType .registerStandardTypes ( eventTypes );
5658
57- final EventEngineContributions contributionManager = new EventEngineContributions () {
58- @ Override
59- public <T > EventType <T > findEventType (String name ) {
60- //noinspection unchecked
61- return (EventType <T >) eventTypes .get ( name );
62- }
63-
64- @ Override
65- public <T > EventType <T > contributeEventType (String name , Class <T > listenerRole ) {
66- final EventType <T > eventType = registerEventType ( name , listenerRole );
67-
68- listenerRegistryBuilder .prepareListeners ( eventType );
69-
70- return eventType ;
71- }
72-
73- private <T > EventType <T > registerEventType (String name , Class <T > listenerRole ) {
74- if ( name == null ) {
75- throw new HibernateException ( "Custom event-type name must be non-null." );
76- }
77-
78- if ( listenerRole == null ) {
79- throw new HibernateException ( "Custom event-type listener role must be non-null." );
80- }
81-
82- // make sure it does not match an existing name...
83- if ( eventTypes .containsKey ( name ) ) {
84- final EventType <?> existing = eventTypes .get ( name );
85- throw new HibernateException (
86- "Custom event-type already registered: " + name + " => " + existing
87- );
88- }
89-
90- final EventType <T > eventType = EventType .create (
91- name ,
92- listenerRole ,
93- eventTypes .size ()
94- );
95-
96- eventTypes .put ( name , eventType );
97- return eventType ;
98- }
99-
100- @ Override @ SafeVarargs
101- public final <T > EventType <T > contributeEventType (String name , Class <T > listenerRole , T ... defaultListeners ) {
102- final EventType <T > eventType = contributeEventType ( name , listenerRole );
103-
104- if ( defaultListeners != null ) {
105- listenerRegistryBuilder .getListenerGroup ( eventType ).appendListeners ( defaultListeners );
106- }
107-
108- return eventType ;
109- }
110-
111- @ Override
112- public <T > void configureListeners (
113- EventType <T > eventType ,
114- Consumer <EventListenerGroup <T >> action ) {
115- if ( ! eventTypes .containsValue ( eventType ) ) {
116- throw new HibernateException ( "EventType [" + eventType + "] not registered" );
117- }
59+ callContributors ( serviceRegistry , new ContributionManager ( eventTypes , listenerRegistryBuilder ) );
11860
119- action . accept ( listenerRegistryBuilder . getListenerGroup ( eventType ) );
120- }
121- };
61+ registeredEventTypes = unmodifiableMap ( eventTypes );
62+ listenerRegistry = listenerRegistryBuilder . buildRegistry ( registeredEventTypes );
63+ }
12264
65+ private static void callContributors (
66+ ServiceRegistryImplementor serviceRegistry , EventEngineContributions contributionManager ) {
12367 final Collection <EventEngineContributor > discoveredContributors =
124- sessionFactory .getServiceRegistry ()
125- .requireService ( ClassLoaderService .class )
68+ serviceRegistry .requireService ( ClassLoaderService .class )
12669 .loadJavaServices ( EventEngineContributor .class );
127- if ( CollectionHelper . isNotEmpty ( discoveredContributors ) ) {
70+ if ( isNotEmpty ( discoveredContributors ) ) {
12871 for ( EventEngineContributor contributor : discoveredContributors ) {
12972 contributor .contribute ( contributionManager );
13073 }
13174 }
132-
133- this .registeredEventTypes = Collections .unmodifiableMap ( eventTypes );
134- this .listenerRegistry = listenerRegistryBuilder .buildRegistry ( registeredEventTypes );
13575 }
13676
13777 public Collection <EventType <?>> getRegisteredEventTypes () {
@@ -152,10 +92,73 @@ public CallbackRegistry getCallbackRegistry() {
15292 }
15393
15494 public void stop () {
155- if ( listenerRegistry instanceof Stoppable ) {
156- ( ( Stoppable ) listenerRegistry ) .stop ();
95+ if ( listenerRegistry instanceof Stoppable stoppable ) {
96+ stoppable .stop ();
15797 }
158-
15998 callbackRegistry .release ();
16099 }
100+
101+ private static class ContributionManager implements EventEngineContributions {
102+ private final Map <String , EventType <?>> eventTypes ;
103+ private final EventListenerRegistryImpl .Builder listenerRegistryBuilder ;
104+
105+ public ContributionManager (
106+ Map <String , EventType <?>> eventTypes ,
107+ EventListenerRegistryImpl .Builder listenerRegistryBuilder ) {
108+ this .eventTypes = eventTypes ;
109+ this .listenerRegistryBuilder = listenerRegistryBuilder ;
110+ }
111+
112+ @ Override
113+ public <T > EventType <T > findEventType (String name ) {
114+ //noinspection unchecked
115+ return (EventType <T >) eventTypes .get ( name );
116+ }
117+
118+ @ Override
119+ public <T > EventType <T > contributeEventType (String name , Class <T > listenerRole ) {
120+ final EventType <T > eventType = registerEventType ( name , listenerRole );
121+ listenerRegistryBuilder .prepareListeners ( eventType );
122+ return eventType ;
123+ }
124+
125+ private <T > EventType <T > registerEventType (String name , Class <T > listenerRole ) {
126+ if ( name == null ) {
127+ throw new HibernateException ( "Custom event-type name must be non-null." );
128+ }
129+ else if ( listenerRole == null ) {
130+ throw new HibernateException ( "Custom event-type listener role must be non-null." );
131+ }
132+ // make sure it does not match an existing name...
133+ else if ( eventTypes .containsKey ( name ) ) {
134+ final EventType <?> existing = eventTypes .get ( name );
135+ throw new HibernateException (
136+ "Custom event-type already registered: " + name + " => " + existing
137+ );
138+ }
139+ else {
140+ final EventType <T > eventType = EventType .create ( name , listenerRole , eventTypes .size () );
141+ eventTypes .put ( name , eventType );
142+ return eventType ;
143+ }
144+ }
145+
146+ @ Override
147+ @ SafeVarargs
148+ public final <T > EventType <T > contributeEventType (String name , Class <T > listenerRole , T ... defaultListeners ) {
149+ final EventType <T > eventType = contributeEventType ( name , listenerRole );
150+ if ( defaultListeners != null ) {
151+ listenerRegistryBuilder .getListenerGroup ( eventType ).appendListeners ( defaultListeners );
152+ }
153+ return eventType ;
154+ }
155+
156+ @ Override
157+ public <T > void configureListeners (EventType <T > eventType , Consumer <EventListenerGroup <T >> action ) {
158+ if ( !eventTypes .containsValue ( eventType ) ) {
159+ throw new HibernateException ( "EventType [" + eventType + "] not registered" );
160+ }
161+ action .accept ( listenerRegistryBuilder .getListenerGroup ( eventType ) );
162+ }
163+ }
161164}
0 commit comments