eu.uqasar.web.pages.tree.historic.project.HistoricProjectPage.java Source code

Java tutorial

Introduction

Here is the source code for eu.uqasar.web.pages.tree.historic.project.HistoricProjectPage.java

Source

package eu.uqasar.web.pages.tree.historic.project;

/*
 * #%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.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.inject.Inject;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.OnLoadHeaderItem;
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.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;

import com.googlecode.wickedcharts.highcharts.options.Axis;
import com.googlecode.wickedcharts.highcharts.options.Legend;
import com.googlecode.wickedcharts.highcharts.options.Options;
import com.googlecode.wickedcharts.highcharts.options.Title;
import com.googlecode.wickedcharts.highcharts.options.series.SimpleSeries;
import com.googlecode.wickedcharts.wicket6.highcharts.Chart;

import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.CssClassNameAppender;
import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
import de.agilecoders.wicket.core.markup.html.bootstrap.navigation.ajax.BootstrapAjaxPagingNavigator;
import eu.uqasar.model.tree.ITreeNode;
import eu.uqasar.model.tree.Project;
import eu.uqasar.model.tree.historic.AbstractHistoricValues;
import eu.uqasar.model.tree.historic.HistoricValuesProject;
import eu.uqasar.service.HistoricalDataService;
import eu.uqasar.service.tree.TreeNodeService;
import eu.uqasar.web.components.JSTemplates;
import eu.uqasar.web.components.ModalActionButton;
import eu.uqasar.web.components.NotificationModal;
import eu.uqasar.web.pages.BasePage;
import eu.uqasar.web.provider.EntityProvider;

/**
 * 
 *
 *
 */
public class HistoricProjectPage extends BasePage {

    /**
     * 
     */
    private static final long serialVersionUID = 3800543700842514105L;

    @Inject
    HistoricalDataService historicalService;

    @Inject
    TreeNodeService treeNodeService;

    // how many items do we show per page
    private static final int itemsPerPage = 10;
    private final WebMarkupContainer dataContainer = newDataContainer();
    private final Modal deleteConfirmationModal;
    private final CheckGroup<AbstractHistoricValues> dataGroup;
    private final AjaxSubmitLink deleteSelectedButton;
    private final Chart historicChart;

    private final Long projectId;
    private final Project project;

    /**
     * Constructor building the page
     *
     * @param parameters
     */
    public HistoricProjectPage(final PageParameters parameters) {

        super(parameters);

        // TODO: I dont know why this does not work???
        //      String key = getPageParameters().get("project-key").toOptionalString();
        project = treeNodeService.getTreeNodeByKey("U-QASAR");
        projectId = project.getId();

        add(new Label("metricName", project.getName()));

        final Form<AbstractHistoricValues> deleteForm = new Form<>("deleteForm");
        add(deleteForm);

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

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

        dataContainer.add(new CheckGroupSelector("dataGroupSelector", dataGroup));

        DataView<AbstractHistoricValues> dataMeasurements = new DataView<AbstractHistoricValues>("dataMeasurements",
                new DataProvider(), itemsPerPage) {

            private static final long serialVersionUID = 7687248000895943825L;

            @Override
            protected void populateItem(final Item<AbstractHistoricValues> item) {
                final AbstractHistoricValues historicDataMeasurement = item.getModelObject();

                item.add(new Check<>("dataCheck", item.getModel(), dataGroup));

                item.add(new Label("value", new PropertyModel<String>(historicDataMeasurement, "value")));

                item.add(new Label("lowerAcceptanceLimit",
                        new PropertyModel<String>(historicDataMeasurement, "lowerAcceptanceLimit")));

                item.add(new Label("upperAcceptanceLimit",
                        new PropertyModel<String>(historicDataMeasurement, "upperAcceptanceLimit")));

                item.add(new Label("timeStamp", new PropertyModel<Date>(historicDataMeasurement, "date")));

            }
        };
        dataContainer.add(dataMeasurements);

        // Add graphical representation of the values
        dataContainer.add(historicChart = historicChart());

        // add links for table pagination
        dataContainer.add(new BootstrapAjaxPagingNavigator("navigatorHead", dataMeasurements));
        dataContainer.add(new BootstrapAjaxPagingNavigator("navigatorFoot", dataMeasurements));

        // add button to delete selected items
        dataContainer.add(deleteSelectedButton = newDeleteSelectedButton(dataGroup));

        // add confirmation modal for deleting products
        add(deleteConfirmationModal = newDeleteConfirmationModal());

    }

    /**
     * @return Returns a graphical representation of all the values, 
     *          thresholds and target value by date 
     */
    private Chart historicChart() {
        Options options = new Options();
        options.setTitle(new Title(project.getName()));

        List<Number> values = new ArrayList<>();
        List<Number> upLimit = new ArrayList<>();
        List<Number> lowLimit = new ArrayList<>();
        List<String> dates = new ArrayList<>();

        // Prepare information to be show in the graphic
        for (AbstractHistoricValues h : historicalService.getAllHistValuesForProjectAsc(projectId)) {
            values.add(h.getValue());
            upLimit.add(h.getUpperAcceptanceLimit());
            lowLimit.add(h.getLowerAcceptanceLimit());
            dates.add(new SimpleDateFormat("dd.MM.yyyy").format(h.getDate()));
        }

        // X Axis
        Axis xAxis = new Axis();
        xAxis.setCategories(dates);
        options.setxAxis(xAxis);

        // Y Axis
        Axis yAxis = new Axis();
        options.setyAxis(yAxis);

        // Adding series to the graphic
        options.addSeries(new SimpleSeries().setName("Value").setData(values));
        options.addSeries(new SimpleSeries().setName("UpLimit").setData(upLimit));
        options.addSeries(new SimpleSeries().setName("LowLimit").setData(lowLimit));

        // Legend
        Legend legend = new Legend();
        legend.setBorderWidth(0);
        options.setLegend(legend);

        return new Chart("chart", options);
    }

    /*
     * (non-Javadoc)
     * 
     * @see eu.uqasar.web.BasePage#getPageTitleModel()
     */
    @Override
    protected IModel<String> getPageTitleModel() {
        return new StringResourceModel("page.title", this, null);
    }

    /**
     *
     * @return
     */
    private WebMarkupContainer newDataContainer() {
        return new WebMarkupContainer("dataContainer") {

            private static final long serialVersionUID = 4444294849967215331L;

            @Override
            public void renderHead(IHeaderResponse response) {
                super.renderHead(response);
                // add javascript to load tagsinput plugin
                response.render(
                        OnLoadHeaderItem.forScript(String.format(JSTemplates.LOAD_TABLE_SORTER, "historic-list")));
            }
        };
    }

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

            private static final long serialVersionUID = 7348039334236716476L;

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                updateDeleteSelectedButton(target);
            }
        });
        return checkGroup;
    }

    /**
     *
     * @return
     */
    private AjaxSubmitLink newDeleteSelectedButton(final CheckGroup<AbstractHistoricValues> cubesGroup) {
        return new AjaxSubmitLink("deleteSelected") {

            private static final long serialVersionUID = 1526806233323350647L;

            @Override
            protected void onConfigure() {
                super.onConfigure();
                if (cubesGroup.getModelObject().isEmpty()) {
                    add(new CssClassNameAppender(Model.of("disabled")) {

                        private static final long serialVersionUID = -120425807017807645L;

                        // remove css class when component is rendered again
                        @Override
                        public boolean isTemporary(Component component) {
                            return true;
                        }
                    });
                    setEnabled(false);
                } else {
                    setEnabled(true);
                }
            }

            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                deleteConfirmationModal.appendShowDialogJavaScript(target);
            }
        };
    }

    /**
     *
     * @return
     */
    private NotificationModal newDeleteConfirmationModal() {
        final NotificationModal notificationModal = new NotificationModal("deleteConfirmationModal",
                new StringResourceModel("delete.confirmation.modal.header", this, null),
                new StringResourceModel("delete.confirmation.modal.message", this, null), false);
        notificationModal.addButton(new ModalActionButton(notificationModal, Buttons.Type.Primary,
                new StringResourceModel("delete.confirmation.modal.submit.text", this, null), true) {

            private static final long serialVersionUID = 1797796653537766182L;

            @Override
            protected void onAfterClick(AjaxRequestTarget target) {
                // confirmed --> delete
                deleteSelectedMeasurements(dataGroup.getModelObject(), target);
                // close modal
                closeDeleteConfirmationModal(notificationModal, target);
            }
        });
        notificationModal.addButton(new ModalActionButton(notificationModal, Buttons.Type.Default,
                new StringResourceModel("delete.confirmation.modal.cancel.text", this, null), true) {

            private static final long serialVersionUID = -7504717586865807253L;

            @Override
            protected void onAfterClick(AjaxRequestTarget target) {
                // Cancel clicked --> do nothing, close modal
                closeDeleteConfirmationModal(notificationModal, target);
            }
        });
        return notificationModal;
    }

    /**
     * @param dataMeasurements
     * @param target
     */
    private void deleteSelectedMeasurements(Collection<AbstractHistoricValues> dataMeasurements,
            AjaxRequestTarget target) {
        String message = new StringResourceModel("cubesmeasurement.selected.deleted", this, null).getString();
        // Soft-delete the current selected data 
        historicalService.softDelete(dataMeasurements);
        getPage().success(message);
        updateFeedbackPanel(target);
        updateDataList(target);
        updateGraphic(target);
        // update the delete button
        dataGroup.updateModel();
        updateDeleteSelectedButton(target);
    }

    /**
     *
     * @param modal
      */
    private void closeDeleteConfirmationModal(final Modal modal, AjaxRequestTarget target) {
        // close
        modal.appendCloseDialogJavaScript(target);
    }

    /**
     *
     * @param target
     */
    private void updateDeleteSelectedButton(AjaxRequestTarget target) {
        target.add(deleteSelectedButton);
    }

    /**
     *
     * @param target
     */
    private void updateDataList(AjaxRequestTarget target) {
        target.add(dataContainer);
    }

    private void updateGraphic(AjaxRequestTarget target) {
        target.add(historicChart);
    }

    /**
     *
     * @param target
     */
    private void updateFeedbackPanel(AjaxRequestTarget target) {
        target.add(feedbackPanel);
    }

    protected Long getRequestedNodeId() {
        StringValue id = getPageParameters().get("id");
        if (id.isEmpty()) {
            String key = getPageParameters().get("project-key").toOptionalString();
            if (key != null) {
                ITreeNode<String> node = treeNodeService.getTreeNodeByKey(key);
                if (node != null) {
                    id = StringValue.valueOf(node.getId());
                } else {
                    // TODO give translated message for the 404 reason
                    throw new AbortWithHttpErrorCodeException(404);
                }
            }
        }
        return id.toOptionalLong();
    }

    /**
     *
     *
     *
     */
    private final class DataProvider extends EntityProvider<AbstractHistoricValues> {

        private static final long serialVersionUID = 943605630815322199L;

        @Override
        public Iterator<HistoricValuesProject> iterator(long first, long count) {

            return historicalService.getAllHistValuesForProject(projectId, Long.valueOf(first).intValue(),
                    Long.valueOf(count).intValue()).iterator();
        }

        @Override
        public long size() {
            return historicalService.countHistValuesForProject(projectId);
        }
    }
}