6
6
import java .util .IdentityHashMap ;
7
7
import java .util .Map ;
8
8
9
+ /**
10
+ * This class is the entrypoint of the context propagation API allowing to retrieve the {@link
11
+ * Propagator} to use.
12
+ */
9
13
public final class Propagators {
10
- private static final Map <Concern , Propagator > PROPAGATORS =
14
+ private static final Map <Concern , RegisteredPropagator > PROPAGATORS =
11
15
synchronizedMap (new IdentityHashMap <>());
16
+ private static final RegisteredPropagator NOOP =
17
+ RegisteredPropagator .of (NoopPropagator .INSTANCE , false );
12
18
private static volatile Propagator defaultPropagator = null ;
13
- private static volatile boolean defaultPropagatorSet = false ;
19
+ private static volatile boolean rebuildDefaultPropagator = true ;
14
20
15
21
private Propagators () {}
16
22
@@ -20,14 +26,16 @@ private Propagators() {}
20
26
* @return The default propagator.
21
27
*/
22
28
public static Propagator defaultPropagator () {
23
- if (! defaultPropagatorSet ) {
29
+ if (rebuildDefaultPropagator ) {
24
30
Propagator [] propagatorsByPriority =
25
31
PROPAGATORS .entrySet ().stream ()
32
+ .filter (entry -> entry .getValue ().isUsedAsDefault ())
26
33
.sorted (comparingInt (entry -> entry .getKey ().priority ()))
27
34
.map (Map .Entry ::getValue )
35
+ .map (RegisteredPropagator ::propagator )
28
36
.toArray (Propagator []::new );
29
37
defaultPropagator = composite (propagatorsByPriority );
30
- defaultPropagatorSet = true ;
38
+ rebuildDefaultPropagator = false ;
31
39
}
32
40
return defaultPropagator ;
33
41
}
@@ -39,7 +47,7 @@ public static Propagator defaultPropagator() {
39
47
* @return the related propagator if registered, a {@link #noop()} propagator otherwise.
40
48
*/
41
49
public static Propagator forConcern (Concern concern ) {
42
- return PROPAGATORS .getOrDefault (concern , NoopPropagator . INSTANCE );
50
+ return PROPAGATORS .getOrDefault (concern , NOOP ). propagator ( );
43
51
}
44
52
45
53
/**
@@ -89,13 +97,49 @@ public static Propagator composite(Propagator... propagators) {
89
97
* @param propagator The propagator to register.
90
98
*/
91
99
public static void register (Concern concern , Propagator propagator ) {
92
- PROPAGATORS .put (concern , propagator );
93
- defaultPropagatorSet = false ;
100
+ register (concern , propagator , true );
101
+ }
102
+
103
+ /**
104
+ * Registers a propagator for concern.
105
+ *
106
+ * @param concern The concern to register a propagator for.
107
+ * @param propagator The propagator to register.
108
+ * @param usedAsDefault Whether the propagator should be used as default propagator.
109
+ * @see Propagators#defaultPropagator()
110
+ */
111
+ public static void register (Concern concern , Propagator propagator , boolean usedAsDefault ) {
112
+ PROPAGATORS .put (concern , RegisteredPropagator .of (propagator , usedAsDefault ));
113
+ if (usedAsDefault ) {
114
+ rebuildDefaultPropagator = true ;
115
+ }
94
116
}
95
117
96
118
/** Clear all registered propagators. For testing purpose only. */
97
119
static void reset () {
98
120
PROPAGATORS .clear ();
99
- defaultPropagatorSet = false ;
121
+ rebuildDefaultPropagator = true ;
122
+ }
123
+
124
+ static class RegisteredPropagator {
125
+ private final Propagator propagator ;
126
+ private final boolean usedAsDefault ;
127
+
128
+ private RegisteredPropagator (Propagator propagator , boolean usedAsDefault ) {
129
+ this .propagator = propagator ;
130
+ this .usedAsDefault = usedAsDefault ;
131
+ }
132
+
133
+ static RegisteredPropagator of (Propagator propagator , boolean useAsDefault ) {
134
+ return new RegisteredPropagator (propagator , useAsDefault );
135
+ }
136
+
137
+ Propagator propagator () {
138
+ return this .propagator ;
139
+ }
140
+
141
+ boolean isUsedAsDefault () {
142
+ return this .usedAsDefault ;
143
+ }
100
144
}
101
145
}
0 commit comments