org.vaadin.tori.ToriUI.java Source code

Java tutorial

Introduction

Here is the source code for org.vaadin.tori.ToriUI.java

Source

/*
 * Copyright 2014 Vaadin Ltd.
 * 
 * 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.vaadin.tori;

import javax.portlet.PortletMode;

import org.apache.log4j.Logger;
import org.vaadin.dialogs.ConfirmDialog;
import org.vaadin.googleanalytics.tracking.GoogleAnalyticsTracker;
import org.vaadin.tori.component.Breadcrumbs;
import org.vaadin.tori.component.DebugControlPanel;
import org.vaadin.tori.component.RecentBar;
import org.vaadin.tori.service.AuthorizationService;
import org.vaadin.tori.service.DebugAuthorizationService;
import org.vaadin.tori.util.ComponentUtil;
import org.vaadin.tori.util.InputCacheUtil;
import org.vaadin.tori.util.UrlConverter;
import org.vaadin.tori.view.edit.EditViewImpl;
import org.vaadin.tori.widgetset.client.ui.ToriUIServerRpc;

import com.vaadin.annotations.Widgetset;
import com.vaadin.server.Page;
import com.vaadin.server.VaadinPortletRequest;
import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
@Widgetset("org.vaadin.tori.widgetset.ToriWidgetset")
public class ToriUI extends UI implements ToriUIServerRpc {

    public static final int DEFAULT_POLL_INTERVAL = 1000 * 10;

    private VerticalLayout mainLayout;

    private GoogleAnalyticsTracker analytics;

    private RecentBar recentBar;
    private Breadcrumbs breadcrumbs;

    private ToriApiLoader apiLoader;
    private InputCacheUtil inputCacheUtil;

    @Override
    protected void init(final VaadinRequest request) {
        setId("tori-ui");
        setPollInterval(DEFAULT_POLL_INTERVAL);
        registerRpc(this);
        ToriApiLoader.init(request);
        apiLoader = ToriApiLoader.getCurrent();
        inputCacheUtil = new InputCacheUtil();
        addExtension(inputCacheUtil.getExtension());
        checkUrl();

        final String trackerId = apiLoader.getDataSource().getConfiguration().getGoogleAnalyticsTrackerId();
        if (trackerId != null && !trackerId.isEmpty()) {
            analytics = new GoogleAnalyticsTracker(trackerId);
            analytics.setAllowAnchor(true);
            analytics.extend(ToriUI.this);
        }

        mainLayout = new VerticalLayout();
        mainLayout.setMargin(false);
        setContent(mainLayout);

        VerticalLayout navigatorContent = new VerticalLayout();
        setNavigator(new ToriNavigator(navigatorContent));
        breadcrumbs = new Breadcrumbs();

        addControlPanelIfInDevelopment();
        recentBar = new RecentBar();
        mainLayout.addComponent(recentBar);
        mainLayout.addComponent(breadcrumbs);
        mainLayout.addComponent(navigatorContent);

        if (request instanceof VaadinPortletRequest) {
            final VaadinPortletRequest r = (VaadinPortletRequest) request;
            setPortletMode(r.getPortletRequest().getPortletMode());
        }

        ConfirmDialog.setFactory(ComponentUtil.getConfirmDialogFactory());
    }

    private void checkUrl() {
        UrlConverter uc = apiLoader.getUrlConverter();
        if (uc != null) {
            String currentUrl = Page.getCurrent().getLocation().toString();
            String convertedUrl = uc.convertUrlToToriForm(currentUrl);
            if (!currentUrl.equals(convertedUrl)) {
                Page.getCurrent().setLocation(convertedUrl);
            }
        }
    }

    public final void setPortletMode(final PortletMode portletMode) {
        if (portletMode == PortletMode.EDIT) {
            final EditViewImpl editView = new EditViewImpl(apiLoader.getDataSource(),
                    apiLoader.getAuthorizationService());
            editView.init();
            setContent(editView);
        } else {
            setContent(mainLayout);
        }
    }

    private void addControlPanelIfInDevelopment() {
        final AuthorizationService authorizationService = apiLoader.getAuthorizationService();
        if (authorizationService instanceof DebugAuthorizationService) {
            DebugControlPanel debugControlPanel = new DebugControlPanel(
                    (DebugAuthorizationService) authorizationService);
            mainLayout.addComponent(debugControlPanel);
            mainLayout.setComponentAlignment(debugControlPanel, Alignment.TOP_RIGHT);
        }
    }

    /**
     * Send data to Google Analytics about what the user is doing.
     * 
     * @param action
     *            the action performed in the path. <code>null</code> to ignore.
     *            E.g. "reply"
     */
    public void trackAction(final String action) {
        if (analytics != null) {

            String fragment = Page.getCurrent().getUriFragment();
            StringBuilder sb = new StringBuilder(apiLoader.getDataSource().getPathRoot() + "#");
            sb.append(fragment != null ? fragment : "");
            if (action != null) {
                sb.append("/" + action);
            }
            analytics.trackPageview(sb.toString());
        } else {
            getLogger().debug("Can't track an action - no analytics configured");
        }
    }

    public RecentBar getRecentBar() {
        return recentBar;
    }

    public Breadcrumbs getBreadcrumbs() {
        return breadcrumbs;
    }

    public InputCacheUtil getInputCacheUtil() {
        return inputCacheUtil;
    }

    private static Logger getLogger() {
        return Logger.getLogger(ToriUI.class);
    }

    public static ToriUI getCurrent() {
        return (ToriUI) UI.getCurrent();
    }

    @Override
    public void userInactive() {
        setPollInterval(0);
    }

    @Override
    public void userActive() {
        setPollInterval(DEFAULT_POLL_INTERVAL);
    }
}