2020
2121import java .util .ArrayList ;
2222import java .util .Collection ;
23+ import java .util .Collections ;
2324import java .util .HashMap ;
2425import java .util .Map ;
25- import java .util .Optional ;
2626import java .util .WeakHashMap ;
2727import java .util .concurrent .ConcurrentHashMap ;
2828import java .util .concurrent .locks .Lock ;
3939@ NullMarked
4040public class LoggerRegistry <T extends ExtendedLogger > {
4141
42- private final Map <MessageFactory , Map <String , T >> loggerByNameByMessageFactory = new WeakHashMap <>();
42+ private final Map <String , Map <MessageFactory , T >> loggerByMessageFactoryByName = new HashMap <>();
4343
4444 private final ReadWriteLock lock = new ReentrantReadWriteLock ();
4545
@@ -160,12 +160,10 @@ public LoggerRegistry(@Nullable final MapFactory<T> mapFactory) {
160160 requireNonNull (name , "name" );
161161 readLock .lock ();
162162 try {
163+ final @ Nullable Map <MessageFactory , T > loggerByMessageFactory = loggerByMessageFactoryByName .get (name );
163164 final MessageFactory effectiveMessageFactory =
164165 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 );
169167 } finally {
170168 readLock .unlock ();
171169 }
@@ -179,8 +177,8 @@ public Collection<T> getLoggers(final Collection<T> destination) {
179177 requireNonNull (destination , "destination" );
180178 readLock .lock ();
181179 try {
182- loggerByNameByMessageFactory .values ().stream ()
183- .flatMap (loggerByName -> loggerByName .values ().stream ())
180+ loggerByMessageFactoryByName .values ().stream ()
181+ .flatMap (loggerByMessageFactory -> loggerByMessageFactory .values ().stream ())
184182 .forEach (destination ::add );
185183 } finally {
186184 readLock .unlock ();
@@ -203,7 +201,8 @@ public Collection<T> getLoggers(final Collection<T> destination) {
203201 @ Deprecated
204202 public boolean hasLogger (final String name ) {
205203 requireNonNull (name , "name" );
206- return getLogger (name ) != null ;
204+ final @ Nullable T logger = getLogger (name );
205+ return logger != null ;
207206 }
208207
209208 /**
@@ -221,7 +220,8 @@ public boolean hasLogger(final String name) {
221220 */
222221 public boolean hasLogger (final String name , @ Nullable final MessageFactory messageFactory ) {
223222 requireNonNull (name , "name" );
224- return getLogger (name , messageFactory ) != null ;
223+ final @ Nullable T logger = getLogger (name , messageFactory );
224+ return logger != null ;
225225 }
226226
227227 /**
@@ -237,9 +237,8 @@ public boolean hasLogger(final String name, final Class<? extends MessageFactory
237237 requireNonNull (messageFactoryClass , "messageFactoryClass" );
238238 readLock .lock ();
239239 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 ()));
243242 } finally {
244243 readLock .unlock ();
245244 }
@@ -249,26 +248,30 @@ public boolean hasLogger(final String name, final Class<? extends MessageFactory
249248 * Registers the provided logger.
250249 * <b>Logger name and message factory parameters are ignored</b>, those will be obtained from the logger instead.
251250 *
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
254253 * @param logger a logger instance
255254 */
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 ) {
258256
259257 // Check arguments
258+ requireNonNull (name , "name" );
260259 requireNonNull (logger , "logger" );
261260
262261 // Insert the logger
263262 writeLock .lock ();
264263 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 );
270269 } finally {
271270 writeLock .unlock ();
272271 }
273272 }
273+
274+ private Map <MessageFactory , T > createLoggerRefByMessageFactoryMap (final String ignored ) {
275+ return new WeakHashMap <>();
276+ }
274277}
0 commit comments