eu.uqasar.web.pages.tree.snapshot.panel.SnapshotViewPanel.java Source code

Java tutorial

Introduction

Here is the source code for eu.uqasar.web.pages.tree.snapshot.panel.SnapshotViewPanel.java

Source

package eu.uqasar.web.pages.tree.snapshot.panel;

/*
 * #%L
 * U-QASAR
 * %%
 * Copyright (C) 2012 - 2015 U-QASAR Consortium
 * %%
 * 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.
 * #L%
 */

import javax.inject.Inject;

import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.CssClassNameAppender;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipBehavior;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
import eu.uqasar.model.tree.BaseIndicator;
import eu.uqasar.model.tree.Metric;
import eu.uqasar.model.tree.Project;
import eu.uqasar.model.tree.QualityIndicator;
import eu.uqasar.model.tree.QualityObjective;
import eu.uqasar.model.tree.QualityStatus;
import eu.uqasar.model.tree.TreeNode;
import eu.uqasar.model.tree.historic.Snapshot;
import eu.uqasar.service.SnapshotService;
import eu.uqasar.service.tree.TreeNodeService;
import eu.uqasar.web.pages.tree.BaseTreePage;
import eu.uqasar.web.pages.tree.metric.MetricViewPage;
import eu.uqasar.web.pages.tree.projects.ProjectViewPage;
import eu.uqasar.web.pages.tree.quality.indicator.QualityIndicatorViewPage;
import eu.uqasar.web.pages.tree.quality.objective.QualityObjectiveViewPage;

/**
 * 
 *
 *
 */
public class SnapshotViewPanel extends Panel {

    private static final long serialVersionUID = -6492328025617396184L;

    @Inject
    TreeNodeService treeNodeService;

    @Inject
    SnapshotService snapshotService;

    private final Snapshot snapshot;

    /**
     * Constructor building the page
     * @param snap
      */
    public SnapshotViewPanel(final String markupId, IModel<Snapshot> snap) {
        super(markupId);

        snapshot = snap.getObject();

        final TreeNode qmTreeNode = snapshot.getProject();

        // Adds to the list every Project persisted on platform
        add(drawTreeElement("qmodel", qmTreeNode));

        // Adds a tree list of the Quality Objectives of the Project
        add(new ListView<TreeNode>("qmlist", qmTreeNode.getChildren()) {
            private static final long serialVersionUID = 6089299549826556193L;

            @Override
            protected void populateItem(ListItem<TreeNode> qo) {
                final TreeNode qmTreeNode = qo.getModelObject();

                // Adds every Quality Objective
                qo.add(drawTreeElement("qobjective", qmTreeNode));

                // Adds a tree list of the Quality Indicators of a Objective
                qo.add(new ListView<TreeNode>("qmlist", qmTreeNode.getChildren()) {
                    private static final long serialVersionUID = 9129630322229875593L;

                    @Override
                    protected void populateItem(ListItem<TreeNode> qi) {
                        final TreeNode qmTreeNode = qi.getModelObject();

                        // Adds every Quality Indicator
                        qi.add(drawTreeElement("qindicator", qmTreeNode));

                        // Adds a tree list of the Metrics of an Indicator
                        qi.add(new ListView<TreeNode>("qmlist", qmTreeNode.getChildren()) {
                            private static final long serialVersionUID = 9129630322229875593L;

                            @Override
                            protected void populateItem(ListItem<TreeNode> me) {
                                final TreeNode qmTreeNode = me.getModelObject();
                                // Adds every Metric from the Indicator
                                me.add(drawTreeElement("qmetric", qmTreeNode));
                            }
                        });
                    }
                });
            }
        });
    }

    /**
     * @param markupId
     * @return Returns a WebMarkContainer with the item details of an element of the tree
     */
    private WebMarkupContainer drawTreeElement(String markupId, TreeNode node) {
        WebMarkupContainer container = new WebMarkupContainer(markupId);

        QualityStatus qs = QualityStatus.Gray;

        // Retrieve snapshot stored value
        if (node instanceof BaseIndicator) {
            qs = ((BaseIndicator) node).getHistoricObject(snapshot.getLastUpdate()).getQualityStatus();
        } else if (node instanceof Project) {
            qs = ((Project) node).getHistoricObject(snapshot.getLastUpdate()).getQualityStatus();
        }

        // Adds an icon with color status 
        Label iconLabel = new Label("icon");
        iconLabel.add(new CssClassNameAppender(node.getIconType().cssClassName()));
        iconLabel.add(new AttributeAppender("class", Model.of(qs.getCssClassName()), " "));
        container.add(iconLabel);

        // Adds the link to the Page of the element according its type
        container.add(setLinkToNodePage(node));

        WebMarkupContainer valueContainer = new WebMarkupContainer("valueContainer");
        valueContainer.add(new AttributeAppender("class", " text-" + qs.getCssClassName()));
        container.add(valueContainer);

        // Adds a tooltip to show Value source and type and its Unit
        if (node instanceof Metric) {
            valueContainer.add(metricTooltip(node));
            valueContainer.add(new Label("unit", new PropertyModel<String>(node, "unit")));
        } else {
            valueContainer.add(new Label("unit", Model.of("%")));
        }

        // Retrieve snapshot stored value
        if (node instanceof BaseIndicator) {
            valueContainer
                    .add(new Label("hValue", ((BaseIndicator) node).getHistoricValue(snapshot.getLastUpdate())));
        } else if (node instanceof Project) {
            valueContainer.add(new Label("hValue", ((Project) node).getHistoricValue(snapshot.getLastUpdate())));
        }

        //TODO: add the current value/state beside snapshot value/state
        // Adds the value with color according to the status of the element
        //      Label qualityValue = new Label("value", new PropertyModel<String>(node, "value"));
        //      valueContainer.add(qualityValue);

        return container;
    }

    /**
     * @param node
     * @return Returns a Link to the page element according to the type of the node
     */
    private BookmarkablePageLink<?> setLinkToNodePage(final TreeNode node) {
        BookmarkablePageLink<?> link = null;

        if (node instanceof Project) {
            link = new BookmarkablePageLink<ProjectViewPage>("link", ProjectViewPage.class,
                    BaseTreePage.forProject((Project) node));
        } else if (node instanceof QualityObjective) {
            link = new BookmarkablePageLink<ProjectViewPage>("link", QualityObjectiveViewPage.class,
                    BaseTreePage.forQualityObjective((QualityObjective) node));
        } else if (node instanceof QualityIndicator) {
            link = new BookmarkablePageLink<ProjectViewPage>("link", QualityIndicatorViewPage.class,
                    BaseTreePage.forQualityIndicator((QualityIndicator) node));
        } else if (node instanceof Metric) {
            link = new BookmarkablePageLink<ProjectViewPage>("link", MetricViewPage.class,
                    BaseTreePage.forMetric((Metric) node));
        }

        link.add(new Label("name", new PropertyModel<String>(node, "name")));

        return link;
    }

    /**
     * @param node
     * @return The Tooltip with Metric source and type information.  
     */
    private TooltipBehavior metricTooltip(TreeNode node) {
        // tooltip config
        TooltipConfig confConfig = new TooltipConfig().withPlacement(TooltipConfig.Placement.top);
        Metric metric = (Metric) node;

        String info = metric.getMetricSource().toString();

        if (metric.getMetricType() != null) {
            info += " - " + metric.getMetricType();
        }

        return new TooltipBehavior(new Model(info), confConfig);
    }

}