Skip to content

Commit b45d3d4

Browse files
committed
Decouple Subject from Tracker (closes snowplow#144)
1 parent a8add2b commit b45d3d4

3 files changed

Lines changed: 78 additions & 10 deletions

File tree

src/main/java/com/snowplowanalytics/snowplow/tracker/Tracker.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,11 @@ public Tracker build() {
129129
/**
130130
* Builds and Adds a finalised payload which is ready for sending.
131131
*
132-
* @param payload The raw event Payload
133-
* @param contexts Custom context for the event
132+
* @param payload The raw event Payload
133+
* @param contexts Custom context for the event
134+
* @param eventSubject An optional event specific Subject
134135
*/
135-
private void addTrackerPayload(TrackerPayload payload, List<SelfDescribingJson> contexts) {
136+
private void addTrackerPayload(TrackerPayload payload, List<SelfDescribingJson> contexts, Subject eventSubject) {
136137

137138
// Add default parameters to the payload
138139
payload.add(Parameter.PLATFORM, platform.toString());
@@ -147,8 +148,10 @@ private void addTrackerPayload(TrackerPayload payload, List<SelfDescribingJson>
147148
}
148149

149150
// Add subject if available
150-
if (this.subject != null) {
151-
payload.addMap(new HashMap<String, Object>(subject.getSubject()));
151+
if (eventSubject != null) {
152+
payload.addMap(new HashMap<String, Object>(eventSubject.getSubject()));
153+
} else if (this.subject != null) {
154+
payload.addMap(new HashMap<String, Object>(this.subject.getSubject()));
152155
}
153156

154157
// Send the event!
@@ -288,7 +291,8 @@ public DevicePlatform getPlatform() {
288291
public void track(PageView event) {
289292
List<SelfDescribingJson> context = event.getContext();
290293
TrackerPayload payload = event.getPayload();
291-
addTrackerPayload(payload, context);
294+
Subject subject = event.getSubject();
295+
addTrackerPayload(payload, context, subject);
292296
}
293297

294298
/**
@@ -299,7 +303,8 @@ public void track(PageView event) {
299303
public void track(Structured event) {
300304
List<SelfDescribingJson> context = event.getContext();
301305
TrackerPayload payload = event.getPayload();
302-
addTrackerPayload(payload, context);
306+
Subject subject = event.getSubject();
307+
addTrackerPayload(payload, context, subject);
303308
}
304309

305310
/**
@@ -312,7 +317,8 @@ public void track(Structured event) {
312317
public void track(EcommerceTransaction event) {
313318
List<SelfDescribingJson> context = event.getContext();
314319
TrackerPayload payload = event.getPayload();
315-
addTrackerPayload(payload, context);
320+
Subject subject = event.getSubject();
321+
addTrackerPayload(payload, context, subject);
316322

317323
// Track each TransactionItem individually
318324
long timestamp = event.getTimestamp();
@@ -330,7 +336,8 @@ public void track(EcommerceTransaction event) {
330336
private void track(EcommerceTransactionItem event, long timestamp) {
331337
List<SelfDescribingJson> context = event.getContext();
332338
TrackerPayload payload = event.getPayload(timestamp);
333-
addTrackerPayload(payload, context);
339+
Subject subject = event.getSubject();
340+
addTrackerPayload(payload, context, subject);
334341
}
335342

336343
/**
@@ -341,7 +348,8 @@ private void track(EcommerceTransactionItem event, long timestamp) {
341348
public void track(Unstructured event) {
342349
List<SelfDescribingJson> context = event.getContext();
343350
TrackerPayload payload = event.getPayload(base64Encoded);
344-
addTrackerPayload(payload, context);
351+
Subject subject = event.getSubject();
352+
addTrackerPayload(payload, context, subject);
345353
}
346354

347355
/**
@@ -355,6 +363,7 @@ public void track(ScreenView event) {
355363
.customContext(event.getContext())
356364
.timestamp(event.getTimestamp())
357365
.eventId(event.getEventId())
366+
.subject(event.getSubject())
358367
.build());
359368
}
360369

@@ -369,6 +378,7 @@ public void track(TimingWithCategory event) {
369378
.customContext(event.getContext())
370379
.timestamp(event.getTimestamp())
371380
.eventId(event.getEventId())
381+
.subject(event.getSubject())
372382
.build());
373383
}
374384
}

src/main/java/com/snowplowanalytics/snowplow/tracker/events/Event.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.google.common.base.Preconditions;
2222

2323
// This library
24+
import com.snowplowanalytics.snowplow.tracker.Subject;
2425
import com.snowplowanalytics.snowplow.tracker.Utils;
2526
import com.snowplowanalytics.snowplow.tracker.constants.Parameter;
2627
import com.snowplowanalytics.snowplow.tracker.payload.SelfDescribingJson;
@@ -38,12 +39,14 @@ public class Event {
3839
protected final List<SelfDescribingJson> context;
3940
protected final long timestamp;
4041
protected final String eventId;
42+
protected final Subject subject;
4143

4244
public static abstract class Builder<T extends Builder<T>> {
4345

4446
private List<SelfDescribingJson> context = new LinkedList<SelfDescribingJson>();
4547
private long timestamp = System.currentTimeMillis();
4648
private String eventId = Utils.getEventId();
49+
private Subject subject = null;
4750

4851
protected abstract T self();
4952

@@ -81,6 +84,17 @@ public T eventId(String eventId) {
8184
return self();
8285
}
8386

87+
/**
88+
* A custom subject for the event.
89+
*
90+
* @param subject the eventId
91+
* @return itself
92+
*/
93+
public T subject(Subject subject) {
94+
this.subject = subject;
95+
return self();
96+
}
97+
8498
public Event build() {
8599
return new Event(this);
86100
}
@@ -107,6 +121,7 @@ protected Event(Builder<?> builder) {
107121
this.context = builder.context;
108122
this.timestamp = builder.timestamp;
109123
this.eventId = builder.eventId;
124+
this.subject = builder.subject;
110125
}
111126

112127
/**
@@ -130,6 +145,13 @@ public String getEventId() {
130145
return this.eventId;
131146
}
132147

148+
/**
149+
* @return the event subject
150+
*/
151+
public Subject getSubject() {
152+
return this.subject;
153+
}
154+
133155
/**
134156
* Adds the default parameters to a TrackerPayload object.
135157
*

src/test/java/com/snowplowanalytics/snowplow/tracker/TrackerTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,42 @@ public void testTrackTimingWithCategory() {
345345
.build(), result);
346346
}
347347

348+
@Test
349+
public void testTrackTimingWithCategoryWithSubject() {
350+
Subject s1 = new Subject();
351+
s1.setIpAddress("127.0.0.1");
352+
s1.setTimezone("Etc/UTC");
353+
354+
// When
355+
tracker.track(TimingWithCategory.builder()
356+
.category("category")
357+
.label("label")
358+
.variable("variable")
359+
.timing(10)
360+
.customContext(contexts)
361+
.timestamp(123456)
362+
.eventId(EXPECTED_EVENT_ID)
363+
.subject(s1)
364+
.build());
365+
366+
// Then
367+
verify(emitter).emit(captor.capture());
368+
Map result = captor.getValue().getMap();
369+
assertEquals(ImmutableMap.<String, Object>builder()
370+
.put("p", "srv")
371+
.put("tv", Version.TRACKER)
372+
.put("e", "ue")
373+
.put("ip", "127.0.0.1")
374+
.put("cx", EXPECTED_BASE64_CONTEXTS)
375+
.put("eid", EXPECTED_EVENT_ID)
376+
.put("tna", "AF003")
377+
.put("tz", "Etc/UTC")
378+
.put("ue_px", "eyJzY2hlbWEiOiJpZ2x1OmNvbS5zbm93cGxvd2FuYWx5dGljcy5zbm93cGxvdy91bnN0cnVjdF9ldmVudC9qc29uc2NoZW1hLzEtMC0wIiwiZGF0YSI6eyJzY2hlbWEiOiJpZ2x1OmNvbS5zbm93cGxvd2FuYWx5dGljcy5zbm93cGxvdy90aW1pbmcvanNvbnNjaGVtYS8xLTAtMCIsImRhdGEiOnsiZWlkIjoiMTVlOWIxNDktNjAyOS00ZjZlLTg0NDctNWI5Nzk3YzllNmJlIiwidGltaW5nIjoiMTAiLCJ2YXJpYWJsZSI6InZhcmlhYmxlIiwibGFiZWwiOiJsYWJlbCIsImNhdGVnb3J5IjoiY2F0ZWdvcnkiLCJkdG0iOiIxMjM0NTYifX19")
379+
.put("dtm", "123456")
380+
.put("aid", "cloudfront")
381+
.build(), result);
382+
}
383+
348384
@Test
349385
public void testDefaultPlatform() throws Exception {
350386
Subject subject = new Subject();

0 commit comments

Comments
 (0)