1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.config;
18
19 import java.util.Arrays;
20 import java.util.HashMap;
21 import java.util.Map;
22 import java.util.Objects;
23 import java.util.concurrent.atomic.AtomicReference;
24
25 import org.apache.logging.log4j.core.Appender;
26 import org.apache.logging.log4j.util.PerformanceSensitive;
27
28
29
30
31
32
33 @PerformanceSensitive
34 public class AppenderControlArraySet {
35 private final AtomicReference<AppenderControl[]> appenderArray = new AtomicReference<>(new AppenderControl[0]);
36
37
38
39
40
41
42
43
44 public boolean add(final AppenderControl control) {
45 boolean success;
46 do {
47 final AppenderControl[] original = appenderArray.get();
48 for (final AppenderControl existing : original) {
49 if (existing.equals(control)) {
50 return false;
51 }
52 }
53 final AppenderControl[] copy = Arrays.copyOf(original, original.length + 1);
54 copy[copy.length - 1] = control;
55 success = appenderArray.compareAndSet(original, copy);
56 } while (!success);
57 return true;
58 }
59
60
61
62
63
64
65
66 public AppenderControl remove(final String name) {
67 boolean success;
68 do {
69 success = true;
70 final AppenderControl[] original = appenderArray.get();
71 for (int i = 0; i < original.length; i++) {
72 final AppenderControl appenderControl = original[i];
73 if (Objects.equals(name, appenderControl.getAppenderName())) {
74 final AppenderControl[] copy = removeElementAt(i, original);
75 if (appenderArray.compareAndSet(original, copy)) {
76 return appenderControl;
77 }
78 success = false;
79 break;
80 }
81 }
82 } while (!success);
83 return null;
84 }
85
86 private AppenderControl[] removeElementAt(final int i, final AppenderControl[] array) {
87 final AppenderControl[] result = Arrays.copyOf(array, array.length - 1);
88 System.arraycopy(array, i + 1, result, i, result.length - i);
89 return result;
90 }
91
92
93
94
95
96
97 public Map<String, Appender> asMap() {
98 final Map<String, Appender> result = new HashMap<>();
99 for (final AppenderControl appenderControl : appenderArray.get()) {
100 result.put(appenderControl.getAppenderName(), appenderControl.getAppender());
101 }
102 return result;
103 }
104
105
106
107
108
109
110 public AppenderControl[] clear() {
111 return appenderArray.getAndSet(new AppenderControl[0]);
112 }
113
114 public boolean isEmpty() {
115 return appenderArray.get().length == 0;
116 }
117
118
119
120
121
122
123 public AppenderControl[] get() {
124 return appenderArray.get();
125 }
126
127 @Override
128 public String toString() {
129 return "AppenderControlArraySet [appenderArray=" + appenderArray + "]";
130 }
131 }