From e583980b3e721ebcaa5794fe3b2864a71c8df963 Mon Sep 17 00:00:00 2001 From: stebjan Date: Tue, 16 Feb 2016 14:22:55 +0100 Subject: [PATCH] #142 - migration to production --- .../experiments/DownloadPackageManager.java | 71 ++++++++ .../ExperimentDownloadProvider.java | 13 +- .../eegdatabase/wui/core/file/FileDTO.java | 13 +- .../ExperimentsPackageDownloadPage.html | 52 ++++-- .../ExperimentsPackageDownloadPage.java | 172 ++++++++++++++++-- .../wui/app/EEGDataBaseApplication.properties | 1 + 6 files changed, 279 insertions(+), 43 deletions(-) create mode 100644 src/main/java/cz/zcu/kiv/eegdatabase/wui/core/experiments/DownloadPackageManager.java diff --git a/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/experiments/DownloadPackageManager.java b/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/experiments/DownloadPackageManager.java new file mode 100644 index 00000000..396c6bab --- /dev/null +++ b/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/experiments/DownloadPackageManager.java @@ -0,0 +1,71 @@ +package cz.zcu.kiv.eegdatabase.wui.core.experiments; + +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.core.file.FileDTO; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by stebjan on 15.2.2016. + */ +public class DownloadPackageManager extends Thread implements Serializable{ + + private int numberOfExperiments; + private int numberOfDownloadedExperiments; + private FileDTO outputFile; + private ExperimentPackage expPackage; + private MetadataCommand command; + private License license; + private List selectList; + private ExperimentDownloadProvider downloadProvider; + private Person loggedUser; + + public DownloadPackageManager(ExperimentPackage pckg, MetadataCommand mc, License license, List selectList, + ExperimentDownloadProvider provider, Person user) { + numberOfDownloadedExperiments = 0; + numberOfExperiments = 0; + expPackage = pckg; + command = mc; + this.license = license; + this.selectList = selectList; + downloadProvider = provider; + loggedUser = user; + + } + + + @Override + public void run() { + numberOfExperiments = selectList.size(); + outputFile = downloadProvider.generatePackageFile(expPackage, command, license, selectList, loggedUser, this); + } + + public int getNumberOfExperiments() { + return numberOfExperiments; + } + + public void setNumberOfExperiments(int numberOfExperiments) { + this.numberOfExperiments = numberOfExperiments; + } + + public int getNumberOfDownloadedExperiments() { + return numberOfDownloadedExperiments; + } + + public void setNumberOfDownloadedExperiments(int numberOfDownloadedExperiments) { + this.numberOfDownloadedExperiments = numberOfDownloadedExperiments; + } + + public FileDTO getOutputFile() { + return outputFile; + } + + public void setOutputFile(FileDTO outputFile) { + this.outputFile = outputFile; + } +} diff --git a/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/experiments/ExperimentDownloadProvider.java b/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/experiments/ExperimentDownloadProvider.java index 3c103583..5f325551 100644 --- a/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/experiments/ExperimentDownloadProvider.java +++ b/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/experiments/ExperimentDownloadProvider.java @@ -126,7 +126,7 @@ public FileDTO generate(Experiment exp, MetadataCommand mc, Collection Set newFiles = prepareDataFilesWithParameters(files, params); // prepared history log - createHistoryRecordAboutDownload(experiment); + createHistoryRecordAboutDownload(experiment, personService.getLoggedPerson()); License license = licenseService.getLicenseForPurchasedExperiment(exp.getExperimentId(), EEGDataBaseSession.get().getLoggedUser().getPersonId()); byte[] licenseFile = licenseService.getLicenseAttachmentContent(license.getLicenseId()); @@ -155,7 +155,8 @@ public FileDTO generate(Experiment exp, MetadataCommand mc, Collection } @Transactional - public FileDTO generatePackageFile(ExperimentPackage pckg, MetadataCommand mc, License license, List selectList) { + public FileDTO generatePackageFile(ExperimentPackage pckg, MetadataCommand mc, License license, List selectList, + Person loggedUser, DownloadPackageManager manager) { ZipOutputStream zipOutputStream = null; FileOutputStream fileOutputStream = null; @@ -204,7 +205,10 @@ public FileDTO generatePackageFile(ExperimentPackage pckg, MetadataCommand mc, L IOUtils.closeQuietly(in); FileUtils.deleteQuietly(file); - createHistoryRecordAboutDownload(exp); + createHistoryRecordAboutDownload(exp, loggedUser); + synchronized (this) { + manager.setNumberOfDownloadedExperiments(manager.getNumberOfDownloadedExperiments() + 1); + } } dto.setFile(tempZipFile); @@ -232,9 +236,8 @@ public FileDTO generatePackageFile(ExperimentPackage pckg, MetadataCommand mc, L } } - private void createHistoryRecordAboutDownload(Experiment experiment) { + private void createHistoryRecordAboutDownload(Experiment experiment, Person user) { - Person user = personService.getLoggedPerson(); Timestamp currentTimestamp = new java.sql.Timestamp(Calendar.getInstance().getTime().getTime()); History history = new History(); log.debug("Setting downloading metadata"); diff --git a/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/file/FileDTO.java b/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/file/FileDTO.java index f43d4b1b..a05bd143 100644 --- a/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/file/FileDTO.java +++ b/src/main/java/cz/zcu/kiv/eegdatabase/wui/core/file/FileDTO.java @@ -22,10 +22,10 @@ ******************************************************************************/ package cz.zcu.kiv.eegdatabase.wui.core.file; -import java.io.File; - import cz.zcu.kiv.eegdatabase.wui.core.dto.IdentifiDTO; +import java.io.File; + /** * Object for file transfer in wicket. * @@ -39,6 +39,15 @@ public class FileDTO extends IdentifiDTO { private String fileName; private String mimetype; private File file; + private boolean deleted; + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } public String getFileName() { return fileName; diff --git a/src/main/java/cz/zcu/kiv/eegdatabase/wui/ui/experiments/ExperimentsPackageDownloadPage.html b/src/main/java/cz/zcu/kiv/eegdatabase/wui/ui/experiments/ExperimentsPackageDownloadPage.html index 86a315fd..9e0d3a3a 100644 --- a/src/main/java/cz/zcu/kiv/eegdatabase/wui/ui/experiments/ExperimentsPackageDownloadPage.html +++ b/src/main/java/cz/zcu/kiv/eegdatabase/wui/ui/experiments/ExperimentsPackageDownloadPage.html @@ -2,22 +2,22 @@ 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.html, 2014/11/13 00:01 Jakub Rinkes --> @@ -32,7 +32,7 @@

- +

@@ -40,7 +40,7 @@

- +
@@ -123,12 +123,36 @@

- +

- + + +
+ + + + + + + + +
+
+
+
+
+ +
+
+ + + +
+ + @@ -154,11 +178,7 @@

- -
- - -
+
diff --git a/src/main/java/cz/zcu/kiv/eegdatabase/wui/ui/experiments/ExperimentsPackageDownloadPage.java b/src/main/java/cz/zcu/kiv/eegdatabase/wui/ui/experiments/ExperimentsPackageDownloadPage.java index dcbe3c78..e83f30af 100644 --- a/src/main/java/cz/zcu/kiv/eegdatabase/wui/ui/experiments/ExperimentsPackageDownloadPage.java +++ b/src/main/java/cz/zcu/kiv/eegdatabase/wui/ui/experiments/ExperimentsPackageDownloadPage.java @@ -22,6 +22,8 @@ ******************************************************************************/ 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; @@ -31,8 +33,10 @@ 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.experimentpackage.ExperimentPackageFacade; +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; @@ -40,20 +44,30 @@ 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.*; +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; @@ -65,7 +79,7 @@ public class ExperimentsPackageDownloadPage extends MenuPage { @SpringBean private ExperimentPackageFacade expPckFacade; - + @SpringBean private ExperimentsFacade expFacade; @@ -99,16 +113,26 @@ private void setupComponents(int packageId) { } - private class ExperimentPackageDownloadForm extends Form { + private class ExperimentPackageDownloadForm extends Form implements IAjaxIndicatorAware{ private static final long serialVersionUID = 163130449536922222L; private IModel licenseModel; + private ProgressBar progressBar; + AjaxSubmitLink submit; + private int step = 0; + Link downloadLink; + FileDTO outputFile; + DownloadPackageManager manager; + private final AjaxIndicatorAppender indicator = new AjaxIndicatorAppender(); public ExperimentPackageDownloadForm(String id, final ExperimentPackage expPackage, final ExperimentDownloadProvider downloadProvider, - final ExperimentPackageFacade expPckFacade) { + final ExperimentPackageFacade expPckFacade) { super(id, new CompoundPropertyModel(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")) { @@ -118,11 +142,96 @@ public ExperimentPackageDownloadForm(String id, final ExperimentPackage expPacka if (personFacade.userNameInGroup(loggedPerson.getUsername(), expPackage.getResearchGroup().getResearchGroupId())) { canSeePersonInfoAboutUser = true; } - + List experiments = expFacade.getExperimentsByPackage(expPackage.getExperimentPackageId()); final List selectList = new ArrayList(experiments); - CheckGroup group = new CheckGroup("group", selectList); + final CheckGroup group = new CheckGroup("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("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)); @@ -143,7 +252,10 @@ protected void populateItem(ListItem item) { }; group.add(experimentsList); - // add(new AjaxPagingNavigator("navigator",experimentsList)); + group.setOutputMarkupPlaceholderTag(true); + group.setOutputMarkupId(true); + group.setRenderBodyOnly(false); + // add(new AjaxPagingNavigator("navigator",experimentsList)); add(group); // checkbox for group of checkboxes about person @@ -214,13 +326,19 @@ protected void populateItem(ListItem item) { // }); final boolean uncheckPersonInfo = canSeePersonInfoAboutUser; - SubmitLink submit = new SubmitLink("submit") { + submit = new AjaxSubmitLink("submit", this) { private static final long serialVersionUID = 1L; @Override - public void onSubmit() { + 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); @@ -228,29 +346,35 @@ public void onSubmit() { command.setEmail(false); command.setPhoneNumber(false); } - - FileDTO 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)); - } + manager = new DownloadPackageManager(expPackage, command, licenseModel.getObject(), selectList, downloadProvider, personFacade.getLoggedPerson()); + manager.start(); + timer.restart(target); + progressBar.setModelObject(0); + + //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 = 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 viewLicenseLink = new AjaxLink("viewLicenseLink", licenseModel) { @@ -273,5 +397,13 @@ protected void onConfigure() { add(viewLicenseLink); } + + @Override + public String getAjaxIndicatorMarkupId() { + return null; + } } } + + + diff --git a/src/main/resources/cz/zcu/kiv/eegdatabase/wui/app/EEGDataBaseApplication.properties b/src/main/resources/cz/zcu/kiv/eegdatabase/wui/app/EEGDataBaseApplication.properties index d2a706ec..691d6671 100644 --- a/src/main/resources/cz/zcu/kiv/eegdatabase/wui/app/EEGDataBaseApplication.properties +++ b/src/main/resources/cz/zcu/kiv/eegdatabase/wui/app/EEGDataBaseApplication.properties @@ -517,6 +517,7 @@ label.hearingDefect=Hearing defect label.chooseAll=Choose all label.chooseFile=Choose all data files label.chooseExperiments=Choose experiments included in downloaded package. +label.packageProgress=Creating package progress: label.chooseGroup=Choose group label.in=in label.length=Length