13
13
import java .util .Arrays ;
14
14
import java .util .Collections ;
15
15
import java .util .Date ;
16
+ import java .util .HashMap ;
16
17
import java .util .List ;
18
+ import java .util .Map ;
17
19
import java .util .concurrent .ExecutorService ;
18
20
import java .util .concurrent .ThreadFactory ;
19
21
import java .util .concurrent .TimeUnit ;
@@ -45,6 +47,7 @@ public class Analytics {
45
47
private final List <MessageTransformer > messageTransformers ;
46
48
private final List <MessageInterceptor > messageInterceptors ;
47
49
private final Log log ;
50
+ private Map <String , Object > externalContext ;
48
51
49
52
Analytics (
50
53
AnalyticsClient client ,
@@ -55,6 +58,7 @@ public class Analytics {
55
58
this .messageTransformers = messageTransformers ;
56
59
this .messageInterceptors = messageInterceptors ;
57
60
this .log = log ;
61
+ this .externalContext = null ;
58
62
}
59
63
60
64
/**
@@ -114,7 +118,11 @@ private Message buildMessage(MessageBuilder builder) {
114
118
return null ;
115
119
}
116
120
}
121
+
122
+ Map <String , Object > newContext = this .existExternalContext (builder .build ());
123
+ builder .context (newContext );
117
124
Message message = builder .build ();
125
+
118
126
for (MessageInterceptor messageInterceptor : messageInterceptors ) {
119
127
message = messageInterceptor .intercept (message );
120
128
if (message == null ) {
@@ -125,6 +133,27 @@ private Message buildMessage(MessageBuilder builder) {
125
133
return message ;
126
134
}
127
135
136
+ private void addExternalContext (String contextKey , Object contextValue ) {
137
+ this .externalContext = new HashMap <>();
138
+ this .externalContext .put (contextKey , contextValue );
139
+ }
140
+
141
+ private Map <String , Object > existExternalContext (Message message ) {
142
+
143
+ // Retrieve the existing context if it exists
144
+ Map <String , ?> existingContext = message .context ();
145
+ if (existingContext == null ) {
146
+ existingContext = new HashMap <>();
147
+ }
148
+
149
+ // Augment the existing context with new context
150
+ Map <String , Object > newContext = new HashMap <>(existingContext );
151
+ if (this .externalContext != null ) {
152
+ newContext .putAll (this .externalContext );
153
+ }
154
+ return newContext ;
155
+ }
156
+
128
157
/** Fluent API for creating {@link Analytics} instances. */
129
158
public static class Builder {
130
159
private static final String DEFAULT_ENDPOINT = "https://api.segment.io" ;
0 commit comments