package org.codinjutsu.tools.jenkins.logic;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.util.messages.MessageBus;
import org.apache.log4j.Logger;
import org.codinjutsu.tools.jenkins.JenkinsAppSettings;
import org.codinjutsu.tools.jenkins.JenkinsSettings;
import org.codinjutsu.tools.jenkins.model.Jenkins;
import org.jetbrains.annotations.NotNull;
public class LoginService {
private static final Logger logger = Logger.getLogger(LoginService.class);
private final Project project;
private final AuthenticationNotifier publisher;
private final RequestManager requestManager;
private final JenkinsSettings jenkinsSettings;
public LoginService(final Project project) {
this.project = project;
final MessageBus myBus = ApplicationManager.getApplication().getMessageBus();
publisher = myBus.syncPublisher(AuthenticationNotifier.USER_LOGGED_IN);
requestManager = RequestManager.getInstance(project);
jenkinsSettings = JenkinsSettings.getSafeInstance(project);
}
public void performAuthentication() {
if(!ApplicationManager.getApplication().isDispatchThread()){
logger.warn("LoginService.performAuthentication called from outside of EDT");
}
final JenkinsAppSettings settings = JenkinsAppSettings.getSafeInstance(project);
if (!settings.isServerUrlSet()) {
logger.warn("Jenkins server is not setup, authentication will not happen");
publisher.emptyConfiguration();
return;
}
new Task.Backgroundable(project, "Authenticating jenkins", false, JenkinsLoadingTaskOption.INSTANCE) {
private Jenkins jenkinsWorkspace;
@Override
public void onSuccess() {
publisher.afterLogin(jenkinsWorkspace);
}
@Override
public void onCancel() {
publisher.loginCancelled();
}
@Override
public void run(@NotNull ProgressIndicator indicator) {
indicator.setIndeterminate(true);
try {
requestManager.authenticate(settings, jenkinsSettings);
jenkinsWorkspace = requestManager.loadJenkinsWorkspace(settings);
} catch (Exception ex) {
publisher.loginFailed(ex);
indicator.cancel();
}
}
}.queue();
}
public static LoginService getInstance(Project project) {
return ServiceManager.getService(project, LoginService.class);
}
}