Skip to content

Commit 8904ac2

Browse files
author
Rocky Yu
committed
add lattice tool: business config loader
1 parent b7ff998 commit 8904ac2

File tree

7 files changed

+278
-18
lines changed

7 files changed

+278
-18
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,24 @@
11
package org.hifforce.lattice.spi.config;
22

3+
import org.hifforce.lattice.model.config.BusinessConfig;
4+
5+
import java.util.List;
6+
37
/**
48
* @author Rocky Yu
59
* @since 2022/9/26
610
*/
711
public interface BusinessConfigLoadSpi {
12+
13+
void setClassLoader(ClassLoader classLoader);
14+
15+
/**
16+
* @return the priority of loader.
17+
*/
18+
int getPriority();
19+
20+
/**
21+
* @return the business config list.
22+
*/
23+
List<BusinessConfig> loadBusinessConfigs(List<String> bizCodes);
824
}

lattice-runtime/src/main/java/org/hiforce/lattice/runtime/Lattice.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,13 @@
1919
import org.hifforce.lattice.model.business.TemplateType;
2020
import org.hifforce.lattice.model.config.*;
2121
import org.hifforce.lattice.model.config.builder.BusinessConfigBuilder;
22-
import org.hifforce.lattice.model.register.AbilitySpec;
23-
import org.hifforce.lattice.model.register.BusinessSpec;
24-
import org.hifforce.lattice.model.register.ProductSpec;
25-
import org.hifforce.lattice.model.register.RealizationSpec;
22+
import org.hifforce.lattice.model.register.*;
2623
import org.hifforce.lattice.utils.BizCodeUtils;
2724
import org.hiforce.lattice.runtime.ability.register.AbilityBuildRequest;
2825
import org.hiforce.lattice.runtime.ability.register.AbilityRegister;
2926
import org.hiforce.lattice.runtime.ability.register.TemplateRegister;
3027
import org.hiforce.lattice.runtime.cache.LatticeRuntimeCache;
28+
import org.hiforce.lattice.runtime.spi.LatticeSpiFactory;
3129
import org.hiforce.lattice.runtime.template.LatticeTemplateManager;
3230
import org.hiforce.lattice.runtime.utils.ClassLoaderUtil;
3331
import org.hiforce.lattice.runtime.utils.ClassPathScanHandler;
@@ -123,10 +121,19 @@ public BusinessConfig getBusinessConfigByBizCode(String bizCode) {
123121

124122

125123
private void buildBusinessConfig() {
124+
List<String> bizCodes = Lattice.getInstance().getAllRegisteredBusinesses().stream()
125+
.map(BaseSpec::getCode).collect(Collectors.toList());
126+
List<BusinessConfig> configs = LatticeSpiFactory.getInstance().getBusinessConfigLoads().stream()
127+
.flatMap(p -> p.loadBusinessConfigs(bizCodes).stream())
128+
.collect(Collectors.toList());
129+
businessConfigs.addAll(configs);
130+
126131
if (isSimpleMode()) {
127132
//auto-config business and products.
128133
autoBuildBusinessConfig();
129134
}
135+
136+
businessConfigs.sort(Comparator.comparingInt(BusinessConfig::getPriority));
130137
}
131138

132139
public void addBusinessConfig(BusinessConfig config) {
@@ -157,6 +164,11 @@ private void autoBuildBusinessConfig() {
157164
.map(this::buildProductConfig)
158165
.collect(Collectors.toList());
159166
for (BusinessSpec businessSpec : getAllRegisteredBusinesses()) {
167+
if (businessConfigs.stream()
168+
.anyMatch(p -> StringUtils.equals(p.getBizCode(), businessSpec.getCode()))) {
169+
continue; //不重复构建
170+
}
171+
160172
List<ExtPriorityConfig> priorityConfigs = businessSpec.getRealizations().stream()
161173
.flatMap(p -> autoBuildPriorityConfig(businessSpec, p).stream())
162174
.filter(Objects::nonNull)
@@ -168,7 +180,6 @@ private void autoBuildBusinessConfig() {
168180
.extension(priorityConfigs)
169181
.build();
170182
businessConfigs.add(businessConfig);
171-
businessConfigs.sort(Comparator.comparingInt(BusinessConfig::getPriority));
172183
}
173184
}
174185

lattice-runtime/src/main/java/org/hiforce/lattice/runtime/spi/LatticeSpiFactory.java

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package org.hiforce.lattice.runtime.spi;
22

33
import com.google.common.collect.Lists;
4+
import org.apache.commons.collections4.CollectionUtils;
45
import org.hifforce.lattice.model.ability.IAbility;
56
import org.hifforce.lattice.model.ability.provider.IAbilityProviderCreator;
67
import org.hifforce.lattice.spi.annotation.*;
7-
import org.hiforce.lattice.runtime.ability.BaseLatticeAbility;
8+
import org.hifforce.lattice.spi.config.BusinessConfigLoadSpi;
89
import org.hiforce.lattice.runtime.ability.execute.RunnerCollection;
910
import org.hiforce.lattice.runtime.ability.provider.DefaultAbilityProviderCreator;
1011

12+
import java.util.Comparator;
1113
import java.util.List;
1214
import java.util.Optional;
1315
import java.util.ServiceLoader;
@@ -45,6 +47,9 @@ public class LatticeSpiFactory {
4547

4648
private IRunnerCollectionBuilder runnerCollectionBuilder;
4749

50+
51+
private List<BusinessConfigLoadSpi> businessConfigLoads;
52+
4853
private LatticeSpiFactory() {
4954

5055
}
@@ -61,27 +66,38 @@ public static LatticeSpiFactory getInstance() {
6166
return instance;
6267
}
6368

69+
public List<BusinessConfigLoadSpi> getBusinessConfigLoads() {
70+
if (null == businessConfigLoads) {
71+
businessConfigLoads = getCustomServiceProviders(BusinessConfigLoadSpi.class);
72+
}
73+
if (CollectionUtils.isNotEmpty(businessConfigLoads)) {
74+
businessConfigLoads.forEach(p -> p.setClassLoader(getClassLoader()));
75+
businessConfigLoads.sort(Comparator.comparingInt(BusinessConfigLoadSpi::getPriority));
76+
}
77+
return businessConfigLoads;
78+
}
79+
6480
/**
6581
* @return The Ability's Custom Annotation Parsers..
6682
*/
6783
@SuppressWarnings("rawtypes")
6884
public List<AbilityAnnotationParser> getAbilityAnnotationParsers() {
6985
if (null == abilityAnnotationParsers) {
70-
abilityAnnotationParsers = getCustomAnnotationParsers(AbilityAnnotationParser.class);
86+
abilityAnnotationParsers = getCustomServiceProviders(AbilityAnnotationParser.class);
7187
}
7288
return abilityAnnotationParsers;
7389
}
7490

7591
public List<ProductAnnotationParser> getProductAnnotationParsers() {
7692
if (null == productAnnotationParsers) {
77-
productAnnotationParsers = getCustomAnnotationParsers(ProductAnnotationParser.class);
93+
productAnnotationParsers = getCustomServiceProviders(ProductAnnotationParser.class);
7894
}
7995
return productAnnotationParsers;
8096
}
8197

8298
public List<BusinessAnnotationParser> getBusinessAnnotationParsers() {
8399
if (null == businessAnnotationParsers) {
84-
businessAnnotationParsers = getCustomAnnotationParsers(BusinessAnnotationParser.class);
100+
businessAnnotationParsers = getCustomServiceProviders(BusinessAnnotationParser.class);
85101
}
86102
return businessAnnotationParsers;
87103
}
@@ -90,7 +106,7 @@ public List<BusinessAnnotationParser> getBusinessAnnotationParsers() {
90106
public List<ExtensionAnnotationParser> getExtensionAnnotationParsers() {
91107
if (null == extensionAnnotationParsers) {
92108
extensionAnnotationParsers =
93-
getCustomAnnotationParsers(ExtensionAnnotationParser.class);
109+
getCustomServiceProviders(ExtensionAnnotationParser.class);
94110
}
95111
return extensionAnnotationParsers;
96112
}
@@ -99,20 +115,20 @@ public List<ExtensionAnnotationParser> getExtensionAnnotationParsers() {
99115
public List<RealizationAnnotationParser> getRealizationAnnotationParsers() {
100116
if (null == realizationAnnotationParsers) {
101117
realizationAnnotationParsers =
102-
getCustomAnnotationParsers(RealizationAnnotationParser.class);
118+
getCustomServiceProviders(RealizationAnnotationParser.class);
103119
}
104120
return realizationAnnotationParsers;
105121
}
106122

107123
@SuppressWarnings("rawtypes")
108124
public List<ScanSkipAnnotationParser> getScanSkipAnnotationParsers() {
109125
if (null == scanSkipAnnotationParsers) {
110-
scanSkipAnnotationParsers = getCustomAnnotationParsers(ScanSkipAnnotationParser.class);
126+
scanSkipAnnotationParsers = getCustomServiceProviders(ScanSkipAnnotationParser.class);
111127
}
112128
return scanSkipAnnotationParsers;
113129
}
114130

115-
public <T> List<T> getCustomAnnotationParsers(Class<T> spiClass) {
131+
public <T> List<T> getCustomServiceProviders(Class<T> spiClass) {
116132

117133
ServiceLoader<T> serializers;
118134
serializers = ServiceLoader.load(spiClass, classLoader);

lattice-tools/lattice-load-config-res/pom.xml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,36 @@
1212

1313
<artifactId>lattice-load-config-res</artifactId>
1414

15+
<properties>
16+
<version.jackson>2.13.4</version.jackson>
17+
</properties>
18+
1519
<dependencies>
1620
<dependency>
1721
<groupId>org.hiforce.lattice</groupId>
1822
<artifactId>lattice-model</artifactId>
1923
</dependency>
24+
<dependency>
25+
<groupId>com.fasterxml.jackson.core</groupId>
26+
<artifactId>jackson-databind</artifactId>
27+
<version>${version.jackson}</version>
28+
</dependency>
29+
<dependency>
30+
<groupId>com.fasterxml.jackson.core</groupId>
31+
<artifactId>jackson-core</artifactId>
32+
<version>${version.jackson}</version>
33+
</dependency>
34+
<dependency>
35+
<groupId>com.fasterxml.jackson.core</groupId>
36+
<artifactId>jackson-annotations</artifactId>
37+
<version>${version.jackson}</version>
38+
</dependency>
39+
<dependency>
40+
<groupId>com.fasterxml.jackson.datatype</groupId>
41+
<artifactId>jackson-datatype-jsr310</artifactId>
42+
<version>${version.jackson}</version>
43+
</dependency>
44+
2045
</dependencies>
2146

2247
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package org.hiforce.lattice.tool;
2+
3+
import com.google.auto.service.AutoService;
4+
import com.google.common.collect.Lists;
5+
import org.apache.commons.lang3.StringUtils;
6+
import org.hifforce.lattice.model.config.BusinessConfig;
7+
import org.hifforce.lattice.spi.config.BusinessConfigLoadSpi;
8+
9+
import java.io.BufferedReader;
10+
import java.io.InputStream;
11+
import java.io.InputStreamReader;
12+
import java.util.List;
13+
import java.util.Optional;
14+
15+
/**
16+
* @author Rocky Yu
17+
* @since 2022/9/26
18+
*/
19+
@SuppressWarnings("unused")
20+
@AutoService(BusinessConfigLoadSpi.class)
21+
public class BizConfigResourceLoader implements BusinessConfigLoadSpi {
22+
23+
private ClassLoader classLoader;
24+
25+
@Override
26+
public void setClassLoader(ClassLoader classLoader) {
27+
this.classLoader = classLoader;
28+
}
29+
30+
@Override
31+
public int getPriority() {
32+
return 100;
33+
}
34+
35+
@Override
36+
public List<BusinessConfig> loadBusinessConfigs(List<String> bizCodes) {
37+
List<BusinessConfig> configs = Lists.newArrayList();
38+
for (String bizCode : bizCodes) {
39+
InputStream is = null;
40+
try {
41+
String resourceFile = String.format("lattice/lattice-%s.json", bizCode);
42+
43+
is = Optional.ofNullable(classLoader).orElse(Thread.currentThread().getContextClassLoader()).
44+
getResourceAsStream(resourceFile);
45+
String jsonStr = getStringByInputStream(is);
46+
if (StringUtils.isEmpty(jsonStr)) {
47+
continue;
48+
}
49+
BusinessConfig businessConfig = JacksonUtils.deserializeIgnoreException(jsonStr, BusinessConfig.class);
50+
configs.add(businessConfig);
51+
} finally {
52+
try {
53+
if (null != is) {
54+
is.close();
55+
}
56+
} catch (Exception ignored) {
57+
}
58+
}
59+
}
60+
return configs;
61+
}
62+
63+
public static String getStringByInputStream(InputStream inputStream) {
64+
if (null == inputStream) {
65+
return null;
66+
}
67+
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
68+
try {
69+
StringBuilder result = new StringBuilder();
70+
String line;
71+
while ((line = bufferedReader.readLine()) != null) {
72+
result.append(line);
73+
}
74+
return result.toString();
75+
} catch (Exception e) {
76+
try {
77+
inputStream.close();
78+
bufferedReader.close();
79+
} catch (Exception ignored) {
80+
}
81+
}
82+
return null;
83+
}
84+
}

0 commit comments

Comments
 (0)