Skip to content

Package: KuraBirthCertificateModule$Builder

KuraBirthCertificateModule$Builder

nameinstructionbranchcomplexitylinemethod
KuraBirthCertificateModule.Builder(String)
M: 11 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
build()
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
defaultProviders()
M: 12 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
provider(KuraBirthCertificateModule.Provider)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
providers()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
providers(Collection)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2017, 2022 Red Hat Inc and others.
3: *
4: * This program and the accompanying materials are made
5: * available under the terms of the Eclipse Public License 2.0
6: * which is available at https://www.eclipse.org/legal/epl-2.0/
7: *
8: * SPDX-License-Identifier: EPL-2.0
9: *
10: * Contributors:
11: * Red Hat Inc - initial API and implementation
12: *******************************************************************************/
13: package org.eclipse.kapua.client.gateway.kura;
14:
15: import org.eclipse.kapua.client.gateway.kura.internal.Metrics;
16: import org.eclipse.kapua.client.gateway.kura.proto.KuraPayloadProto.KuraPayload;
17: import org.eclipse.kapua.client.gateway.mqtt.MqttModuleContext;
18: import org.eclipse.kapua.client.gateway.spi.Module;
19: import org.eclipse.kapua.client.gateway.spi.ModuleContext;
20: import org.slf4j.Logger;
21: import org.slf4j.LoggerFactory;
22:
23: import java.nio.ByteBuffer;
24: import java.util.Collection;
25: import java.util.Collections;
26: import java.util.HashMap;
27: import java.util.HashSet;
28: import java.util.Map;
29: import java.util.Objects;
30: import java.util.Optional;
31: import java.util.Set;
32: import java.util.TreeSet;
33:
34: public class KuraBirthCertificateModule implements Module {
35:
36: private static final Logger logger = LoggerFactory.getLogger(KuraBirthCertificateModule.class);
37:
38: @FunctionalInterface
39: public interface Provider {
40:
41: public void provideData(Map<String, String> values);
42:
43: public static final Provider JVM = new Provider() {
44:
45: @Override
46: public void provideData(final Map<String, String> values) {
47: values.put("jvm_name", System.getProperty("java.vm.name"));
48: values.put("jvm_version", System.getProperty("java.version"));
49:
50: values.put("os", System.getProperty("os.name"));
51: values.put("os_version", System.getProperty("os.version"));
52: values.put("os_arch", System.getProperty("os.arch"));
53: }
54:
55: };
56:
57: public static final Provider RUNTIME = new Provider() {
58:
59: @Override
60: public void provideData(final Map<String, String> values) {
61: values.put("available_processors", Integer.toString(Runtime.getRuntime().availableProcessors()));
62: values.put("total_memory", Long.toString(Runtime.getRuntime().totalMemory()));
63: }
64:
65: };
66: }
67:
68: public static class Builder {
69:
70: private final String accountName;
71:
72: private final Set<Provider> providers = new HashSet<>();
73:
74: private Builder(final String accountName) {
75: this.accountName = accountName;
76: }
77:
78: public Builder defaultProviders() {
79: providers.add(Provider.JVM);
80: providers.add(Provider.RUNTIME);
81: return this;
82: }
83:
84: public Builder provider(final Provider provider) {
85: Objects.requireNonNull(provider);
86: providers.add(provider);
87: return this;
88: }
89:
90: public Builder providers(final Collection<Provider> providers) {
91: Objects.requireNonNull(providers);
92: this.providers.addAll(providers);
93: return this;
94: }
95:
96: public Set<Provider> providers() {
97: return Collections.unmodifiableSet(providers);
98: }
99:
100: public KuraBirthCertificateModule build() {
101: return new KuraBirthCertificateModule(accountName, providers());
102: }
103: }
104:
105: public static Builder newBuilder(final String accountName) {
106: return new Builder(accountName);
107: }
108:
109: private final Set<String> applications = new TreeSet<>();
110:
111: private MqttModuleContext client;
112:
113: private final String accountName;
114:
115: private final Set<Provider> providers;
116:
117: private KuraBirthCertificateModule(final String accountName, final Set<Provider> providers) {
118: this.accountName = accountName;
119: this.providers = new HashSet<>(providers);
120: }
121:
122: @Override
123: public void applicationAdded(final String applicationId) {
124: logger.info("Application added: {}", applicationId);
125: if (applications.add(applicationId)) {
126: sendBirthCertificate();
127: }
128: }
129:
130: @Override
131: public void applicationRemoved(final String applicationId) {
132: logger.info("Application removed: {}", applicationId);
133: if (applications.remove(applicationId)) {
134: sendBirthCertificate();
135: }
136: }
137:
138: @Override
139: public void connected() {
140: sendBirthCertificate();
141: }
142:
143: @Override
144: public void initialize(final ModuleContext context) {
145: final Optional<MqttModuleContext> client = context.adapt(MqttModuleContext.class);
146:
147: this.client = client.orElseThrow(() -> {
148: return new IllegalStateException(
149: String.format("%s can only be used with a client providing an instance to %s",
150: KuraBirthCertificateModule.class.getSimpleName(),
151: MqttModuleContext.class.getName()));
152: });
153: }
154:
155: private void sendBirthCertificate() {
156: logger.debug("Sending birth certificate");
157:
158: final Map<String, String> values = new HashMap<>();
159:
160: for (final Provider provider : providers) {
161: provider.provideData(values);
162: }
163:
164: values.put("application_ids", String.join(",", applications));
165:
166: // build payload
167:
168: final KuraPayload.Builder builder = KuraPayload.newBuilder();
169: Metrics.buildMetrics(builder, values);
170: final ByteBuffer buffer = ByteBuffer.wrap(builder.build().toByteArray());
171:
172: // publish MQTT payload
173:
174: final String clientId = client.getMqttClientId();
175:
176: try {
177: client.publishMqtt(String.format("$EDC/%s/%s/MQTT/BIRTH", accountName, clientId), buffer);
178: } catch (final Exception e) {
179: logger.warn("Failed to publish birth certificate", e);
180: }
181: }
182:
183: }