@@ -18,6 +18,7 @@ import com.pubnub.api.v2.callbacks.StatusListener
18
18
import com.pubnub.api.v2.subscriptions.Subscription
19
19
import com.pubnub.internal.subscribe.eventengine.effect.MessagesConsumer
20
20
import com.pubnub.internal.subscribe.eventengine.effect.StatusConsumer
21
+ import org.slf4j.LoggerFactory
21
22
import java.util.concurrent.CopyOnWriteArrayList
22
23
23
24
class ListenerManager (val pubnub : PubNub ) : MessagesConsumer, StatusConsumer, EventEmitter, StatusEmitter {
@@ -26,6 +27,8 @@ class ListenerManager(val pubnub: PubNub) : MessagesConsumer, StatusConsumer, Ev
26
27
private val statusListeners get() = listeners.filterIsInstance<StatusListener >()
27
28
private val eventListeners get() = listeners.filterIsInstance<EventListener >()
28
29
30
+ private val log = LoggerFactory .getLogger(this .javaClass.simpleName)
31
+
29
32
/* *
30
33
* Add a listener.
31
34
*
@@ -65,49 +68,59 @@ class ListenerManager(val pubnub: PubNub) : MessagesConsumer, StatusConsumer, Ev
65
68
}
66
69
67
70
override fun announce (status : PNStatus ) {
68
- statusListeners.forEach { it.status(pubnub, status) }
71
+ statusListeners.safeForEach { it.status(pubnub, status) }
69
72
}
70
73
71
74
override fun announce (message : PNMessageResult ) {
72
- eventListeners.forEach { it.message(pubnub, message) }
75
+ eventListeners.safeForEach { it.message(pubnub, message) }
73
76
val envelope = AnnouncementEnvelope (message)
74
- subscriptionCallbacks.forEach { it.message(pubnub, envelope) }
75
- setCallbacks.forEach { it.message(pubnub, envelope) }
77
+ subscriptionCallbacks.safeForEach { it.message(pubnub, envelope) }
78
+ setCallbacks.safeForEach { it.message(pubnub, envelope) }
76
79
}
77
80
78
81
override fun announce (presence : PNPresenceEventResult ) {
79
- eventListeners.forEach { it.presence(pubnub, presence) }
82
+ eventListeners.safeForEach { it.presence(pubnub, presence) }
80
83
val envelope = AnnouncementEnvelope (presence)
81
- subscriptionCallbacks.forEach { it.presence(pubnub, envelope) }
82
- setCallbacks.forEach { it.presence(pubnub, envelope) }
84
+ subscriptionCallbacks.safeForEach { it.presence(pubnub, envelope) }
85
+ setCallbacks.safeForEach { it.presence(pubnub, envelope) }
83
86
}
84
87
85
88
override fun announce (signal : PNSignalResult ) {
86
- eventListeners.forEach { it.signal(pubnub, signal) }
89
+ eventListeners.safeForEach { it.signal(pubnub, signal) }
87
90
val envelope = AnnouncementEnvelope (signal)
88
- subscriptionCallbacks.forEach { it.signal(pubnub, envelope) }
89
- setCallbacks.forEach { it.signal(pubnub, envelope) }
91
+ subscriptionCallbacks.safeForEach { it.signal(pubnub, envelope) }
92
+ setCallbacks.safeForEach { it.signal(pubnub, envelope) }
90
93
}
91
94
92
95
override fun announce (messageAction : PNMessageActionResult ) {
93
- eventListeners.forEach { it.messageAction(pubnub, messageAction) }
96
+ eventListeners.safeForEach { it.messageAction(pubnub, messageAction) }
94
97
val envelope = AnnouncementEnvelope (messageAction)
95
- subscriptionCallbacks.forEach { it.messageAction(pubnub, envelope) }
96
- setCallbacks.forEach { it.messageAction(pubnub, envelope) }
98
+ subscriptionCallbacks.safeForEach { it.messageAction(pubnub, envelope) }
99
+ setCallbacks.safeForEach { it.messageAction(pubnub, envelope) }
97
100
}
98
101
99
102
override fun announce (pnObjectEventResult : PNObjectEventResult ) {
100
- eventListeners.forEach { it.objects(pubnub, pnObjectEventResult) }
103
+ eventListeners.safeForEach { it.objects(pubnub, pnObjectEventResult) }
101
104
val envelope = AnnouncementEnvelope (pnObjectEventResult)
102
- subscriptionCallbacks.forEach { it.objects(pubnub, envelope) }
103
- setCallbacks.forEach { it.objects(pubnub, envelope) }
105
+ subscriptionCallbacks.safeForEach { it.objects(pubnub, envelope) }
106
+ setCallbacks.safeForEach { it.objects(pubnub, envelope) }
104
107
}
105
108
106
109
override fun announce (pnFileEventResult : PNFileEventResult ) {
107
- eventListeners.forEach { it.file(pubnub, pnFileEventResult) }
110
+ eventListeners.safeForEach { it.file(pubnub, pnFileEventResult) }
108
111
val envelope = AnnouncementEnvelope (pnFileEventResult)
109
- subscriptionCallbacks.forEach { it.file(pubnub, envelope) }
110
- setCallbacks.forEach { it.file(pubnub, envelope) }
112
+ subscriptionCallbacks.safeForEach { it.file(pubnub, envelope) }
113
+ setCallbacks.safeForEach { it.file(pubnub, envelope) }
114
+ }
115
+
116
+ private inline fun <T > Iterable<T>.safeForEach (action : (T ) -> Unit ) {
117
+ for (element in this ) {
118
+ try {
119
+ action(element)
120
+ } catch (e: Throwable ) {
121
+ log.warn(" Uncaught exception in listener." , e)
122
+ }
123
+ }
111
124
}
112
125
}
113
126
0 commit comments