@Test public void testRemoveReturnsRemovedItem() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); final AppenderControl[] controls = new AppenderControl[] {createControl("A"), createControl("B"), createControl("C"), createControl("D")}; for (final AppenderControl ctl : controls) { set.add(ctl); } assertEquals(controls.length, set.get().length); final AppenderControl b = set.remove("B"); assertSame(controls[1], b); final AppenderControl c = set.remove("C"); assertSame(controls[2], c); }
@Test public void testAsMap() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); final AppenderControl[] controls = new AppenderControl[] {createControl("A"), createControl("B"), createControl("C"), createControl("D")}; for (final AppenderControl ctl : controls) { set.add(ctl); } final Map<String, Appender> expected = new HashMap<>(); for (final AppenderControl ctl : controls) { expected.put(ctl.getAppenderName(), ctl.getAppender()); } assertEquals(expected, set.asMap()); }
@Test public void testInitiallyEmpty() throws Exception { assertTrue(new AppenderControlArraySet().isEmpty()); assertTrue(new AppenderControlArraySet().get().length == 0); }
@Test public void testAddMakesNonEmpty() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); assertTrue(set.isEmpty()); set.add(createControl("A")); assertFalse(set.isEmpty()); }
@Test public void testClearReturnsAllItems() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); final AppenderControl[] controls = new AppenderControl[] {createControl("A"), createControl("B"), createControl("C")}; for (final AppenderControl ctl : controls) { set.add(ctl); } assertEquals(3, set.get().length); final AppenderControl[] previous = set.clear(); assertArrayEquals(previous, controls); }
@Test public void testGetReturnsAddedItems() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); final AppenderControl[] controls = new AppenderControl[] {createControl("A"), createControl("B"), createControl("C")}; for (final AppenderControl ctl : controls) { set.add(ctl); } assertEquals(3, set.get().length); assertArrayEquals(controls, set.get()); } }
@Test public void testAddReturnsTrueIfSuccessfullyAdded() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); assertTrue(set.add(createControl("A"))); assertTrue(set.add(createControl("B"))); assertTrue(set.add(createControl("C"))); }
/** * Returns all Appenders as a Map. * * @return a Map with the Appender name as the key and the Appender as the value. */ public Map<String, Appender> getAppenders() { return appenders.asMap(); }
/** * Removes the Appender with the specific name. * * @param name The name of the Appender. */ public void removeAppender(final String name) { AppenderControl removed = null; while ((removed = appenders.remove(name)) != null) { cleanupFilter(removed); } }
/** * Adds an Appender to the LoggerConfig. * * @param appender The Appender to add. * @param level The Level to use. * @param filter A Filter for the Appender reference. */ public void addAppender(final Appender appender, final Level level, final Filter filter) { appenders.add(new AppenderControl(appender, level, filter)); }
@PerformanceSensitive("allocation") protected void callAppenders(final LogEvent event) { final AppenderControl[] controls = appenders.get(); //noinspection ForLoopReplaceableByForEach for (int i = 0; i < controls.length; i++) { controls[i].callAppender(event); } }
private final AppenderControlArraySet appenders = new AppenderControlArraySet(); private final String name; private LogEventFactory logEventFactory;
/** * Removes the AppenderControl with the specific name and returns it (or {@code null} if no such appender existed). * * @param name The name of the AppenderControl to remove * @return the removed AppenderControl or {@code null} */ public AppenderControl remove(final String name) { boolean success; do { success = true; final AppenderControl[] original = appenderArray.get(); for (int i = 0; i < original.length; i++) { final AppenderControl appenderControl = original[i]; if (Objects.equals(name, appenderControl.getAppenderName())) { final AppenderControl[] copy = removeElementAt(i, original); if (appenderArray.compareAndSet(original, copy)) { return appenderControl; // successfully removed } success = false; // could not swap: array was modified by another thread break; } } } while (!success); return null; // not found }
@Test public void testAddDoesNotAppendersWithSameName() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); final AppenderControl[] controls = new AppenderControl[] {createControl("A"), createControl("B"), createControl("B"), createControl("B"), createControl("A")}; for (final AppenderControl ctl : controls) { set.add(ctl); } assertEquals(2, set.get().length); assertSame(controls[0], set.get()[0]); assertSame(controls[1], set.get()[1]); }
@Test public void testIsEmptyMeansZeroLengthArray() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); assertTrue(set.isEmpty()); assertTrue(set.get().length == 0); }
@Test public void testRemoveRemovesItemFromSet() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); set.add(createControl("A")); set.add(createControl("B")); set.add(createControl("C")); set.add(createControl("D")); assertEquals(4, set.get().length); set.remove("B"); assertEquals(3, set.get().length); final AppenderControl[] three = set.get(); assertEquals("A", three[0].getAppenderName()); assertEquals("C", three[1].getAppenderName()); assertEquals("D", three[2].getAppenderName()); set.remove("C"); assertEquals(2, set.get().length); final AppenderControl[] two = set.get(); assertEquals("A", two[0].getAppenderName()); assertEquals("D", two[1].getAppenderName()); set.remove("A"); assertEquals(1, set.get().length); final AppenderControl[] one = set.get(); assertEquals("D", one[0].getAppenderName()); set.remove("D"); assertTrue(set.isEmpty()); }
@Test public void testAddReturnsFalseIfAlreadyInSet() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); assertTrue(set.add(createControl("A"))); assertTrue(set.add(createControl("B"))); assertFalse(set.add(createControl("B"))); assertFalse(set.add(createControl("B"))); assertFalse(set.add(createControl("A"))); assertEquals(2, set.get().length); }