18
18
import saros .context .IContextKeyBindings .Socks5StreamService ;
19
19
import saros .net .ConnectionState ;
20
20
import saros .net .IConnectionManager ;
21
+ import saros .net .stream .ByteStream ;
21
22
import saros .net .stream .IStreamService ;
23
+ import saros .net .stream .IStreamServiceListener ;
22
24
import saros .net .stream .StreamMode ;
23
25
import saros .net .xmpp .IConnectionListener ;
24
26
import saros .net .xmpp .JID ;
28
30
/**
29
31
* This class is responsible for handling all transfers of binary data. It maintains a map of
30
32
* established connections and tries to reuse them.
31
- *
32
- * @author srossbach
33
- * @author coezbek
34
- * @author jurke
35
33
*/
36
34
@ Component (module = "net" )
37
35
public class DataTransferManager implements IConnectionListener , IConnectionManager {
38
36
39
37
private static final Logger LOG = Logger .getLogger (DataTransferManager .class );
40
38
41
- private static final String DEFAULT_CONNECTION_ID = "default" ;
39
+ // package private for testing purposes
40
+ static final String DEFAULT_CONNECTION_ID = "default" ;
42
41
43
42
private static final String IN = "in" ;
44
43
@@ -65,6 +64,12 @@ public class DataTransferManager implements IConnectionListener, IConnectionMana
65
64
private final CopyOnWriteArrayList <IByteStreamConnectionListener > connectionListeners =
66
65
new CopyOnWriteArrayList <>();
67
66
67
+ private final CopyOnWriteArrayList <IPacketConnectionListener > packetConnectionListeners =
68
+ new CopyOnWriteArrayList <>();
69
+
70
+ private final IStreamServiceListener streamServiceListener =
71
+ (stream ) -> createAndAnnouncePacketConnection (stream , true );
72
+
68
73
private final IByteStreamConnectionListener byteStreamConnectionListener =
69
74
new IByteStreamConnectionListener () {
70
75
@@ -81,11 +86,6 @@ public void connectionChanged(
81
86
toConnectionIDToken (
82
87
connectionId , incomingRequest ? IN : OUT , connection .getRemoteAddress ());
83
88
84
- /// TODO we currently have to announce not initialized connections otherwise the IReceiver
85
- // will miss updates
86
-
87
- notfiyconnectionChanged (id , connection , incomingRequest );
88
-
89
89
LOG .debug (
90
90
"bytestream connection changed "
91
91
+ connection
@@ -123,7 +123,16 @@ public void connectionChanged(
123
123
}
124
124
}
125
125
126
- connection .initialize ();
126
+ try {
127
+ connection .initialize ();
128
+ } catch (IOException e ) {
129
+ LOG .error ("failed to initialize connection: " + connection );
130
+ connection .close ();
131
+ connectionPool .remove (id );
132
+ return ;
133
+ }
134
+
135
+ notfiyconnectionChanged (id , connection , incomingRequest );
127
136
}
128
137
129
138
@ Override
@@ -234,6 +243,14 @@ public void removeConnectionListener(final IByteStreamConnectionListener listene
234
243
connectionListeners .remove (listener );
235
244
}
236
245
246
+ public void addPacketConnectionListener (final IPacketConnectionListener listener ) {
247
+ packetConnectionListeners .addIfAbsent (listener );
248
+ }
249
+
250
+ public void removePacketConnectionListener (final IPacketConnectionListener listener ) {
251
+ packetConnectionListeners .remove (listener );
252
+ }
253
+
237
254
private IByteStreamConnection connectInternal (String connectionID , JID peer ) throws IOException {
238
255
239
256
IByteStreamConnection connection = null ;
@@ -265,6 +282,8 @@ private IByteStreamConnection connectInternal(String connectionID, JID peer) thr
265
282
final ArrayList <IStreamService > currentStreamServices =
266
283
new ArrayList <IStreamService >(streamServices );
267
284
285
+ ByteStream byteStream = null ;
286
+
268
287
for (IStreamService streamService : currentStreamServices ) {
269
288
LOG .info (
270
289
"establishing connection to "
@@ -274,7 +293,7 @@ private IByteStreamConnection connectInternal(String connectionID, JID peer) thr
274
293
+ " using stream service "
275
294
+ streamService );
276
295
try {
277
- connection = streamService .connect (connectionID , peer );
296
+ byteStream = streamService .connect (connectionID , peer );
278
297
break ;
279
298
} catch (IOException e ) {
280
299
LOG .warn ("failed to connect to " + peer + " using stream service: " + streamService , e );
@@ -298,9 +317,8 @@ private IByteStreamConnection connectInternal(String connectionID, JID peer) thr
298
317
}
299
318
}
300
319
301
- if (connection != null ) {
302
- byteStreamConnectionListener .connectionChanged (connectionID , connection , false );
303
-
320
+ if (byteStream != null ) {
321
+ connection = createAndAnnouncePacketConnection (byteStream , false );
304
322
return connection ;
305
323
}
306
324
@@ -347,7 +365,7 @@ private void prepareConnection(final Connection connection) {
347
365
connectionPool .open ();
348
366
349
367
for (IStreamService streamService : streamServices )
350
- streamService .initialize (xmppConnection , byteStreamConnectionListener );
368
+ streamService .initialize (xmppConnection , streamServiceListener );
351
369
}
352
370
353
371
private void disposeConnection () {
@@ -431,4 +449,22 @@ private void notfiyconnectionChanged(
431
449
}
432
450
}
433
451
}
452
+
453
+ private IByteStreamConnection createAndAnnouncePacketConnection (
454
+ final ByteStream byteStream , final boolean isIncoming ) {
455
+ final IPacketConnection connection =
456
+ new BinaryChannelConnection (byteStream , byteStreamConnectionListener );
457
+
458
+ for (final IPacketConnectionListener listener : packetConnectionListeners ) {
459
+ try {
460
+ listener .connectionEstablished (connection );
461
+ } catch (RuntimeException e ) {
462
+ LOG .error ("invoking connectionEstablished() on listener: " + listener + " failed" , e );
463
+ }
464
+ }
465
+
466
+ byteStreamConnectionListener .connectionChanged (byteStream .getId (), connection , isIncoming );
467
+
468
+ return connection ;
469
+ }
434
470
}
0 commit comments