package com.codecademy.eventhub.model; import com.google.common.collect.Maps; import com.codecademy.eventhub.base.ByteBufferMap; import com.codecademy.eventhub.base.KeyValueCallback; import java.nio.ByteBuffer; import java.util.Map; public class Event { private final ByteBufferMap byteBufferMap; private Event(ByteBufferMap byteBufferMap) { this.byteBufferMap = byteBufferMap; } public String getEventType() { return byteBufferMap.get("event_type"); } public String getDate() { return byteBufferMap.get("date"); } public String getExternalUserId() { return byteBufferMap.get("external_user_id"); } public String get(String key) { return byteBufferMap.get(key); } public void enumerate(KeyValueCallback callback) { byteBufferMap.enumerate(callback); } public ByteBuffer toByteBuffer() { return byteBufferMap.toByteBuffer(); } public static Event fromByteBuffer(ByteBuffer byteBuffer) { return new Event(new ByteBufferMap(byteBuffer.duplicate())); } @Override public String toString() { return String.format( "event type: %s\n" + "date: %s\n" + "external user id: %s", getEventType(), getDate(), getExternalUserId()); } public static class Builder { private final String eventType; private final String externalUserId; private final String date; private Map<String, String> properties; public Builder(String eventType, String externalUserId, String date, Map<String, String> properties) { this.eventType = eventType; this.externalUserId = externalUserId; this.date = date; this.properties = properties; } public Builder add(String key, String value) { properties.put(key, value); return this; } public Event build() { Map<String, String> allProperties = Maps.newHashMap(); allProperties.putAll(properties); allProperties.put("event_type", eventType); allProperties.put("date", date); allProperties.put("external_user_id", externalUserId); return new Event(ByteBufferMap.build(allProperties)); } } }