Skip to content

Commit 777500c

Browse files
committed
refactor and extract client to long lived factory
Change-Id: Iaa489f68fa359e353a7e6bfe8289e5c290232bed
1 parent ba11324 commit 777500c

File tree

4 files changed

+88
-69
lines changed

4 files changed

+88
-69
lines changed

src/main/java/org/softwarefactory/keycloak/providers/events/models/Configuration.java

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.softwarefactory.keycloak.providers.events.models;
2+
3+
public class MQTTMessageOptions {
4+
public boolean retained;
5+
public boolean cleanSession;
6+
public int qos;
7+
public String topic;
8+
}

src/main/java/org/softwarefactory/keycloak/providers/events/mqtt/MQTTEventListenerProvider.java

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,74 +18,63 @@
1818
package org.softwarefactory.keycloak.providers.events.mqtt;
1919

2020
import java.util.Map;
21+
import java.util.Set;
2122
import java.util.logging.Level;
2223
import java.util.logging.Logger;
2324

2425
import org.eclipse.paho.client.mqttv3.IMqttClient;
25-
import org.eclipse.paho.client.mqttv3.MqttClient;
26-
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
2726
import org.eclipse.paho.client.mqttv3.MqttMessage;
28-
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
2927
import org.json.simple.JSONObject;
3028
import org.keycloak.events.Event;
3129
import org.keycloak.events.EventListenerProvider;
30+
import org.keycloak.events.EventType;
3231
import org.keycloak.events.admin.AdminEvent;
33-
import org.softwarefactory.keycloak.providers.events.models.Configuration;
32+
import org.keycloak.events.admin.OperationType;
33+
import org.softwarefactory.keycloak.providers.events.models.MQTTMessageOptions;
3434

3535
/**
3636
* @author <a href="mailto:mhuin@redhat.com">Matthieu Huin</a>
3737
*/
3838
public class MQTTEventListenerProvider implements EventListenerProvider {
3939
private static final Logger logger = Logger.getLogger(MQTTEventListenerProvider.class.getName());
4040

41-
private Configuration configuration;
42-
public static final String PUBLISHER_ID = "keycloak";
41+
private IMqttClient client;
42+
43+
private Set<EventType> excludedEvents;
44+
private Set<OperationType> excludedAdminEvents;
45+
private MQTTMessageOptions messageOptions;
4346

44-
public MQTTEventListenerProvider(Configuration configuration) {
45-
this.configuration = configuration;
47+
48+
public MQTTEventListenerProvider(Set<EventType> excludedEvents, Set<OperationType> excludedAdminEvents, MQTTMessageOptions messageOptions, IMqttClient client) {
49+
this.excludedEvents = excludedEvents;
50+
this.excludedAdminEvents = excludedAdminEvents;
51+
this.client = client;
52+
this.messageOptions = messageOptions;
4653
}
4754

4855
@Override
4956
public void onEvent(Event event) {
5057
// Ignore excluded events
51-
if (configuration.excludedEvents == null || !configuration.excludedEvents.contains(event.getType())) {
58+
if (excludedEvents == null || !excludedEvents.contains(event.getType())) {
5259
sendMqttMessage(convertEvent(event));
5360
}
5461
}
5562

5663
@Override
5764
public void onEvent(AdminEvent event, boolean includeRepresentation) {
5865
// Ignore excluded operations
59-
if (configuration.excludedAdminOperations == null
60-
|| !configuration.excludedAdminOperations.contains(event.getOperationType())) {
66+
if (excludedAdminEvents == null || !excludedAdminEvents.contains(event.getOperationType())) {
6167
sendMqttMessage(convertAdminEvent(event));
6268
}
6369
}
6470

6571
private void sendMqttMessage(String event) {
66-
MemoryPersistence persistence = null;
67-
if (configuration.usePersistence) {
68-
persistence = new MemoryPersistence();
69-
}
70-
71-
try (IMqttClient client = new MqttClient(configuration.serverUri, PUBLISHER_ID, persistence)) {
72-
MqttConnectOptions options = new MqttConnectOptions();
73-
options.setAutomaticReconnect(true);
74-
options.setCleanSession(configuration.cleanSession);
75-
options.setConnectionTimeout(10);
76-
77-
if (configuration.username != null && configuration.password != null) {
78-
options.setUserName(configuration.username);
79-
options.setPassword(configuration.password.toCharArray());
80-
}
81-
82-
client.connect(options);
72+
try {
8373
logger.log(Level.FINE, "Event: {0}", event);
8474
MqttMessage payload = toPayload(event);
85-
payload.setQos(configuration.qos);
86-
payload.setRetained(configuration.retained);
87-
client.publish(configuration.topic, payload);
88-
client.disconnect();
75+
payload.setQos(messageOptions.qos);
76+
payload.setRetained(messageOptions.retained);
77+
client.publish(messageOptions.topic, payload);
8978
} catch (Exception e) {
9079
logger.log(Level.SEVERE, "Publishing failed!", e);
9180
}

src/main/java/org/softwarefactory/keycloak/providers/events/mqtt/MQTTEventListenerProviderFactory.java

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,54 +18,91 @@
1818
package org.softwarefactory.keycloak.providers.events.mqtt;
1919

2020
import java.util.HashSet;
21+
import java.util.Set;
22+
import java.util.logging.Level;
23+
import java.util.logging.Logger;
24+
25+
import org.eclipse.paho.client.mqttv3.IMqttClient;
26+
import org.eclipse.paho.client.mqttv3.MqttClient;
27+
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
28+
import org.eclipse.paho.client.mqttv3.MqttException;
29+
import org.eclipse.paho.client.mqttv3.MqttSecurityException;
30+
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
2131
import org.keycloak.Config;
2232
import org.keycloak.events.EventListenerProvider;
2333
import org.keycloak.events.EventListenerProviderFactory;
2434
import org.keycloak.events.EventType;
2535
import org.keycloak.events.admin.OperationType;
2636
import org.keycloak.models.KeycloakSession;
2737
import org.keycloak.models.KeycloakSessionFactory;
28-
import org.softwarefactory.keycloak.providers.events.models.Configuration;
38+
import org.softwarefactory.keycloak.providers.events.models.MQTTMessageOptions;
2939

3040
/**
3141
* @author <a href="mailto:mhuin@redhat.com">Matthieu Huin</a>
3242
*/
3343
public class MQTTEventListenerProviderFactory implements EventListenerProviderFactory {
44+
private static final Logger logger = Logger.getLogger(MQTTEventListenerProviderFactory.class.getName());
45+
private static final String PUBLISHER_ID = "keycloak";
3446

35-
private Configuration configuration;
47+
private IMqttClient client;
48+
private Set<EventType> excludedEvents;
49+
private Set<OperationType> excludedAdminOperations;
50+
private MQTTMessageOptions messageOptions;
3651

3752
@Override
3853
public EventListenerProvider create(KeycloakSession session) {
39-
return new MQTTEventListenerProvider(configuration);
54+
return new MQTTEventListenerProvider(excludedEvents, excludedAdminOperations, messageOptions, client);
4055
}
4156

4257
@Override
4358
public void init(Config.Scope config) {
44-
configuration = new Configuration();
45-
String[] excludes = config.getArray("exclude-events");
59+
var excludes = config.getArray("excludeEvents");
4660
if (excludes != null) {
47-
configuration.excludedEvents = new HashSet<>();
61+
excludedEvents = new HashSet<EventType>();
4862
for (String e : excludes) {
49-
configuration.excludedEvents.add(EventType.valueOf(e));
63+
excludedEvents.add(EventType.valueOf(e));
5064
}
5165
}
5266

5367
String[] excludesOperations = config.getArray("excludesOperations");
5468
if (excludesOperations != null) {
55-
configuration.excludedAdminOperations = new HashSet<>();
69+
excludedAdminOperations = new HashSet<OperationType>();
5670
for (String e : excludesOperations) {
57-
configuration.excludedAdminOperations.add(OperationType.valueOf(e));
71+
excludedAdminOperations.add(OperationType.valueOf(e));
5872
}
5973
}
6074

61-
configuration.serverUri = config.get("serverUri", "tcp://localhost:1883");
62-
configuration.username = config.get("username", null);
63-
configuration.password = config.get("password", null);
64-
configuration.topic = config.get("topic", "keycloak/events");
65-
configuration.usePersistence = config.getBoolean("usePersistence", false);
66-
configuration.retained = config.getBoolean("retained", true);
67-
configuration.cleanSession = config.getBoolean("cleanSession", true);
68-
configuration.qos = config.getInt("qos", 0);
75+
MqttConnectOptions options = new MqttConnectOptions();
76+
var serverUri = config.get("serverUri", "tcp://localhost:1883");
77+
78+
MemoryPersistence persistence = null;
79+
if (config.getBoolean("usePersistence", false)) {
80+
persistence = new MemoryPersistence();
81+
}
82+
83+
var username = config.get("username", null);
84+
var password = config.get("password", null);
85+
if (username != null && password != null) {
86+
options.setUserName(username);
87+
options.setPassword(password.toCharArray());
88+
}
89+
options.setAutomaticReconnect(true);
90+
options.setCleanSession(config.getBoolean("cleanSession", true));
91+
options.setConnectionTimeout(10);
92+
93+
messageOptions = new MQTTMessageOptions();
94+
messageOptions.topic = config.get("topic", "keycloak/events");
95+
messageOptions.retained = config.getBoolean("retained", true);
96+
messageOptions.qos = config.getInt("qos", 0);
97+
98+
try {
99+
client = new MqttClient(serverUri, PUBLISHER_ID, persistence);
100+
client.connect(options);
101+
} catch (MqttSecurityException e){
102+
logger.log(Level.SEVERE, "Connection not secure!", e);
103+
} catch (MqttException e){
104+
logger.log(Level.SEVERE, "Connection could not be established!", e);
105+
}
69106
}
70107

71108
@Override
@@ -75,7 +112,11 @@ public void postInit(KeycloakSessionFactory factory) {
75112

76113
@Override
77114
public void close() {
78-
// not needed
115+
try {
116+
client.disconnect();
117+
} catch (MqttException e) {
118+
logger.log(Level.SEVERE, "Connection could not be closed!", e);
119+
}
79120
}
80121

81122
@Override

0 commit comments

Comments
 (0)