Skip to content

Commit b20ac39

Browse files
committed
HHH-8577 - ClearListener: allow to listen for clear events
1 parent 3d366a5 commit b20ac39

File tree

6 files changed

+272
-88
lines changed

6 files changed

+272
-88
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.hibernate.event.spi.EventType;
5656

5757
import static org.hibernate.event.spi.EventType.AUTO_FLUSH;
58+
import static org.hibernate.event.spi.EventType.CLEAR;
5859
import static org.hibernate.event.spi.EventType.DELETE;
5960
import static org.hibernate.event.spi.EventType.DIRTY_CHECK;
6061
import static org.hibernate.event.spi.EventType.EVICT;
@@ -226,6 +227,11 @@ private static Map<EventType,EventListenerGroupImpl> prepareListenerMap() {
226227
workMap
227228
);
228229

230+
prepareListeners(
231+
CLEAR,
232+
workMap
233+
);
234+
229235
// flush listeners
230236
prepareListeners(
231237
FLUSH,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
5+
* indicated by the @author tags or express copyright attribution
6+
* statements applied by the authors. All third-party contributions are
7+
* distributed under license by Red Hat Inc.
8+
*
9+
* This copyrighted material is made available to anyone wishing to use, modify,
10+
* copy, or redistribute it subject to the terms and conditions of the GNU
11+
* Lesser General Public License, as published by the Free Software Foundation.
12+
*
13+
* This program is distributed in the hope that it will be useful,
14+
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15+
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
16+
* for more details.
17+
*
18+
* You should have received a copy of the GNU Lesser General Public License
19+
* along with this distribution; if not, write to:
20+
* Free Software Foundation, Inc.
21+
* 51 Franklin Street, Fifth Floor
22+
* Boston, MA 02110-1301 USA
23+
*/
24+
package org.hibernate.event.spi;
25+
26+
/**
27+
* An event for {@link org.hibernate.Session#clear()} listening
28+
*
29+
* @author Steve Ebersole
30+
*/
31+
public class ClearEvent extends AbstractEvent {
32+
/**
33+
* Constructs an event from the given event session.
34+
*
35+
* @param source The session event source.
36+
*/
37+
public ClearEvent(EventSource source) {
38+
super( source );
39+
}
40+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
5+
* indicated by the @author tags or express copyright attribution
6+
* statements applied by the authors. All third-party contributions are
7+
* distributed under license by Red Hat Inc.
8+
*
9+
* This copyrighted material is made available to anyone wishing to use, modify,
10+
* copy, or redistribute it subject to the terms and conditions of the GNU
11+
* Lesser General Public License, as published by the Free Software Foundation.
12+
*
13+
* This program is distributed in the hope that it will be useful,
14+
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15+
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
16+
* for more details.
17+
*
18+
* You should have received a copy of the GNU Lesser General Public License
19+
* along with this distribution; if not, write to:
20+
* Free Software Foundation, Inc.
21+
* 51 Franklin Street, Fifth Floor
22+
* Boston, MA 02110-1301 USA
23+
*/
24+
package org.hibernate.event.spi;
25+
26+
import java.io.Serializable;
27+
28+
/**
29+
* Listener for notification of {@link org.hibernate.Session#clear()}
30+
*
31+
* @author Steve Ebersole
32+
*/
33+
public interface ClearEventListener extends Serializable {
34+
/**
35+
* Callback for {@link org.hibernate.Session#clear()} notification
36+
*
37+
* @param event The event representing the clear
38+
*/
39+
public void onClear(ClearEvent event);
40+
}

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

Lines changed: 58 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -38,90 +38,61 @@
3838
* @author Steve Ebersole
3939
*/
4040
public class EventType<T> {
41-
public static final EventType<LoadEventListener> LOAD
42-
= new EventType<LoadEventListener>( "load", LoadEventListener.class );
43-
public static final EventType<ResolveNaturalIdEventListener> RESOLVE_NATURAL_ID
44-
= new EventType<ResolveNaturalIdEventListener>( "resolve-natural-id", ResolveNaturalIdEventListener.class );
45-
public static final EventType<InitializeCollectionEventListener> INIT_COLLECTION
46-
= new EventType<InitializeCollectionEventListener>( "load-collection", InitializeCollectionEventListener.class );
47-
48-
public static final EventType<SaveOrUpdateEventListener> SAVE_UPDATE
49-
= new EventType<SaveOrUpdateEventListener>( "save-update", SaveOrUpdateEventListener.class );
50-
public static final EventType<SaveOrUpdateEventListener> UPDATE
51-
= new EventType<SaveOrUpdateEventListener>( "update", SaveOrUpdateEventListener.class );
52-
public static final EventType<SaveOrUpdateEventListener> SAVE
53-
= new EventType<SaveOrUpdateEventListener>( "save", SaveOrUpdateEventListener.class );
54-
public static final EventType<PersistEventListener> PERSIST
55-
= new EventType<PersistEventListener>( "create", PersistEventListener.class );
56-
public static final EventType<PersistEventListener> PERSIST_ONFLUSH
57-
= new EventType<PersistEventListener>( "create-onflush", PersistEventListener.class );
58-
59-
public static final EventType<MergeEventListener> MERGE
60-
= new EventType<MergeEventListener>( "merge", MergeEventListener.class );
61-
62-
public static final EventType<DeleteEventListener> DELETE
63-
= new EventType<DeleteEventListener>( "delete", DeleteEventListener.class );
64-
65-
public static final EventType<ReplicateEventListener> REPLICATE
66-
= new EventType<ReplicateEventListener>( "replicate", ReplicateEventListener.class );
67-
68-
public static final EventType<FlushEventListener> FLUSH
69-
= new EventType<FlushEventListener>( "flush", FlushEventListener.class );
70-
public static final EventType<AutoFlushEventListener> AUTO_FLUSH
71-
= new EventType<AutoFlushEventListener>( "auto-flush", AutoFlushEventListener.class );
72-
public static final EventType<DirtyCheckEventListener> DIRTY_CHECK
73-
= new EventType<DirtyCheckEventListener>( "dirty-check", DirtyCheckEventListener.class );
74-
public static final EventType<FlushEntityEventListener> FLUSH_ENTITY
75-
= new EventType<FlushEntityEventListener>( "flush-entity", FlushEntityEventListener.class );
76-
77-
public static final EventType<EvictEventListener> EVICT
78-
= new EventType<EvictEventListener>( "evict", EvictEventListener.class );
79-
80-
public static final EventType<LockEventListener> LOCK
81-
= new EventType<LockEventListener>( "lock", LockEventListener.class );
82-
83-
public static final EventType<RefreshEventListener> REFRESH
84-
= new EventType<RefreshEventListener>( "refresh", RefreshEventListener.class );
85-
86-
public static final EventType<PreLoadEventListener> PRE_LOAD
87-
= new EventType<PreLoadEventListener>( "pre-load", PreLoadEventListener.class );
88-
public static final EventType<PreDeleteEventListener> PRE_DELETE
89-
= new EventType<PreDeleteEventListener>( "pre-delete", PreDeleteEventListener.class );
90-
public static final EventType<PreUpdateEventListener> PRE_UPDATE
91-
= new EventType<PreUpdateEventListener>( "pre-update", PreUpdateEventListener.class );
92-
public static final EventType<PreInsertEventListener> PRE_INSERT
93-
= new EventType<PreInsertEventListener>( "pre-insert", PreInsertEventListener.class );
94-
95-
public static final EventType<PostLoadEventListener> POST_LOAD
96-
= new EventType<PostLoadEventListener>( "post-load", PostLoadEventListener.class );
97-
public static final EventType<PostDeleteEventListener> POST_DELETE
98-
= new EventType<PostDeleteEventListener>( "post-delete", PostDeleteEventListener.class );
99-
public static final EventType<PostUpdateEventListener> POST_UPDATE
100-
= new EventType<PostUpdateEventListener>( "post-update", PostUpdateEventListener.class );
101-
public static final EventType<PostInsertEventListener> POST_INSERT
102-
= new EventType<PostInsertEventListener>( "post-insert", PostInsertEventListener.class );
103-
104-
public static final EventType<PostDeleteEventListener> POST_COMMIT_DELETE
105-
= new EventType<PostDeleteEventListener>( "post-commit-delete", PostDeleteEventListener.class );
106-
public static final EventType<PostUpdateEventListener> POST_COMMIT_UPDATE
107-
= new EventType<PostUpdateEventListener>( "post-commit-update", PostUpdateEventListener.class );
108-
public static final EventType<PostInsertEventListener> POST_COMMIT_INSERT
109-
= new EventType<PostInsertEventListener>( "post-commit-insert", PostInsertEventListener.class );
110-
111-
public static final EventType<PreCollectionRecreateEventListener> PRE_COLLECTION_RECREATE
112-
= new EventType<PreCollectionRecreateEventListener>( "pre-collection-recreate", PreCollectionRecreateEventListener.class );
113-
public static final EventType<PreCollectionRemoveEventListener> PRE_COLLECTION_REMOVE
114-
= new EventType<PreCollectionRemoveEventListener>( "pre-collection-remove", PreCollectionRemoveEventListener.class );
115-
public static final EventType<PreCollectionUpdateEventListener> PRE_COLLECTION_UPDATE
116-
= new EventType<PreCollectionUpdateEventListener>( "pre-collection-update", PreCollectionUpdateEventListener.class );
117-
118-
public static final EventType<PostCollectionRecreateEventListener> POST_COLLECTION_RECREATE
119-
= new EventType<PostCollectionRecreateEventListener>( "post-collection-recreate", PostCollectionRecreateEventListener.class );
120-
public static final EventType<PostCollectionRemoveEventListener> POST_COLLECTION_REMOVE
121-
= new EventType<PostCollectionRemoveEventListener>( "post-collection-remove", PostCollectionRemoveEventListener.class );
122-
public static final EventType<PostCollectionUpdateEventListener> POST_COLLECTION_UPDATE
123-
= new EventType<PostCollectionUpdateEventListener>( "post-collection-update", PostCollectionUpdateEventListener.class );
41+
public static final EventType<LoadEventListener> LOAD = create( "load", LoadEventListener.class );
42+
public static final EventType<ResolveNaturalIdEventListener> RESOLVE_NATURAL_ID = create( "resolve-natural-id", ResolveNaturalIdEventListener.class );
12443

44+
public static final EventType<InitializeCollectionEventListener> INIT_COLLECTION = create( "load-collection", InitializeCollectionEventListener.class );
45+
46+
public static final EventType<SaveOrUpdateEventListener> SAVE_UPDATE = create( "save-update", SaveOrUpdateEventListener.class );
47+
public static final EventType<SaveOrUpdateEventListener> UPDATE = create( "update", SaveOrUpdateEventListener.class );
48+
public static final EventType<SaveOrUpdateEventListener> SAVE = create( "save", SaveOrUpdateEventListener.class );
49+
public static final EventType<PersistEventListener> PERSIST = create( "create", PersistEventListener.class );
50+
public static final EventType<PersistEventListener> PERSIST_ONFLUSH = create( "create-onflush", PersistEventListener.class );
51+
52+
public static final EventType<MergeEventListener> MERGE = create( "merge", MergeEventListener.class );
53+
54+
public static final EventType<DeleteEventListener> DELETE = create( "delete", DeleteEventListener.class );
55+
56+
public static final EventType<ReplicateEventListener> REPLICATE = create( "replicate", ReplicateEventListener.class );
57+
58+
public static final EventType<FlushEventListener> FLUSH = create( "flush", FlushEventListener.class );
59+
public static final EventType<AutoFlushEventListener> AUTO_FLUSH = create( "auto-flush", AutoFlushEventListener.class );
60+
public static final EventType<DirtyCheckEventListener> DIRTY_CHECK = create( "dirty-check", DirtyCheckEventListener.class );
61+
public static final EventType<FlushEntityEventListener> FLUSH_ENTITY = create( "flush-entity", FlushEntityEventListener.class );
62+
63+
public static final EventType<ClearEventListener> CLEAR = create( "clear", ClearEventListener.class );
64+
public static final EventType<EvictEventListener> EVICT = create( "evict", EvictEventListener.class );
65+
66+
public static final EventType<LockEventListener> LOCK = create( "lock", LockEventListener.class );
67+
68+
public static final EventType<RefreshEventListener> REFRESH = create( "refresh", RefreshEventListener.class );
69+
70+
public static final EventType<PreLoadEventListener> PRE_LOAD = create( "pre-load", PreLoadEventListener.class );
71+
public static final EventType<PreDeleteEventListener> PRE_DELETE = create( "pre-delete", PreDeleteEventListener.class );
72+
public static final EventType<PreUpdateEventListener> PRE_UPDATE = create( "pre-update", PreUpdateEventListener.class );
73+
public static final EventType<PreInsertEventListener> PRE_INSERT = create( "pre-insert", PreInsertEventListener.class );
74+
75+
public static final EventType<PostLoadEventListener> POST_LOAD = create( "post-load", PostLoadEventListener.class );
76+
public static final EventType<PostDeleteEventListener> POST_DELETE = create( "post-delete", PostDeleteEventListener.class );
77+
public static final EventType<PostUpdateEventListener> POST_UPDATE = create( "post-update", PostUpdateEventListener.class );
78+
public static final EventType<PostInsertEventListener> POST_INSERT = create( "post-insert", PostInsertEventListener.class );
79+
80+
public static final EventType<PostDeleteEventListener> POST_COMMIT_DELETE = create( "post-commit-delete", PostDeleteEventListener.class );
81+
public static final EventType<PostUpdateEventListener> POST_COMMIT_UPDATE = create( "post-commit-update", PostUpdateEventListener.class );
82+
public static final EventType<PostInsertEventListener> POST_COMMIT_INSERT = create( "post-commit-insert", PostInsertEventListener.class );
83+
84+
public static final EventType<PreCollectionRecreateEventListener> PRE_COLLECTION_RECREATE = create( "pre-collection-recreate", PreCollectionRecreateEventListener.class );
85+
public static final EventType<PreCollectionRemoveEventListener> PRE_COLLECTION_REMOVE = create( "pre-collection-remove", PreCollectionRemoveEventListener.class );
86+
public static final EventType<PreCollectionUpdateEventListener> PRE_COLLECTION_UPDATE = create( "pre-collection-update", PreCollectionUpdateEventListener.class );
87+
88+
public static final EventType<PostCollectionRecreateEventListener> POST_COLLECTION_RECREATE = create( "post-collection-recreate", PostCollectionRecreateEventListener.class );
89+
public static final EventType<PostCollectionRemoveEventListener> POST_COLLECTION_REMOVE = create( "post-collection-remove", PostCollectionRemoveEventListener.class );
90+
public static final EventType<PostCollectionUpdateEventListener> POST_COLLECTION_UPDATE = create( "post-collection-update", PostCollectionUpdateEventListener.class );
91+
92+
93+
private static <T> EventType<T> create(String name, Class<T> listenerClass) {
94+
return new EventType<T>( name, listenerClass );
95+
}
12596

12697
/**
12798
* Maintain a map of {@link EventType} instances keyed by name for lookup by name as well as {@link #values()}
@@ -132,14 +103,13 @@ public class EventType<T> {
132103
@Override
133104
public Map<String, EventType> run() {
134105
final Map<String, EventType> typeByNameMap = new HashMap<String, EventType>();
135-
final Field[] fields = EventType.class.getDeclaredFields();
136-
for ( int i = 0, max = fields.length; i < max; i++ ) {
137-
if ( EventType.class.isAssignableFrom( fields[i].getType() ) ) {
106+
for ( Field field : EventType.class.getDeclaredFields() ) {
107+
if ( EventType.class.isAssignableFrom( field.getType() ) ) {
138108
try {
139-
final EventType typeField = ( EventType ) fields[i].get( null );
109+
final EventType typeField = (EventType) field.get( null );
140110
typeByNameMap.put( typeField.eventName(), typeField );
141111
}
142-
catch( Exception t ) {
112+
catch (Exception t) {
143113
throw new HibernateException( "Unable to initialize EventType map", t );
144114
}
145115
}

hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@
109109
import org.hibernate.event.service.spi.EventListenerRegistry;
110110
import org.hibernate.event.spi.AutoFlushEvent;
111111
import org.hibernate.event.spi.AutoFlushEventListener;
112+
import org.hibernate.event.spi.ClearEvent;
113+
import org.hibernate.event.spi.ClearEventListener;
112114
import org.hibernate.event.spi.DeleteEvent;
113115
import org.hibernate.event.spi.DeleteEventListener;
114116
import org.hibernate.event.spi.DirtyCheckEvent;
@@ -332,6 +334,11 @@ public void clear() {
332334
private void internalClear() {
333335
persistenceContext.clear();
334336
actionQueue.clear();
337+
338+
final ClearEvent event = new ClearEvent( this );
339+
for ( ClearEventListener listener : listeners( EventType.CLEAR ) ) {
340+
listener.onClear( event );
341+
}
335342
}
336343

337344
public long getTimestamp() {

0 commit comments

Comments
 (0)