20
20
21
21
import java .util .ArrayList ;
22
22
import java .util .Collection ;
23
+ import java .util .Collections ;
23
24
import java .util .HashMap ;
24
25
import java .util .Map ;
25
- import java .util .Optional ;
26
26
import java .util .WeakHashMap ;
27
27
import java .util .concurrent .ConcurrentHashMap ;
28
28
import java .util .concurrent .locks .Lock ;
39
39
@ NullMarked
40
40
public class LoggerRegistry <T extends ExtendedLogger > {
41
41
42
- private final Map <MessageFactory , Map <String , T >> loggerByNameByMessageFactory = new WeakHashMap <>();
42
+ private final Map <String , Map <MessageFactory , T >> loggerByMessageFactoryByName = new HashMap <>();
43
43
44
44
private final ReadWriteLock lock = new ReentrantReadWriteLock ();
45
45
@@ -160,12 +160,10 @@ public LoggerRegistry(@Nullable final MapFactory<T> mapFactory) {
160
160
requireNonNull (name , "name" );
161
161
readLock .lock ();
162
162
try {
163
+ final @ Nullable Map <MessageFactory , T > loggerByMessageFactory = loggerByMessageFactoryByName .get (name );
163
164
final MessageFactory effectiveMessageFactory =
164
165
messageFactory != null ? messageFactory : ParameterizedMessageFactory .INSTANCE ;
165
- return Optional .of (loggerByNameByMessageFactory )
166
- .map (loggerByNameByMessageFactory -> loggerByNameByMessageFactory .get (effectiveMessageFactory ))
167
- .map (loggerByName -> loggerByName .get (name ))
168
- .orElse (null );
166
+ return loggerByMessageFactory == null ? null : loggerByMessageFactory .get (effectiveMessageFactory );
169
167
} finally {
170
168
readLock .unlock ();
171
169
}
@@ -179,8 +177,8 @@ public Collection<T> getLoggers(final Collection<T> destination) {
179
177
requireNonNull (destination , "destination" );
180
178
readLock .lock ();
181
179
try {
182
- loggerByNameByMessageFactory .values ().stream ()
183
- .flatMap (loggerByName -> loggerByName .values ().stream ())
180
+ loggerByMessageFactoryByName .values ().stream ()
181
+ .flatMap (loggerByMessageFactory -> loggerByMessageFactory .values ().stream ())
184
182
.forEach (destination ::add );
185
183
} finally {
186
184
readLock .unlock ();
@@ -203,7 +201,8 @@ public Collection<T> getLoggers(final Collection<T> destination) {
203
201
@ Deprecated
204
202
public boolean hasLogger (final String name ) {
205
203
requireNonNull (name , "name" );
206
- return getLogger (name ) != null ;
204
+ final @ Nullable T logger = getLogger (name );
205
+ return logger != null ;
207
206
}
208
207
209
208
/**
@@ -221,7 +220,8 @@ public boolean hasLogger(final String name) {
221
220
*/
222
221
public boolean hasLogger (final String name , @ Nullable final MessageFactory messageFactory ) {
223
222
requireNonNull (name , "name" );
224
- return getLogger (name , messageFactory ) != null ;
223
+ final @ Nullable T logger = getLogger (name , messageFactory );
224
+ return logger != null ;
225
225
}
226
226
227
227
/**
@@ -237,9 +237,8 @@ public boolean hasLogger(final String name, final Class<? extends MessageFactory
237
237
requireNonNull (messageFactoryClass , "messageFactoryClass" );
238
238
readLock .lock ();
239
239
try {
240
- return loggerByNameByMessageFactory .entrySet ().stream ()
241
- .filter (entry -> messageFactoryClass .equals (entry .getKey ().getClass ()))
242
- .anyMatch (entry -> entry .getValue ().containsKey (name ));
240
+ return loggerByMessageFactoryByName .getOrDefault (name , Collections .emptyMap ()).keySet ().stream ()
241
+ .anyMatch (messageFactory -> messageFactoryClass .equals (messageFactory .getClass ()));
243
242
} finally {
244
243
readLock .unlock ();
245
244
}
@@ -249,26 +248,30 @@ public boolean hasLogger(final String name, final Class<? extends MessageFactory
249
248
* Registers the provided logger.
250
249
* <b>Logger name and message factory parameters are ignored</b>, those will be obtained from the logger instead.
251
250
*
252
- * @param name ignored – kept for backward compatibility
253
- * @param messageFactory ignored – kept for backward compatibility
251
+ * @param name a logger name
252
+ * @param messageFactory a message factory
254
253
* @param logger a logger instance
255
254
*/
256
- public void putIfAbsent (
257
- @ Nullable final String name , @ Nullable final MessageFactory messageFactory , final T logger ) {
255
+ public void putIfAbsent (final String name , @ Nullable final MessageFactory messageFactory , final T logger ) {
258
256
259
257
// Check arguments
258
+ requireNonNull (name , "name" );
260
259
requireNonNull (logger , "logger" );
261
260
262
261
// Insert the logger
263
262
writeLock .lock ();
264
263
try {
265
- final String loggerName = logger . getName ();
266
- final MessageFactory loggerMessageFactory = logger . getMessageFactory () ;
267
- loggerByNameByMessageFactory
268
- .computeIfAbsent (loggerMessageFactory , ignored -> new HashMap <>() )
269
- .putIfAbsent (loggerName , logger );
264
+ final MessageFactory effectiveMessageFactory =
265
+ messageFactory != null ? messageFactory : ParameterizedMessageFactory . INSTANCE ;
266
+ loggerByMessageFactoryByName
267
+ .computeIfAbsent (name , this :: createLoggerRefByMessageFactoryMap )
268
+ .putIfAbsent (effectiveMessageFactory , logger );
270
269
} finally {
271
270
writeLock .unlock ();
272
271
}
273
272
}
273
+
274
+ private Map <MessageFactory , T > createLoggerRefByMessageFactoryMap (final String ignored ) {
275
+ return new WeakHashMap <>();
276
+ }
274
277
}
0 commit comments