Skip to content

Commit f33b124

Browse files
author
weiqiangliu
committed
Release 3.6.0
1 parent b1df584 commit f33b124

23 files changed

Lines changed: 340 additions & 7474 deletions

SensorsAnalyticsSDK/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<groupId>com.sensorsdata.analytics.javasdk</groupId>
1616
<name>SensorsAnalyticsSDK</name>
1717
<artifactId>SensorsAnalyticsSDK</artifactId>
18-
<version>3.5.2</version>
18+
<version>3.6.0</version>
1919
<description>The official Java SDK of Sensors Analytics</description>
2020
<url>http://sensorsdata.cn</url>
2121

SensorsAnalyticsSDK/src/main/java/com/sensorsdata/analytics/javasdk/SensorsAnalytics.java

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
import static com.sensorsdata.analytics.javasdk.SensorsConst.BIND_ID_ACTION_TYPE;
55
import static com.sensorsdata.analytics.javasdk.SensorsConst.ITEM_DELETE_ACTION_TYPE;
66
import static com.sensorsdata.analytics.javasdk.SensorsConst.ITEM_SET_ACTION_TYPE;
7+
import static com.sensorsdata.analytics.javasdk.SensorsConst.LIB;
8+
import static com.sensorsdata.analytics.javasdk.SensorsConst.LIB_SYSTEM_ATTR;
9+
import static com.sensorsdata.analytics.javasdk.SensorsConst.LIB_VERSION_SYSTEM_ATTR;
710
import static com.sensorsdata.analytics.javasdk.SensorsConst.PROFILE_APPEND_ACTION_TYPE;
811
import static com.sensorsdata.analytics.javasdk.SensorsConst.PROFILE_DELETE_ACTION_TYPE;
912
import static com.sensorsdata.analytics.javasdk.SensorsConst.PROFILE_INCREMENT_ACTION_TYPE;
1013
import static com.sensorsdata.analytics.javasdk.SensorsConst.PROFILE_SET_ACTION_TYPE;
1114
import static com.sensorsdata.analytics.javasdk.SensorsConst.PROFILE_SET_ONCE_ACTION_TYPE;
1215
import static com.sensorsdata.analytics.javasdk.SensorsConst.PROFILE_UNSET_ACTION_TYPE;
1316
import static com.sensorsdata.analytics.javasdk.SensorsConst.PROJECT_SYSTEM_ATTR;
17+
import static com.sensorsdata.analytics.javasdk.SensorsConst.SDK_VERSION;
1418
import static com.sensorsdata.analytics.javasdk.SensorsConst.SIGN_UP_SYSTEM_ATTR;
1519
import static com.sensorsdata.analytics.javasdk.SensorsConst.TRACK_ACTION_TYPE;
1620
import static com.sensorsdata.analytics.javasdk.SensorsConst.TRACK_SIGN_UP_ACTION_TYPE;
@@ -41,6 +45,7 @@
4145
import java.util.HashMap;
4246
import java.util.List;
4347
import java.util.Map;
48+
import java.util.concurrent.ConcurrentHashMap;
4449

4550
/**
4651
* Sensors Analytics SDK
@@ -54,7 +59,26 @@ public class SensorsAnalytics implements ISensorsAnalytics {
5459
private static final String EVENT_NAME = "event name";
5560
private static final String ORIGINAL_DISTINCT_ID = "Original Distinct Id";
5661

62+
private final Map<String, Object> superProperties = new ConcurrentHashMap<>();
63+
64+
void setSuperProperties(Map<String, Object> superProperties) {
65+
for (Map.Entry<String, Object> entry : superProperties.entrySet()) {
66+
if (SensorsAnalyticsUtil.KEY_PATTERN.matcher(entry.getKey()).matches() &&
67+
!"$track_id".equals(entry.getKey())) {
68+
this.superProperties.put(entry.getKey(), entry.getValue());
69+
}
70+
}
71+
}
72+
73+
void clearSuperProper() {
74+
this.superProperties.clear();
75+
this.superProperties.put(LIB_SYSTEM_ATTR, LIB);
76+
this.superProperties.put(LIB_VERSION_SYSTEM_ATTR, SDK_VERSION);
77+
log.info("Call clearSuperProperties method.");
78+
}
79+
5780
public SensorsAnalytics(final Consumer consumer) {
81+
clearSuperProper();
5882
worker = new SensorsAnalyticsWorker(consumer);
5983
}
6084

@@ -65,23 +89,23 @@ public void setEnableTimeFree(@NonNull boolean enableTimeFree) {
6589

6690
@Override
6791
public void registerSuperProperties(@NonNull SuperPropertiesRecord propertiesRecord) {
68-
worker.setSuperProperties(propertiesRecord.getPropertyMap());
92+
setSuperProperties(propertiesRecord.getPropertyMap());
6993
}
7094

7195
@Override
7296
public void registerSuperProperties(@NonNull Map<String, Object> superPropertiesMap) {
73-
worker.setSuperProperties(superPropertiesMap);
97+
setSuperProperties(superPropertiesMap);
7498
}
7599

76100
@Override
77101
public void clearSuperProperties() {
78-
worker.clearSuperProperties();
102+
clearSuperProper();
79103
}
80104

81105
@Override
82106
public void track(@NonNull EventRecord eventRecord) throws InvalidArgumentException {
83-
addEvent(eventRecord.getDistinctId(), eventRecord.getIsLoginId(), null, TRACK_ACTION_TYPE,
84-
eventRecord.getEventName(), eventRecord.getPropertyMap());
107+
eventRecord.getPropertyMap().putAll(putAllSuperPro(eventRecord.getPropertyMap(), superProperties));
108+
worker.doAddData(new SensorsData(eventRecord, TRACK_ACTION_TYPE));
85109
}
86110

87111
@Override
@@ -296,6 +320,10 @@ public void unbind(@NonNull String key, @NonNull String value) throws InvalidArg
296320
@Override
297321
public void trackById(@NonNull SensorsAnalyticsIdentity analyticsIdentity, @NonNull String eventName,
298322
Map<String, Object> properties) throws InvalidArgumentException {
323+
if (properties == null) {
324+
properties = new HashMap<>();
325+
}
326+
properties.putAll(superProperties);
299327
IDMEventRecord eventRecord = IDMEventRecord.starter()
300328
.identityMap(analyticsIdentity.getIdentityMap())
301329
.setEventName(eventName)
@@ -407,6 +435,7 @@ public void profileDeleteById(@NonNull String key, @NonNull String value) throws
407435

408436
@Override
409437
public void trackById(@NonNull IDMEventRecord idmEventRecord) throws InvalidArgumentException {
438+
idmEventRecord.getPropertyMap().putAll(putAllSuperPro(idmEventRecord.getPropertyMap(), superProperties));
410439
worker.doAddData(new SensorsData(idmEventRecord));
411440
}
412441

@@ -457,11 +486,13 @@ public void profileUnsetById(@NonNull IDMUserRecord idmUserRecord) throws Invali
457486

458487
@Override
459488
public void track(@NonNull UserEventSchema userEventSchema) throws InvalidArgumentException {
489+
userEventSchema.getPropertyMap().putAll(putAllSuperPro(userEventSchema.getPropertyMap(), superProperties));
460490
worker.doSchemaData(new SensorsSchemaData(userEventSchema, TRACK_ACTION_TYPE));
461491
}
462492

463493
@Override
464494
public void track(@NonNull ItemEventSchema itemEventSchema) throws InvalidArgumentException {
495+
itemEventSchema.getProperties().putAll(putAllSuperPro(itemEventSchema.getProperties(), superProperties));
465496
worker.doSchemaData(new SensorsSchemaData(itemEventSchema, TRACK_ACTION_TYPE));
466497
}
467498

@@ -473,6 +504,7 @@ public void bind(@NonNull IdentitySchema identitySchema) throws InvalidArgumentE
473504
UserEventSchema userEventSchema = UserEventSchema.init()
474505
.setEventName(BIND_ID)
475506
.identityMap(identitySchema.getIdMap())
507+
.addProperties(superProperties)
476508
.start();
477509
worker.doSchemaData(new SensorsSchemaData(userEventSchema, BIND_ID_ACTION_TYPE));
478510
}
@@ -485,6 +517,7 @@ public void unbind(@NonNull IdentitySchema identitySchema) throws InvalidArgumen
485517
UserEventSchema userEventSchema = UserEventSchema.init()
486518
.setEventName(UNBIND_ID)
487519
.identityMap(identitySchema.getIdMap())
520+
.addProperties(superProperties)
488521
.start();
489522
worker.doSchemaData(new SensorsSchemaData(userEventSchema, UNBIND_ID_ACTION_TYPE));
490523
}
@@ -598,7 +631,7 @@ private void addEvent(String distinctId, boolean isLoginId, String originDistinc
598631
.setEventName(eventName)
599632
.setDistinctId(distinctId)
600633
.isLoginId(isLoginId)
601-
.addProperties(properties)
634+
.addProperties(putAllSuperPro(properties, superProperties))
602635
.build();
603636
SensorsData sensorsData = new SensorsData(eventRecord, actionType);
604637
sensorsData.setOriginalId(originDistinctId);
@@ -629,6 +662,7 @@ private void addEventIdentity(Map<String, String> identityMap, String actionType
629662
IDMEventRecord idmEventRecord = IDMEventRecord.starter()
630663
.setEventName(eventName)
631664
.identityMap(identityMap)
665+
.addProperties(superProperties)
632666
.build();
633667
worker.doAddData(new SensorsData(idmEventRecord, actionType));
634668
}
@@ -642,4 +676,16 @@ private void assertIdentityMap(String actionType, Map<String, String> identityMa
642676
}
643677
}
644678

679+
private Map<String, Object> putAllSuperPro(Map<String, Object> pro, Map<String, Object> superPro) {
680+
if (pro == null) {
681+
pro = new HashMap<>();
682+
}
683+
for (Map.Entry<String, Object> entry : superPro.entrySet()) {
684+
if (!pro.containsKey(entry.getKey())) {
685+
pro.put(entry.getKey(), entry.getValue());
686+
}
687+
}
688+
return pro;
689+
}
690+
645691
}
Lines changed: 14 additions & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,24 @@
11
package com.sensorsdata.analytics.javasdk;
22

3-
import static com.sensorsdata.analytics.javasdk.SensorsConst.APP_VERSION_SYSTEM_ATTR;
4-
import static com.sensorsdata.analytics.javasdk.SensorsConst.BIND_ID_ACTION_TYPE;
5-
import static com.sensorsdata.analytics.javasdk.SensorsConst.LIB;
6-
import static com.sensorsdata.analytics.javasdk.SensorsConst.LIB_SYSTEM_ATTR;
7-
import static com.sensorsdata.analytics.javasdk.SensorsConst.LIB_VERSION_SYSTEM_ATTR;
8-
import static com.sensorsdata.analytics.javasdk.SensorsConst.LOGIN_SYSTEM_ATTR;
9-
import static com.sensorsdata.analytics.javasdk.SensorsConst.PROJECT_SYSTEM_ATTR;
10-
import static com.sensorsdata.analytics.javasdk.SensorsConst.SDK_VERSION;
11-
import static com.sensorsdata.analytics.javasdk.SensorsConst.TIME_SYSTEM_ATTR;
12-
import static com.sensorsdata.analytics.javasdk.SensorsConst.TOKEN_SYSTEM_ATTR;
133
import static com.sensorsdata.analytics.javasdk.SensorsConst.TRACK_ACTION_TYPE;
144
import static com.sensorsdata.analytics.javasdk.SensorsConst.TRACK_SIGN_UP_ACTION_TYPE;
15-
import static com.sensorsdata.analytics.javasdk.SensorsConst.UNBIND_ID_ACTION_TYPE;
165

17-
import com.sensorsdata.analytics.javasdk.bean.SensorsAnalyticsIdentity;
186
import com.sensorsdata.analytics.javasdk.consumer.Consumer;
19-
import com.sensorsdata.analytics.javasdk.util.SensorsAnalyticsUtil;
207

218
import lombok.NonNull;
229
import lombok.extern.slf4j.Slf4j;
2310

24-
import java.util.Date;
25-
import java.util.HashMap;
2611
import java.util.Map;
27-
import java.util.concurrent.ConcurrentHashMap;
2812

2913
@Slf4j
3014
class SensorsAnalyticsWorker {
3115

3216
private final Consumer consumer;
3317

34-
private final Map<String, Object> superProperties = new ConcurrentHashMap<>();
35-
36-
private boolean enableTimeFree = false;
18+
private boolean timeFree = false;
3719

3820
public SensorsAnalyticsWorker(Consumer consumer) {
3921
this.consumer = consumer;
40-
clearSuperProperties();
4122
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
4223
@Override
4324
public void run() {
@@ -47,51 +28,13 @@ public void run() {
4728
}));
4829
}
4930

50-
void setEnableTimeFree(boolean enableTimeFree) {
51-
log.info("Call setEnableTimeFree method with param:{}", enableTimeFree);
52-
this.enableTimeFree = enableTimeFree;
53-
}
54-
55-
void setSuperProperties(Map<String, Object> superProperties) {
56-
this.superProperties.putAll(superProperties);
57-
}
58-
59-
void clearSuperProperties() {
60-
this.superProperties.clear();
61-
this.superProperties.put(LIB_SYSTEM_ATTR, LIB);
62-
this.superProperties.put(LIB_VERSION_SYSTEM_ATTR, SDK_VERSION);
63-
log.info("Call clearSuperProperties method.");
64-
}
65-
66-
void doAddEvent(String distinctId, boolean isLoginId, String originDistinctId, String actionType, String eventName,
67-
Map<String, Object> properties) {
68-
this.consumer.send(
69-
generateEventMap(distinctId, isLoginId, originDistinctId, null, actionType, eventName, properties));
70-
}
71-
72-
73-
7431
void doAddData(@NonNull SensorsData sensorsData) {
75-
//enable history data import
76-
if (enableTimeFree) {
77-
sensorsData.getProperties().put("time_free", true);
78-
}
79-
//check properties
80-
final Map<String, Object> properties = sensorsData.getProperties();
81-
//check common properties contains $app_version
82-
if (this.superProperties.containsKey(APP_VERSION_SYSTEM_ATTR)) {
83-
sensorsData.getLib().put(APP_VERSION_SYSTEM_ATTR, (String) this.superProperties.get(APP_VERSION_SYSTEM_ATTR));
84-
}
85-
// 只有 track 和 track_signup 事件才需要设置公共属性
86-
if (sensorsData.getType().startsWith(TRACK_ACTION_TYPE)) {
87-
for (Map.Entry<String, Object> entry : superProperties.entrySet()) {
88-
if (!properties.containsKey(entry.getKey())) {
89-
properties.put(entry.getKey(), entry.getValue());
90-
}
91-
}
32+
Map<String, Object> data = SensorsData.generateData(sensorsData);
33+
if (timeFree && (TRACK_ACTION_TYPE.equals(sensorsData.getType()))
34+
|| TRACK_SIGN_UP_ACTION_TYPE.equals(sensorsData.getType())) {
35+
data.put("time_free", true);
9236
}
93-
//event or profile
94-
this.consumer.send(SensorsData.generateData(sensorsData));
37+
this.consumer.send(data);
9538
}
9639

9740
void flush() {
@@ -102,104 +45,17 @@ void shutdown() {
10245
this.consumer.close();
10346
}
10447

105-
/**
106-
* 非 IDM 模式下 identity 一定为 null
107-
*
108-
* @param distinctId 登录 ID
109-
* @param isLoginId 是否登录ID
110-
* @param originDistinctId 匿名ID
111-
* @param identity ID-Mapping 身份标识
112-
* @param actionType 行为类型
113-
* @param eventName 事件名
114-
* @param properties 属性
115-
* @return Map<String, Object>
116-
*/
117-
private Map<String, Object> generateEventMap(String distinctId, Boolean isLoginId, String originDistinctId,
118-
Map<String, String> identity, String actionType, String eventName, Map<String, Object> properties) {
119-
Map<String, Object> eventMap = new HashMap<>();
120-
eventMap.put("_track_id", SensorsAnalyticsUtil.getTrackId(properties, distinctId));
121-
eventMap.put("type", actionType);
122-
eventMap.put("lib", getLibProperties());
123-
//开启历史数据导入
124-
if (enableTimeFree) {
125-
eventMap.put("time_free", true);
126-
}
127-
HashMap<String, Object> eventProperties = new HashMap<>();
128-
//普通模式
129-
if (identity == null) {
130-
eventMap.put("distinct_id", distinctId);
131-
if (isLoginId) {
132-
eventProperties.put(LOGIN_SYSTEM_ATTR, true);
133-
}
134-
} else {// id-mapping 模式
135-
eventMap.put("identities", identity);
136-
if (distinctId != null) {
137-
eventMap.put("distinct_id", distinctId);
138-
eventProperties.put(LOGIN_SYSTEM_ATTR, false);
139-
} else {
140-
if (identity.containsKey(SensorsAnalyticsIdentity.LOGIN_ID)) {
141-
eventProperties.put(LOGIN_SYSTEM_ATTR, true);
142-
eventMap.put("distinct_id", identity.get(SensorsAnalyticsIdentity.LOGIN_ID));
143-
} else {
144-
eventProperties.put(LOGIN_SYSTEM_ATTR, false);
145-
String firstKey = identity.keySet().iterator().next();
146-
eventMap.put("distinct_id", String.format("%s+%s", firstKey, identity.get(firstKey)));
147-
}
148-
}
149-
}
150-
//检查自定义属性
151-
if (properties != null && !properties.isEmpty()) {
152-
for (Map.Entry<String, Object> entry : properties.entrySet()) {
153-
switch (entry.getKey()) {
154-
case TIME_SYSTEM_ATTR:
155-
eventMap.put("time", ((Date) entry.getValue()).getTime());
156-
break;
157-
case PROJECT_SYSTEM_ATTR:
158-
eventMap.put("project", entry.getValue());
159-
break;
160-
case TOKEN_SYSTEM_ATTR:
161-
eventMap.put("token", entry.getValue());
162-
break;
163-
default:
164-
eventProperties.put(entry.getKey(), entry.getValue());
165-
break;
166-
}
167-
}
168-
}
169-
//操作类型
170-
if (actionType != null) {
171-
switch (actionType) {
172-
case TRACK_SIGN_UP_ACTION_TYPE:
173-
eventMap.put("original_id", originDistinctId);
174-
case TRACK_ACTION_TYPE:
175-
case BIND_ID_ACTION_TYPE:
176-
case UNBIND_ID_ACTION_TYPE:
177-
eventMap.put("event", eventName);
178-
eventProperties.putAll(superProperties);
179-
break;
180-
}
181-
}
182-
//最终校验是否有 time 属性
183-
if (!eventMap.containsKey("time")) {
184-
eventMap.put("time", System.currentTimeMillis());
185-
}
186-
eventMap.put("properties", eventProperties);
187-
return eventMap;
188-
}
18948

190-
private Map<String, String> getLibProperties() {
191-
Map<String, String> libInfo = SensorsAnalyticsUtil.generateLibInfo();
192-
if (this.superProperties.containsKey(APP_VERSION_SYSTEM_ATTR)) {
193-
libInfo.put(APP_VERSION_SYSTEM_ATTR, (String) this.superProperties.get(APP_VERSION_SYSTEM_ATTR));
49+
public void doSchemaData(@NonNull SensorsSchemaData schemaData) {
50+
Map<String, Object> sensorsData = schemaData.generateData();
51+
if (timeFree && (TRACK_ACTION_TYPE.equals(schemaData.getType()))
52+
|| TRACK_SIGN_UP_ACTION_TYPE.equals(schemaData.getType())) {
53+
sensorsData.put("time_free", true);
19454
}
195-
return libInfo;
55+
this.consumer.send(sensorsData);
19656
}
19757

198-
public void doSchemaData(@NonNull SensorsSchemaData schemaData) {
199-
// 开启历史数据导入,兼容之前接口逻辑
200-
if (enableTimeFree && schemaData.isEventSchemaData()) {
201-
schemaData.getProperties().put("time_free", true);
202-
}
203-
this.consumer.send(schemaData.generateData());
58+
public void setEnableTimeFree(boolean enableTimeFree) {
59+
this.timeFree = enableTimeFree;
20460
}
20561
}

0 commit comments

Comments
 (0)