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