16
16
package io .micronaut .discovery .consul .client .v1 ;
17
17
18
18
import io .micronaut .context .annotation .Requires ;
19
+ import io .micronaut .context .env .Environment ;
20
+ import io .micronaut .context .env .PropertySource ;
19
21
import io .micronaut .core .async .publisher .Publishers ;
22
+ import io .micronaut .core .util .CollectionUtils ;
20
23
import io .micronaut .discovery .DiscoveryClient ;
21
24
import io .micronaut .discovery .ServiceInstance ;
25
+ import io .micronaut .discovery .config .ConfigDiscoveryConfiguration ;
26
+ import io .micronaut .discovery .config .ConfigurationClient ;
22
27
import io .micronaut .discovery .consul .ConsulConfiguration ;
23
28
import io .micronaut .discovery .consul .ConsulServiceInstance ;
24
29
import io .micronaut .http .client .Client ;
30
+ import io .reactivex .Emitter ;
31
+ import io .reactivex .Flowable ;
32
+ import io .reactivex .functions .Consumer ;
33
+ import io .reactivex .functions .Function ;
25
34
import org .reactivestreams .Publisher ;
26
35
27
- import javax .annotation .Nullable ;
28
36
import javax .inject .Inject ;
29
37
import java .io .IOException ;
30
- import java .util .ArrayList ;
31
- import java .util .Collections ;
32
- import java .util .List ;
33
- import java .util .Optional ;
38
+ import java .util .*;
34
39
35
40
/**
36
41
* Abstract implementation of {@link ConsulClient} that also implements {@link DiscoveryClient}
41
46
@ SuppressWarnings ("unused" )
42
47
@ Client (id = ConsulClient .SERVICE_ID , path = "/v1" , configuration = ConsulConfiguration .class )
43
48
@ Requires (beans = ConsulConfiguration .class )
44
- public abstract class AbstractConsulClient implements ConsulClient {
49
+ public abstract class AbstractConsulClient implements ConsulClient , ConfigurationClient {
45
50
46
51
private ConsulConfiguration consulConfiguration = new ConsulConfiguration ();
47
52
@@ -56,6 +61,53 @@ public String getDescription() {
56
61
return ConsulClient .SERVICE_ID ;
57
62
}
58
63
64
+ @ Override
65
+ public Publisher <PropertySource > getPropertySources (Environment environment ) {
66
+ Set <String > activeNames = environment .getActiveNames ();
67
+ Optional <String > serviceId = consulConfiguration .getServiceId ();
68
+ ConsulConfiguration .ConsulConfigDiscoveryConfiguration configDiscoveryConfiguration = consulConfiguration .getConfiguration ();
69
+
70
+ ConfigDiscoveryConfiguration .Format format = configDiscoveryConfiguration .getFormat ();
71
+ String path = configDiscoveryConfiguration .getPath ().orElse (ConfigDiscoveryConfiguration .DEFAULT_PATH );
72
+ if (!path .endsWith ("/" )) {
73
+ path += "/" ;
74
+ }
75
+
76
+ String commonConfigPath = path + Environment .DEFAULT_NAME ;
77
+ String applicationSpecificPath = null ;
78
+ if (serviceId .isPresent ()) {
79
+ applicationSpecificPath = path + serviceId .get ();
80
+ }
81
+
82
+ String dc = configDiscoveryConfiguration .getDatacenter ().orElse (null );
83
+ Flowable <List <KeyValue >> configurationValues = Flowable .fromPublisher (readValues (path , dc , null , null ));
84
+ String finalApplicationSpecificPath = applicationSpecificPath ;
85
+ String finalPath = path ;
86
+ return configurationValues .flatMap (keyValues -> Flowable .generate (emitter -> {
87
+ if (CollectionUtils .isEmpty (keyValues )) {
88
+ emitter .onComplete ();
89
+ }
90
+ else {
91
+ Map <String , PropertySource > propertySources = new HashMap ();
92
+
93
+ for (KeyValue keyValue : keyValues ) {
94
+ String key = keyValue .getKey ();
95
+ String value = keyValue .getValue ();
96
+
97
+ if (key .startsWith (finalPath )) {
98
+ key = key .substring (finalPath .length ());
99
+
100
+ }
101
+ }
102
+
103
+ for (PropertySource propertySource : propertySources .values ()) {
104
+ emitter .onNext (propertySource );
105
+ }
106
+ emitter .onComplete ();
107
+ }
108
+ }));
109
+ }
110
+
59
111
@ Override
60
112
public Publisher <List <ServiceInstance >> getInstances (String serviceId ) {
61
113
if (SERVICE_ID .equals (serviceId )) {
@@ -81,8 +133,4 @@ public Publisher<List<ServiceInstance>> getInstances(String serviceId) {
81
133
}
82
134
}
83
135
84
- @ Override
85
- public void close () throws IOException {
86
- // no-op.. will be closed by @Client
87
- }
88
136
}
0 commit comments