Skip to content

Commit 6ea97c9

Browse files
author
xuchang
committed
Release 3.4.3
1 parent fb8b719 commit 6ea97c9

34 files changed

+4101
-487
lines changed

SensorsAnalyticsSDK/pom.xml

Lines changed: 7 additions & 14 deletions
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.4.1</version>
18+
<version>3.4.3</version>
1919
<description>The official Java SDK of Sensors Analytics</description>
2020
<url>http://sensorsdata.cn</url>
2121

@@ -26,19 +26,6 @@
2626
</license>
2727
</licenses>
2828

29-
<developers>
30-
<developer>
31-
<name>fangzhuo</name>
32-
<email>[email protected]</email>
33-
<url>http://sensorsdata.cn</url>
34-
</developer>
35-
<developer>
36-
<name>dengshiwei</name>
37-
<email>[email protected]</email>
38-
<url>http://sensorsdata.cn</url>
39-
</developer>
40-
</developers>
41-
4229
<scm>
4330
<connection>scm:[email protected]:sensorsdata/sa-sdk-java.git</connection>
4431
<developerConnection>scm:[email protected]:sensorsdata/sa-sdk-java.git</developerConnection>
@@ -98,6 +85,12 @@
9885
<version>${jetty.version}</version>
9986
<scope>test</scope>
10087
</dependency>
88+
<dependency>
89+
<groupId>org.junit.jupiter</groupId>
90+
<artifactId>junit-jupiter</artifactId>
91+
<version>RELEASE</version>
92+
<scope>test</scope>
93+
</dependency>
10194
</dependencies>
10295

10396
<build>

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
package com.sensorsdata.analytics.javasdk;
22

3-
import com.sensorsdata.analytics.javasdk.bean.*;
3+
import com.sensorsdata.analytics.javasdk.bean.EventRecord;
4+
import com.sensorsdata.analytics.javasdk.bean.ItemRecord;
5+
import com.sensorsdata.analytics.javasdk.bean.SensorsAnalyticsIdentity;
6+
import com.sensorsdata.analytics.javasdk.bean.SuperPropertiesRecord;
7+
import com.sensorsdata.analytics.javasdk.bean.UserRecord;
48
import com.sensorsdata.analytics.javasdk.consumer.ConcurrentLoggingConsumer;
59

6-
import java.util.*;
10+
import java.util.ArrayList;
11+
import java.util.Calendar;
12+
import java.util.HashMap;
13+
import java.util.List;
14+
import java.util.Map;
715

816
/**
917
* @author fz

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.sensorsdata.analytics.javasdk;
22

33
import com.sensorsdata.analytics.javasdk.bean.EventRecord;
4+
import com.sensorsdata.analytics.javasdk.bean.IDMEventRecord;
5+
import com.sensorsdata.analytics.javasdk.bean.IDMUserRecord;
46
import com.sensorsdata.analytics.javasdk.bean.ItemRecord;
57
import com.sensorsdata.analytics.javasdk.bean.SensorsAnalyticsIdentity;
68
import com.sensorsdata.analytics.javasdk.bean.SuperPropertiesRecord;
@@ -498,6 +500,57 @@ void profileUnsetById(@NonNull SensorsAnalyticsIdentity analyticsIdentity, @NonN
498500
*/
499501
void profileDeleteById(@NonNull SensorsAnalyticsIdentity analyticsIdentity) throws InvalidArgumentException;
500502

503+
/**
504+
* 使用 IDM3.0 触发埋点事件
505+
*
506+
* @param idmEventRecord IDM 事件属性对象{@link com.sensorsdata.analytics.javasdk.bean.IDMEventRecord}
507+
* @throws InvalidArgumentException 参数不合法异常
508+
*/
509+
void trackById(@NonNull IDMEventRecord idmEventRecord) throws InvalidArgumentException;
510+
511+
/**
512+
* 设置用户的属性。属性取值可接受类型为{@link Number}, {@link String}, {@link java.util.Date}和{@link java.util.List};
513+
* <p>
514+
* 如果要设置的 properties 的 key,之前在这个用户的 profile 中已经存在,则覆盖,否则,新创建
515+
*
516+
* @param idmUserRecord 用户属性集合对象 {@link com.sensorsdata.analytics.javasdk.bean.IDMUserRecord}
517+
* @throws InvalidArgumentException 不合法参数异常
518+
*/
519+
void profileSetById(@NonNull IDMUserRecord idmUserRecord) throws InvalidArgumentException;
520+
521+
/**
522+
* 首次设置用户的属性。
523+
* 属性取值可接受类型为{@link Number}, {@link String}, {@link java.util.Date}和{@link java.util.List};
524+
*
525+
* @param idmUserRecord 用户属性集合对象 {@link com.sensorsdata.analytics.javasdk.bean.IDMUserRecord}
526+
* @throws InvalidArgumentException 不合法参数异常
527+
*/
528+
void profileSetOnceById(@NonNull IDMUserRecord idmUserRecord) throws InvalidArgumentException;
529+
530+
/**
531+
* 为用户的一个或多个数值类型的属性累加一个数值,若该属性不存在,则创建它并设置默认值为 0。属性取值只接受{@link Number}类型
532+
*
533+
* @param idmUserRecord 用户属性集合对象 {@link com.sensorsdata.analytics.javasdk.bean.IDMUserRecord}
534+
* @throws InvalidArgumentException 不合法参数异常
535+
*/
536+
void profileIncrementById(@NonNull IDMUserRecord idmUserRecord) throws InvalidArgumentException;
537+
538+
/**
539+
* 为用户的一个或多个数组类型的属性追加字符串,属性取值类型必须为 {@link java.util.List},且列表中元素的类型必须为 {@link String}
540+
*
541+
* @param idmUserRecord 用户属性集合对象 {@link com.sensorsdata.analytics.javasdk.bean.IDMUserRecord}
542+
* @throws InvalidArgumentException 不合法参数异常
543+
*/
544+
void profileAppendById(@NonNull IDMUserRecord idmUserRecord) throws InvalidArgumentException;
545+
546+
/**
547+
* 删除用户指定属性
548+
*
549+
* @param idmUserRecord 用户属性集合对象 {@link com.sensorsdata.analytics.javasdk.bean.IDMUserRecord}
550+
* @throws InvalidArgumentException 不合法参数异常
551+
*/
552+
void profileUnsetById(@NonNull IDMUserRecord idmUserRecord) throws InvalidArgumentException;
553+
501554
/**
502555
* 立即发送缓存中的所有日志
503556
*/

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

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import static com.sensorsdata.analytics.javasdk.SensorsConst.UNBIND_ID_ACTION_TYPE;
1919

2020
import com.sensorsdata.analytics.javasdk.bean.EventRecord;
21+
import com.sensorsdata.analytics.javasdk.bean.IDMEventRecord;
22+
import com.sensorsdata.analytics.javasdk.bean.IDMUserRecord;
2123
import com.sensorsdata.analytics.javasdk.bean.ItemRecord;
2224
import com.sensorsdata.analytics.javasdk.bean.SensorsAnalyticsIdentity;
2325
import com.sensorsdata.analytics.javasdk.bean.SuperPropertiesRecord;
@@ -266,7 +268,12 @@ public void unbind(@NonNull SensorsAnalyticsIdentity analyticsIdentity) throws I
266268
@Override
267269
public void trackById(@NonNull SensorsAnalyticsIdentity analyticsIdentity, @NonNull String eventName,
268270
Map<String, Object> properties) throws InvalidArgumentException {
269-
addEventIdentity(analyticsIdentity, TRACK_ACTION_TYPE, eventName, properties);
271+
IDMEventRecord eventRecord = IDMEventRecord.starter()
272+
.identityMap(analyticsIdentity.getIdentityMap())
273+
.setEventName(eventName)
274+
.addProperties(properties)
275+
.build();
276+
worker.doAddData(new SensorsData(eventRecord));
270277
}
271278

272279
@Override
@@ -360,6 +367,42 @@ public void profileDeleteById(@NonNull SensorsAnalyticsIdentity analyticsIdentit
360367
addEventIdentity(analyticsIdentity, PROFILE_DELETE_ACTION_TYPE, null, null);
361368
}
362369

370+
@Override
371+
public void trackById(@NonNull IDMEventRecord idmEventRecord) throws InvalidArgumentException {
372+
worker.doAddData(new SensorsData(idmEventRecord));
373+
}
374+
375+
@Override
376+
public void profileSetById(@NonNull IDMUserRecord idmUserRecord) throws InvalidArgumentException {
377+
SensorsAnalyticsUtil.assertProperties(PROFILE_SET_ACTION_TYPE, idmUserRecord.getPropertyMap());
378+
worker.doAddData(new SensorsData(idmUserRecord, PROFILE_SET_ACTION_TYPE));
379+
}
380+
381+
@Override
382+
public void profileSetOnceById(@NonNull IDMUserRecord idmUserRecord) throws InvalidArgumentException {
383+
SensorsAnalyticsUtil.assertProperties(PROFILE_SET_ONCE_ACTION_TYPE, idmUserRecord.getPropertyMap());
384+
worker.doAddData(new SensorsData(idmUserRecord, PROFILE_SET_ONCE_ACTION_TYPE));
385+
}
386+
387+
@Override
388+
public void profileIncrementById(@NonNull IDMUserRecord idmUserRecord) throws InvalidArgumentException {
389+
SensorsAnalyticsUtil.assertProperties(PROFILE_INCREMENT_ACTION_TYPE, idmUserRecord.getPropertyMap());
390+
worker.doAddData(new SensorsData(idmUserRecord, PROFILE_INCREMENT_ACTION_TYPE));
391+
}
392+
393+
@Override
394+
public void profileAppendById(@NonNull IDMUserRecord idmUserRecord) throws InvalidArgumentException {
395+
SensorsAnalyticsUtil.assertProperties(PROFILE_APPEND_ACTION_TYPE, idmUserRecord.getPropertyMap());
396+
worker.doAddData(new SensorsData(idmUserRecord, PROFILE_APPEND_ACTION_TYPE));
397+
}
398+
399+
@Override
400+
public void profileUnsetById(@NonNull IDMUserRecord idmUserRecord) throws InvalidArgumentException {
401+
SensorsAnalyticsUtil.assertProperties(PROFILE_UNSET_ACTION_TYPE, idmUserRecord.getPropertyMap());
402+
worker.doAddData(new SensorsData(idmUserRecord, PROFILE_UNSET_ACTION_TYPE));
403+
}
404+
405+
363406
@Override
364407
public void flush() {
365408
worker.flush();
@@ -397,7 +440,11 @@ private void addEvent(String distinctId, boolean isLoginId, String originDistinc
397440

398441
private void addEventIdentity(SensorsAnalyticsIdentity analyticsIdentity, String actionType, String eventName,
399442
Map<String, Object> properties) throws InvalidArgumentException {
400-
Map<String, String> identityMap = analyticsIdentity.getIdentityMap();
443+
addEventIdentity(analyticsIdentity.getIdentityMap(), actionType, eventName, properties);
444+
}
445+
446+
private void addEventIdentity(Map<String, String> identityMap, String actionType, String eventName,
447+
Map<String, Object> properties) throws InvalidArgumentException {
401448
if (identityMap.isEmpty()) {
402449
throw new InvalidArgumentException("The identity is empty.");
403450
}
@@ -406,9 +453,12 @@ private void addEventIdentity(SensorsAnalyticsIdentity analyticsIdentity, String
406453
if (actionType.equals(TRACK_ACTION_TYPE)) {
407454
SensorsAnalyticsUtil.assertKey(EVENT_NAME, eventName);
408455
}
456+
409457
worker.doAddEventIdentity(identityMap, actionType, eventName, properties);
410458
}
411459

460+
461+
412462
private void assertIdentityMap(String actionType, Map<String, String> identityMap) throws InvalidArgumentException {
413463
for (Map.Entry<String, String> entry : identityMap.entrySet()) {
414464
SensorsAnalyticsUtil.assertKey(actionType, entry.getKey());

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

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import static com.sensorsdata.analytics.javasdk.SensorsConst.LOGIN_SYSTEM_ATTR;
99
import static com.sensorsdata.analytics.javasdk.SensorsConst.PROJECT_SYSTEM_ATTR;
1010
import static com.sensorsdata.analytics.javasdk.SensorsConst.SDK_VERSION;
11-
import static com.sensorsdata.analytics.javasdk.SensorsConst.TINE_SYSTEM_ATTR;
11+
import static com.sensorsdata.analytics.javasdk.SensorsConst.TIME_SYSTEM_ATTR;
1212
import static com.sensorsdata.analytics.javasdk.SensorsConst.TOKEN_SYSTEM_ATTR;
1313
import static com.sensorsdata.analytics.javasdk.SensorsConst.TRACK_ACTION_TYPE;
1414
import static com.sensorsdata.analytics.javasdk.SensorsConst.TRACK_SIGN_UP_ACTION_TYPE;
@@ -18,6 +18,7 @@
1818
import com.sensorsdata.analytics.javasdk.consumer.Consumer;
1919
import com.sensorsdata.analytics.javasdk.util.SensorsAnalyticsUtil;
2020

21+
import lombok.NonNull;
2122
import lombok.extern.slf4j.Slf4j;
2223

2324
import java.util.Date;
@@ -31,13 +32,12 @@ class SensorsAnalyticsWorker {
3132

3233
private final Consumer consumer;
3334

34-
private final Map<String, Object> superProperties;
35+
private final Map<String, Object> superProperties = new ConcurrentHashMap<String, Object>();
3536

3637
private boolean enableTimeFree = false;
3738

3839
public SensorsAnalyticsWorker(Consumer consumer) {
3940
this.consumer = consumer;
40-
this.superProperties = new ConcurrentHashMap<String, Object>();
4141
clearSuperProperties();
4242
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
4343
@Override
@@ -70,6 +70,38 @@ void doAddEvent(String distinctId, boolean isLoginId, String originDistinctId, S
7070
generateEventMap(distinctId, isLoginId, originDistinctId, null, actionType, eventName, properties));
7171
}
7272

73+
void doAddData(@NonNull SensorsData sensorsData) {
74+
//enable history data import
75+
if (enableTimeFree) {
76+
sensorsData.getProperties().put("time_free", true);
77+
}
78+
//check properties
79+
final Map<String, Object> properties = sensorsData.getProperties();
80+
if (properties.containsKey(PROJECT_SYSTEM_ATTR)) {
81+
sensorsData.setProject(properties.get(PROJECT_SYSTEM_ATTR).toString());
82+
properties.remove(PROJECT_SYSTEM_ATTR);
83+
}
84+
if (properties.containsKey(TOKEN_SYSTEM_ATTR)) {
85+
sensorsData.setToken(properties.get(TOKEN_SYSTEM_ATTR).toString());
86+
properties.remove(TOKEN_SYSTEM_ATTR);
87+
}
88+
if (properties.containsKey(TIME_SYSTEM_ATTR)) {
89+
sensorsData.setTime((Date) properties.get(TIME_SYSTEM_ATTR));
90+
properties.remove(TIME_SYSTEM_ATTR);
91+
}
92+
//check common properties contains $app_version
93+
if (this.superProperties.containsKey(APP_VERSION_SYSTEM_ATTR)) {
94+
sensorsData.getLib().put(APP_VERSION_SYSTEM_ATTR, (String) this.superProperties.get(APP_VERSION_SYSTEM_ATTR));
95+
}
96+
// 只有 track 和 track_signup 事件才需要设置公共属性
97+
if (sensorsData.getType().startsWith(TRACK_ACTION_TYPE)) {
98+
properties.putAll(superProperties);
99+
}
100+
//event or profile
101+
this.consumer.send(SensorsData.generateData(sensorsData));
102+
}
103+
104+
73105
void doAddItem(String itemType, String itemId, String actionType, Map<String, Object> properties) {
74106
Map<String, Object> item = new HashMap<>();
75107
item.put("item_type", itemType);
@@ -111,7 +143,7 @@ void shutdown() {
111143
}
112144

113145
/**
114-
* distinctId、isLoginId、originDistinctId 与 identity 作为互斥参数,同时只有一种有值
146+
* 非 IDM 模式下 identity 一定为 null
115147
*
116148
* @param distinctId 登录 ID
117149
* @param isLoginId 是否登录ID
@@ -141,19 +173,25 @@ private Map<String, Object> generateEventMap(String distinctId, Boolean isLoginI
141173
}
142174
} else {// id-mapping 模式
143175
eventMap.put("identities", identity);
144-
if (identity.containsKey(SensorsAnalyticsIdentity.LOGIN_ID)) {
145-
eventProperties.put(LOGIN_SYSTEM_ATTR, true);
146-
eventMap.put("distinct_id", identity.get(SensorsAnalyticsIdentity.LOGIN_ID));
147-
} else {
176+
if (distinctId != null) {
177+
eventMap.put("distinct_id", distinctId);
148178
eventProperties.put(LOGIN_SYSTEM_ATTR, false);
149-
eventMap.put("distinct_id", identity.get(identity.keySet().iterator().next()));
179+
} else {
180+
if (identity.containsKey(SensorsAnalyticsIdentity.LOGIN_ID)) {
181+
eventProperties.put(LOGIN_SYSTEM_ATTR, true);
182+
eventMap.put("distinct_id", identity.get(SensorsAnalyticsIdentity.LOGIN_ID));
183+
} else {
184+
eventProperties.put(LOGIN_SYSTEM_ATTR, false);
185+
String firstKey = identity.keySet().iterator().next();
186+
eventMap.put("distinct_id", String.format("%s+%s", firstKey, identity.get(firstKey)));
187+
}
150188
}
151189
}
152190
//检查自定义属性
153191
if (properties != null && !properties.isEmpty()) {
154192
for (Map.Entry<String, Object> entry : properties.entrySet()) {
155193
switch (entry.getKey()) {
156-
case TINE_SYSTEM_ATTR:
194+
case TIME_SYSTEM_ATTR:
157195
eventMap.put("time", ((Date) entry.getValue()).getTime());
158196
break;
159197
case PROJECT_SYSTEM_ATTR:

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ private SensorsConst() {
1515
/**
1616
* 当前JDK版本号,注意要和pom文件里面的version保持一致
1717
*/
18-
public static final String SDK_VERSION = "3.4.1";
18+
public static final String SDK_VERSION = "3.4.3";
1919
/**
2020
* 当前语言类型
2121
*/
@@ -50,7 +50,7 @@ private SensorsConst() {
5050
* 系统预置属性
5151
*/
5252
public static final String PROJECT_SYSTEM_ATTR = "$project";
53-
public static final String TINE_SYSTEM_ATTR = "$time";
53+
public static final String TIME_SYSTEM_ATTR = "$time";
5454
public static final String TOKEN_SYSTEM_ATTR = "$token";
5555
public static final String LOGIN_SYSTEM_ATTR = "$is_login_id";
5656
public static final String APP_VERSION_SYSTEM_ATTR = "$app_version";

0 commit comments

Comments
 (0)