com.hack23.cia.web.impl.ui.application.views.common.AbstractView.java Source code

Java tutorial

Introduction

Here is the source code for com.hack23.cia.web.impl.ui.application.views.common.AbstractView.java

Source

/*
 * Copyright 2014 James Pether Srling
 *
 * 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.
 *
 *   $Id$
 *  $HeadURL$
*/
package com.hack23.cia.web.impl.ui.application.views.common;

import java.util.Map;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.context.request.RequestContextHolder;

import com.hack23.cia.service.api.ApplicationManager;
import com.hack23.cia.service.api.action.application.LogoutRequest;
import com.hack23.cia.web.impl.ui.application.action.PageActionEventHelper;
import com.hack23.cia.web.impl.ui.application.util.UserContextUtil;
import com.hack23.cia.web.impl.ui.application.views.common.labelfactory.LabelFactory;
import com.hack23.cia.web.impl.ui.application.views.common.pagelinks.api.PageLinkFactory;
import com.hack23.cia.web.impl.ui.application.views.common.pagemode.PageModeContentFactory;
import com.hack23.cia.web.impl.ui.application.views.common.sizing.ContentRatio;
import com.hack23.cia.web.impl.ui.application.views.pageclicklistener.LogoutClickListener;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.FontAwesome;
import com.vaadin.server.ThemeResource;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Image;
import com.vaadin.ui.Label;
import com.vaadin.ui.Link;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.Panel;
import com.vaadin.ui.VerticalLayout;

/**
 * The Class AbstractView.
 */
public abstract class AbstractView extends Panel implements View {

    /** The Constant serialVersionUID. */
    private static final long serialVersionUID = 1L;

    /** The Constant LOGGER. */
    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractView.class);

    /** The Constant LOGOUT. */
    private static final String LOGOUT = "Logout";

    /** The Constant ROLE_USER. */
    private static final String ROLE_USER = "ROLE_USER";

    /** The Constant ROLE_ADMIN. */
    private static final String ROLE_ADMIN = "ROLE_ADMIN";

    /** The application manager. */
    @Autowired
    private transient ApplicationManager applicationManager;

    /** The page mode content factory map. */
    private final transient Map<String, PageModeContentFactory> pageModeContentFactoryMap;

    /** The page name. */
    private final String pageName;

    /** The barmenu. */
    private final MenuBar barmenu = new MenuBar();

    /** The top header right panel. */
    private final HorizontalLayout topHeaderRightPanel = new HorizontalLayout();

    /** The panel. */
    private Panel panel;

    /** The page link factory. */
    @Autowired
    protected transient PageLinkFactory pageLinkFactory;

    /** The page action event helper. */
    @Autowired
    protected transient PageActionEventHelper pageActionEventHelper;

    /**
     * Instantiates a new abstract view.
     */
    protected AbstractView(final Map<String, PageModeContentFactory> pageModeContentFactoryMap,
            final String pageName) {
        super();
        this.pageModeContentFactoryMap = pageModeContentFactoryMap;
        this.pageName = pageName;
    }

    /**
     * Post construct.
     */
    @PostConstruct
    public final void postConstruct() {
        setSizeFull();
        createBasicLayoutWithPanelAndFooter(pageName);
    }

    @Override
    public final void enter(final ViewChangeEvent event) {
        try {

            final String parameters = event.getParameters();
            for (final PageModeContentFactory pageModeContentFactory : pageModeContentFactoryMap.values()) {
                if (pageModeContentFactory.matches(pageName, parameters)) {
                    getPanel()
                            .setContent(pageModeContentFactory.createContent(parameters, getBarmenu(), getPanel()));
                    return;
                }
            }
        } catch (final AccessDeniedException e) {
            LOGGER.warn("Access denided:" + pageName, e);
            final VerticalLayout panelContent = new VerticalLayout();
            panelContent.setMargin(true);
            panelContent.setWidth(100, Unit.PERCENTAGE);
            panelContent.setHeight(100, Unit.PERCENTAGE);
            LabelFactory.createHeader2Label(panelContent, "Access denided:" + pageName);
            getPanel().setContent(panelContent);
            getPanel().setCaption("Access denied");
        }
    }

    /**
     * Creates the basic layout with panel and footer.
     *
     * @param panelName
     *            the panel name
     */
    protected final void createBasicLayoutWithPanelAndFooter(final String panelName) {
        final VerticalLayout layout = new VerticalLayout();
        layout.setMargin(true);
        layout.setSpacing(true);
        layout.setWidth(100, Unit.PERCENTAGE);
        layout.setHeight(100, Unit.PERCENTAGE);

        final VerticalLayout pageModeContent = new VerticalLayout();
        pageModeContent.setMargin(true);
        pageModeContent.setSpacing(true);
        pageModeContent.setWidth(100, Unit.PERCENTAGE);
        pageModeContent.setHeight(100, Unit.PERCENTAGE);

        layout.addComponent(pageModeContent);

        final ThemeResource ciaLogoResource = new ThemeResource("cia-logo.png");

        final Image ciaLogoImage = new Image(null, ciaLogoResource);

        final HorizontalLayout topHeader = new HorizontalLayout();

        topHeader.addComponent(ciaLogoImage);
        ciaLogoImage.setWidth("75px");
        ciaLogoImage.setHeight("75px");
        topHeader.setComponentAlignment(ciaLogoImage, Alignment.MIDDLE_LEFT);
        topHeader.setExpandRatio(ciaLogoImage, ContentRatio.SMALL);

        final HorizontalLayout topTitleHeadertPanel = new HorizontalLayout();

        final Label titleLabel = new Label("Citizen Intelligence Agency");
        titleLabel.setStyleName("Header");
        topTitleHeadertPanel.addComponent(titleLabel);
        topTitleHeadertPanel.setComponentAlignment(titleLabel, Alignment.MIDDLE_LEFT);

        final Label sloganLabel = new Label("// Tracking politicians like bugs!");
        sloganLabel.setStyleName("HeaderSlogan");
        topTitleHeadertPanel.addComponent(sloganLabel);
        topTitleHeadertPanel.setComponentAlignment(sloganLabel, Alignment.MIDDLE_RIGHT);

        topHeader.addComponent(topTitleHeadertPanel);
        topHeader.setComponentAlignment(topTitleHeadertPanel, Alignment.MIDDLE_LEFT);
        topHeader.setExpandRatio(topTitleHeadertPanel, ContentRatio.GRID);

        topHeaderRightPanel.removeAllComponents();
        topHeader.addComponent(topHeaderRightPanel);
        topHeader.setComponentAlignment(topHeaderRightPanel, Alignment.MIDDLE_RIGHT);
        topHeader.setExpandRatio(topHeaderRightPanel, ContentRatio.LARGE);

        if (UserContextUtil.allowRoleInSecurityContext(ROLE_ADMIN)
                || UserContextUtil.allowRoleInSecurityContext(ROLE_USER)) {

            final Link userHomePageLink = pageLinkFactory.createUserHomeViewPageLink();
            topHeaderRightPanel.addComponent(userHomePageLink);
            topHeaderRightPanel.setComponentAlignment(userHomePageLink, Alignment.MIDDLE_RIGHT);

            final Button logoutButton = new Button(LOGOUT, FontAwesome.SIGN_OUT);

            final LogoutRequest logoutRequest = new LogoutRequest();
            logoutRequest.setSessionId(RequestContextHolder.currentRequestAttributes().getSessionId());
            logoutButton.addClickListener(new LogoutClickListener(logoutRequest, applicationManager));

            topHeaderRightPanel.addComponent(logoutButton);
            topHeaderRightPanel.setComponentAlignment(logoutButton, Alignment.MIDDLE_RIGHT);

        } else {
            final Link createRegisterPageLink = pageLinkFactory.createRegisterPageLink();
            topHeaderRightPanel.addComponent(createRegisterPageLink);
            topHeaderRightPanel.setComponentAlignment(createRegisterPageLink, Alignment.MIDDLE_RIGHT);

            final Link createLoginPageLink = pageLinkFactory.createLoginPageLink();
            topHeaderRightPanel.addComponent(createLoginPageLink);
            topHeaderRightPanel.setComponentAlignment(createLoginPageLink, Alignment.MIDDLE_RIGHT);
        }

        topHeaderRightPanel.setWidth("100%");
        topHeaderRightPanel.setHeight("60px");

        topHeader.setWidth("100%");
        topHeader.setHeight("60px");

        pageModeContent.addComponent(topHeader);
        pageModeContent.setComponentAlignment(topHeader, Alignment.TOP_CENTER);

        pageModeContent.addComponent(getBarmenu());
        pageModeContent.setComponentAlignment(getBarmenu(), Alignment.TOP_CENTER);

        panel = new Panel(panelName);

        panel.setSizeFull();
        pageModeContent.addComponent(panel);
        pageModeContent.setExpandRatio(panel, ContentRatio.FULL_SIZE);

        pageModeContent.addComponent(pageLinkFactory.createMainViewPageLink());
        setContent(layout);

        setWidth(100, Unit.PERCENTAGE);
        setHeight(100, Unit.PERCENTAGE);
        setSizeFull();

    }

    /**
     * Gets the barmenu.
     *
     * @return the barmenu
     */
    public final MenuBar getBarmenu() {
        return barmenu;
    }

    /**
     * Gets the panel.
     *
     * @return the panel
     */
    protected final Panel getPanel() {
        return panel;
    }

    /**
     * Gets the top header right panel.
     *
     * @return the top header right panel
     */
    protected final HorizontalLayout getTopHeaderRightPanel() {
        return topHeaderRightPanel;
    }

}