net.databinder.auth.components.DataUserStatusPanelBase.java Source code

Java tutorial

Introduction

Here is the source code for net.databinder.auth.components.DataUserStatusPanelBase.java

Source

/*
 * Databinder: a simple bridge from Wicket to Hibernate
 * Copyright (C) 2006  Nathan Hamblen nathan@technically.us
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
package net.databinder.auth.components;

import net.databinder.auth.AuthApplication;
import net.databinder.auth.AuthSession;
import net.databinder.auth.components.DataSignInPageBase.ReturnPage;
import net.databinder.auth.data.DataUser;

import org.apache.wicket.Page;
import org.apache.wicket.authroles.authorization.strategies.role.Roles;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.AbstractReadOnlyModel;

/**
 * Displays sign in and out links, as well as current user if any.
 * Replaceable String resources: <pre>
 * data.auth.status.account
 * data.auth.status.admin
 * data.auth.status.sign_out
 * data.auth.status.sign_in</pre>
 */
public abstract class DataUserStatusPanelBase<T extends DataUser> extends Panel {
    /**
     * Constructs sign in and out links.
     * @param id Wicket id
     */
    public DataUserStatusPanelBase(String id) {
        super(id);

        WebMarkupContainer wrapper = new WebMarkupContainer("signedInWrapper") {
            public boolean isVisible() {
                return getAuthSession().isSignedIn();
            }
        };
        add(wrapper);
        wrapper.add(new Label("username", new AbstractReadOnlyModel() {
            @Override
            public Object getObject() {
                return getAuthSession().getUser().getUsername();
            }
        }));
        wrapper.add(new Link("profile") {
            @Override
            public void onClick() {
                setResponsePage(profilePage(new DataSignInPageBase.ReturnPage() {
                    public Page get() {
                        return DataUserStatusPanelBase.this.getPage();
                    }
                }));
            }
        }.add(new Label("text", getString("data.auth.status.account", null, "Account"))));

        wrapper.add(new BookmarkablePageLink("admin", adminPageClass()) {
            @Override
            public boolean isEnabled() {
                return !adminPageClass().isInstance(getPage());
            }

            @Override
            public boolean isVisible() {
                T user = ((AuthSession<T>) getSession()).getUser();
                return user != null && user.hasRole(Roles.ADMIN);
            }
        }.add(new Label("text", getString("data.auth.status.admin", null, "Admin"))));

        wrapper.add(new Link("signOut") {
            @Override
            public void onClick() {
                getAuthSession().signOut();
                setResponsePage(getApplication().getHomePage());
            }
        }.add(new Label("text", getString("data.auth.status.sign_out", null, "Sign out"))));

        add(getSignInLink("signIn").add(new Label("text", getString("data.auth.status.sign_in", null, "Sign in"))));
    }

    /** 
     * @param returnPage current page, to be returned to after profile update
     * @return new page instance for user profile 
     */
    protected abstract WebPage profilePage(ReturnPage returnPage);

    /** @return page class for user administration */
    protected abstract Class<? extends WebPage> adminPageClass();

    /**
     * Returns link to sign-in page from <tt>AuthDataApplication</tt> subclass. Uses redirect
     * to intercept page so that user will return to current page once signed in. Override
     * for other behavior.
     */
    protected Link getSignInLink(String id) {
        return new Link(id) {
            @Override
            public void onClick() {
                redirectToInterceptPage(getSession().getPageFactory()
                        .newPage(((AuthApplication<T>) getApplication()).getSignInPageClass()));
            }

            @Override
            public boolean isVisible() {
                return !getAuthSession().isSignedIn();
            }
        };
    }

    /** @return casted web session*/
    protected AuthSession getAuthSession() {
        return (AuthSession) getSession();
    }
}