@@ -111,11 +111,15 @@ public <X> void addListener(Event<X> event, Consumer<X> handler) {
111
111
Objects .requireNonNull (event );
112
112
Objects .requireNonNull (handler );
113
113
114
- eventCallbacks .put (event , handler );
114
+ synchronized (eventCallbacks ) {
115
+ eventCallbacks .put (event , handler );
116
+ }
115
117
}
116
118
117
119
public void clearListeners () {
118
- eventCallbacks .clear ();
120
+ synchronized (eventCallbacks ) {
121
+ eventCallbacks .clear ();
122
+ }
119
123
}
120
124
121
125
@ Override
@@ -159,41 +163,43 @@ public void onText(CharSequence data) {
159
163
} else if (raw .get ("method" ) instanceof String && raw .get ("params" ) instanceof Map ) {
160
164
LOG .fine ("Seen: " + raw );
161
165
162
- // TODO: Also only decode once.
163
- eventCallbacks .keySet ().stream ()
164
- .filter (event -> raw .get ("method" ).equals (event .getMethod ()))
165
- .forEach (event -> {
166
- // TODO: This is grossly inefficient. I apologise, and we should fix this.
167
- try (StringReader reader = new StringReader (asString );
168
- JsonInput input = JSON .newInput (reader )) {
169
- Object value = null ;
170
- input .beginObject ();
171
- while (input .hasNext ()) {
172
- switch (input .nextName ()) {
173
- case "params" :
174
- value = event .getMapper ().apply (input );
175
- break ;
176
-
177
- default :
178
- input .skipValue ();
179
- break ;
166
+ synchronized (eventCallbacks ) {
167
+ // TODO: Also only decode once.
168
+ eventCallbacks .keySet ().stream ()
169
+ .filter (event -> raw .get ("method" ).equals (event .getMethod ()))
170
+ .forEach (event -> {
171
+ // TODO: This is grossly inefficient. I apologise, and we should fix this.
172
+ try (StringReader reader = new StringReader (asString );
173
+ JsonInput input = JSON .newInput (reader )) {
174
+ Object value = null ;
175
+ input .beginObject ();
176
+ while (input .hasNext ()) {
177
+ switch (input .nextName ()) {
178
+ case "params" :
179
+ value = event .getMapper ().apply (input );
180
+ break ;
181
+
182
+ default :
183
+ input .skipValue ();
184
+ break ;
185
+ }
180
186
}
181
- }
182
- input .endObject ();
187
+ input .endObject ();
183
188
184
- if (value == null ) {
185
- // Do nothing.
186
- return ;
187
- }
189
+ if (value == null ) {
190
+ // Do nothing.
191
+ return ;
192
+ }
188
193
189
- final Object finalValue = value ;
194
+ final Object finalValue = value ;
190
195
191
- for (Consumer <?> action : eventCallbacks .get (event )) {
192
- @ SuppressWarnings ("unchecked" ) Consumer <Object > obj = (Consumer <Object >) action ;
193
- obj .accept (finalValue );
196
+ for (Consumer <?> action : eventCallbacks .get (event )) {
197
+ @ SuppressWarnings ("unchecked" ) Consumer <Object > obj = (Consumer <Object >) action ;
198
+ obj .accept (finalValue );
199
+ }
194
200
}
195
- }
196
- });
201
+ });
202
+ }
197
203
} else {
198
204
LOG .warning ("Unhandled type: " + data );
199
205
}
0 commit comments