com.data2semantics.yasgui.client.openid.OpenId.java Source code

Java tutorial

Introduction

Here is the source code for com.data2semantics.yasgui.client.openid.OpenId.java

Source

package com.data2semantics.yasgui.client.openid;

import java.util.ArrayList;

import com.data2semantics.yasgui.client.View;
import com.data2semantics.yasgui.client.helpers.Helper;
import com.data2semantics.yasgui.client.settings.ZIndexes;
import com.data2semantics.yasgui.shared.LoginResult;
import com.data2semantics.yasgui.shared.StaticConfig;
import com.data2semantics.yasgui.shared.UserDetails;
import com.google.gwt.core.client.GWT;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.Cursor;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.types.TitleOrientation;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLFlow;
import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
import com.smartgwt.client.widgets.layout.VLayout;

/*
 * #%L
 * YASGUI
 * %%
 * Copyright (C) 2013 Laurens Rietveld
 * %%
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * #L%
 */

public class OpenId {
    View view;
    private static int WINDOW_WIDTH = 800;
    private static int WINDOW_HEIGHT = 200;
    private boolean loggedIn = false;
    private ArrayList<OpenIdProvider> providers;
    private String displayName;

    public OpenId(View view) {
        getProviders();
        for (OpenIdProvider provider : providers) {
            //prefetch these. otherwise, somehow, on first load the icons arent shown..
            com.google.gwt.user.client.ui.Image.prefetch("images/" + provider.getImageLocation());
        }

        this.view = view;
        drawSessionWidgetLogin();
        // on initiation, check whether we are logged in..
        updateLoginStatus();
    }

    /**
     * Update login status, and (re)draws widget containing session info (in YASGUI config menu)
     */
    private void updateLoginStatus() {
        view.getOpenIdService().getCurrentUser(new AsyncCallback<UserDetails>() {

            public void onFailure(Throwable caught) {
                view.getElements().onError(caught);
            }

            public void onSuccess(UserDetails details) {
                if (details.isLoggedIn()) {
                    loggedIn = true;
                    drawSessionWidgetLoggedIn(details);
                    loggedInCallback();

                } else {
                    loggedIn = false;
                    drawSessionWidgetLogin();

                }
            }

        });

    }

    /**
     * Try to log in for a given openId service
     * @param openIdService
     */
    public void login(String openIdService) {
        view.getOpenIdService().login(GWT.getHostPageBaseURL(), !GWT.isProdMode(), openIdService,
                new AsyncCallback<LoginResult>() {

                    public void onFailure(Throwable caught) {
                        view.getElements().onError("error " + caught.getMessage());
                    }

                    public void onSuccess(LoginResult result) {
                        if (result.isLoggedIn()) {
                            //already logged in
                        } else {
                            // redirect user to login page
                            Window.Location.assign(result.getAuthenticationLink());
                        }

                    }

                });
    }

    /**
     * Log out
     */
    public void logOut() {
        String url;
        url = StaticConfig.OPEN_ID_SERVLET + "?logOut=1&appBaseUrl=" + URL.encode(GWT.getHostPageBaseURL());
        if (!GWT.isProdMode()) {
            url += StaticConfig.DEBUG_FILE + "&" + StaticConfig.DEBUG_ARGUMENT_KEY + "="
                    + StaticConfig.DEBUG_ARGUMENT_VALUE;
        }
        Window.Location.assign(url);
        loggedIn = false;
    }

    /**
     * Redraw YASGUI config menu, to update the session info
     * 
     * @param details
     */
    private void drawSessionWidgetLoggedIn(UserDetails details) {
        this.displayName = details.getDisplayName();
        view.getElements().redrawConfigMenu();
    }

    /**
     * Get display name for this user
     * 
     * @return
     */
    public String getDisplayName() {
        return this.displayName;
    }

    /**
     * Redraw YASGUI config menu, with option to log in
     */
    private void drawSessionWidgetLogin() {
        view.getElements().redrawConfigMenu();
    }

    /**
     * Show openid providers in popup
     */
    public void showOpenIdProviders() {
        com.smartgwt.client.widgets.Window window = new com.smartgwt.client.widgets.Window();
        //      window.setScrollbarSize(0);
        //      window.setOverflow(Overflow.HIDDEN);
        //      for (Canvas canvas: window.getItems()) {
        //         canvas.setScrollbarSize(0);
        ////         canvas.setOverflow(Overflow.HIDDEN);
        //      }
        window.setAutoSize(true);
        window.setOverflow(Overflow.HIDDEN);
        window.setZIndex(ZIndexes.MODAL_WINDOWS);
        window.setIsModal(true);
        window.setDismissOnOutsideClick(true);
        window.setShowTitle(false);
        window.setWidth(WINDOW_WIDTH);
        window.setHeight(WINDOW_HEIGHT);
        window.setShowMinimizeButton(false);
        window.setShowTitle(false);
        window.setAutoCenter(true);
        window.addItem(drawProviders());
        window.draw();
    }

    /**
     * draw provider buttons, shown in popup window
     * @return
     */
    private HLayout drawProviders() {
        HLayout hlayout = new HLayout();
        hlayout.addMember(Helper.getHSpacer());
        hlayout.setHeight(WINDOW_HEIGHT - 40);
        hlayout.setAlign(Alignment.CENTER);
        hlayout.setWidth100();
        LayoutSpacer iconSpacer = new LayoutSpacer();
        iconSpacer.setWidth(15);
        iconSpacer.setHeight(1);
        boolean hasItemBefore = false;
        for (final OpenIdProvider provider : providers) {
            if (hasItemBefore) {
                hlayout.addMember(iconSpacer);
            }
            hasItemBefore = true;
            VLayout outerContainer = new VLayout();
            outerContainer.addMembers(Helper.getVSpacer(), getProviderCanvas(provider), Helper.getVSpacer());
            hlayout.addMember(outerContainer);
        }
        hlayout.addMember(Helper.getHSpacer());
        return hlayout;
    }

    private VLayout getProviderCanvas(final OpenIdProvider provider) {
        //use core google img class to get size of image. then pass it on the smartgwt (blegh)
        com.google.gwt.user.client.ui.Image gwtImg = new com.google.gwt.user.client.ui.Image(
                "images/" + provider.getImageLocation());
        final VLayout providerContainer = new VLayout();

        if (gwtImg.getWidth() > 0 && gwtImg.getHeight() > 0) {
            //to avoid dividing by zero
            int width = provider.getMaxIconHeight() * (gwtImg.getWidth() / gwtImg.getHeight());
            int height = provider.getMaxIconHeight();
            providerContainer.setPadding(15);
            providerContainer.setMargin(10);
            providerContainer.setWidth(width + 5);
            providerContainer.setHeight(WINDOW_HEIGHT - 100);
            providerContainer.setAlign(Alignment.CENTER);
            providerContainer.setStyleName("providerContainer");
            Img providerImg = new Img(provider.getImageLocation(), width, height);
            if (provider.getUrl() == null) {

                providerContainer.addClickHandler(new ClickHandler() {
                    public void onClick(ClickEvent event) {
                        if (providerContainer.getMembers().length == 2) {//might be added already
                            HLayout formLayout = new HLayout();
                            DynamicForm form = new DynamicForm();

                            final TextItem textItem = new TextItem();
                            textItem.setHint("http://openIdProvider.org");
                            textItem.setShowHintInField(true);
                            textItem.setWidth(150);
                            textItem.setShowTitle(false);
                            form.setTitleOrientation(TitleOrientation.TOP);
                            form.setItems(textItem);

                            Button authenticateButton = new Button("submit");
                            authenticateButton.setWidth(40);
                            authenticateButton.addClickHandler(new ClickHandler() {
                                public void onClick(ClickEvent event) {
                                    view.getOpenId().login(textItem.getValueAsString());
                                }
                            });
                            formLayout.addMember(form);
                            formLayout.addMember(authenticateButton);
                            providerContainer.addMember(formLayout);
                        }
                    }
                });

            } else {
                providerImg.addClickHandler(new ClickHandler() {
                    public void onClick(ClickEvent event) {
                        view.getOpenId().login(provider.getUrl());
                    }
                });
            }
            providerImg.setCursor(Cursor.POINTER);
            providerContainer.setCursor(Cursor.POINTER);

            HTMLFlow text = new HTMLFlow("log in with");
            text.setCursor(Cursor.POINTER);
            providerContainer.addMember(text);
            providerContainer.addMember(providerImg);
        }
        return providerContainer;
    }

    /**
     * Get the different providers we support
     */
    private void getProviders() {
        providers = new ArrayList<OpenIdProvider>();
        providers.add(new ProviderGoogle());
        providers.add(new ProviderYahoo());
        providers.add(new ProviderOpenId());
    }

    /**
     * Check whether this user is logged in
     * @return
     */
    public boolean isLoggedIn() {
        return loggedIn;
    }

    /**
     * Callback to execute when user is validated as being logged in
     */
    public void loggedInCallback() {
        view.getTabs().loggedInCallback();
    }
}