cz.zcu.kiv.eegdatabase.wui.ui.experiments.ExperimentsPackageDownloadPage.java Source code

Java tutorial

Introduction

Here is the source code for cz.zcu.kiv.eegdatabase.wui.ui.experiments.ExperimentsPackageDownloadPage.java

Source

/*******************************************************************************
 * This file is part of the EEG-database project
 * 
 *   ==========================================
 *  
 *   Copyright (C) 2013 by University of West Bohemia (http://www.zcu.cz/en/)
 *  
 *  ***********************************************************************************************************************
 *  
 *   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.
 *  
 *  ***********************************************************************************************************************
 *  
 *   ExperimentsPackageDownloadPage.java, 2014/11/13 00:01 Jakub Rinkes
 ******************************************************************************/
package cz.zcu.kiv.eegdatabase.wui.ui.experiments;

import com.googlecode.wicket.jquery.ui.panel.JQueryFeedbackPanel;
import com.googlecode.wicket.jquery.ui.widget.progressbar.ProgressBar;
import cz.zcu.kiv.eegdatabase.data.pojo.Experiment;
import cz.zcu.kiv.eegdatabase.data.pojo.ExperimentPackage;
import cz.zcu.kiv.eegdatabase.data.pojo.License;
import cz.zcu.kiv.eegdatabase.data.pojo.Person;
import cz.zcu.kiv.eegdatabase.logic.controller.experiment.MetadataCommand;
import cz.zcu.kiv.eegdatabase.wui.app.session.EEGDataBaseSession;
import cz.zcu.kiv.eegdatabase.wui.components.menu.button.ButtonPageMenu;
import cz.zcu.kiv.eegdatabase.wui.components.page.MenuPage;
import cz.zcu.kiv.eegdatabase.wui.components.utils.FileUtils;
import cz.zcu.kiv.eegdatabase.wui.components.utils.PageParametersUtils;
import cz.zcu.kiv.eegdatabase.wui.components.utils.ResourceUtils;
import cz.zcu.kiv.eegdatabase.wui.core.experimentLicense.ExperimentLicenseFacade;
import cz.zcu.kiv.eegdatabase.wui.core.experimentpackage.ExperimentPackageFacade;
import cz.zcu.kiv.eegdatabase.wui.core.experimentpackage.ExperimentPackageLicenseFacade;
import cz.zcu.kiv.eegdatabase.wui.core.experiments.DownloadPackageManager;
import cz.zcu.kiv.eegdatabase.wui.core.experiments.ExperimentDownloadProvider;
import cz.zcu.kiv.eegdatabase.wui.core.experiments.ExperimentsFacade;
import cz.zcu.kiv.eegdatabase.wui.core.file.FileDTO;
import cz.zcu.kiv.eegdatabase.wui.core.license.LicenseFacade;
import cz.zcu.kiv.eegdatabase.wui.core.person.PersonFacade;
import cz.zcu.kiv.eegdatabase.wui.ui.licenses.components.ViewLicensePanel;
import org.apache.wicket.RestartResponseAtInterceptPageException;
import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.IAjaxIndicatorAware;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.extensions.ajax.markup.html.AjaxIndicatorAppender;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
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.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.PageableListView;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.string.StringValue;
import org.apache.wicket.util.time.Duration;

import java.util.ArrayList;
import java.util.List;

@AuthorizeInstantiation(value = { "ROLE_READER", "ROLE_USER", "ROLE_EXPERIMENTER", "ROLE_ADMIN" })
public class ExperimentsPackageDownloadPage extends MenuPage {

    private static final long serialVersionUID = -2458549683564604189L;

    @SpringBean
    private ExperimentPackageFacade expPckFacade;

    @SpringBean
    private ExperimentsFacade expFacade;

    @SpringBean
    private ExperimentDownloadProvider downloadProvider;

    @SpringBean
    private PersonFacade personFacade;

    @SpringBean
    private LicenseFacade licenseFacade;

    @SpringBean
    private ExperimentPackageLicenseFacade experimentPackageLicenseFacade;
    @SpringBean
    private ExperimentLicenseFacade experimentLicenseFacade;

    public ExperimentsPackageDownloadPage(PageParameters parameters) {

        StringValue packageIdValue = parameters.get(DEFAULT_PARAM_ID);
        if (packageIdValue.isNull() || packageIdValue.isEmpty())
            throw new RestartResponseAtInterceptPageException(ListExperimentsByPackagePage.class);
        else
            setupComponents(packageIdValue.toInt());
    }

    private void setupComponents(int packageId) {

        setPageTitle(ResourceUtils.getModel("pageTitle.downloadPackage"));
        add(new ButtonPageMenu("leftMenu", ExperimentsPageLeftMenu.values()));

        ExperimentPackage experimentPackage = expPckFacade.read(packageId);

        add(new Label("packageName", experimentPackage.getName()));
        add(new ExperimentPackageDownloadForm("form", experimentPackage, downloadProvider, expPckFacade));

    }

    private class ExperimentPackageDownloadForm extends Form<MetadataCommand> implements IAjaxIndicatorAware {

        private static final long serialVersionUID = 163130449536922222L;
        private IModel<License> licenseModel;
        private ProgressBar progressBar;
        AjaxSubmitLink submit;
        private int step = 0;
        Link<Void> downloadLink;
        FileDTO outputFile;
        DownloadPackageManager manager;
        private final AjaxIndicatorAppender indicator = new AjaxIndicatorAppender();

        public ExperimentPackageDownloadForm(String id, final ExperimentPackage expPackage,
                final ExperimentDownloadProvider downloadProvider, final ExperimentPackageFacade expPckFacade) {
            super(id, new CompoundPropertyModel<MetadataCommand>(new MetadataCommand()));
            setOutputMarkupId(true);

            final FeedbackPanel feedback = new JQueryFeedbackPanel("feedback");
            add(feedback.setOutputMarkupId(true));

            boolean canSeePersonInfoAboutUser = false;
            Person loggedPerson = EEGDataBaseSession.get().getLoggedUser();
            if (loggedPerson.getAuthority().equals("ROLE_ADMIN")) {
                canSeePersonInfoAboutUser = true;
            }

            if (personFacade.userNameInGroup(loggedPerson.getUsername(),
                    expPackage.getResearchGroup().getResearchGroupId())) {
                canSeePersonInfoAboutUser = true;
            }

            List<Experiment> experiments = expFacade.getExperimentsByPackage(expPackage.getExperimentPackageId());
            final List<Experiment> selectList = new ArrayList<Experiment>(experiments);

            final CheckGroup<Experiment> group = new CheckGroup<Experiment>("group", selectList);

            final AbstractAjaxTimerBehavior timer = new AbstractAjaxTimerBehavior(Duration.milliseconds(500)) {

                private static final long serialVersionUID = 1L;

                @Override
                protected void onTimer(AjaxRequestTarget target) {
                    if (manager != null) {
                        if (manager.getNumberOfExperiments() == 0) {
                            step = 100;
                        } else {
                            double percentage = (double) manager.getNumberOfDownloadedExperiments()
                                    / manager.getNumberOfExperiments() * 100;
                            step = (int) percentage - progressBar.getModelObject();
                        }
                    }
                    progressBar.forward(target, step);
                }
            };

            add(timer);

            progressBar = new ProgressBar("progress", Model.of(0)) {

                private static final long serialVersionUID = 1L;

                @Override
                public void onValueChanged(AjaxRequestTarget target) {
                    //this.getDefaultModelObjectAsString()
                    info("Creating package: " + manager.getNumberOfDownloadedExperiments() + "/"
                            + manager.getNumberOfExperiments());
                    target.add(feedback);
                }

                @Override
                protected void onComplete(AjaxRequestTarget target) {
                    timer.stop(target); //wicket6

                    info("Package created!");
                    if (manager.isAlive()) {
                        try {
                            manager.join();
                        } catch (InterruptedException e) {
                            error("Error");
                        }
                    }
                    outputFile = manager.getOutputFile();
                    downloadLink.setVisible(true);
                    target.add(downloadLink);
                }
            };

            add(this.progressBar);

            // Indicator //
            //add(new EmptyPanel("indicator").add(this.indicator));

            // Initialize FeedbackPanel //
            //this.info("value: " + this.progressBar.getDefaultModelObjectAsString());

            downloadLink = new Link<Void>("downloadLink") {
                @Override
                public void onClick() {

                    if (outputFile == null || outputFile.getFile() == null)
                        error("Error while file is generated. Can't be downloaded.");
                    else if (outputFile.isDeleted()) {

                        setResponsePage(ExperimentsPackageDownloadPage.class,
                                PageParametersUtils.getDefaultPageParameters(expPackage.getExperimentPackageId()));
                    } else {
                        outputFile.setDeleted(true);
                        getPage().getRequestCycle()
                                .scheduleRequestHandlerAfterCurrent(FileUtils.prepareDownloadFile(outputFile));
                    }

                }
            };
            downloadLink.setOutputMarkupPlaceholderTag(true);
            downloadLink.setOutputMarkupId(true);
            downloadLink.setVisible(false);
            add(downloadLink);

            group.add(new CheckGroupSelector("selectedAll", group));

            PageableListView<Experiment> experimentsList = new PageableListView<Experiment>("selectExp",
                    experiments, Integer.MAX_VALUE) {

                private static final long serialVersionUID = 1L;

                @Override
                protected void populateItem(ListItem<Experiment> item) {
                    item.setModel(new CompoundPropertyModel<Experiment>(item.getModel()));
                    item.add(new Check<Experiment>("selected", item.getModel()));
                    item.add(new Label("experimentId"));
                    item.add(new Label("scenario.title"));
                    item.add(new Label("startTime"));
                    item.add(new Label("personBySubjectPersonId.gender"));
                    item.add(new Label("personBySubjectPersonId.dateOfBirth"));
                }
            };

            group.add(experimentsList);
            group.setOutputMarkupPlaceholderTag(true);
            group.setOutputMarkupId(true);
            group.setRenderBodyOnly(false);
            // add(new AjaxPagingNavigator("navigator",experimentsList));
            add(group);

            // checkbox for group of checkboxes about person
            //            add(new AjaxCheckBox("person") {
            //
            //                private static final long serialVersionUID = 1L;
            //
            //                @Override
            //                protected void onUpdate(AjaxRequestTarget target) {
            //
            //                    target.add(ExperimentPackageDownloadForm.this);
            //                }
            //            });
            //            // checkbox for group of checkboxes about scenario
            //            add(new AjaxCheckBox("scenario") {
            //
            //                private static final long serialVersionUID = 1L;
            //
            //                @Override
            //                protected void onUpdate(AjaxRequestTarget target) {
            //
            //                    target.add(ExperimentPackageDownloadForm.this);
            //                }
            //            });
            //            // checkbox for group of checkboxes about measuration
            //            add(new AjaxCheckBox("measuration") {
            //
            //                private static final long serialVersionUID = 1L;
            //
            //                @Override
            //                protected void onUpdate(AjaxRequestTarget target) {
            //
            //                    target.add(ExperimentPackageDownloadForm.this);
            //                }
            //            });
            //
            //            // personal info is hidded bud if u check all its checked in data too.
            //            // so before generate file is this unchecked in command manualy
            //            // all checkboxes in checkbox groups.
            //
            //            add(new CheckBox("name").setVisibilityAllowed(canSeePersonInfoAboutUser));
            //            add(new CheckBox("birth").setVisibilityAllowed(canSeePersonInfoAboutUser));
            //            add(new CheckBox("gender"));
            //            add(new CheckBox("phoneNumber").setVisibilityAllowed(canSeePersonInfoAboutUser));
            //            add(new CheckBox("email").setVisibilityAllowed(canSeePersonInfoAboutUser));
            //            add(new CheckBox("note"));
            //            add(new CheckBox("personAddParams"));
            //            add(new CheckBox("title"));
            //            add(new CheckBox("length"));
            //            add(new CheckBox("description"));
            //            add(new CheckBox("scenFile"));
            //            add(new CheckBox("times"));
            //            add(new CheckBox("temperature"));
            //            add(new CheckBox("weather"));
            //            add(new CheckBox("weatherNote"));
            //            add(new CheckBox("hardware"));
            //            add(new CheckBox("measurationAddParams"));
            //
            //            // chooseAll checkbox indicate via metadatacommand information - all data is checked and ajax update page.
            //            add(new AjaxCheckBox("chooseAll") {
            //
            //                private static final long serialVersionUID = 1L;
            //
            //                @Override
            //                protected void onUpdate(AjaxRequestTarget target) {
            //                    target.add(ExperimentPackageDownloadForm.this);
            //                }
            //            });

            final boolean uncheckPersonInfo = canSeePersonInfoAboutUser;
            submit = new AjaxSubmitLink("submit", this) {

                private static final long serialVersionUID = 1L;

                @Override
                protected void onSubmit(AjaxRequestTarget target, Form form) {
                    // because we used object for check we have all data rdy to use.
                    //progressBar.setVisible(true);
                    this.setVisible(false);
                    group.setVisible(false);
                    target.add(group);
                    target.add(this);

                    MetadataCommand command = ExperimentPackageDownloadForm.this.getModelObject();
                    if (!uncheckPersonInfo) {
                        command.setName(false);
                        command.setBirth(false);
                        command.setEmail(false);
                        command.setPhoneNumber(false);
                    }
                    command.setScenario(true);
                    manager = new DownloadPackageManager(expPackage, command, licenseModel.getObject(), selectList,
                            downloadProvider, personFacade.getLoggedPerson());
                    manager.start();
                    timer.restart(target);
                    progressBar.setModelObject(0);
                    step = 1;

                    //outputFile = downloadProvider.generatePackageFile(expPackage, command, licenseModel.getObject(), selectList);

                    //                    if (outputFile == null || outputFile.getFile() == null)
                    //                        error("Error while file is generated. Can't be downloaded.");
                    //                    else {
                    //                        getRequestCycle().scheduleRequestHandlerAfterCurrent(FileUtils.prepareDownloadFile(outputFile));
                    //                    }
                }
            };
            submit.setOutputMarkupId(true);
            submit.setOutputMarkupPlaceholderTag(true);
            add(submit);

            final ModalWindow viewLicenseWindow = new ModalWindow("viewLicenseWindow");
            viewLicenseWindow.setAutoSize(true);
            viewLicenseWindow.setResizable(false);
            viewLicenseWindow.setMinimalWidth(700);
            viewLicenseWindow.setWidthUnit("px");
            add(viewLicenseWindow);

            licenseModel = new Model<License>();
            License license = licenseFacade.getLicenseForPurchasedExpPackage(expPackage.getExperimentPackageId(),
                    EEGDataBaseSession.get().getLoggedUser().getPersonId());
            licenseModel.setObject(license);

            viewLicenseWindow
                    .setContent(new ViewLicensePanel(viewLicenseWindow.getContentId(), licenseModel, false));
            viewLicenseWindow.setTitle(ResourceUtils.getModel("dataTable.heading.licenseTitle"));
            AjaxLink<License> viewLicenseLink = new AjaxLink<License>("viewLicenseLink", licenseModel) {

                private static final long serialVersionUID = 1L;

                @Override
                public void onClick(AjaxRequestTarget target) {
                    viewLicenseWindow.show(target);
                }

                @Override
                protected void onConfigure() {
                    super.onConfigure();
                    this.setVisible(licenseModel.getObject() != null);
                }

            };
            viewLicenseLink.setOutputMarkupPlaceholderTag(true);
            add(viewLicenseLink);

        }

        @Override
        public String getAjaxIndicatorMarkupId() {
            return null;
        }
    }
}