Author: solomax
Date: Thu Sep 11 08:53:57 2014
New Revision: 1624232

URL: http://svn.apache.org/r1624232
Log:
[OPENMEETINGS-1079] download progress bar is added

Added:
    
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/backup/ProgressHolder.java
    
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/ProgressHolder.java
Modified:
    
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/backup/BackupExport.java
    
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/cli/Admin.java
    
openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
    
openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
    
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
    
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
    
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
    
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java

Modified: 
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/backup/BackupExport.java
URL: 
http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/backup/BackupExport.java?rev=1624232&r1=1624231&r2=1624232&view=diff
==============================================================================
--- 
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/backup/BackupExport.java
 (original)
+++ 
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/backup/BackupExport.java
 Thu Sep 11 08:53:57 2014
@@ -138,22 +138,24 @@ public class BackupExport {
        @Autowired
        private RoomOrganisationDao roomOrganisationDao;
 
-       public void performExport(File filePath, File backup_dir, boolean 
includeFiles) throws Exception {
+       public void performExport(File filePath, File backup_dir, boolean 
includeFiles, ProgressHolder progressHolder) throws Exception {
                if (!backup_dir.exists()) {
                        backup_dir.mkdirs();
                }
                Serializer simpleSerializer = new Persister();
                
+               progressHolder.setProgress(0);
                /*
                 * ##################### Backup Organizations
                 */
                writeList(simpleSerializer, backup_dir, "organizations.xml",
                                "organisations", organisationDao.get(0, 
Integer.MAX_VALUE));
-
+               progressHolder.setProgress(5);
                /*
                 * ##################### Backup Users
                 */
                exportUsers(backup_dir, usersDao.getAllBackupUsers());
+               progressHolder.setProgress(10);
 
                /*
                 * ##################### Backup Room
@@ -167,6 +169,7 @@ public class BackupExport {
                        registry.bind(RoomType.class, RoomTypeConverter.class);
                        
                        writeList(serializer, backup_dir, "rooms.xml", "rooms", 
roomDao.get());
+                       progressHolder.setProgress(15);
                }
 
                /*
@@ -182,6 +185,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, 
"rooms_organisation.xml",
                                        "room_organisations", 
roomOrganisationDao.get());
+                       progressHolder.setProgress(20);
                }
 
                /*
@@ -202,6 +206,7 @@ public class BackupExport {
                        }
                        
                        writeList(serializer, backup_dir, "appointements.xml", 
"appointments", list);
+                       progressHolder.setProgress(25);
                }
 
                /*
@@ -217,6 +222,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, "meetingmembers.xml",
                                        "meetingmembers", 
meetingMemberDao.getMeetingMembers());
+                       progressHolder.setProgress(30);
                }
 
                /*
@@ -224,16 +230,19 @@ public class BackupExport {
                 */
                writeList(simpleSerializer, backup_dir, "ldapconfigs.xml",
                                "ldapconfigs", ldapConfigDao.get());
+               progressHolder.setProgress(35);
 
                /*
                 * ##################### Cluster servers
                 */
                writeList(simpleSerializer, backup_dir, "servers.xml", 
"servers", serverDao.get(0, Integer.MAX_VALUE));
+               progressHolder.setProgress(40);
 
                /*
                 * ##################### OAuth2 servers
                 */
                writeList(simpleSerializer, backup_dir, "oauth2servers.xml", 
"oauth2servers", auth2Dao.get(0, Integer.MAX_VALUE));
+               progressHolder.setProgress(45);
 
                /*
                 * ##################### Private Messages
@@ -252,6 +261,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, "privateMessages.xml",
                                        "privatemessages", list);
+                       progressHolder.setProgress(50);
                }
 
                /*
@@ -259,6 +269,7 @@ public class BackupExport {
                 */
                writeList(simpleSerializer, backup_dir, 
"privateMessageFolder.xml",
                                "privatemessagefolders", 
privateMessageFolderDao.get(0, Integer.MAX_VALUE));
+               progressHolder.setProgress(55);
 
                /*
                 * ##################### User Contacts
@@ -272,6 +283,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, "userContacts.xml",
                                        "usercontacts", 
userContactsDao.getUserContacts());
+                       progressHolder.setProgress(60);
                }
 
                /*
@@ -289,6 +301,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, 
"fileExplorerItems.xml",
                                        "fileExplorerItems", list);
+                       progressHolder.setProgress(65);
                }
 
                /*
@@ -306,6 +319,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, "flvRecordings.xml",
                                        "flvrecordings", list);
+                       progressHolder.setProgress(70);
                }
 
                /*
@@ -325,6 +339,7 @@ public class BackupExport {
                        }
                        
                        writeList(serializer, backup_dir, "roompolls.xml", 
"roompolls", list);
+                       progressHolder.setProgress(75);
                }
 
                /*
@@ -344,6 +359,7 @@ public class BackupExport {
                        }
                        
                        writeList(serializer, backup_dir, "configs.xml", 
"configs", list);
+                       progressHolder.setProgress(80);
                }
                
                /*
@@ -362,6 +378,7 @@ public class BackupExport {
                        }
                        
                        writeList(serializer, backup_dir, "chat_messages.xml", 
"chat_messages", list);
+                       progressHolder.setProgress(85);
                }
                if (includeFiles) {
                        /*
@@ -398,9 +415,11 @@ public class BackupExport {
                        File sourceDirRec = 
OmFileHelper.getStreamsHibernateDir();
 
                        FileHelper.copyRec(sourceDirRec, targetDirRec);
+                       progressHolder.setProgress(90);
                }
 
                writeZipDir(backup_dir, filePath);
+               progressHolder.setProgress(100);
                log.debug("---Done");
        }
        
@@ -494,7 +513,7 @@ public class BackupExport {
                                File backupFile = new File(backup_dir, 
requestedFile);
 
                                try {
-                                       performExport(backupFile, backup_dir, 
includeFiles);
+                                       performExport(backupFile, backup_dir, 
includeFiles, new ProgressHolder());
 
                                        response.reset();
                                        response.resetBuffer();

Added: 
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/backup/ProgressHolder.java
URL: 
http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/backup/ProgressHolder.java?rev=1624232&view=auto
==============================================================================
--- 
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/backup/ProgressHolder.java
 (added)
+++ 
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/backup/ProgressHolder.java
 Thu Sep 11 08:53:57 2014
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.openmeetings.backup;
+
+import java.io.Serializable;
+
+public class ProgressHolder implements Serializable {
+       private static final long serialVersionUID = 1L;
+       
+       private int progress;
+
+       public int getProgress() {
+               return progress;
+       }
+
+       public void setProgress(int progress) {
+               this.progress = progress;
+       }
+}

Modified: 
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/cli/Admin.java
URL: 
http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/cli/Admin.java?rev=1624232&r1=1624231&r2=1624232&view=diff
==============================================================================
--- 
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/cli/Admin.java
 (original)
+++ 
openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/cli/Admin.java
 Thu Sep 11 08:53:57 2014
@@ -51,6 +51,7 @@ import org.apache.openjpa.lib.log.Log;
 import org.apache.openjpa.lib.log.LogFactoryImpl.LogImpl;
 import org.apache.openmeetings.backup.BackupExport;
 import org.apache.openmeetings.backup.BackupImport;
+import org.apache.openmeetings.backup.ProgressHolder;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
 import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
@@ -300,7 +301,7 @@ public class Admin {
                                        backup_dir.mkdirs();
                                        
                                        BackupExport export = 
getApplicationContext(ctxName).getBean(BackupExport.class);
-                                       export.performExport(f, backup_dir, 
includeFiles);
+                                       export.performExport(f, backup_dir, 
includeFiles, new ProgressHolder());
                                        FileHelper.removeRec(backup_dir);
                                        backup_dir.delete();
                                } catch (Exception e) {

Modified: 
openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
URL: 
http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html?rev=1624232&r1=1624231&r2=1624232&view=diff
==============================================================================
--- 
openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
 (original)
+++ 
openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
 Thu Sep 11 08:53:57 2014
@@ -34,7 +34,8 @@
                    <label><wicket:ommessage key="1537" /></label> <input 
type="checkbox" wicket:id="includeFilesInBackup" />
                    </div>
                    <div class="formelement">
-                      <span wicket:id="progress">[[upload progressbar]]</span>
+                      <span wicket:id="progress"></span>
+                      <div wicket:id="dprogress"></div>
                    </div>
                    <div class="formelement">
                            <!-- Perform Download -->

Modified: 
openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java?rev=1624232&r1=1624231&r2=1624232&view=diff
==============================================================================
--- 
openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
 (original)
+++ 
openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
 Thu Sep 11 08:53:57 2014
@@ -27,6 +27,7 @@ import java.util.Date;
 
 import org.apache.openmeetings.backup.BackupExport;
 import org.apache.openmeetings.backup.BackupImport;
+import org.apache.openmeetings.backup.ProgressHolder;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.util.CalendarPatterns;
 import org.apache.openmeetings.util.OmFileHelper;
@@ -34,6 +35,7 @@ import org.apache.openmeetings.web.admin
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.util.AjaxDownload;
 import org.apache.openmeetings.web.util.BootstrapFileUploadBehavior;
+import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
@@ -47,9 +49,12 @@ import org.apache.wicket.markup.html.pan
 import org.apache.wicket.model.Model;
 import org.apache.wicket.util.lang.Bytes;
 import org.apache.wicket.util.resource.FileResourceStream;
+import org.apache.wicket.util.time.Duration;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
+import com.googlecode.wicket.jquery.ui.widget.progressbar.ProgressBar;
+
 /**
  * Panel component to manage Backup Import/Export
  * 
@@ -72,8 +77,14 @@ public class BackupPanel extends AdminPa
         */
        private class BackupForm extends Form<Void> {
                private static final long serialVersionUID = 1L;
-               private FileUploadField fileUploadField;
-               private Model<Boolean> includeFilesInBackup = Model.of(true);
+               private final FileUploadField fileUploadField;
+               private final Model<Boolean> includeFilesInBackup = 
Model.of(true);
+               private final AbstractAjaxTimerBehavior timer;
+               private final ProgressBar progressBar;
+               private File backupFile;
+               private Throwable th = null;
+               private boolean started = false;
+               private ProgressHolder progressHolder;
 
                public BackupForm(String id) {
                        super(id);
@@ -104,30 +115,20 @@ public class BackupPanel extends AdminPa
 
                                @Override
                                protected void onSubmit(AjaxRequestTarget 
target, Form<?> form) {
-
-                                       File working_dir = 
OmFileHelper.getUploadBackupDir();
-
+                                       File workingDir = 
OmFileHelper.getUploadBackupDir();
                                        String dateString = "backup_" + 
CalendarPatterns.getTimeForStreamId(new Date());
-
-                                       File backup_dir = new File(working_dir, 
dateString);
-                                       File backupFile = new File(backup_dir, 
dateString + ".zip");
-
-                                       try {
-                                               
getBean(BackupExport.class).performExport(
-                                                               backupFile,
-                                                               backup_dir,
-                                                               
includeFilesInBackup.getObject());
-
-                                               
download.setFileName(backupFile.getName());
-                                               download.setResourceStream(new 
FileResourceStream(backupFile));
-                                               download.initiate(target);
-                                       } catch (Exception e) {
-                                               log.error("Exception on panel 
backup download ", e);
-                                               uploadFeedback.error(e);
-                                       }
+                                       File backupDir = new File(workingDir, 
dateString);
+                                       backupFile = new File(backupDir, 
dateString + ".zip");
+                                       th = null;
+                                       started = true;
+                                       progressHolder = new ProgressHolder();
+
+                                       timer.restart(target);
+                                       new Thread(new 
BackupProcess(getBean(BackupExport.class), backupDir, 
includeFilesInBackup.getObject(), progressHolder)
+                                               , "Openmeetings - " + 
dateString).start();
 
                                        // repaint the feedback panel so that 
it is hidden
-                                       target.add(uploadFeedback);
+                                       target.add(uploadFeedback, 
progressBar.setVisible(true));
                                }
 
                                @Override
@@ -136,7 +137,41 @@ public class BackupPanel extends AdminPa
                                        target.add(uploadFeedback);
                                }
                        });
+                       add(timer = new 
AbstractAjaxTimerBehavior(Duration.ONE_SECOND) {
+                               private static final long serialVersionUID = 1L;
+
+                               @Override
+                               protected void onTimer(AjaxRequestTarget 
target) {
+                                       if (!started) {
+                                               timer.stop(target);
+                                               return;
+                                       }
+                                       if (th != null) {
+                                               timer.stop(target);
+                                               //TODO change text, localize
+                                               progressBar.setVisible(false);
+                                               uploadFeedback.error(th);
+                                               target.add(uploadFeedback);
+                                       } else {
+                                               
progressBar.setModelObject(progressHolder.getProgress());
+                                               progressBar.refresh(target);
+                                               //TODO add current step result 
as info
+                                       }
+                               }
+                       });
+                       add((progressBar = new ProgressBar("dprogress", new 
Model<Integer>(0)) {
+                               private static final long serialVersionUID = 1L;
 
+                               @Override
+                               protected void onComplete(AjaxRequestTarget 
target) {
+                                       timer.stop(target);
+                                       
target.add(progressBar.setVisible(false));
+                                       
+                                       
download.setFileName(backupFile.getName());
+                                       download.setResourceStream(new 
FileResourceStream(backupFile));
+                                       download.initiate(target);
+                               }
+                       
}).setVisible(false).setOutputMarkupPlaceholderTag(true));
                        add(fileUploadField.add(new 
AjaxFormSubmitBehavior(this, "onchange") {
                                private static final long serialVersionUID = 1L;
 
@@ -167,6 +202,29 @@ public class BackupPanel extends AdminPa
                        add(new Label("cmdLineDesc", 
WebSession.getString(1505)).setEscapeModelStrings(false));
                }
 
+               private class BackupProcess implements Runnable {
+                       private BackupExport backup;
+                       private File backupDir;
+                       private boolean includeFiles;
+                       private ProgressHolder progressHolder;
+                       
+                       public BackupProcess(BackupExport backup, File 
backupDir, boolean includeFiles, ProgressHolder progressHolder) {
+                               this.backup = backup;
+                               this.backupDir = backupDir;
+                               this.includeFiles = includeFiles;
+                               this.progressHolder = progressHolder;
+                               th = null;
+                       }
+                       
+                       public void run() {
+                               try {
+                                       backup.performExport(backupFile, 
backupDir, includeFiles, progressHolder);
+                               } catch (Exception e) {
+                                       log.error("Exception on panel backup 
download ", e);
+                                       th = e;
+                               }
+                       }
+               }
        }
 
        public BackupPanel(String id) {

Modified: 
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java?rev=1624232&r1=1624231&r2=1624232&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
 Thu Sep 11 08:53:57 2014
@@ -138,22 +138,25 @@ public class BackupExport {
        @Autowired
        private RoomOrganisationDao roomOrganisationDao;
 
-       public void performExport(File filePath, File backup_dir, boolean 
includeFiles) throws Exception {
+       public void performExport(File filePath, File backup_dir, boolean 
includeFiles, ProgressHolder progressHolder) throws Exception {
                if (!backup_dir.exists()) {
                        backup_dir.mkdirs();
                }
                Serializer simpleSerializer = new Persister();
                
+               progressHolder.setProgress(0);
                /*
                 * ##################### Backup Organizations
                 */
                writeList(simpleSerializer, backup_dir, "organizations.xml",
                                "organisations", organisationDao.get(0, 
Integer.MAX_VALUE));
 
+               progressHolder.setProgress(5);
                /*
                 * ##################### Backup Users
                 */
                exportUsers(backup_dir, usersDao.getAllBackupUsers());
+               progressHolder.setProgress(10);
 
                /*
                 * ##################### Backup Room
@@ -167,6 +170,7 @@ public class BackupExport {
                        registry.bind(RoomType.class, RoomTypeConverter.class);
                        
                        writeList(serializer, backup_dir, "rooms.xml", "rooms", 
roomDao.get());
+                       progressHolder.setProgress(15);
                }
 
                /*
@@ -182,6 +186,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, 
"rooms_organisation.xml",
                                        "room_organisations", 
roomOrganisationDao.get());
+                       progressHolder.setProgress(20);
                }
 
                /*
@@ -202,6 +207,7 @@ public class BackupExport {
                        }
                        
                        writeList(serializer, backup_dir, "appointements.xml", 
"appointments", list);
+                       progressHolder.setProgress(25);
                }
 
                /*
@@ -217,6 +223,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, "meetingmembers.xml",
                                        "meetingmembers", 
meetingMemberDao.getMeetingMembers());
+                       progressHolder.setProgress(30);
                }
 
                /*
@@ -224,16 +231,19 @@ public class BackupExport {
                 */
                writeList(simpleSerializer, backup_dir, "ldapconfigs.xml",
                                "ldapconfigs", ldapConfigDao.get());
+               progressHolder.setProgress(35);
 
                /*
                 * ##################### Cluster servers
                 */
                writeList(simpleSerializer, backup_dir, "servers.xml", 
"servers", serverDao.get(0, Integer.MAX_VALUE));
+               progressHolder.setProgress(40);
 
                /*
                 * ##################### OAuth2 servers
                 */
                writeList(simpleSerializer, backup_dir, "oauth2servers.xml", 
"oauth2servers", auth2Dao.get(0, Integer.MAX_VALUE));
+               progressHolder.setProgress(45);
 
                /*
                 * ##################### Private Messages
@@ -252,6 +262,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, "privateMessages.xml",
                                        "privatemessages", list);
+                       progressHolder.setProgress(50);
                }
 
                /*
@@ -259,6 +270,7 @@ public class BackupExport {
                 */
                writeList(simpleSerializer, backup_dir, 
"privateMessageFolder.xml",
                                "privatemessagefolders", 
privateMessageFolderDao.get(0, Integer.MAX_VALUE));
+               progressHolder.setProgress(55);
 
                /*
                 * ##################### User Contacts
@@ -272,6 +284,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, "userContacts.xml",
                                        "usercontacts", 
userContactsDao.getUserContacts());
+                       progressHolder.setProgress(60);
                }
 
                /*
@@ -289,6 +302,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, 
"fileExplorerItems.xml",
                                        "fileExplorerItems", list);
+                       progressHolder.setProgress(65);
                }
 
                /*
@@ -306,6 +320,7 @@ public class BackupExport {
                        
                        writeList(serializer, backup_dir, "flvRecordings.xml",
                                        "flvrecordings", list);
+                       progressHolder.setProgress(70);
                }
 
                /*
@@ -325,6 +340,7 @@ public class BackupExport {
                        }
                        
                        writeList(serializer, backup_dir, "roompolls.xml", 
"roompolls", list);
+                       progressHolder.setProgress(75);
                }
 
                /*
@@ -343,6 +359,7 @@ public class BackupExport {
                        }
                        
                        writeList(serializer, backup_dir, "configs.xml", 
"configs", list);
+                       progressHolder.setProgress(80);
                }
                
                /*
@@ -361,6 +378,7 @@ public class BackupExport {
                        }
                        
                        writeList(serializer, backup_dir, "chat_messages.xml", 
"chat_messages", list);
+                       progressHolder.setProgress(85);
                }
                if (includeFiles) {
                        /*
@@ -397,9 +415,11 @@ public class BackupExport {
                        File sourceDirRec = 
OmFileHelper.getStreamsHibernateDir();
 
                        FileHelper.copyRec(sourceDirRec, targetDirRec);
+                       progressHolder.setProgress(90);
                }
 
                writeZipDir(backup_dir, filePath);
+               progressHolder.setProgress(100);
                log.debug("---Done");
        }
        
@@ -493,7 +513,7 @@ public class BackupExport {
                                File backupFile = new File(backup_dir, 
requestedFile);
 
                                try {
-                                       performExport(backupFile, backup_dir, 
includeFiles);
+                                       performExport(backupFile, backup_dir, 
includeFiles, new ProgressHolder());
 
                                        response.reset();
                                        response.resetBuffer();

Added: 
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/ProgressHolder.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/ProgressHolder.java?rev=1624232&view=auto
==============================================================================
--- 
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/ProgressHolder.java
 (added)
+++ 
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/ProgressHolder.java
 Thu Sep 11 08:53:57 2014
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.openmeetings.backup;
+
+import java.io.Serializable;
+
+public class ProgressHolder implements Serializable {
+       private static final long serialVersionUID = 1L;
+       
+       private int progress;
+
+       public int getProgress() {
+               return progress;
+       }
+
+       public void setProgress(int progress) {
+               this.progress = progress;
+       }
+}

Modified: 
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java?rev=1624232&r1=1624231&r2=1624232&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
 Thu Sep 11 08:53:57 2014
@@ -51,6 +51,7 @@ import org.apache.openjpa.lib.log.Log;
 import org.apache.openjpa.lib.log.LogFactoryImpl.LogImpl;
 import org.apache.openmeetings.backup.BackupExport;
 import org.apache.openmeetings.backup.BackupImport;
+import org.apache.openmeetings.backup.ProgressHolder;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
 import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
@@ -300,7 +301,7 @@ public class Admin {
                                        backup_dir.mkdirs();
                                        
                                        BackupExport export = 
getApplicationContext(ctxName).getBean(BackupExport.class);
-                                       export.performExport(f, backup_dir, 
includeFiles);
+                                       export.performExport(f, backup_dir, 
includeFiles, new ProgressHolder());
                                        FileHelper.removeRec(backup_dir);
                                        backup_dir.delete();
                                } catch (Exception e) {

Modified: 
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html?rev=1624232&r1=1624231&r2=1624232&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
 (original)
+++ 
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
 Thu Sep 11 08:53:57 2014
@@ -34,7 +34,8 @@
                    <label><wicket:ommessage key="1537" /></label> <input 
type="checkbox" wicket:id="includeFilesInBackup" />
                    </div>
                    <div class="formelement">
-                      <span wicket:id="progress">[[upload progressbar]]</span>
+                      <span wicket:id="progress"></span>
+                      <div wicket:id="dprogress"></div>
                    </div>
                    <div class="formelement">
                            <!-- Perform Download -->

Modified: 
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java?rev=1624232&r1=1624231&r2=1624232&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
 Thu Sep 11 08:53:57 2014
@@ -27,6 +27,7 @@ import java.util.Date;
 
 import org.apache.openmeetings.backup.BackupExport;
 import org.apache.openmeetings.backup.BackupImport;
+import org.apache.openmeetings.backup.ProgressHolder;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.util.CalendarPatterns;
 import org.apache.openmeetings.util.OmFileHelper;
@@ -34,6 +35,7 @@ import org.apache.openmeetings.web.admin
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.util.AjaxDownload;
 import org.apache.openmeetings.web.util.BootstrapFileUploadBehavior;
+import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
@@ -47,9 +49,11 @@ import org.apache.wicket.markup.html.pan
 import org.apache.wicket.model.Model;
 import org.apache.wicket.util.lang.Bytes;
 import org.apache.wicket.util.resource.FileResourceStream;
+import org.apache.wicket.util.time.Duration;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
+import com.googlecode.wicket.jquery.ui.widget.progressbar.ProgressBar;
 /**
  * Panel component to manage Backup Import/Export
  * 
@@ -72,8 +76,14 @@ public class BackupPanel extends AdminPa
         */
        private class BackupForm extends Form<Void> {
                private static final long serialVersionUID = 1L;
-               private FileUploadField fileUploadField;
-               private Model<Boolean> includeFilesInBackup = Model.of(true);
+               private final FileUploadField fileUploadField;
+               private final Model<Boolean> includeFilesInBackup = 
Model.of(true);
+               private final AbstractAjaxTimerBehavior timer;
+               private final ProgressBar progressBar;
+               private File backupFile;
+               private Throwable th = null;
+               private boolean started = false;
+               private ProgressHolder progressHolder;
 
                public BackupForm(String id) {
                        super(id);
@@ -105,29 +115,20 @@ public class BackupPanel extends AdminPa
                                @Override
                                protected void onSubmit(AjaxRequestTarget 
target, Form<?> form) {
 
-                                       File working_dir = 
OmFileHelper.getUploadBackupDir();
-
+                                       File workingDir = 
OmFileHelper.getUploadBackupDir();
                                        String dateString = "backup_" + 
CalendarPatterns.getTimeForStreamId(new Date());
-
-                                       File backup_dir = new File(working_dir, 
dateString);
-                                       File backupFile = new File(backup_dir, 
dateString + ".zip");
-
-                                       try {
-                                               
getBean(BackupExport.class).performExport(
-                                                               backupFile,
-                                                               backup_dir,
-                                                               
includeFilesInBackup.getObject());
-
-                                               
download.setFileName(backupFile.getName());
-                                               download.setResourceStream(new 
FileResourceStream(backupFile));
-                                               download.initiate(target);
-                                       } catch (Exception e) {
-                                               log.error("Exception on panel 
backup download ", e);
-                                               uploadFeedback.error(e);
-                                       }
+                                       File backupDir = new File(workingDir, 
dateString);
+                                       backupFile = new File(backupDir, 
dateString + ".zip");
+                                       th = null;
+                                       started = true;
+                                       progressHolder = new ProgressHolder();
+
+                                       timer.restart(target);
+                                       new Thread(new 
BackupProcess(getBean(BackupExport.class), backupDir, 
includeFilesInBackup.getObject(), progressHolder)
+                                               , "Openmeetings - " + 
dateString).start();
 
                                        // repaint the feedback panel so that 
it is hidden
-                                       target.add(uploadFeedback);
+                                       target.add(uploadFeedback, 
progressBar.setVisible(true));
                                }
 
                                @Override
@@ -136,7 +137,41 @@ public class BackupPanel extends AdminPa
                                        target.add(uploadFeedback);
                                }
                        });
+                       add(timer = new 
AbstractAjaxTimerBehavior(Duration.ONE_SECOND) {
+                               private static final long serialVersionUID = 1L;
+
+                               @Override
+                               protected void onTimer(AjaxRequestTarget 
target) {
+                                       if (!started) {
+                                               timer.stop(target);
+                                               return;
+                                       }
+                                       if (th != null) {
+                                               timer.stop(target);
+                                               //TODO change text, localize
+                                               progressBar.setVisible(false);
+                                               uploadFeedback.error(th);
+                                               target.add(uploadFeedback);
+                                       } else {
+                                               
progressBar.setModelObject(progressHolder.getProgress());
+                                               progressBar.refresh(target);
+                                               //TODO add current step result 
as info
+                                       }
+                               }
+                       });
+                       add((progressBar = new ProgressBar("dprogress", new 
Model<Integer>(0)) {
+                               private static final long serialVersionUID = 1L;
 
+                               @Override
+                               protected void onComplete(AjaxRequestTarget 
target) {
+                                       timer.stop(target);
+                                       
target.add(progressBar.setVisible(false));
+                                       
+                                       
download.setFileName(backupFile.getName());
+                                       download.setResourceStream(new 
FileResourceStream(backupFile));
+                                       download.initiate(target);
+                               }
+                       
}).setVisible(false).setOutputMarkupPlaceholderTag(true));
                        add(fileUploadField.add(new 
AjaxFormSubmitBehavior(this, "onchange") {
                                private static final long serialVersionUID = 1L;
 
@@ -167,6 +202,29 @@ public class BackupPanel extends AdminPa
                        add(new Label("cmdLineDesc", 
WebSession.getString(1505)).setEscapeModelStrings(false));
                }
 
+               private class BackupProcess implements Runnable {
+                       private BackupExport backup;
+                       private File backupDir;
+                       private boolean includeFiles;
+                       private ProgressHolder progressHolder;
+                       
+                       public BackupProcess(BackupExport backup, File 
backupDir, boolean includeFiles, ProgressHolder progressHolder) {
+                               this.backup = backup;
+                               this.backupDir = backupDir;
+                               this.includeFiles = includeFiles;
+                               this.progressHolder = progressHolder;
+                               th = null;
+                       }
+                       
+                       public void run() {
+                               try {
+                                       backup.performExport(backupFile, 
backupDir, includeFiles, progressHolder);
+                               } catch (Exception e) {
+                                       log.error("Exception on panel backup 
download ", e);
+                                       th = e;
+                               }
+                       }
+               }
        }
 
        public BackupPanel(String id) {


Reply via email to