Skip to content

Commit 4843cfc

Browse files
committed
cleanups around CallbackRegistryImpl
1 parent be75f86 commit 4843cfc

File tree

3 files changed

+52
-86
lines changed

3 files changed

+52
-86
lines changed

hibernate-core/src/main/java/org/hibernate/internal/util/collections/ArrayHelper.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,15 @@ public static <T> T[] join(T[] x, T... y) {
212212
return result;
213213
}
214214

215+
@SuppressWarnings("unchecked")
216+
@AllowReflection
217+
public static <T> T[] add(T[] x, T y) {
218+
T[] result = (T[]) Array.newInstance( x.getClass().getComponentType(), x.length + 1 );
219+
System.arraycopy( x, 0, result, 0, x.length );
220+
result[x.length] = y;
221+
return result;
222+
}
223+
215224
public static final boolean[] TRUE = {true};
216225
public static final boolean[] FALSE = {false};
217226

hibernate-core/src/main/java/org/hibernate/internal/util/collections/MapBackedClassValue.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
* @author Sanne Grinovero
1919
* @since 6.2
2020
*/
21-
public final class MapBackedClassValue<V> implements ReadOnlyMap<Class,V> {
21+
public final class MapBackedClassValue<V> implements ReadOnlyMap<Class<?>,V> {
2222

2323
private volatile Map<Class<?>, V> map;
2424

@@ -44,7 +44,7 @@ public MapBackedClassValue(final Map<Class<?>, V> map) {
4444
}
4545

4646
@Override
47-
public V get(Class key) {
47+
public V get(Class<?> key) {
4848
return classValue.get( key );
4949
}
5050

hibernate-core/src/main/java/org/hibernate/jpa/event/internal/CallbackRegistryImpl.java

Lines changed: 41 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.util.HashMap;
88
import java.util.Map;
99

10-
import jakarta.persistence.PersistenceException;
1110

1211
import org.hibernate.internal.build.AllowReflection;
1312
import org.hibernate.internal.util.collections.ArrayHelper;
@@ -26,13 +25,13 @@
2625
*/
2726
final 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

Comments
 (0)