Skip to content

Commit edab958

Browse files
authored
Merge pull request lowcoder-org#329 from lvhuichao/develop
1. feat: compatible for compound application; 2. feat: add field downloadUrl for recommended js library
2 parents e155918 + 5b07763 commit edab958

File tree

5 files changed

+68
-23
lines changed

5 files changed

+68
-23
lines changed

server/api-service/openblocks-sdk/src/main/java/com/openblocks/sdk/constants/DslConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ public static class CompoundAppDslConstants {
1010
public static final String HIDE_WHEN_NO_PERMISSION = "hideWhenNoPermission";
1111
public static final String APP = "app";
1212
public static final String APP_ID = "appId";
13+
public static final String ACTION = "action";
1314
}
1415
}

server/api-service/openblocks-server/src/main/java/com/openblocks/api/application/CompoundApplicationDslFilter.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
package com.openblocks.api.application;
22

33
import static com.openblocks.domain.permission.model.ResourceAction.READ_APPLICATIONS;
4+
import static com.openblocks.sdk.constants.DslConstants.CompoundAppDslConstants.ACTION;
5+
import static com.openblocks.sdk.constants.DslConstants.CompoundAppDslConstants.APP;
6+
import static com.openblocks.sdk.constants.DslConstants.CompoundAppDslConstants.APP_ID;
7+
import static com.openblocks.sdk.constants.DslConstants.CompoundAppDslConstants.COMP;
8+
import static com.openblocks.sdk.constants.DslConstants.CompoundAppDslConstants.HIDE_WHEN_NO_PERMISSION;
49

510
import java.util.ArrayList;
611
import java.util.Collections;
712
import java.util.HashMap;
813
import java.util.Iterator;
914
import java.util.List;
1015
import java.util.Map;
16+
import java.util.Optional;
1117
import java.util.Set;
1218
import java.util.stream.Collectors;
1319

@@ -19,9 +25,9 @@
1925

2026
import com.google.common.collect.Sets;
2127
import com.openblocks.api.home.SessionUserService;
22-
import com.openblocks.sdk.util.MoreMapUtils;
2328
import com.openblocks.domain.permission.service.ResourcePermissionService;
2429
import com.openblocks.sdk.constants.DslConstants.CompoundAppDslConstants;
30+
import com.openblocks.sdk.util.MoreMapUtils;
2531

2632
import reactor.core.publisher.Mono;
2733

@@ -50,7 +56,6 @@ public Mono<Void> removeSubAppsFromCompoundDsl(Map<String, Object> dsl) {
5056
.then();
5157
}
5258

53-
@SuppressWarnings("unchecked")
5459
private void removeSubAppsFromCompoundDsl(Map<String, Object> dsl, Set<String> appIdsNeedRemoved) {
5560

5661
List<Map<String, Object>> items = MoreMapUtils.getList(dsl, CompoundAppDslConstants.ITEMS, new ArrayList<>());
@@ -59,13 +64,11 @@ private void removeSubAppsFromCompoundDsl(Map<String, Object> dsl, Set<String> a
5964
Map<String, Object> item = iterator.next();
6065
// for leaf node which has empty items.
6166
if (isLeaf(item)) {
62-
boolean hideWhenNoPermission = MapUtils.getBoolean(item, CompoundAppDslConstants.HIDE_WHEN_NO_PERMISSION, true);
63-
if (!hideWhenNoPermission) {
67+
if (!hideWhenNoPermission(item)) {
6468
continue;
6569
}
6670

67-
Map<String, Object> app = (Map<String, Object>) MapUtils.getMap(item, CompoundAppDslConstants.APP, new HashMap<>());
68-
String appId = MapUtils.getString(app, CompoundAppDslConstants.APP_ID);
71+
String appId = getAppId(item);
6972
if (StringUtils.isNotBlank(appId) && appIdsNeedRemoved.contains(appId)) {
7073
iterator.remove();
7174
continue;
@@ -92,15 +95,13 @@ private boolean isLeaf(Map<String, Object> item) {
9295
/**
9396
* Recursively find all sub-application ids from the DSL of the compound application.
9497
*/
95-
@SuppressWarnings("unchecked")
9698
public Set<String> getAllSubAppIdsFromCompoundAppDsl(Map<String, Object> dsl) {
9799
List<Map<String, Object>> items = MoreMapUtils.getList(dsl, CompoundAppDslConstants.ITEMS, new ArrayList<>());
98100
return items.stream()
99101
.map(item -> {
100102
// If the item is a leaf node, find its id and return it.
101103
if (isLeaf(item)) {
102-
Map<String, Object> app = (Map<String, Object>) MapUtils.getMap(item, CompoundAppDslConstants.APP, new HashMap<>());
103-
String appId = MapUtils.getString(app, CompoundAppDslConstants.APP_ID);
104+
String appId = getAppId(item);
104105
if (StringUtils.isBlank(appId)) {
105106
return Collections.<String> emptySet();
106107
}
@@ -112,4 +113,23 @@ public Set<String> getAllSubAppIdsFromCompoundAppDsl(Map<String, Object> dsl) {
112113
.flatMap(Set::stream)
113114
.collect(Collectors.toSet());
114115
}
116+
117+
@SuppressWarnings("unchecked")
118+
private String getAppId(Map<String, Object> item) {
119+
return Optional.ofNullable((Map<String, Object>) MapUtils.getMap(item, ACTION))
120+
.map(action -> (Map<String, Object>) MapUtils.getMap(action, COMP))
121+
.or(() -> Optional.of(item)) // compatible code
122+
.map(i -> (Map<String, Object>) MapUtils.getMap(i, APP))
123+
.map(app -> MapUtils.getString(app, APP_ID))
124+
.orElse(null);
125+
}
126+
127+
@SuppressWarnings("unchecked")
128+
private boolean hideWhenNoPermission(Map<String, Object> item) {
129+
return Optional.ofNullable((Map<String, Object>) MapUtils.getMap(item, ACTION))
130+
.map(action -> (Map<String, Object>) MapUtils.getMap(action, COMP))
131+
.or(() -> Optional.of(item)) // compatible code
132+
.map(i -> MapUtils.getBoolean(i, HIDE_WHEN_NO_PERMISSION))
133+
.orElse(true);
134+
}
115135
}

server/api-service/openblocks-server/src/main/java/com/openblocks/api/misc/JsLibraryController.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import java.util.Optional;
1212
import java.util.concurrent.ConcurrentHashMap;
1313
import java.util.concurrent.ConcurrentMap;
14+
import java.util.function.Function;
15+
import java.util.stream.Collectors;
1416

1517
import org.apache.commons.collections4.CollectionUtils;
1618
import org.apache.commons.collections4.MapUtils;
@@ -24,12 +26,14 @@
2426
import org.springframework.web.bind.annotation.RestController;
2527
import org.springframework.web.reactive.function.client.ExchangeStrategies;
2628

29+
import com.fasterxml.jackson.core.type.TypeReference;
2730
import com.google.common.cache.CacheBuilder;
2831
import com.google.common.cache.CacheLoader;
2932
import com.google.common.cache.LoadingCache;
3033
import com.openblocks.api.framework.view.ResponseView;
3134
import com.openblocks.infra.constant.NewUrl;
3235
import com.openblocks.infra.localcache.ReloadableCache;
36+
import com.openblocks.sdk.util.JsonUtils;
3337
import com.openblocks.sdk.webclient.WebClientBuildHelper;
3438

3539
import lombok.Builder;
@@ -63,19 +67,25 @@ public Mono<JsLibraryMeta> load(@NotNull String key) {
6367
.build();
6468

6569
static {
66-
try (InputStream is = JsLibraryController.class.getClassLoader().getResourceAsStream("recommendedJsLibraries")) {
70+
try (InputStream is = JsLibraryController.class.getClassLoader().getResourceAsStream("recommendedJsLibraries.json")) {
6771
if (is != null) {
68-
List<String> names = IOUtils.readLines(is, Charset.defaultCharset());
69-
log.info("find recommended js library names: {}", names);
70-
for (String libName : names) {
72+
String content = IOUtils.toString(is, Charset.defaultCharset());
73+
List<Map<String, Object>> recommendedJsLibraries = JsonUtils.fromJsonSafely(content, new TypeReference<>() {
74+
}, Collections.emptyList());
75+
Map<String, Map<String, Object>> recommendedJsLibraryMap = recommendedJsLibraries.stream()
76+
.collect(Collectors.toMap(map -> MapUtils.getString(map, "name"), Function.identity()));
77+
78+
log.info("find recommended js library names: {}", recommendedJsLibraryMap.keySet());
79+
for (String libName : recommendedJsLibraryMap.keySet()) {
7180
ReloadableCache<JsLibraryMeta> reloadableCache = ReloadableCache.<JsLibraryMeta> newBuilder()
7281
.setName(libName)
7382
.setInterval(Duration.ofDays(1))
74-
.setFactory(() -> {
75-
Mono<JsLibraryMeta> fetch = fetch(libName);
76-
log.info("reloaded recommended js library: {}", libName);
77-
return fetch;
78-
})
83+
.setFactory(() -> fetch(libName)
84+
.doOnNext(jsLibraryMeta -> {
85+
Map<String, Object> map = recommendedJsLibraryMap.get(libName);
86+
jsLibraryMeta.setDownloadUrl(MapUtils.getString(map, "downloadUrl"));
87+
})
88+
.doOnNext(jsLibraryMeta -> log.info("reloaded recommended js library: {}", JsonUtils.toJson(jsLibraryMeta))))
7989
.build();
8090
RECOMMENDED_JS_LIB_META_CACHE.put(libName, reloadableCache);
8191
}
@@ -154,5 +164,6 @@ public static class JsLibraryMeta {
154164
private String latestVersion;
155165
private String homepage;
156166
private String description;
167+
private String downloadUrl;
157168
}
158169
}

server/api-service/openblocks-server/src/main/resources/recommendedJsLibraries

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[
2+
{
3+
"name": "jspdf",
4+
"downloadUrl": "https://unpkg.com/jspdf/dist/jspdf.umd.min.js"
5+
},
6+
{
7+
"name": "jmespath",
8+
"downloadUrl": "https://unpkg.com/jmespath/jmespath.js"
9+
},
10+
{
11+
"name": "jsonpath",
12+
"downloadUrl": "https://unpkg.com/jsonpath/jsonpath.js"
13+
},
14+
{
15+
"name": "i18next",
16+
"downloadUrl": "https://unpkg.com/i18next/dist/umd/i18next.min.js"
17+
}
18+
]

0 commit comments

Comments
 (0)