You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2014/09/11 10:53:58 UTC

svn commit: r1624232 - in /openmeetings: branches/3.0.x/src/install/java/org/apache/openmeetings/backup/ branches/3.0.x/src/install/java/org/apache/openmeetings/cli/ branches/3.0.x/src/web/java/org/apache/openmeetings/web/admin/backup/ trunk/singleweba...

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) {