Skip to content

Commit 3759b2f

Browse files
authored
Merge pull request #126 from jwfing/master
support disable Hook
2 parents 7da20cf + 4df105b commit 3759b2f

File tree

12 files changed

+739
-27
lines changed

12 files changed

+739
-27
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@
22

33
Following is change logs for recently release versions, you can refer to [releases page](https://github.com/leancloud/java-unified-sdk/releases) for more details.
44

5+
## 6.5.8 release
6+
7+
#### Break changes
8+
- None
9+
10+
#### New features
11+
- support disable hook for leanengine.
12+
13+
#### Optimization and fixed bugs
14+
- fixed: AddUniqueOperation#apply error for AbstractList.
15+
516
## 6.5.7 release
617

718
#### Break changes

android-sdk/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ allprojects {
3030
}
3131

3232
ext {
33-
sdkVersion = "6.5.7"
33+
sdkVersion = "6.5.8"
3434
supportLibVersion = "26.1.0"
3535
converterVersion = "2.1.0"
3636
rxandroidVersion = "2.1.1"

android-sdk/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ org.gradle.jvmargs=-Xmx1536m
1515
# This option should only be used with decoupled projects. More details, visit
1616
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
1717
# org.gradle.parallel=true
18-
VERSION_NAME=6.5.7
18+
VERSION_NAME=6.5.8
1919
VERSION_CODE=2695
2020
GROUP=cn.leancloud
2121

core/src/main/java/cn/leancloud/AVObject.java

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public class AVObject {
4040

4141
public static final String KEY_CLASSNAME = "className";
4242

43+
public static final String KEY_IGNORE_HOOKS = "__ignore_hooks";
44+
4345
private static final String INTERNAL_PATTERN = "^[\\da-z][\\d-a-z]*$";
4446
private static final Set<String> RESERVED_ATTRS = new HashSet<String>(
4547
Arrays.asList(KEY_CREATED_AT, KEY_UPDATED_AT, KEY_OBJECT_ID, KEY_ACL));
@@ -60,6 +62,13 @@ public class AVObject {
6062
private volatile boolean fetchWhenSave = false;
6163
protected volatile boolean totallyOverwrite = false;
6264

65+
public enum Hook {
66+
beforeSave, afterSave, beforeUpdate, afterUpdate, beforeDelete, afterDelete,
67+
}
68+
69+
@JSONField(serialize = false)
70+
private Set<Hook> ignoreHooks = new TreeSet<Hook>();
71+
6372
/**
6473
* Default constructor.
6574
*/
@@ -712,6 +721,9 @@ protected JSONObject generateChangedParam() {
712721
tmp.remove(KEY_CREATED_AT);
713722
tmp.remove(KEY_UPDATED_AT);
714723
tmp.remove(KEY_OBJECT_ID);
724+
if (ignoreHooks.size() > 0) {
725+
tmp.put(KEY_IGNORE_HOOKS, ignoreHooks);
726+
}
715727
return new JSONObject(tmp);
716728
}
717729

@@ -732,6 +744,10 @@ protected JSONObject generateChangedParam() {
732744
}
733745
}
734746

747+
if (ignoreHooks.size() > 0) {
748+
params.put(KEY_IGNORE_HOOKS, ignoreHooks);
749+
}
750+
735751
if (!needBatchMode()) {
736752
return new JSONObject(params);
737753
}
@@ -1150,10 +1166,14 @@ public void onComplete() {
11501166
* @return observable instance.
11511167
*/
11521168
public Observable<AVNull> deleteInBackground() {
1169+
Map<String, Object> ignoreParam = new HashMap<>();
1170+
if (ignoreHooks.size() > 0) {
1171+
ignoreParam.put(KEY_IGNORE_HOOKS, ignoreHooks);
1172+
}
11531173
if (totallyOverwrite) {
1154-
return PaasClient.getStorageClient().deleteWholeObject(this.endpointClassName, getObjectId());
1174+
return PaasClient.getStorageClient().deleteWholeObject(this.endpointClassName, getObjectId(), ignoreParam);
11551175
}
1156-
return PaasClient.getStorageClient().deleteObject(this.className, getObjectId());
1176+
return PaasClient.getStorageClient().deleteObject(this.className, getObjectId(), ignoreParam);
11571177
}
11581178

11591179
/**
@@ -1182,6 +1202,7 @@ public static Observable<AVNull> deleteAllInBackground(Collection<? extends AVOb
11821202
return Observable.just(AVNull.getINSTANCE());
11831203
}
11841204
String className = null;
1205+
Map<String, Object> ignoreParams = new HashMap<>();
11851206
StringBuilder sb = new StringBuilder();
11861207
for (AVObject o : objects) {
11871208
if (StringUtil.isEmpty(o.getObjectId()) || StringUtil.isEmpty(o.getClassName())) {
@@ -1196,7 +1217,7 @@ public static Observable<AVNull> deleteAllInBackground(Collection<? extends AVOb
11961217
return Observable.error(new IllegalArgumentException("The objects class name must be the same."));
11971218
}
11981219
}
1199-
return PaasClient.getStorageClient().deleteObject(className, sb.toString());
1220+
return PaasClient.getStorageClient().deleteObject(className, sb.toString(), ignoreParams);
12001221
}
12011222

12021223
/**
@@ -1536,6 +1557,28 @@ public static <T extends AVObject> T createWithoutData(Class<T> clazz, String ob
15361557
}
15371558
}
15381559

1560+
/**
1561+
* disable beforeXXX Hooks
1562+
*/
1563+
public void disableBeforeHook() {
1564+
Collections.addAll(ignoreHooks, Hook.beforeSave, Hook.beforeUpdate, Hook.beforeDelete);
1565+
}
1566+
1567+
/**
1568+
* disable afterXXX Hooks
1569+
*/
1570+
public void disableAfterHook() {
1571+
Collections.addAll(ignoreHooks, Hook.afterSave, Hook.afterUpdate, Hook.afterDelete);
1572+
}
1573+
1574+
/**
1575+
* ignore specified Hook
1576+
* @param hook target Hook.
1577+
*/
1578+
public void ignoreHook(Hook hook) {
1579+
ignoreHooks.add(hook);
1580+
}
1581+
15391582
protected static <T extends AVObject> T cast(AVObject object, Class<T> clazz) throws Exception {
15401583
if (clazz.getClass().isAssignableFrom(object.getClass())) {
15411584
return (T) object;
@@ -1570,7 +1613,6 @@ public boolean equals(Object o) {
15701613

15711614
@Override
15721615
public int hashCode() {
1573-
15741616
return Objects.hash(getClassName(), getServerData(), operations, acl, isFetchWhenSave());
15751617
}
15761618
}

core/src/main/java/cn/leancloud/core/AVOSCloud.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,16 @@ public static String getApplicationKey() {
183183
return applicationKey;
184184
}
185185

186+
public static String getHookKey() {
187+
return hookKey;
188+
}
189+
public static void setHookKey(String key) {
190+
hookKey = key;
191+
}
186192
private static REGION defaultRegion = REGION.NorthChina;
187193
private static String applicationId = "";
188194
private static String applicationKey = "";
195+
private static String hookKey = "";
189196
private static volatile AVLogger.Level logLevel = AVLogger.Level.INFO;
190197
static boolean printAllHeaders = false;
191198
private static boolean enableCircularReferenceDetect = false;

core/src/main/java/cn/leancloud/core/RequestPaddingInterceptor.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import cn.leancloud.AVCloud;
44
import cn.leancloud.AVUser;
5+
import cn.leancloud.utils.StringUtil;
56
import okhttp3.Interceptor;
67
import okhttp3.Request;
78
import okhttp3.Response;
@@ -12,6 +13,7 @@ public class RequestPaddingInterceptor implements Interceptor {
1213
public static final String HEADER_KEY_LC_SESSIONTOKEN = "X-LC-Session";
1314
public static final String HEADER_KEY_LC_APPID = "X-LC-Id";
1415
public static final String HEADER_KEY_LC_APPKEY = "X-LC-Key";
16+
public static final String HEADER_KEY_LC_HOOKKEY = "X-LC-Hook-Key";
1517
private static final String HEADER_KEY_LC_PROD_MODE = "X-LC-Prod";
1618
public static final String HEADER_KEY_LC_SIGN = "X-LC-Sign";
1719
private static final String HEADER_KEY_ACCEPT = "Accept";
@@ -28,15 +30,20 @@ public static void changeRequestSignature(RequestSignature signature) {
2830
public Response intercept(Interceptor.Chain chain) throws IOException {
2931
Request originalRequest = chain.request();
3032
String sessionToken = null == AVUser.getCurrentUser()? "" : AVUser.getCurrentUser().getSessionToken();
31-
Request newRequest = originalRequest.newBuilder()
33+
34+
okhttp3.Request.Builder builder = originalRequest.newBuilder()
3235
.header(HEADER_KEY_LC_PROD_MODE, AVCloud.isProductionMode()?"1":"0")
3336
.header(HEADER_KEY_LC_APPID, AVOSCloud.getApplicationId())
3437
.header(HEADER_KEY_LC_SIGN, requestSignature.generateSign())
3538
.header(HEADER_KEY_ACCEPT, DEFAULT_CONTENT_TYPE)
3639
.header(HEADER_KEY_CONTENT_TYPE, DEFAULT_CONTENT_TYPE)
3740
.header(HEADER_KEY_USER_AGENT, AppConfiguration.getUserAgent())
38-
.header(HEADER_KEY_LC_SESSIONTOKEN, null == sessionToken ? "":sessionToken)
39-
.build();
41+
.header(HEADER_KEY_LC_SESSIONTOKEN, null == sessionToken ? "":sessionToken);
42+
if (!StringUtil.isEmpty(AVOSCloud.getHookKey())) {
43+
builder = builder.header(HEADER_KEY_LC_HOOKKEY, AVOSCloud.getHookKey());
44+
}
45+
46+
Request newRequest = builder.build();
4047
return chain.proceed(newRequest);
4148
}
4249
}

core/src/main/java/cn/leancloud/core/StorageClient.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ public Integer apply(AVQueryResult o) throws Exception {
216216
});
217217
}
218218

219-
public Observable<AVNull> deleteObject(final String className, String objectId) {
220-
return wrapObservable(apiService.deleteObject(className, objectId));
219+
public Observable<AVNull> deleteObject(final String className, String objectId, Map<String, Object> param) {
220+
return wrapObservable(apiService.deleteObject(className, objectId, param));
221221
}
222222

223223
public Observable<? extends AVObject> createObject(final String className, JSONObject data, boolean fetchFlag,
@@ -273,8 +273,8 @@ public Observable<AVObject> getWholeObject(final String endpointClass, String ob
273273
return wrapObservable(apiService.getWholeObject(endpointClass, objectId, includeKeys));
274274
}
275275

276-
public Observable<AVNull> deleteWholeObject(final String endpointClass, String objectId) {
277-
return wrapObservable(apiService.deleteWholeObject(endpointClass, objectId));
276+
public Observable<AVNull> deleteWholeObject(final String endpointClass, String objectId, Map<String, Object> param) {
277+
return wrapObservable(apiService.deleteWholeObject(endpointClass, objectId, param));
278278
}
279279

280280
public Observable<AVFile> fetchFile(String objectId) {

core/src/main/java/cn/leancloud/ops/AddUniqueOperation.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.alibaba.fastjson.JSONArray;
44

5+
import java.util.ArrayList;
56
import java.util.List;
67

78
/**
@@ -16,25 +17,29 @@ public AddUniqueOperation(String key, Object value) {
1617
@Override
1718
public Object apply(Object obj) {
1819
Object result = super.apply(obj);
20+
List<Object> listResult = null;
1921
if (null != result && (result instanceof List || result instanceof JSONArray)) {
2022
if (result instanceof List) {
2123
Object[] objects = ((List)result).toArray();
22-
((List)result).clear();
24+
listResult = new ArrayList<>();
2325
for (Object o : objects) {
24-
if (!((List)result).contains(o)) {
25-
((List)result).add(o);
26+
if (listResult.contains(o)) {
27+
continue;
2628
}
29+
listResult.add(o);
2730
}
2831
} else {
2932
Object[] objects = ((JSONArray)result).toArray();
3033
((JSONArray)result).clear();
34+
listResult = new ArrayList<>();
3135
for (Object o : objects) {
32-
if (!((JSONArray)result).contains(o)) {
33-
((JSONArray)result).add(o);
36+
if (listResult.contains(o)) {
37+
continue;
3438
}
39+
listResult.add(o);
3540
}
3641
}
3742
}
38-
return result;
43+
return listResult;
3944
}
4045
}

core/src/main/java/cn/leancloud/service/APIService.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,10 @@ Observable<AVObject> updateObject(@Path("className") String className, @Path("ob
4848
@Body JSONObject object, @Query("fetchWhenSave") boolean fetchFlag,
4949
@Query("where") JSONObject where);
5050

51-
@DELETE("/1.1/classes/{className}/{objectId}")
52-
Observable<AVNull> deleteObject(@Path("className") String className, @Path("objectId") String objectId);
51+
// @DELETEWITHBODY("/1.1/classes/{className}/{objectId}")
52+
@HTTP(method = "DELETE", path = "/1.1/classes/{className}/{objectId}", hasBody = true)
53+
Observable<AVNull> deleteObject(@Path("className") String className, @Path("objectId") String objectId,
54+
@Body Map<String, Object> param);
5355

5456
@POST("/1.1/batch")
5557
Observable<JSONArray> batchCreate(@Body JSONObject param);
@@ -69,8 +71,10 @@ Observable<AVObject> saveWholeObject(@Path("endpointClass") String endpointClass
6971
@GET("/1.1/{endpointClass}/{objectId}")
7072
Observable<AVObject> getWholeObject(@Path("endpointClass") String endpointClass, @Path("objectId") String objectId,
7173
@Query("include") String includeKeys);
72-
@DELETE("/1.1/{endpointClass}/{objectId}")
73-
Observable<AVNull> deleteWholeObject(@Path("endpointClass") String endpointClass, @Path("objectId") String objectId);
74+
// @DELETE("/1.1/{endpointClass}/{objectId}")
75+
@HTTP(method = "DELETE", path = "/1.1/{endpointClass}/{objectId}", hasBody = true)
76+
Observable<AVNull> deleteWholeObject(@Path("endpointClass") String endpointClass, @Path("objectId") String objectId,
77+
@Body Map<String, Object> param);
7478

7579
/**
7680
* request format:

core/src/test/java/cn/leancloud/AVCloudFunctionTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package cn.leancloud;
22

3-
import com.alibaba.fastjson.JSONObject;
43
import io.reactivex.Observable;
54
import io.reactivex.Observer;
65
import io.reactivex.disposables.Disposable;

0 commit comments

Comments
 (0)