public IoConnectFuture connect()

in sshd-mina/src/main/java/org/apache/sshd/mina/MinaConnector.java [150:223]


    public IoConnectFuture connect(SocketAddress address, AttributeRepository context, SocketAddress localAddress) {
        IoConnectFuture future = new DefaultIoConnectFuture(address, null) {

            @Override
            public void setSession(org.apache.sshd.common.io.IoSession session) {
                if (context != null) {
                    session.setAttribute(AttributeRepository.class, context);
                }
                super.setSession(session);
            }

        };
        IoConnector connector = getConnector();
        AtomicReference<IoSession> createdSession = new AtomicReference<>();
        ConnectFuture connectFuture = connector.connect(
                address, localAddress,
                (s, f) -> {
                    s.setAttribute(CONNECT_FUTURE_KEY, future);
                    if (f.isCanceled()) {
                        s.closeNow();
                    } else {
                        createdSession.set(s);
                    }
                    if (context != null) {
                        s.setAttribute(AttributeRepository.class, context);
                    }
                });
        future.addListener(f -> {
            if (f.isCanceled()) {
                connectFuture.cancel();
                IoSession ioSession = connectFuture.getSession();
                if (ioSession != null) {
                    ioSession.setAttribute(CONNECT_FUTURE_KEY, future);
                    ioSession.closeNow();
                }
            }
        });
        connectFuture.addListener((IoFutureListener<ConnectFuture>) cf -> {
            Throwable t = cf.getException();
            if (t != null) {
                future.setException(t);
            } else if (cf.isCanceled()) {
                IoSession ioSession = createdSession.getAndSet(null);
                CancelFuture cancellation = future.cancel();
                if (ioSession != null) {
                    ioSession.setAttribute(CONNECT_FUTURE_KEY, future);
                    ioSession.closeNow();
                } else if (cancellation != null) {
                    cancellation.setCanceled();
                }
            } else {
                IoSession ioSession = cf.getSession();
                org.apache.sshd.common.io.IoSession sshSession = getSession(ioSession);
                if (context != null) {
                    sshSession.setAttribute(AttributeRepository.class, context);
                }
                future.setSession(sshSession);
                if (future.getSession() != sshSession) {
                    // Must have been canceled
                    try {
                        sshSession.close(true);
                    } finally {
                        CancelFuture cancellation = future.getCancellation();
                        if (cancellation != null) {
                            cancellation.setCanceled();
                        }
                    }
                } else {
                    ioSession.removeAttribute(CONNECT_FUTURE_KEY);
                }
            }
        });
        return future;
    }