/* * GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007 */ package hudson.gwtmarketplace.client.commands; import hudson.gwtmarketplace.client.Session; import hudson.gwtmarketplace.client.model.UserInfo; import hudson.gwtmarketplace.client.service.UserInfoService; import hudson.gwtmarketplace.client.service.UserInfoServiceAsync; import java.util.ArrayList; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; public abstract class LoginCommand extends AbstractAsyncCommand<UserInfo> { private static UserInfoServiceAsync service = GWT.create(UserInfoService.class); private String loginUrl; private String logoutUrl; private static boolean executing = false; private static List<LoginCommand> additionalCommands = new ArrayList<LoginCommand>(); public LoginCommand() { loginUrl = Window.Location.getHref(); logoutUrl = loginUrl; if (logoutUrl.indexOf('#') > 0) logoutUrl = logoutUrl.substring(0, logoutUrl.indexOf('#')); } public LoginCommand(String loginUrl, String logoutUrl) { this.loginUrl = loginUrl; this.logoutUrl = logoutUrl; } @Override public void execute() { if (executing) { additionalCommands.add(this); } else { executing = true; service.login(loginUrl, logoutUrl, new AsyncCallback<UserInfo>() { @Override public void onSuccess(UserInfo result) { executing = false; Session.get().setLoginUrl(result.getLoginUrl()); Session.get().setLogoutUrl(result.getLogoutUrl()); if (result.isLoggedIn()) { Session.get().setLoggedInUser(result); } for (LoginCommand cmd : additionalCommands) cmd.onSuccess(result); additionalCommands.clear(); LoginCommand.this.onSuccess(result); } @Override public void onFailure(Throwable caught) { executing = false; for (LoginCommand cmd : additionalCommands) cmd.onFailure(caught); additionalCommands.clear(); LoginCommand.this.onFailure(caught); } }); } } }