Skip to content

Commit ccd1224

Browse files
guqingruibaby
authored andcommitted
refactor: optimize the way to obtain plugin configurations (halo-dev#135)
### What this PR does? /kind improvement 优化插件配置的获取方式 2.17.0 已经对配置获取增加了缓存因此不必在需要插件手动处理 ```release-note None ```
1 parent 59f6d2c commit ccd1224

File tree

4 files changed

+47
-82
lines changed

4 files changed

+47
-82
lines changed

src/main/java/run/halo/comment/widget/DefaultCommentWidget.java

+2-24
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package run.halo.comment.widget;
22

33
import java.util.Properties;
4-
import lombok.Data;
54
import lombok.RequiredArgsConstructor;
65
import lombok.extern.slf4j.Slf4j;
76
import org.apache.commons.lang3.StringUtils;
@@ -29,7 +28,6 @@ public class DefaultCommentWidget implements CommentWidget {
2928
static final PropertyPlaceholderHelper PROPERTY_PLACEHOLDER_HELPER = new PropertyPlaceholderHelper("${", "}");
3029

3130
private final PluginWrapper pluginWrapper;
32-
private final SettingFetcher settingFetcher;
3331
private final SettingConfigGetter settingConfigGetter;
3432

3533
@Override
@@ -65,15 +63,13 @@ private String commentHtml(IAttribute groupAttribute, IAttribute kindAttribute,
6563
properties.setProperty("name", nameAttribute.getValue());
6664
properties.setProperty("domId", domIdFrom(group, kindAttribute.getValue(), nameAttribute.getValue()));
6765

68-
var basicConfig = settingFetcher.fetch(BasicConfig.GROUP, BasicConfig.class)
69-
.orElse(new BasicConfig());
66+
var basicConfig = settingConfigGetter.getBasicConfig().blockOptional().orElseThrow();
7067
properties.setProperty("size", String.valueOf(basicConfig.getSize()));
7168
properties.setProperty("replySize", String.valueOf(basicConfig.getReplySize()));
7269
properties.setProperty("withReplies", String.valueOf(basicConfig.isWithReplies()));
7370
properties.setProperty("withReplySize", String.valueOf(basicConfig.getWithReplySize()));
7471

75-
var avatarConfig = settingFetcher.fetch(AvatarConfig.GROUP, AvatarConfig.class)
76-
.orElse(new AvatarConfig());
72+
var avatarConfig = settingConfigGetter.getAvatarConfig().blockOptional().orElseThrow();
7773
properties.setProperty("useAvatarProvider", String.valueOf(avatarConfig.isEnable()));
7874
properties.setProperty("avatarProvider", String.valueOf(avatarConfig.getProvider()));
7975
properties.setProperty("avatarProviderMirror", String.valueOf(avatarConfig.getProviderMirror()));
@@ -111,24 +107,6 @@ private String commentHtml(IAttribute groupAttribute, IAttribute kindAttribute,
111107
""", properties);
112108
}
113109

114-
@Data
115-
private static class BasicConfig {
116-
public static final String GROUP = "basic";
117-
private int size;
118-
private int replySize;
119-
private boolean withReplies;
120-
private int withReplySize;
121-
}
122-
123-
@Data
124-
private static class AvatarConfig {
125-
public static final String GROUP = "avatar";
126-
private boolean enable;
127-
private String provider;
128-
private String providerMirror;
129-
private String policy;
130-
}
131-
132110
private String domIdFrom(String group, String kind, String name) {
133111
Assert.notNull(name, "The name must not be null.");
134112
Assert.notNull(kind, "The kind must not be null.");

src/main/java/run/halo/comment/widget/SettingConfigGetter.java

+33
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,26 @@
99

1010
public interface SettingConfigGetter {
1111

12+
/**
13+
* Never {@link Mono#empty()}.
14+
*/
15+
Mono<BasicConfig> getBasicConfig();
16+
17+
/**
18+
* Never {@link Mono#empty()}.
19+
*/
20+
Mono<AvatarConfig> getAvatarConfig();
21+
22+
/**
23+
* Never {@link Mono#empty()}.
24+
*/
1225
Mono<SecurityConfig> getSecurityConfig();
1326

1427
@Data
1528
@Accessors(chain = true)
1629
class SecurityConfig {
30+
public static final String GROUP = "security";
31+
1732
@Getter(onMethod_ = @NonNull)
1833
private CaptchaConfig captcha = CaptchaConfig.empty();
1934

@@ -46,4 +61,22 @@ public static CaptchaConfig empty() {
4661
return new CaptchaConfig();
4762
}
4863
}
64+
65+
@Data
66+
class BasicConfig {
67+
public static final String GROUP = "basic";
68+
private int size;
69+
private int replySize;
70+
private boolean withReplies;
71+
private int withReplySize;
72+
}
73+
74+
@Data
75+
class AvatarConfig {
76+
public static final String GROUP = "avatar";
77+
private boolean enable;
78+
private String provider;
79+
private String providerMirror;
80+
private String policy;
81+
}
4982
}
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,30 @@
11
package run.halo.comment.widget;
22

3-
import static run.halo.app.extension.index.query.QueryFactory.equal;
4-
5-
import java.util.function.Function;
6-
import com.google.common.cache.Cache;
7-
import com.google.common.cache.CacheBuilder;
83
import lombok.RequiredArgsConstructor;
94
import org.springframework.stereotype.Component;
105
import reactor.core.publisher.Mono;
11-
import run.halo.app.extension.ConfigMap;
12-
import run.halo.app.extension.DefaultExtensionMatcher;
13-
import run.halo.app.extension.ExtensionClient;
14-
import run.halo.app.extension.controller.Controller;
15-
import run.halo.app.extension.controller.ControllerBuilder;
16-
import run.halo.app.extension.controller.Reconciler;
17-
import run.halo.app.extension.router.selector.FieldSelector;
186
import run.halo.app.plugin.ReactiveSettingFetcher;
197

208
@Component
219
@RequiredArgsConstructor
2210
public class SettingConfigGetterImpl implements SettingConfigGetter {
2311
private final ReactiveSettingFetcher settingFetcher;
24-
private final SettingConfigCache settingConfigCache;
2512

2613
@Override
27-
public Mono<SecurityConfig> getSecurityConfig() {
28-
return settingConfigCache.get("security",
29-
key -> settingFetcher.fetch("security", SecurityConfig.class)
30-
.defaultIfEmpty(SecurityConfig.empty())
31-
);
14+
public Mono<BasicConfig> getBasicConfig() {
15+
return settingFetcher.fetch(BasicConfig.GROUP, BasicConfig.class)
16+
.defaultIfEmpty(new BasicConfig());
3217
}
3318

34-
interface SettingConfigCache {
35-
<T> Mono<T> get(String key, Function<String, Mono<T>> loader);
19+
@Override
20+
public Mono<AvatarConfig> getAvatarConfig() {
21+
return settingFetcher.fetch(AvatarConfig.GROUP, AvatarConfig.class)
22+
.defaultIfEmpty(new AvatarConfig());
3623
}
3724

38-
@Component
39-
@RequiredArgsConstructor
40-
static class SettingConfigCacheImpl implements Reconciler<Reconciler.Request>, SettingConfigCache {
41-
private static final String CONFIG_NAME = "plugin-comment-widget-configmap";
42-
43-
private final Cache<String, Object> cache = CacheBuilder.newBuilder()
44-
.maximumSize(10)
45-
.build();
46-
47-
private final ExtensionClient client;
48-
49-
@SuppressWarnings("unchecked")
50-
public <T> Mono<T> get(String key, Function<String, Mono<T>> loader) {
51-
return Mono.justOrEmpty(cache.getIfPresent(key))
52-
.switchIfEmpty(loader.apply(key).doOnNext(value -> cache.put(key, value)))
53-
.map(object -> (T) object);
54-
}
55-
56-
@Override
57-
public Result reconcile(Request request) {
58-
cache.invalidateAll();
59-
return Result.doNotRetry();
60-
}
61-
62-
@Override
63-
public Controller setupWith(ControllerBuilder builder) {
64-
var extension = new ConfigMap();
65-
var extensionMatcher = DefaultExtensionMatcher.builder(client, extension.groupVersionKind())
66-
.fieldSelector(FieldSelector.of(equal("metadata.name", CONFIG_NAME)))
67-
.build();
68-
return builder
69-
.extension(extension)
70-
.syncAllOnStart(false)
71-
.onAddMatcher(extensionMatcher)
72-
.onUpdateMatcher(extensionMatcher)
73-
.build();
74-
}
25+
@Override
26+
public Mono<SecurityConfig> getSecurityConfig() {
27+
return settingFetcher.fetch(SecurityConfig.GROUP, SecurityConfig.class)
28+
.defaultIfEmpty(SecurityConfig.empty());
7529
}
7630
}

src/main/resources/plugin.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ metadata:
88
"store.halo.run/app-id": "app-YXyaD"
99
spec:
1010
enabled: true
11-
requires: ">=2.15.0"
11+
requires: ">=2.17.0"
1212
author:
1313
name: Halo
1414
website: https://github.com/halo-dev

0 commit comments

Comments
 (0)