Skip to content

Commit 56c80ec

Browse files
control plane > add information on adapters and extensions
1 parent ea4a64c commit 56c80ec

File tree

11 files changed

+203
-23
lines changed

11 files changed

+203
-23
lines changed

hivemq-edge/src/main/java/com/hivemq/HiveMQEdgeBootstrap.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public class HiveMQEdgeBootstrap {
6464
private @Nullable GeneralBootstrapServiceImpl generalBootstrapService;
6565
private @Nullable PersistenceBootstrapService persistenceBootstrapService;
6666
private @Nullable Injector injector;
67+
private CompleteBootstrapService completeBootstrapService;
6768

6869
public HiveMQEdgeBootstrap(
6970
final @NotNull MetricRegistry metricRegistry,
@@ -151,6 +152,8 @@ private void bootstrapInjector() {
151152
.restComponentService(restComponentsService)
152153
.restComponentsHolder(genericAPIHolder)
153154
.connectionPersistence(connectionPersistence)
155+
.commercialModuleDiscovery(commercialModuleLoaderDiscovery)
156+
.completeBootstrapService(completeBootstrapService)
154157
.hivemqId(hivemqId)
155158
.build();
156159
log.trace("Initialized injector in {}ms", (System.currentTimeMillis() - startDagger));
@@ -159,7 +162,7 @@ private void bootstrapInjector() {
159162
private void bootstrapCoreComponents() {
160163
log.info("Integrating Core Modules");
161164
// configService is always set in caller
162-
assert configService != null;
165+
Preconditions.checkNotNull(configService);
163166

164167
try {
165168
commercialModuleLoaderDiscovery = new CommercialModuleLoaderDiscovery(moduleLoader);
@@ -198,7 +201,7 @@ private void finishBootstrap() {
198201
Preconditions.checkNotNull(persistenceBootstrapService);
199202

200203
try {
201-
final CompleteBootstrapService completeBootstrapService = CompleteBootstrapServiceImpl.decorate(
204+
completeBootstrapService = CompleteBootstrapServiceImpl.decorate(
202205
persistenceBootstrapService,
203206
persistences,
204207
restComponentsService,

hivemq-edge/src/main/java/com/hivemq/HiveMQEdgeGateway.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,14 @@ public void start(final @Nullable EmbeddedExtension embeddedExtension) throws Hi
6666
try {
6767
extensionBootstrap.startExtensionSystem(embeddedExtension).get();
6868
bridgeService.updateBridges();
69-
protocolAdapterManager.start();
69+
protocolAdapterManager.start().get();
7070

7171
final List<ListenerStartupInformation> startupInformation = nettyBootstrap.bootstrapServer().get();
7272
Checkpoints.checkpoint("listener-started");
7373
new StartupListenerVerifier(startupInformation).verifyAndPrint();
7474

75+
76+
7577
((AdminServiceImpl) adminService).hivemqStarted();
7678
} catch (Exception e) {
7779
throw new HiveMQEdgeStartupException(e);

hivemq-edge/src/main/java/com/hivemq/HiveMQEdgeMain.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717

1818
import com.codahale.metrics.MetricFilter;
1919
import com.codahale.metrics.MetricRegistry;
20+
import com.google.common.base.Preconditions;
2021
import com.hivemq.bootstrap.LoggingBootstrap;
2122
import com.hivemq.bootstrap.ioc.Injector;
23+
import com.hivemq.bootstrap.ioc.Persistences;
24+
import com.hivemq.bootstrap.services.AfterHiveMQStartBootstrapService;
25+
import com.hivemq.bootstrap.services.AfterHiveMQStartBootstrapServiceImpl;
2226
import com.hivemq.common.shutdown.ShutdownHooks;
2327
import com.hivemq.configuration.info.SystemInformation;
2428
import com.hivemq.configuration.info.SystemInformationImpl;
@@ -137,9 +141,28 @@ protected void stopApiServer() {
137141
}
138142

139143
protected void afterStart() {
144+
afterHiveMQStartBootstrap();
140145
//hook method
141146
}
142147

148+
private void afterHiveMQStartBootstrap() {
149+
Preconditions.checkNotNull(injector);
150+
final Persistences persistences = injector.persistences();
151+
Preconditions.checkNotNull(persistences);
152+
Preconditions.checkNotNull(configService);
153+
154+
try {
155+
final AfterHiveMQStartBootstrapService afterHiveMQStartBootstrapService =
156+
AfterHiveMQStartBootstrapServiceImpl.decorate(injector.completeBootstrapService(),
157+
injector.protocolAdapterManager(),
158+
injector.services().modulesAndExtensionsService());
159+
injector.commercialModuleLoaderDiscovery().afterHiveMQStart(afterHiveMQStartBootstrapService);
160+
} catch (Exception e) {
161+
log.warn("Error on bootstraping persistences.", e);
162+
throw new HiveMQEdgeStartupException(e);
163+
}
164+
}
165+
143166
public void start(final @Nullable EmbeddedExtension embeddedExtension)
144167
throws InterruptedException, HiveMQEdgeStartupException {
145168
shutdownThread = new Thread(this::stop, "shutdown-thread");

hivemq-edge/src/main/java/com/hivemq/bootstrap/ioc/Injector.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.hivemq.api.ioc.ApiModule;
2121
import com.hivemq.api.resources.GenericAPIHolder;
2222
import com.hivemq.bootstrap.netty.ioc.NettyModule;
23+
import com.hivemq.bootstrap.services.CompleteBootstrapService;
2324
import com.hivemq.bridge.ioc.BridgeModule;
2425
import com.hivemq.common.executors.ioc.ExecutorsModule;
2526
import com.hivemq.common.shutdown.ShutdownHooks;
@@ -33,6 +34,7 @@
3334
import com.hivemq.edge.modules.api.adapters.ModuleServices;
3435
import com.hivemq.edge.modules.ioc.ModulesModule;
3536
import com.hivemq.edge.modules.ioc.RemoteServiceModule;
37+
import com.hivemq.extensions.core.CommercialModuleLoaderDiscovery;
3638
import com.hivemq.extensions.core.HandlerService;
3739
import com.hivemq.extensions.core.PersistencesService;
3840
import com.hivemq.extensions.core.RestComponentsService;
@@ -45,6 +47,7 @@
4547
import com.hivemq.persistence.PersistenceStartup;
4648
import com.hivemq.persistence.connection.ConnectionPersistence;
4749
import com.hivemq.persistence.ioc.PersistenceModule;
50+
import com.hivemq.protocols.ProtocolAdapterManager;
4851
import com.hivemq.security.ioc.SecurityModule;
4952
import com.hivemq.throttling.ioc.ThrottlingModule;
5053
import com.hivemq.uns.ioc.UnsServiceModule;
@@ -96,6 +99,12 @@ public interface Injector {
9699

97100
Services services();
98101

102+
CommercialModuleLoaderDiscovery commercialModuleLoaderDiscovery();
103+
104+
CompleteBootstrapService completeBootstrapService();
105+
106+
ProtocolAdapterManager protocolAdapterManager();
107+
99108
// UnsServiceModule uns();
100109

101110
// ExecutorsModule executors();
@@ -142,6 +151,13 @@ interface Builder {
142151
@BindsInstance
143152
Builder hivemqId(HivemqId hivemqId);
144153

154+
@BindsInstance
155+
Builder commercialModuleDiscovery(CommercialModuleLoaderDiscovery commercialModuleLoaderDiscovery);
156+
157+
@BindsInstance
158+
Builder completeBootstrapService(CompleteBootstrapService completeBootstrapService);
159+
160+
145161
Injector build();
146162
}
147163

hivemq-edge/src/main/java/com/hivemq/bootstrap/ioc/Services.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.hivemq.bridge.BridgeService;
1919
import com.hivemq.edge.HiveMQCapabilityService;
20+
import com.hivemq.edge.ModulesAndExtensionsService;
2021
import com.hivemq.extension.sdk.api.annotations.NotNull;
2122
import com.hivemq.extensions.core.HandlerService;
2223
import com.hivemq.persistence.SingleWriterService;
@@ -25,21 +26,24 @@
2526

2627
public class Services {
2728

28-
2929
private final @NotNull HiveMQCapabilityService capabilityService;
3030
private final @NotNull BridgeService bridgeService;
3131
private final @NotNull SingleWriterService singleWriterService;
3232
private final @NotNull HandlerService handlerService;
33+
private final @NotNull ModulesAndExtensionsService modulesAndExtensionsService;
3334

3435
@Inject
35-
public Services(final @NotNull HiveMQCapabilityService capabilityService,
36-
final @NotNull BridgeService bridgeService,
37-
final @NotNull SingleWriterService singleWriterService,
38-
final @NotNull HandlerService handlerService) {
36+
public Services(
37+
final @NotNull HiveMQCapabilityService capabilityService,
38+
final @NotNull BridgeService bridgeService,
39+
final @NotNull SingleWriterService singleWriterService,
40+
final @NotNull HandlerService handlerService,
41+
final @NotNull ModulesAndExtensionsService modulesAndExtensionsService) {
3942
this.capabilityService = capabilityService;
4043
this.bridgeService = bridgeService;
4144
this.singleWriterService = singleWriterService;
4245
this.handlerService = handlerService;
46+
this.modulesAndExtensionsService = modulesAndExtensionsService;
4347
}
4448

4549
public @NotNull HiveMQCapabilityService capabilityService() {
@@ -57,4 +61,8 @@ public Services(final @NotNull HiveMQCapabilityService capabilityService,
5761
public @NotNull HandlerService handlerService() {
5862
return handlerService;
5963
}
64+
65+
public @NotNull ModulesAndExtensionsService modulesAndExtensionsService() {
66+
return modulesAndExtensionsService;
67+
}
6068
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.hivemq.bootstrap.services;
2+
3+
import com.hivemq.edge.ModulesAndExtensionsService;
4+
import com.hivemq.extension.sdk.api.annotations.NotNull;
5+
import com.hivemq.protocols.ProtocolAdapterManager;
6+
7+
public interface AfterHiveMQStartBootstrapService extends CompleteBootstrapService {
8+
9+
@NotNull ProtocolAdapterManager protocolAdapterManager();
10+
11+
@NotNull ModulesAndExtensionsService modulesAndExtensionsService();
12+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package com.hivemq.bootstrap.services;
2+
3+
import com.codahale.metrics.MetricRegistry;
4+
import com.hivemq.bootstrap.ioc.Persistences;
5+
import com.hivemq.common.shutdown.ShutdownHooks;
6+
import com.hivemq.configuration.HivemqId;
7+
import com.hivemq.configuration.info.SystemInformation;
8+
import com.hivemq.configuration.service.ConfigurationService;
9+
import com.hivemq.edge.HiveMQCapabilityService;
10+
import com.hivemq.edge.ModulesAndExtensionsService;
11+
import com.hivemq.extension.sdk.api.annotations.NotNull;
12+
import com.hivemq.extensions.core.HandlerService;
13+
import com.hivemq.extensions.core.PersistencesService;
14+
import com.hivemq.extensions.core.RestComponentsService;
15+
import com.hivemq.protocols.ProtocolAdapterManager;
16+
17+
public class AfterHiveMQStartBootstrapServiceImpl implements AfterHiveMQStartBootstrapService {
18+
19+
private final @NotNull CompleteBootstrapService delegate;
20+
private final @NotNull ProtocolAdapterManager protocolAdapterManager;
21+
private final @NotNull ModulesAndExtensionsService modulesAndExtensionsService;
22+
23+
public AfterHiveMQStartBootstrapServiceImpl(
24+
final @NotNull CompleteBootstrapService delegate,
25+
final @NotNull ProtocolAdapterManager protocolAdapterManager,
26+
final @NotNull ModulesAndExtensionsService modulesAndExtensionsService) {
27+
this.delegate = delegate;
28+
this.protocolAdapterManager = protocolAdapterManager;
29+
this.modulesAndExtensionsService = modulesAndExtensionsService;
30+
}
31+
32+
@Override
33+
public @NotNull MetricRegistry metricRegistry() {
34+
return delegate.metricRegistry();
35+
}
36+
37+
@Override
38+
public @NotNull SystemInformation systemInformation() {
39+
return delegate.systemInformation();
40+
}
41+
42+
@Override
43+
public @NotNull ShutdownHooks shutdownHooks() {
44+
return delegate.shutdownHooks();
45+
}
46+
47+
@Override
48+
public @NotNull ConfigurationService configurationService() {
49+
return delegate.configurationService();
50+
}
51+
52+
@Override
53+
public @NotNull HivemqId getHivemqId() {
54+
return delegate.getHivemqId();
55+
}
56+
57+
@Override
58+
public @NotNull PersistencesService persistenceService() {
59+
return delegate.persistenceService();
60+
}
61+
62+
@Override
63+
public @NotNull HiveMQCapabilityService capabilityService() {
64+
return delegate.capabilityService();
65+
}
66+
67+
@Override
68+
public @NotNull Persistences persistences() {
69+
return delegate.persistences();
70+
}
71+
72+
@Override
73+
public @NotNull RestComponentsService restComponentsService() {
74+
return delegate.restComponentsService();
75+
}
76+
77+
@Override
78+
public @NotNull HandlerService handlerService() {
79+
return delegate.handlerService();
80+
}
81+
82+
@Override
83+
public @NotNull ProtocolAdapterManager protocolAdapterManager() {
84+
return protocolAdapterManager;
85+
}
86+
87+
@Override
88+
public @NotNull ModulesAndExtensionsService modulesAndExtensionsService() {
89+
return modulesAndExtensionsService;
90+
}
91+
92+
public static @NotNull AfterHiveMQStartBootstrapService decorate(
93+
final @NotNull CompleteBootstrapService completeBootstrapService,
94+
final @NotNull ProtocolAdapterManager protocolAdapterManager,
95+
final @NotNull ModulesAndExtensionsService modulesAndExtensionsService) {
96+
return new AfterHiveMQStartBootstrapServiceImpl(completeBootstrapService,
97+
protocolAdapterManager,
98+
modulesAndExtensionsService);
99+
}
100+
101+
102+
}

hivemq-edge/src/main/java/com/hivemq/bootstrap/services/PersistenceBootstrapService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public interface PersistenceBootstrapService extends GeneralBootstrapService {
1414
@NotNull HiveMQCapabilityService capabilityService();
1515

1616

17-
static PersistenceBootstrapService decorate(
17+
static PersistenceBootstrapService decorate(
1818
final @NotNull GeneralBootstrapService generalBootstrapService,
1919
final @NotNull PersistencesService persistencesService,
2020
final @NotNull HiveMQCapabilityService capabilityService) {

hivemq-edge/src/main/java/com/hivemq/edge/impl/ModulesAndExtensionsServiceImpl.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,20 @@
2424
import com.hivemq.extensions.HiveMQExtensions;
2525

2626
import javax.inject.Inject;
27+
import java.util.ArrayList;
2728
import java.util.HashSet;
2829
import java.util.List;
2930
import java.util.Map;
31+
import java.util.Objects;
3032
import java.util.stream.Collectors;
3133

3234
/**
3335
* @author Simon L Johnson
3436
*/
3537
public class ModulesAndExtensionsServiceImpl implements ModulesAndExtensionsService {
3638

37-
private @NotNull final HiveMQExtensions hiveMQExtensions;
38-
private @NotNull final HiveMQEdgeRemoteService hiveMQEdgeRemoteConfigurationService;
39+
private final @NotNull HiveMQExtensions hiveMQExtensions;
40+
private final @NotNull HiveMQEdgeRemoteService hiveMQEdgeRemoteConfigurationService;
3941

4042
@Inject
4143
public ModulesAndExtensionsServiceImpl(final @NotNull HiveMQExtensions hiveMQExtensions,
@@ -44,32 +46,29 @@ public ModulesAndExtensionsServiceImpl(final @NotNull HiveMQExtensions hiveMQExt
4446
this.hiveMQEdgeRemoteConfigurationService = hiveMQEdgeRemoteConfigurationService;
4547
}
4648

47-
public List<Extension> getExtensions(){
49+
public @NotNull List<Extension> getExtensions(){
4850

4951
//-- Add discovered extensions
50-
HashSet<Extension> extensions = new HashSet<>();
5152
List<Extension> availableExtensions = hiveMQEdgeRemoteConfigurationService.getConfiguration().getExtensions();
52-
extensions.addAll(availableExtensions);
53+
HashSet<Extension> extensions = new HashSet<>(availableExtensions);
5354

5455
//-- Add installed extensions
5556
Map<String, HiveMQExtension> extensionsMap = hiveMQExtensions.getEnabledHiveMQExtensions();
56-
extensions.addAll(extensionsMap.values().stream().map(e -> convertExtension(e)).collect(Collectors.toList()));
57-
return extensions.stream().collect(Collectors.toList());
57+
extensions.addAll(extensionsMap.values().stream().map(ModulesAndExtensionsServiceImpl::convertExtension).collect(Collectors.toList()));
58+
return new ArrayList<>(extensions);
5859
}
5960

60-
public List<Module> getModules(){
61-
HashSet<Module> modules = new HashSet<>();
61+
public @NotNull List<Module> getModules(){
6262
List<Module> availableModules = hiveMQEdgeRemoteConfigurationService.getConfiguration().getModules();
63-
modules.addAll(availableModules);
64-
return modules.stream().collect(Collectors.toList());
63+
HashSet<Module> modules = new HashSet<>(availableModules);
64+
return new ArrayList<>(modules);
6565
}
6666

6767
private static Extension convertExtension(HiveMQExtension extension){
6868
return new Extension(extension.getId(),
6969
extension.getVersion(),
7070
extension.getName(),
71-
null,
72-
extension.getAuthor(),
71+
null, Objects.requireNonNullElse(extension.getAuthor(), "unknown"),
7372
extension.getPriority(),
7473
true,
7574
null);

hivemq-edge/src/main/java/com/hivemq/extensions/core/CommercialModuleLoaderDiscovery.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,18 @@ public void completeBootstrap(final @NotNull CompleteBootstrapService completeBo
7272
}
7373

7474

75+
public void afterHiveMQStart(final @NotNull CompleteBootstrapService completeBootstrapService) {
76+
try {
77+
for (ModuleLoaderMain instance : instances) {
78+
instance.afterPersistenceBootstrap(completeBootstrapService);
79+
}
80+
} catch (Exception e) {
81+
log.error("Error when completing bootstrap ", e);
82+
}
83+
}
84+
85+
86+
7587
}
7688

7789

0 commit comments

Comments
 (0)