diff --git a/analytics/src/main/java/com/segment/analytics/Analytics.java b/analytics/src/main/java/com/segment/analytics/Analytics.java index 81af36c7..c390f096 100644 --- a/analytics/src/main/java/com/segment/analytics/Analytics.java +++ b/analytics/src/main/java/com/segment/analytics/Analytics.java @@ -9,11 +9,8 @@ import com.segment.analytics.internal.AnalyticsVersion; import com.segment.analytics.messages.Message; import com.segment.analytics.messages.MessageBuilder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.List; + +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; @@ -45,6 +42,7 @@ public class Analytics { private final List messageTransformers; private final List messageInterceptors; private final Log log; + private Map externalContext; Analytics( AnalyticsClient client, @@ -55,6 +53,7 @@ public class Analytics { this.messageTransformers = messageTransformers; this.messageInterceptors = messageInterceptors; this.log = log; + this.externalContext = null; } /** @@ -114,7 +113,11 @@ private Message buildMessage(MessageBuilder builder) { return null; } } + + Map newContext = this.existExternalContext(builder.build()); + builder.context(newContext); Message message = builder.build(); + for (MessageInterceptor messageInterceptor : messageInterceptors) { message = messageInterceptor.intercept(message); if (message == null) { @@ -125,6 +128,26 @@ private Message buildMessage(MessageBuilder builder) { return message; } + private void addExternalContext(String contextKey, Object contextValue) { + this.externalContext = new HashMap<>(); + this.externalContext.put(contextKey, contextValue); + } + + private Map existExternalContext(Message message) { + + // Retrieve the existing context if it exists + Map existingContext = message.context(); + if (existingContext == null) { + existingContext = new HashMap<>(); + } + + // Augment the existing context with new context + Map newContext = new HashMap<>(existingContext); + newContext.putAll(this.externalContext); + + return newContext; + } + /** Fluent API for creating {@link Analytics} instances. */ public static class Builder { private static final String DEFAULT_ENDPOINT = "https://api.segment.io";