au.org.theark.web.pages.home.HomePage.java Source code

Java tutorial

Introduction

Here is the source code for au.org.theark.web.pages.home.HomePage.java

Source

/*******************************************************************************
 * Copyright (c) 2011  University of Western Australia. All rights reserved.
 * 
 * This file is part of The Ark.
 * 
 * The Ark is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 * 
 * The Ark 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
package au.org.theark.web.pages.home;

import java.util.ArrayList;
import java.util.List;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.IAjaxIndicatorAware;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.extensions.markup.html.tabs.TabbedPanel;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import au.org.theark.core.exception.ArkSystemException;
import au.org.theark.core.exception.EntityNotFoundException;
import au.org.theark.core.model.study.entity.ArkModule;
import au.org.theark.core.model.study.entity.ArkUser;
import au.org.theark.core.model.study.entity.LinkSubjectStudy;
import au.org.theark.core.model.study.entity.Study;
import au.org.theark.core.service.IArkCommonService;
import au.org.theark.core.util.ContextHelper;
import au.org.theark.core.web.component.tabbedPanel.ArkAjaxTabbedPanel;
import au.org.theark.lims.web.component.panel.applet.PrintAppletPanel;
import au.org.theark.registry.web.menu.RegistryTabProviderImpl;
import au.org.theark.study.service.IStudyService;
import au.org.theark.study.web.Constants;
import au.org.theark.web.menu.AdminTabProviderImpl;
import au.org.theark.web.menu.CalendarTabProviderImpl;
import au.org.theark.web.menu.DiseaseTabProviderImpl;
import au.org.theark.web.menu.GenomicsTabProviderImpl;
import au.org.theark.web.menu.LimsTabProviderImpl;
import au.org.theark.web.menu.MainTabProviderImpl;
import au.org.theark.web.menu.PhenotypicTabProviderImpl;
import au.org.theark.web.menu.ReportTabProviderImpl;
import au.org.theark.web.menu.WorkTrackingTabProviderImpl;
import au.org.theark.web.pages.login.LoginPage;

/**
 * <p>
 * The <code>HomePage</code> class that extends the {@link au.org.theark.web.pages.home.BasePage BasePage} class. It provides the implementation of the
 * index page of The Ark application.
 * </p>
 * 
 * @author nivedann
 * @author cellis
 */
public class HomePage extends BasePage {

    private static final long serialVersionUID = 6042144198163845254L;
    private transient static Logger log = LoggerFactory.getLogger(HomePage.class);
    private WebMarkupContainer arkContextPanelMarkup;
    private TabbedPanel moduleTabbedPanel;

    @SpringBean(name = au.org.theark.core.Constants.ARK_COMMON_SERVICE)
    private IArkCommonService<Void> iArkCommonService;

    @SpringBean(name = Constants.STUDY_SERVICE)
    private IStudyService studyService;

    /**
     * Constructor that is invoked when page is invoked without a session.
     * 
     * @param parameters
     *           Page parameters
     */
    public HomePage(final PageParameters parameters) {
        Subject currentUser = SecurityUtils.getSubject();

        if (currentUser.getPrincipal() != null) {
            buildContextPanel();
            buildModuleTabs();
        } else {
            setResponsePage(LoginPage.class);
        }

        // Applet used for barcode printing
        PrintAppletPanel printAppletPanel = new PrintAppletPanel("printAppletPanel", "zebra");
        printAppletPanel.add(new AttributeModifier("class", "floatLeft"));
        this.add(printAppletPanel);
    }

    public void onBeforeRender() {

        super.onBeforeRender();

        Long studyIdInSession = (Long) SecurityUtils.getSubject().getSession()
                .getAttribute(au.org.theark.core.Constants.STUDY_CONTEXT_ID);

        Study study = null;
        if (studyIdInSession != null) {
            study = iArkCommonService.getStudy(studyIdInSession);
        }

        if (study != null) {
            ContextHelper contextHelper = new ContextHelper();
            contextHelper.setStudyContextLabel(study.getName(), this.arkContextPanelMarkup);
            Long sessionPersonId = (Long) SecurityUtils.getSubject().getSession()
                    .getAttribute(au.org.theark.core.Constants.PERSON_CONTEXT_ID);
            String sessionPersonType = (String) SecurityUtils.getSubject().getSession()
                    .getAttribute(au.org.theark.core.Constants.PERSON_TYPE);
            if (sessionPersonId != null && sessionPersonType != null
                    && sessionPersonType.equals(au.org.theark.core.Constants.PERSON_CONTEXT_TYPE_SUBJECT)) {

                try {
                    //todo:  are we are getting just to catch an exception and log an error????
                    studyService.getPerson(sessionPersonId);
                    LinkSubjectStudy lss = iArkCommonService.getSubject(sessionPersonId, study);
                    contextHelper.setSubjectContextLabel(lss.getSubjectUID(), this.arkContextPanelMarkup);
                    contextHelper.setSubjectNameContextLabel(lss.getPerson().getFullName(),
                            this.arkContextPanelMarkup);
                } catch (EntityNotFoundException e) {
                    log.error(e.getMessage());
                } catch (ArkSystemException e) {
                    log.error(e.getMessage());
                }
            }
        }

    }

    /**
     * Builds the ContextPanel that is used to store/show the context items in session, such as Study, SubjectUID etc)
     */
    protected void buildContextPanel() {
        this.arkContextPanelMarkup = new WebMarkupContainer("contextMarkupContainer");

        // Require a Label for each context item (currently hard coded in mark up)
        // TODO: Use dynamic component to remove hard-coded Labels
        Label studyLabel = new Label("studyLabel", "");
        arkContextPanelMarkup.add(studyLabel);
        Label subjectLabel = new Label("subjectLabel", "");
        arkContextPanelMarkup.add(subjectLabel);
        Label subjectNameLabel = new Label("subjectNameLabel", "");
        arkContextPanelMarkup.add(subjectNameLabel);
        Label phenoLabel = new Label("phenoLabel", "");
        arkContextPanelMarkup.add(phenoLabel);
        Label genoLabel = new Label("genoLabel", "");
        arkContextPanelMarkup.add(genoLabel);
        add(arkContextPanelMarkup);
        arkContextPanelMarkup.setOutputMarkupPlaceholderTag(true);
    }

    /**
     * Build the list of main tabs/modules based on the current logged in user
     */
    @Override
    protected void buildModuleTabs() {
        List<ITab> moduleTabsList = new ArrayList<ITab>(0);
        List<ArkModule> arkModuleList = new ArrayList<ArkModule>(0);
        Subject currentUser = SecurityUtils.getSubject();
        String ldapUserName = currentUser.getPrincipal().toString();

        MainTabProviderImpl studyMainTabProvider = null;

        try {
            ArkUser arkUser = iArkCommonService.getArkUser(ldapUserName);
            arkModuleList = iArkCommonService.getArkModuleListByArkUser(arkUser);

            for (ArkModule arkModule : arkModuleList) {
                //log.info("arkModule: " + arkModule.getName());
                if (arkModule.getName().equalsIgnoreCase(au.org.theark.core.Constants.ARK_MODULE_STUDY)) {
                    // Study
                    studyMainTabProvider = new MainTabProviderImpl(arkModule.getName());
                    // Pass in the Study logo mark up, to allow dynamic logo reference
                    moduleTabsList = studyMainTabProvider.buildTabs(this.studyNameMarkup, this.studyLogoMarkup,
                            this.arkContextPanelMarkup);
                }

                if (arkModule.getName().equalsIgnoreCase(au.org.theark.core.Constants.ARK_MODULE_DISEASE)) {
                    //Disease
                    DiseaseTabProviderImpl diseaseTabProvider = new DiseaseTabProviderImpl(arkModule.getName());
                    List<ITab> diseaseTabList = diseaseTabProvider.buildTabs(this.arkContextPanelMarkup);
                    moduleTabsList.addAll(diseaseTabList);
                }

                if (arkModule.getName().equalsIgnoreCase(au.org.theark.core.Constants.ARK_MODULE_PHENOTYPIC)) {
                    // Pheno
                    PhenotypicTabProviderImpl phenotypicTabProvidor = new PhenotypicTabProviderImpl(
                            arkModule.getName());
                    List<ITab> phenotypicTabsList = phenotypicTabProvidor.buildTabs(this.arkContextPanelMarkup);
                    for (ITab itab : phenotypicTabsList) {
                        moduleTabsList.add(itab);
                    }
                }

                if (arkModule.getName().equalsIgnoreCase(au.org.theark.core.Constants.ARK_MODULE_LIMS)) {
                    // LIMS
                    LimsTabProviderImpl limsTabProvider = new LimsTabProviderImpl(arkModule.getName());
                    List<ITab> limsTabList = limsTabProvider.buildTabs(this.arkContextPanelMarkup,
                            this.studyNameMarkup, this.studyLogoMarkup);
                    for (ITab tab : limsTabList) {
                        moduleTabsList.add(tab);
                    }
                }

                if (arkModule.getName().equalsIgnoreCase(au.org.theark.core.Constants.ARK_MODULE_WORKTRACKING)) {
                    //  Work
                    WorkTrackingTabProviderImpl workTrackingTabProvider = new WorkTrackingTabProviderImpl(
                            arkModule.getName());
                    List<ITab> workTabList = workTrackingTabProvider.buildTabs();
                    for (ITab tab : workTabList) {
                        moduleTabsList.add(tab);
                    }
                }

                if (arkModule.getName().equalsIgnoreCase(au.org.theark.core.Constants.ARK_MODULE_REGISTRY)) {
                    //  Registry
                    RegistryTabProviderImpl regoTab = new RegistryTabProviderImpl(arkModule.getName());
                    List<ITab> regoTabList = regoTab.buildTabs();
                    for (ITab tab : regoTabList) {
                        moduleTabsList.add(tab);
                    }
                }

                if (arkModule.getName().equalsIgnoreCase(au.org.theark.core.Constants.ARK_MODULE_REPORTING)) {
                    // Reporting always displayed, but data extraction function requires role/permisssion 
                    ReportTabProviderImpl reportTabProvider = new ReportTabProviderImpl(
                            (au.org.theark.core.Constants.ARK_MODULE_REPORTING));
                    List<ITab> reportTabList = reportTabProvider.buildTabs();
                    for (ITab tab : reportTabList) {
                        moduleTabsList.add(tab);
                    }
                }

                if (arkModule.getName().equalsIgnoreCase(au.org.theark.core.Constants.ARK_MODULE_GENOMICS)) {
                    // Reporting always displayed, but data extraction function requires role/permisssion 
                    GenomicsTabProviderImpl genomicsTabProvider = new GenomicsTabProviderImpl(
                            (au.org.theark.core.Constants.ARK_MODULE_GENOMICS));
                    List<ITab> genomicsTabList = genomicsTabProvider.buildTabs();
                    for (ITab tab : genomicsTabList) {
                        moduleTabsList.add(tab);
                    }
                }
                //Add the Calendar as a Module
                if (arkModule.getName().equalsIgnoreCase(au.org.theark.core.Constants.ARK_MODULE_CALENDAR)) {
                    CalendarTabProviderImpl calendarTabProvider = new CalendarTabProviderImpl(
                            (au.org.theark.core.Constants.ARK_MODULE_CALENDAR));
                    List<ITab> calendarTabList = calendarTabProvider.buildTabs();
                    for (ITab tab : calendarTabList) {
                        moduleTabsList.add(tab);
                    }
                }

            }

            //Only add the global search tab once, at the end of the tabs
            ITab globalSearchTab = studyMainTabProvider
                    .createTab(au.org.theark.core.Constants.ARK_MODULE_GLOBAL_SEARCH);
            moduleTabsList.add(globalSearchTab);

            // Only display admin tab for the super user
            ArkModule arkModule = iArkCommonService
                    .getArkModuleByName(au.org.theark.core.Constants.ARK_MODULE_ADMIN);
            if (arkModuleList.contains(arkModule)) {
                // Admin
                AdminTabProviderImpl adminTabProvider = new AdminTabProviderImpl(arkModule.getName());
                List<ITab> adminTabList = adminTabProvider.buildTabs();
                for (ITab tab : adminTabList) {
                    moduleTabsList.add(tab);
                }
            }
        } catch (EntityNotFoundException e) {
            log.error("ArkUser [" + ldapUserName + "] was not found!");
            log.error(e.getMessage());
        }

        moduleTabbedPanel = new ArkAjaxTabbedPanel("moduleTabsList", moduleTabsList, arkContextPanelMarkup);
        moduleTabbedPanel.setOutputMarkupPlaceholderTag(true);
        studyMainTabProvider.setModuleTabbedPanel(moduleTabbedPanel);
        add(moduleTabbedPanel);
    }

    @Override
    String getTitle() {
        return "ArkHomePage";
    }

    /**
     * @param log
     *           the log to set
     */
    public static void setLog(Logger log) {
        HomePage.log = log;
    }

    /**
     * @return the log
     */
    public static Logger getLog() {
        return log;
    }

}