Условное сцепление методов в java или вызов пользовательского метода - PullRequest
2 голосов
/ 19 февраля 2020

Я смотрю на библиотеку eclipse j git. Он должен быть в состоянии выполнять как S SH, так и HTTPS-соединения, и ему необходимо либо предоставлять сеанс s sh, либо учетные данные пользователя каждый раз при выполнении pu sh, clone, et c. Но я не знаю правильного способа сделать это при использовании цепочки методов.

if (isSSH(repository)) {
        call = git
            .push()
            .setTransportConfigCallback(transport -> {
                SshTransport sshTransport = (SshTransport) transport;
                sshTransport.setSshSessionFactory(getSshSession(repository));
            })
            .setPushAll()
            .call();
}
else {
        call = git
            .push()
            .setCredentialsProvider(prepareCredentialsProvider(repository))
            .setPushAll()
            .call();
}

Можно ли упростить его, либо сделав его условным, либо сделав собственный метод "prepareConnection" для замены setTransportConfigCallback и setCredentialsProvider?

И setTransportConfigCallback, и setCredentialsProvider находятся в этом классе:

public abstract class TransportCommand<C extends GitCommand, T> extends
        GitCommand<T> {
    public C setTransportConfigCallback(
            final TransportConfigCallback transportConfigCallback) {
        this.transportConfigCallback = transportConfigCallback;
        return self();
    }

    public C setCredentialsProvider(
            final CredentialsProvider credentialsProvider) {
        this.credentialsProvider = credentialsProvider;
        return self();
    }
    ...

РЕДАКТИРОВАТЬ

Пока что мое решение заключается в добавлении этого метода:

private GitCommand prepareConnection(TransportCommand cmd, Repository repository) {

    if (isSSH(repository))
        return cmd.setTransportConfigCallback(transport -> {
            SshTransport sshTransport = (SshTransport) transport;
            sshTransport.setSshSessionFactory(getSshSession(repository));
        });
    else
        return cmd.setCredentialsProvider(prepareCredentialsProvider(repository));
}

Может использоваться следующим образом:

Iterable<PushResult> call = ((PushCommand) prepareConnection(git.push(), repository))
                    .setPushAll()
                    .call();
...