info.magnolia.ui.admincentral.shellapp.pulse.message.MessagesListViewImpl.java Source code

Java tutorial

Introduction

Here is the source code for info.magnolia.ui.admincentral.shellapp.pulse.message.MessagesListViewImpl.java

Source

/**
 * This file Copyright (c) 2012-2015 Magnolia International
 * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
 *
 *
 * This file is dual-licensed under both the Magnolia
 * Network Agreement and the GNU General Public License.
 * You may elect to use one or the other of these licenses.
 *
 * This file is distributed in the hope that it will be
 * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
 * Redistribution, except as permitted by whichever of the GPL
 * or MNA you select, is prohibited.
 *
 * 1. For the GPL license (GPL), you can redistribute and/or
 * modify this file under the terms of the GNU General
 * Public License, Version 3, as published by the Free Software
 * Foundation.  You should have received a copy of the GNU
 * General Public License, Version 3 along with this program;
 * if not, write to the Free Software Foundation, Inc., 51
 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * 2. For the Magnolia Network Agreement (MNA), this file
 * and the accompanying materials are made available under the
 * terms of the MNA which accompanies this distribution, and
 * is available at http://www.magnolia-cms.com/mna.html
 *
 * Any modifications to this file must keep this entire header
 * intact.
 *
 */
package info.magnolia.ui.admincentral.shellapp.pulse.message;

import info.magnolia.i18nsystem.SimpleTranslator;
import info.magnolia.ui.admincentral.shellapp.pulse.item.detail.PulseItemCategory;
import info.magnolia.ui.admincentral.shellapp.pulse.item.list.AbstractPulseListView;
import info.magnolia.ui.admincentral.shellapp.pulse.item.list.PulseListFooter;
import info.magnolia.ui.admincentral.shellapp.pulse.message.data.MessageConstants;
import info.magnolia.ui.api.message.MessageType;
import info.magnolia.ui.workbench.column.DateColumnFormatter;

import javax.inject.Inject;

import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;

import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.ui.AbstractSelect;
import com.vaadin.ui.Component;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.GeneratedRow;

/**
 * Implementation of {@link MessagesListView}.
 */
public final class MessagesListViewImpl extends AbstractPulseListView implements MessagesListView {

    private static final String[] order = new String[] { MessageConstants.NEW_PROPERTY_ID,
            MessageConstants.TYPE_PROPERTY_ID, MessageConstants.TEXT_PROPERTY_ID,
            MessageConstants.SENDER_PROPERTY_ID, MessageConstants.DATE_PROPERTY_ID };

    @Inject
    public MessagesListViewImpl(SimpleTranslator i18n) {
        super(i18n, order,
                new String[] { i18n.translate("pulse.items.new"), i18n.translate("pulse.items.type"),
                        i18n.translate("pulse.messages.text"), i18n.translate("pulse.items.sender"),
                        i18n.translate("pulse.items.date") },
                i18n.translate("pulse.messages.empty"), PulseItemCategory.ALL_MESSAGES, PulseItemCategory.INFO,
                PulseItemCategory.PROBLEM);
        constructTable();
        setFooter(new PulseListFooter(getItemTable(), i18n, false));
    }

    private void constructTable() {
        final Table table = getItemTable();
        table.setCacheRate(1);
        table.addGeneratedColumn(MessageConstants.NEW_PROPERTY_ID, new PulseNewItemColumnGenerator());
        table.setColumnWidth(MessageConstants.NEW_PROPERTY_ID, 100);
        table.addGeneratedColumn(MessageConstants.TYPE_PROPERTY_ID, new MessageTypeColumnGenerator());
        table.setColumnWidth(MessageConstants.TYPE_PROPERTY_ID, 50);
        table.addGeneratedColumn(MessageConstants.TEXT_PROPERTY_ID, new MessageSubjectColumnGenerator());
        table.setColumnWidth(MessageConstants.TEXT_PROPERTY_ID, 450);
        table.addGeneratedColumn(MessageConstants.DATE_PROPERTY_ID, new DateColumnFormatter(null));
        table.setColumnWidth(MessageConstants.DATE_PROPERTY_ID, 150);
        getItemTable().setSortAscending(false);

        // tooltips
        table.setItemDescriptionGenerator(new AbstractSelect.ItemDescriptionGenerator() {

            @Override
            public String generateDescription(Component source, Object itemId, Object propertyId) {
                if (MessageConstants.TEXT_PROPERTY_ID.equals(propertyId)) {
                    String subject = (String) ((AbstractSelect) source)
                            .getContainerProperty(itemId, MessageConstants.SUBJECT_PROPERTY_ID).getValue();
                    return StringEscapeUtils.escapeXml(subject);
                }
                return null;
            }
        });
    }

    @Override
    public void setDataSource(Container dataSource) {
        super.setDataSource(dataSource);
        getItemTable().setSortContainerPropertyId(MessageConstants.DATE_PROPERTY_ID);
    }

    @Override
    protected GeneratedRow generateGroupingRow(Item item) {
        GeneratedRow row = new GeneratedRow();
        MessageType messageType = (MessageType) item.getItemProperty(MessageConstants.TYPE_PROPERTY_ID).getValue();

        String key = null;
        switch (messageType) {
        case ERROR:
            key = "pulse.messages.errors";
            break;
        case WARNING:
            key = "pulse.messages.warnings";
            break;
        case INFO:
            key = "pulse.messages.info";
            break;
        default:
            return null;
        }

        row.setText("", "", getI18n().translate(key));
        return row;
    }

    /**
     * The Vaadin {@link Table.ColumnGenerator ColumnGenerator} for the subject cells in the messages list view.
     */
    // default visibility for tests.
    class MessageSubjectColumnGenerator implements Table.ColumnGenerator {

        @Override
        public Object generateCell(Table source, Object itemId, Object columnId) {

            String subject = (String) source.getContainerProperty(itemId, MessageConstants.SUBJECT_PROPERTY_ID)
                    .getValue();
            String text = (String) source.getContainerProperty(itemId, MessageConstants.TEXT_PROPERTY_ID)
                    .getValue();

            if (StringUtils.isNotBlank(subject) && StringUtils.isNotBlank(text)) {

                // prepare title and comment texts
                subject = StringEscapeUtils.escapeXml(subject);
                text = StringEscapeUtils.escapeXml(text);

                return String.format(
                        "<div class=\"message-subject-text\">" + "<strong>%s</strong><br/>" + "%s</div>",
                        StringUtils.abbreviate(subject, 70), StringUtils.abbreviate(text, 70));
            }
            return null;
        }
    }

    /**
     * The Vaadin {@link Table.ColumnGenerator ColumnGenerator} for the type cells in the messages list view.
     */
    private class MessageTypeColumnGenerator implements Table.ColumnGenerator {

        @Override
        public Object generateCell(Table source, Object itemId, Object columnId) {
            MessageType messageType = (MessageType) source
                    .getContainerProperty(itemId, MessageConstants.TYPE_PROPERTY_ID).getValue();

            String level, shape = "circle", mark;
            switch (messageType) {
            case INFO:
                level = "info-icon";
                mark = "icon-info_mark";
                break;
            case WARNING:
                level = "warning-icon";
                mark = "icon-warning-mark";
                break;
            case ERROR:
                level = "error-icon";
                shape = "triangle";
                mark = "icon-error-mark";
                break;
            default:
                return null;
            }

            return String.format(
                    "<span class=\"composite-icon %1$s\">" + "<span class=\"icon icon-shape-%2$s-plus\"></span>"
                            + "<span class=\"icon icon-shape-%2$s\"></span>" + "<span class=\"icon %3$s\"></span>"
                            + "</span>",
                    level, shape, mark);
        }
    }

}