Skip to content

Feature/v1/event end point #164

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Jan 26, 2018
Merged
5 changes: 2 additions & 3 deletions core-api/src/main/java/com/optimizely/ab/Optimizely.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@
import com.optimizely.ab.event.LogEvent;
import com.optimizely.ab.event.internal.BuildVersionInfo;
import com.optimizely.ab.event.internal.EventBuilder;
import com.optimizely.ab.event.internal.EventBuilderV2;
import com.optimizely.ab.event.internal.payload.Event.ClientEngine;
import com.optimizely.ab.event.internal.payload.EventBatch.ClientEngine;
import com.optimizely.ab.internal.EventTagUtils;
import com.optimizely.ab.notification.NotificationBroadcaster;
import com.optimizely.ab.notification.NotificationCenter;
Expand Down Expand Up @@ -948,7 +947,7 @@ public Optimizely build() throws ConfigParseException {


if (eventBuilder == null) {
eventBuilder = new EventBuilderV2(clientEngine, clientVersion);
eventBuilder = new EventBuilder(clientEngine, clientVersion);
}

if (errorHandler == null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/**
*
* Copyright 2016-2017, Optimizely and contributors
* Copyright 2016-2018, Optimizely and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -16,27 +16,122 @@
*/
package com.optimizely.ab.event.internal;

import com.optimizely.ab.annotations.VisibleForTesting;
import com.optimizely.ab.bucketing.DecisionService;
import com.optimizely.ab.config.EventType;
import com.optimizely.ab.config.Experiment;
import com.optimizely.ab.config.ProjectConfig;
import com.optimizely.ab.config.Variation;
import com.optimizely.ab.event.LogEvent;

import com.optimizely.ab.event.internal.payload.Attribute;
import com.optimizely.ab.event.internal.payload.Decision;
import com.optimizely.ab.event.internal.payload.EventBatch;
import com.optimizely.ab.event.internal.payload.Event;
import com.optimizely.ab.event.internal.payload.Snapshot;
import com.optimizely.ab.event.internal.payload.Visitor;
import com.optimizely.ab.event.internal.serializer.DefaultJsonSerializer;
import com.optimizely.ab.event.internal.serializer.Serializer;
import com.optimizely.ab.internal.EventTagUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class EventBuilder {
private static final Logger logger = LoggerFactory.getLogger(EventBuilder.class);
static final String ATTRIBUTE_KEY_FOR_BUCKETING_ATTRIBUTE = "optimizely_bucketing_id";
static final String EVENT_ENDPOINT = "https://logx.optimizely.com/v1/events";
static final String ACTIVATE_EVENT_KEY = "campaign_activated";

private Serializer serializer;
@VisibleForTesting
public final String clientVersion;
@VisibleForTesting
public final EventBatch.ClientEngine clientEngine;

public EventBuilder() {
this(EventBatch.ClientEngine.JAVA_SDK, BuildVersionInfo.VERSION);
}

public EventBuilder(EventBatch.ClientEngine clientEngine, String clientVersion) {
this.clientEngine = clientEngine;
this.clientVersion = clientVersion;
this.serializer = DefaultJsonSerializer.getInstance();
}

public abstract class EventBuilder {

public abstract LogEvent createImpressionEvent(@Nonnull ProjectConfig projectConfig,
public LogEvent createImpressionEvent(@Nonnull ProjectConfig projectConfig,
@Nonnull Experiment activatedExperiment,
@Nonnull Variation variation,
@Nonnull String userId,
@Nonnull Map<String, String> attributes);
@Nonnull Map<String, String> attributes) {

public abstract LogEvent createConversionEvent(@Nonnull ProjectConfig projectConfig,
Decision decision = new Decision(activatedExperiment.getLayerId(), activatedExperiment.getId(),
variation.getId(), false);
Event impressionEvent = new Event(System.currentTimeMillis(),UUID.randomUUID().toString(), activatedExperiment.getLayerId(),
ACTIVATE_EVENT_KEY, null, null, null, ACTIVATE_EVENT_KEY, null);
Snapshot snapshot = new Snapshot(Arrays.asList(decision), Arrays.asList(impressionEvent));

Visitor visitor = new Visitor(userId, null, buildAttributeList(projectConfig, attributes), Arrays.asList(snapshot));
List<Visitor> visitors = Arrays.asList(visitor);
EventBatch eventBatch = new EventBatch(clientEngine.getClientEngineValue(), clientVersion, projectConfig.getAccountId(), visitors, projectConfig.getAnonymizeIP(), projectConfig.getProjectId(), projectConfig.getRevision());
String payload = this.serializer.serialize(eventBatch);
return new LogEvent(LogEvent.RequestMethod.POST, EVENT_ENDPOINT, Collections.<String, String>emptyMap(), payload);
}

public LogEvent createConversionEvent(@Nonnull ProjectConfig projectConfig,
@Nonnull Map<Experiment, Variation> experimentVariationMap,
@Nonnull String userId,
@Nonnull String eventId,
@Nonnull String eventName,
@Nonnull Map<String, String> attributes,
@Nonnull Map<String, ?> eventTags);
@Nonnull Map<String, ?> eventTags) {

if (experimentVariationMap.isEmpty()) {
return null;
}

ArrayList<Decision> decisions = new ArrayList<Decision>();
for (Map.Entry<Experiment, Variation> entry : experimentVariationMap.entrySet()) {
Decision decision = new Decision(entry.getKey().getLayerId(), entry.getKey().getId(), entry.getValue().getId(), false);
decisions.add(decision);
}

EventType eventType = projectConfig.getEventNameMapping().get(eventName);

Event conversionEvent = new Event(System.currentTimeMillis(),UUID.randomUUID().toString(), eventType.getId(),
eventType.getKey(), null, EventTagUtils.getRevenueValue(eventTags), eventTags, eventType.getKey(), EventTagUtils.getNumericValue(eventTags));
Snapshot snapshot = new Snapshot(decisions, Arrays.asList(conversionEvent));

Visitor visitor = new Visitor(userId, null, buildAttributeList(projectConfig, attributes), Arrays.asList(snapshot));
List<Visitor> visitors = Arrays.asList(visitor);
EventBatch eventBatch = new EventBatch(clientEngine.getClientEngineValue(), clientVersion, projectConfig.getAccountId(), visitors, projectConfig.getAnonymizeIP(), projectConfig.getProjectId(), projectConfig.getRevision());
String payload = this.serializer.serialize(eventBatch);
return new LogEvent(LogEvent.RequestMethod.POST, EVENT_ENDPOINT, Collections.<String, String>emptyMap(), payload);
}

private List<Attribute> buildAttributeList(ProjectConfig projectConfig, Map<String, String> attributes) {
List<Attribute> attributesList = new ArrayList<Attribute>();

Map<String, com.optimizely.ab.config.Attribute> attributeMap = projectConfig.getAttributeKeyMapping();
for (Map.Entry<String, String> entry : attributes.entrySet()) {
com.optimizely.ab.config.Attribute projectAttribute = attributeMap.get(entry.getKey());
Attribute attribute = new Attribute((projectAttribute != null ? projectAttribute.getId() : null),
entry.getKey(), Attribute.CUSTOM_ATTRIBUTE_TYPE, entry.getValue());

if (entry.getKey() == DecisionService.BUCKETING_ATTRIBUTE) {
attribute = new Attribute(com.optimizely.ab.bucketing.DecisionService.BUCKETING_ATTRIBUTE,
ATTRIBUTE_KEY_FOR_BUCKETING_ATTRIBUTE, Attribute.CUSTOM_ATTRIBUTE_TYPE, entry.getValue());
}

attributesList.add(attribute);
}

return attributesList;
}
}

This file was deleted.

Loading