eu.uqasar.web.pages.tree.subset.panel.SubsetProposalPanel.java Source code

Java tutorial

Introduction

Here is the source code for eu.uqasar.web.pages.tree.subset.panel.SubsetProposalPanel.java

Source

package eu.uqasar.web.pages.tree.subset.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 java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import javax.inject.Inject;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Check;
import org.apache.wicket.markup.html.form.CheckGroup;
import org.apache.wicket.markup.html.form.CheckGroupSelector;
import org.apache.wicket.markup.html.form.Form;
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.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;

import de.agilecoders.wicket.core.markup.html.bootstrap.image.Icon;
import eu.uqasar.model.meta.MetaData;
import eu.uqasar.model.meta.QModelTagData;
import eu.uqasar.model.qmtree.QMBaseIndicator;
import eu.uqasar.model.qmtree.QMMetric;
import eu.uqasar.model.qmtree.QMQualityIndicator;
import eu.uqasar.model.qmtree.QMQualityObjective;
import eu.uqasar.model.qmtree.QMTreeNode;
import eu.uqasar.model.qmtree.QModel;
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.TreeNode;
import eu.uqasar.service.QMTreeNodeService;
import eu.uqasar.service.tree.TreeNodeService;
import eu.uqasar.web.pages.tree.BaseTreePage;
import eu.uqasar.web.pages.tree.projects.ProjectViewPage;

/**
 * 
 *
 *
 */
public class SubsetProposalPanel extends Panel {

    private static final long serialVersionUID = -6492328025617396184L;

    @Inject
    QMTreeNodeService qmTreeNodeService;

    @Inject
    TreeNodeService treeNodeService;

    private final WebMarkupContainer dataContainer = new WebMarkupContainer("dataContainer");
    //   private final Modal saveConfirmationModal;
    private final CheckGroup<QMTreeNode> dataGroup;
    //   private final AjaxSubmitLink saveSelectedButton;

    private final Set<MetaData> projectTags;

    private TreeNode currentParentProjectNode;
    private TreeNode currentParentQualityObjective;
    private TreeNode currentParentQualityIndicator;

    private QMTreeNode currentParentQMProjectNode;
    private QMTreeNode currentParentQMQualityObjective;
    private QMTreeNode currentParentQMQualityIndicator;

    /**
     * @param markupId
     */
    public SubsetProposalPanel(final String markupId) {
        this(markupId, new Project());
    }

    /**
     * @param markupId
      */
    public SubsetProposalPanel(final String markupId, final Project project) {
        super(markupId);

        projectTags = projectTags(project);

        final Form<QMTreeNode> saveForm = new Form<>("saveForm");
        add(saveForm);

        // add checkgroup for selecting multiple measurements
        saveForm.add(dataGroup = newDataCheckGroup());

        // add the container holding list of existing measurements
        dataGroup.add(dataContainer.setOutputMarkupId(true));

        dataContainer.add(new CheckGroupSelector("dataGroupSelector", dataGroup));
        List<QModel> qModelList = new LinkedList<>();
        qModelList.add(project.getQmodel());
        dataContainer.add(new ListView<QMTreeNode>("qmlist", qModelList) {
            private static final long serialVersionUID = -8627579715676163392L;

            @Override
            protected void populateItem(ListItem<QMTreeNode> item) {
                final QMTreeNode qmTreeNode = project.getQmodel(); //item.getModelObject();

                // Adds every Quality Model persisted on platform
                item.add(drawTreeElement("qmodel", item));

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

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

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

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

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

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

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

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

    }

    private Set<MetaData> projectTags(Project project) {
        Set<MetaData> projectTagsSet = new HashSet<>();

        projectTagsSet = new HashSet<>();
        projectTagsSet.addAll(project.getCustomerTypes());
        projectTagsSet.addAll(project.getProjectTypes());
        projectTagsSet.addAll(project.getSoftwareTypes());
        projectTagsSet.addAll(project.getSoftwareLicenses());
        projectTagsSet.addAll(project.getProgrammingLanguages());
        projectTagsSet.addAll(project.getContinuousIntegrationTools());
        projectTagsSet.addAll(project.getIssueTrackingTools());
        projectTagsSet.addAll(project.getSourceCodeManagementTools());
        projectTagsSet.addAll(project.getStaticAnalysisTools());
        projectTagsSet.addAll(project.getTestManagementTools());
        projectTagsSet.addAll(project.getSoftwareDevelopmentMethodologies());

        return projectTagsSet;
    }

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

        container.add(new Label("name", new PropertyModel<String>(node, "name")));
        container.add(new Icon("icon", node.getIconType()));

        Check<QMTreeNode> check = new Check<>("nodeCheck", item.getModel(), dataGroup);
        container.add(check);

        // Adds tags and Checks for elements of the QM
        if (node instanceof QMBaseIndicator) {

            // Marks as Checked if the item has tags coincidences
            for (MetaData tag : projectTags) {
                for (QModelTagData tagModel : ((QMBaseIndicator) node).getQModelTagData()) {
                    if (tagModel.getName().equals(tag.getName())) {
                        check.add(new AttributeModifier("checked", "checked"));
                    }
                }
            }

            // Adds the tags of every element
            WebMarkupContainer tags = new WebMarkupContainer("tags");
            tags.add(newLabelInWMC("tag", new PropertyModel<QModelTagData>(node, "qModelTagData"), tags));
            tags.add(new AttributeModifier("style", "margin-left:50px"));
            container.add(tags);
        }

        return container;
    }

    /**
     * 
     * @return
     */
    private CheckGroup<QMTreeNode> newDataCheckGroup() {
        CheckGroup<QMTreeNode> checkGroup = new CheckGroup<>("dataGroup", new ArrayList<QMTreeNode>());
        checkGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() {

            private static final long serialVersionUID = 7348039334236716476L;

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                //            updateSaveSelectedButton(target);
            }
        });

        return checkGroup;
    }

    /**
     * @param target
     */
    public void saveSelectedItems(AjaxRequestTarget target) {
        String message = new StringResourceModel("subset.selected.created", this, null).getString();
        String labelProject = new StringResourceModel("auto.created.project", this, null).getString();

        long randomId = UUID.randomUUID().toString().hashCode();
        currentParentProjectNode = new Project(labelProject, String.format("prj-%s", randomId));

        // Add selected elements to the current created project
        for (QMTreeNode qmTreeNode : dataGroup.getModelObject()) {
            addNodeToProjectTree(qmTreeNode);
        }

        // Project is created
        treeNodeService.create(currentParentProjectNode);

        // Prints success message
        getPage().success(message);

        // update the save button
        dataGroup.updateModel();

        // Goes to Project view page of the new create project
        setResponsePage(ProjectViewPage.class, BaseTreePage.forProject(currentParentProjectNode.getNodeKey()));
    }

    public void saveSubset(Project project) {

        // Add selected elements to the current created project
        for (QMTreeNode qmTreeNode : dataGroup.getModelObject()) {
            addNodeToProjectTree(qmTreeNode, project);
        }
    }

    /**
     * Create elements from the subset into the provided Project
     * 
     * @param node
     */
    private void addNodeToProjectTree(QMTreeNode node, Project project) {

        String labelObjective = new StringResourceModel("auto.created.objective", this, null).getString();
        String labelIndicator = new StringResourceModel("auto.created.indicator", this, null).getString();

        if (node instanceof QModel) {
            QModel qm = (QModel) node;
            project.setQmodel(qm);
            currentParentQMProjectNode = qm;

        } else if (node instanceof QMQualityObjective) {
            QMQualityObjective qmqo = (QMQualityObjective) node;
            currentParentQualityObjective = new QualityObjective(qmqo, project);
            currentParentQMQualityObjective = qmqo;

        } else if (node instanceof QMQualityIndicator) {
            QMQualityIndicator qmqi = (QMQualityIndicator) node;

            if (qmqi.getParent() != currentParentQMQualityObjective) {
                currentParentQualityObjective = new QualityObjective(labelObjective, project);
                currentParentQMQualityObjective = qmqi.getParent();
            }

            currentParentQualityIndicator = new QualityIndicator(qmqi,
                    (QualityObjective) currentParentQualityObjective);
            currentParentQMQualityIndicator = qmqi;

        } else if (node instanceof QMMetric) {
            QMMetric qmm = (QMMetric) node;

            if (qmm.getParent().getParent() != currentParentQMQualityObjective) {
                currentParentQualityObjective = new QualityObjective(labelObjective, project);
                currentParentQMQualityObjective = qmm.getParent().getParent();
            }

            if (qmm.getParent() != currentParentQMQualityIndicator) {
                currentParentQualityIndicator = new QualityIndicator(labelIndicator,
                        (QualityObjective) currentParentQualityObjective);
                currentParentQMQualityIndicator = qmm.getParent();
            }

            new Metric(qmm, (QualityIndicator) currentParentQualityIndicator);
        }
    }

    /**
     * TO be replaced with the method  addNodeToProjectTree(QMTreeNode node, Project project) 
     * 
     * @param node
     */
    private void addNodeToProjectTree(QMTreeNode node) {

        String labelProjectFrom = new StringResourceModel("from.created.project", this, null).getString();
        String labelObjective = new StringResourceModel("auto.created.objective", this, null).getString();
        String labelIndicator = new StringResourceModel("auto.created.indicator", this, null).getString();

        if (node instanceof QModel) {
            QModel qm = (QModel) node;
            long randomId = UUID.randomUUID().toString().hashCode();
            Project project = new Project(labelProjectFrom + qm.getName(), String.format("prj-%s", randomId));
            project.setQmodel(qm);
            currentParentProjectNode = project;
            currentParentQMProjectNode = qm;

        } else if (node instanceof QMQualityObjective) {
            QMQualityObjective qmqo = (QMQualityObjective) node;
            currentParentQualityObjective = new QualityObjective(qmqo, (Project) currentParentProjectNode);
            currentParentQMQualityObjective = qmqo;

        } else if (node instanceof QMQualityIndicator) {
            QMQualityIndicator qmqi = (QMQualityIndicator) node;

            if (qmqi.getParent() != currentParentQMQualityObjective) {
                currentParentQualityObjective = new QualityObjective(labelObjective,
                        (Project) currentParentProjectNode);
                currentParentQMQualityObjective = qmqi.getParent();
            }

            currentParentQualityIndicator = new QualityIndicator(qmqi,
                    (QualityObjective) currentParentQualityObjective);
            currentParentQMQualityIndicator = qmqi;

        } else if (node instanceof QMMetric) {
            QMMetric qmm = (QMMetric) node;

            if (qmm.getParent().getParent() != currentParentQMQualityObjective) {
                currentParentQualityObjective = new QualityObjective(labelObjective,
                        (Project) currentParentProjectNode);
                currentParentQMQualityObjective = qmm.getParent().getParent();
            }

            if (qmm.getParent() != currentParentQMQualityIndicator) {
                currentParentQualityIndicator = new QualityIndicator(labelIndicator,
                        (QualityObjective) currentParentQualityObjective);
                currentParentQMQualityIndicator = qmm.getParent();
            }

            new Metric(qmm, (QualityIndicator) currentParentQualityIndicator);
        }
    }

    /**
     * @param markUpId
     * @param propertyModel
     * @param wmc
     * @return Returns a label with tags, hidden in the case of object does not have tags
     */
    private <T> Label newLabelInWMC(String markUpId, PropertyModel<QModelTagData> propertyModel,
            final WebMarkupContainer wmc) {
        return new Label(markUpId, propertyModel) {
            private static final long serialVersionUID = 1817873106739742280L;

            @Override
            public void onConfigure() {
                super.onConfigure();
                setDefaultModel(Model.of(this.getDefaultModelObjectAsString().replace("[", "").replace("]", "")));
                if (this.getDefaultModelObjectAsString().isEmpty()) {
                    wmc.setVisible(false);
                }
            }
        };
    }

    /**
     * @return the dataGroup
     */
    public CheckGroup<QMTreeNode> getDataGroup() {
        return dataGroup;
    }

}