package hudson.gwtmarketplace.client;
import hudson.gwtmarketplace.client.service.UserInfoService;
import hudson.gwtmarketplace.client.service.UserInfoServiceAsync;
import java.util.List;
import java.util.Map;
import com.google.gwt.core.client.GWT;
import com.google.gwt.gwtpages.client.GotoPageCommand;
import com.google.gwt.gwtpages.client.PageRequestSession;
import com.google.gwt.gwtpages.client.Pages;
import com.google.gwt.gwtpages.client.page.LoadedPageContainer;
import com.google.gwt.gwtpages.client.page.PageAttributes;
import com.google.gwt.gwtpages.client.page.event.PageRequestEventHandler;
import com.google.gwt.gwtpages.client.page.parameters.PageParameters;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class AuthenticationPageEventHandler implements PageRequestEventHandler {
private static UserInfoServiceAsync svc = null;
@Override
public void init(Pages pages) {
svc = GWT.create(UserInfoService.class);
}
@Override
public void onAfterPageEnter(LoadedPageContainer pageLoadResult,
PageParameters parameters, GotoPageCommand command) {
}
@Override
public void onPageEnterSuccess(LoadedPageContainer pageLoadResult,
PageParameters parameters, GotoPageCommand command) {
}
@Override
public void onPageRequest(String pageToken, String historyToken,
PageRequestSession session) {
}
@Override
public void onBeforePageEnter(LoadedPageContainer pageLoadResult,
PageParameters parameters, GotoPageCommand command) {
if (null != pageLoadResult.getAttributes()
&& null != pageLoadResult.getAttributes().get(AuthenticationData.class)) {
// this is a secure page
if (null == Session.get().getLoggedInUser()) {
StringBuilder callbackUri = new StringBuilder();
callbackUri.append(Window.Location.getProtocol()).append("//")
.append(Window.Location.getHost())
.append(Window.Location.getPath());
Map<String, List<String>> parameterMap = Window.Location
.getParameterMap();
if (parameterMap.size() > 0) {
boolean started = false;
callbackUri.append("?");
for (Map.Entry<String, List<String>> entry : parameterMap
.entrySet()) {
for (String s : entry.getValue()) {
if (started)
callbackUri.append("&");
else
started = true;
callbackUri.append(entry.getKey()).append("=")
.append(s);
}
}
}
callbackUri.append("#").append(History.getToken());
svc.getLoginUrl(callbackUri.toString(),
new AsyncCallback<String>() {
@Override
public void onSuccess(String result) {
Window.Location.assign(result);
}
@Override
public void onFailure(Throwable caught) {
Window.Location.assign(Session.get()
.getLoginUrl());
}
});
Pages.get().stopRequest();
}
}
}
@Override
public void onPageLoaded(LoadedPageContainer result) {
}
@Override
public void onPageWaitForAsync(LoadedPageContainer loadedPageContainer,
PageParameters parameters, GotoPageCommand command) {
}
@Override
public void onPageForward(LoadedPageContainer currentLoadedPageContainer,
PageParameters currentParameters, GotoPageCommand currentCommand,
GotoPageCommand forwardCommand) {
}
public static PageAttributes createPageAttributes() {
return new PageAttributes().put(AuthenticationData.class,
new AuthenticationData() {
});
}
private interface AuthenticationData {
}
}