From 7f176580793857e9036f34d1b5d70a5dac4c87ed Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 16 Apr 2014 20:47:49 +0200 Subject: [PATCH] fix LOGBACK-976 (take2) --- .../util/StatusListenerConfigHelper.java | 4 +- .../qos/logback/core/BasicStatusManager.java | 19 +++++++ .../core/status/OnConsoleStatusListener.java | 0 .../logback/core/status/StatusManager.java | 6 ++- .../logback/core/BasicStatusManagerTest.java | 51 ++++++++++++++----- logback-site/src/site/pages/news.html | 6 +++ 6 files changed, 69 insertions(+), 17 deletions(-) mode change 100644 => 100755 logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.java mode change 100644 => 100755 logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java mode change 100644 => 100755 logback-core/src/main/java/ch/qos/logback/core/status/OnConsoleStatusListener.java mode change 100644 => 100755 logback-core/src/main/java/ch/qos/logback/core/status/StatusManager.java mode change 100644 => 100755 logback-core/src/test/java/ch/qos/logback/core/BasicStatusManagerTest.java diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.java b/logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.java old mode 100644 new mode 100755 index 42737ffdb..674c5f131 --- a/logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.java @@ -38,10 +38,10 @@ public class StatusListenerConfigHelper { } else { listener = createListenerPerClassName(loggerContext, listenerClass); } - initListener(loggerContext, listener); + initAndAddListener(loggerContext, listener); } - private static void initListener(LoggerContext loggerContext, StatusListener listener) { + private static void initAndAddListener(LoggerContext loggerContext, StatusListener listener) { if (listener != null) { if(listener instanceof ContextAware) // LOGBACK-767 ((ContextAware) listener).setContext(loggerContext); diff --git a/logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java b/logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java old mode 100644 new mode 100755 index 6f1fc05d5..38a8cbcba --- a/logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java +++ b/logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java @@ -18,6 +18,7 @@ import java.util.List; import ch.qos.logback.core.helpers.CyclicBuffer; import ch.qos.logback.core.spi.LogbackLock; +import ch.qos.logback.core.status.OnConsoleStatusListener; import ch.qos.logback.core.status.Status; import ch.qos.logback.core.status.StatusListener; import ch.qos.logback.core.status.StatusManager; @@ -105,12 +106,30 @@ public class BasicStatusManager implements StatusManager { return count; } + /** + * This implementation does not allow duplicate installations of OnConsoleStatusListener + * @param listener + */ public void add(StatusListener listener) { synchronized (statusListenerListLock) { + if(listener instanceof OnConsoleStatusListener) { + boolean alreadyPresent = checkForPresence(statusListenerList, listener.getClass()); + if(alreadyPresent) + return; + } statusListenerList.add(listener); } } + private boolean checkForPresence(List statusListenerList, Class aClass) { + for(StatusListener e: statusListenerList) { + if(e.getClass() == aClass) + return true; + } + return false; + } + + public void remove(StatusListener listener) { synchronized (statusListenerListLock) { statusListenerList.remove(listener); diff --git a/logback-core/src/main/java/ch/qos/logback/core/status/OnConsoleStatusListener.java b/logback-core/src/main/java/ch/qos/logback/core/status/OnConsoleStatusListener.java old mode 100644 new mode 100755 diff --git a/logback-core/src/main/java/ch/qos/logback/core/status/StatusManager.java b/logback-core/src/main/java/ch/qos/logback/core/status/StatusManager.java old mode 100644 new mode 100755 index 2394bcd9d..30b8c2184 --- a/logback-core/src/main/java/ch/qos/logback/core/status/StatusManager.java +++ b/logback-core/src/main/java/ch/qos/logback/core/status/StatusManager.java @@ -55,8 +55,8 @@ public interface StatusManager { * @param listener */ void add(StatusListener listener); - - /** + + /**); * Remove a status listener. * * @param listener @@ -77,4 +77,6 @@ public interface StatusManager { */ List getCopyOfStatusListenerList(); + + } diff --git a/logback-core/src/test/java/ch/qos/logback/core/BasicStatusManagerTest.java b/logback-core/src/test/java/ch/qos/logback/core/BasicStatusManagerTest.java old mode 100644 new mode 100755 index 9823372b7..e8876f751 --- a/logback-core/src/test/java/ch/qos/logback/core/BasicStatusManagerTest.java +++ b/logback-core/src/test/java/ch/qos/logback/core/BasicStatusManagerTest.java @@ -21,6 +21,8 @@ import static org.junit.Assert.assertNotNull; import java.util.ArrayList; import java.util.List; +import ch.qos.logback.core.status.OnConsoleStatusListener; +import ch.qos.logback.core.status.StatusListener; import org.junit.Test; import ch.qos.logback.core.status.ErrorStatus; @@ -29,38 +31,61 @@ import ch.qos.logback.core.status.Status; public class BasicStatusManagerTest { - + BasicStatusManager bsm = new BasicStatusManager(); - + @Test public void smoke() { bsm.add(new ErrorStatus("hello", this)); assertEquals(Status.ERROR, bsm.getLevel()); - + List statusList = bsm.getCopyOfStatusList(); assertNotNull(statusList); assertEquals(1, statusList.size()); assertEquals("hello", statusList.get(0).getMessage()); } - + @Test public void many() { int margin = 300; - int len = MAX_HEADER_COUNT+TAIL_SIZE+margin; - for(int i = 0; i < len; i++) { - bsm.add(new ErrorStatus(""+i, this)); + int len = MAX_HEADER_COUNT + TAIL_SIZE + margin; + for (int i = 0; i < len; i++) { + bsm.add(new ErrorStatus("" + i, this)); } - + List statusList = bsm.getCopyOfStatusList(); assertNotNull(statusList); - assertEquals(MAX_HEADER_COUNT+TAIL_SIZE, statusList.size()); + assertEquals(MAX_HEADER_COUNT + TAIL_SIZE, statusList.size()); List witness = new ArrayList(); - for(int i = 0; i < MAX_HEADER_COUNT; i++) { - witness.add(new ErrorStatus(""+i, this)); + for (int i = 0; i < MAX_HEADER_COUNT; i++) { + witness.add(new ErrorStatus("" + i, this)); } - for(int i = 0; i < TAIL_SIZE; i++) { - witness.add(new ErrorStatus(""+(MAX_HEADER_COUNT+margin+i), this)); + for (int i = 0; i < TAIL_SIZE; i++) { + witness.add(new ErrorStatus("" + (MAX_HEADER_COUNT + margin + i), this)); } assertEquals(witness, statusList); } + + @Test + public void duplicateInstallationsOfOnConsoleListener() { + OnConsoleStatusListener sl0 = new OnConsoleStatusListener(); + sl0.start(); + OnConsoleStatusListener sl1 = new OnConsoleStatusListener(); + sl1.start(); + + bsm.add(sl0); + + { + List listeners = bsm.getCopyOfStatusListenerList(); + assertEquals(1, listeners.size()); + } + + bsm.add(sl1); + { + List listeners = bsm.getCopyOfStatusListenerList(); + assertEquals(1, listeners.size()); + } + } + + } diff --git a/logback-site/src/site/pages/news.html b/logback-site/src/site/pages/news.html index cab23db28..9c2c1543a 100755 --- a/logback-site/src/site/pages/news.html +++ b/logback-site/src/site/pages/news.html @@ -49,6 +49,12 @@ context upon JVM exit.

+

BasicStatusManager now prevents adding more than + one instance of OnConsoleStatusListener as a status + listener. This fixes LOGBACK-976. +

+

2nd of April, 2014 - Release of version 1.1.2

Create an abstract method, createOutputStream, as an extension point -- GitLab