@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 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()); }
/** * 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> asMap() { final Map<String, Appender> result = new HashMap<>(); for (final AppenderControl appenderControl : appenderArray.get()) { result.put(appenderControl.getAppenderName(), appenderControl.getAppender()); } return result; }
/** * 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 }