Mercury-IM/domain/src/main/java/org/mercury_im/messenger/usecase/LogIntoAccount.java

75 lines
2.6 KiB
Java

package org.mercury_im.messenger.usecase;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.sasl.SASLErrorException;
import org.mercury_im.messenger.xmpp.MercuryConnection;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import io.reactivex.Completable;
import io.reactivex.Single;
public class LogIntoAccount {
public enum ConnectionResult {
success,
credential_error,
server_error,
other_error
}
private static final Logger LOGGER = Logger.getLogger(LogIntoAccount.class.getName());
private final MercuryConnection connection;
private LogIntoAccount(MercuryConnection connection) {
this.connection = connection;
}
public static LogIntoAccount with(MercuryConnection connection) {
if (connection == null) {
throw new NullPointerException("MercuryConnection cannot be null.");
}
return new LogIntoAccount(connection);
}
public Completable executeAndPossiblyThrow() {
return Completable.fromAction(this::doAuthenticateIfNecessary);
}
public Single<ConnectionResult> execute() {
return Single.fromCallable(this::authenticateIfNecessary);
}
private ConnectionResult authenticateIfNecessary() {
try {
doAuthenticateIfNecessary();
return ConnectionResult.success;
} catch (SASLErrorException e) {
LOGGER.log(Level.WARNING, "SASL Error while connecting to account " + connection.getAccount().getAddress(), e);
return ConnectionResult.credential_error;
} catch (SmackException.ConnectionException e) {
LOGGER.log(Level.WARNING, "Connectivity error while connecting to account " + connection.getAccount().getAddress(), e);
return ConnectionResult.server_error;
}
catch (IOException | XMPPException | SmackException | InterruptedException e) {
LOGGER.log(Level.WARNING, "Error connecting to account " + connection.getAccount().getAddress(), e);
return ConnectionResult.other_error;
}
}
private void doAuthenticateIfNecessary()
throws InterruptedException, XMPPException, SmackException, IOException {
if (!connection.getConnection().isAuthenticated()) {
LOGGER.log(Level.INFO, "Logging in");
((AbstractXMPPConnection) connection.getConnection()).connect().login();
LOGGER.log(Level.INFO, "Login complete");
}
}
}