org.onexus.website.api.Website.java Source code

Java tutorial

Introduction

Here is the source code for org.onexus.website.api.Website.java

Source

/**
 *  Copyright 2012 Universitat Pompeu Fabra.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *
 */
package org.onexus.website.api;

import org.apache.wicket.AttributeModifier;
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.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;
import org.onexus.resource.api.ORI;
import org.onexus.resource.api.session.LoginContext;
import org.onexus.website.api.pages.IPageManager;
import org.onexus.website.api.pages.PageConfig;
import org.onexus.website.api.pages.PageModel;
import org.onexus.website.api.theme.DefaultTheme;
import org.onexus.website.api.utils.CustomCssBehavior;
import org.onexus.website.api.utils.HtmlDataResourceModel;
import org.onexus.website.api.utils.authorization.Authorization;
import org.onexus.website.api.utils.panels.ConnectionsPanel;
import org.onexus.website.api.utils.panels.LoginPanel;
import org.onexus.website.api.utils.panels.NotAuthorizedPage;
import org.onexus.website.api.utils.visible.VisiblePredicate;

import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Website extends WebPage {

    // Parameters
    public static final String PARAMETER_CURRENT_PAGE = "c";

    @Inject
    private IPageManager pageManager;

    public Website(PageParameters pageParameters) {
        super(new WebsiteModel(pageParameters));

        if (!Authorization.authorize(getConfig())) {
            if (WebsiteSession.get().isSignedIn()) {
                setResponsePage(NotAuthorizedPage.class);
            } else {
                WebsiteApplication.get().restartResponseAtSignInPage();
            }
        }

        LoginContext ctx = LoginContext.get();
        try {

            LoginContext.set(LoginContext.SERVICE_CONTEXT, null);

            add(new DefaultTheme());

            final WebsiteStatus status = getStatus();
            final WebsiteConfig config = getConfig();

            ORI parentUri = config.getORI().getParent();
            add(new CustomCssBehavior(parentUri, config.getCss()));

            // Init currentPage
            VisiblePredicate visiblePredicate = new VisiblePredicate(getConfig().getORI(), Collections.EMPTY_LIST);
            if (status.getCurrentPage() == null || config.getPage(status.getCurrentPage()) == null
                    || !visiblePredicate.evaluate(config.getPage(status.getCurrentPage()))) {
                List<PageConfig> visiblePages = getPageConfigList();
                if (!visiblePages.isEmpty()) {
                    String currentPage = visiblePages.get(0).getId();
                    status.setCurrentPage(currentPage);
                }
            }

            add(new Label("windowTitle", config.getTitle()));

            add(new EmptyPanel("progressbar"));
            //TODO add(new ProgressBar("progressbar", false));

            String header = config.getHeader();

            Label headerLabel = new Label("header", new HtmlDataResourceModel(parentUri, header));
            headerLabel.setVisible(header != null && !header.isEmpty());
            headerLabel.setEscapeModelStrings(false);
            add(headerLabel);

            WebMarkupContainer menuSection = new WebMarkupContainer("menuSection");
            menuSection.add(
                    new ListView<PageConfig>("menu", new PropertyModel<List<PageConfig>>(this, "pageConfigList")) {

                        @Override
                        protected void populateItem(ListItem<PageConfig> item) {

                            PageConfig pageConfig = item.getModelObject();

                            PageParameters parameters = new PageParameters();
                            parameters.add(PARAMETER_CURRENT_PAGE, pageConfig.getId());

                            Link<String> link = new BookmarkablePageLink<String>("link", Website.class, parameters);
                            link.add(new Label("name", pageConfig.getLabel()));

                            String currentPage = status.getCurrentPage();

                            item.add(link);

                            if (currentPage.equals(pageConfig.getId())) {
                                link.getParent().add(new AttributeModifier("class", "active"));
                            }

                        }
                    });

            if (pageParameters.get("embed").toBoolean(false)) {
                menuSection.setVisible(false);
            } else {
                menuSection.setVisible(true);
            }

            // Login section
            Panel login = new LoginPanel("login");
            menuSection.add(login);
            if (config.getLogin() == null || !config.getLogin()) {
                login.setVisible(false);
            }

            // Projects section
            menuSection.add(new ConnectionsPanel("connections", config.getConnections()));

            add(menuSection);

            String currentPage = status.getCurrentPage();

            add(pageManager.create("page", new PageModel(currentPage, (IModel<WebsiteStatus>) getDefaultModel())));

            String bottom = config.getBottom();
            Label bottomLabel = new Label("bottom", new HtmlDataResourceModel(parentUri, bottom));
            bottomLabel.setVisible(bottom != null && !bottom.isEmpty());
            bottomLabel.setEscapeModelStrings(false);
            add(bottomLabel);

        } finally {
            LoginContext.set(ctx, null);
        }

    }

    @Override
    protected void onBeforeRender() {
        StringValue embed = getPage().getPageParameters().get("embed");

        boolean visible = !embed.toBoolean(false);

        get("header").setVisible(visible);
        get("bottom").setVisible(visible);

        if (!Authorization.authorize(getConfig())
                || !Authorization.authorize(getConfig().getPage(getStatus().getCurrentPage()))) {
            if (WebsiteSession.get().isSignedIn()) {
                setResponsePage(NotAuthorizedPage.class);
            } else {
                WebsiteApplication.get().restartResponseAtSignInPage();
            }
        }

        super.onBeforeRender();
    }

    public WebsiteStatus getStatus() {
        return (WebsiteStatus) getDefaultModelObject();
    }

    public WebsiteConfig getConfig() {
        return getStatus().getConfig();
    }

    public List<PageConfig> getPageConfigList() {
        List<PageConfig> pages = new ArrayList<PageConfig>();

        VisiblePredicate visiblePredicate = new VisiblePredicate(getConfig().getORI(), Collections.EMPTY_LIST);

        for (PageConfig page : getConfig().getPages()) {

            if (Authorization.authorize(page) && visiblePredicate.evaluate(page)) {
                pages.add(page);
            }
        }

        return pages;
    }

}