You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by se...@apache.org on 2012/10/14 14:30:02 UTC

svn commit: r1398067 - in /incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web: components/admin/backup/BackupPanel.html components/admin/backup/BackupPanel.java util/ util/AjaxDownload.java

Author: sebawagner
Date: Sun Oct 14 12:30:02 2012
New Revision: 1398067

URL: http://svn.apache.org/viewvc?rev=1398067&view=rev
Log:
OPENMEETINGS-444 - basic functionality, however backup does currently not work at all (see OPENMEETINGS-445)

Added:
    incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/
    incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/AjaxDownload.java
Modified:
    incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/backup/BackupPanel.html
    incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/backup/BackupPanel.java

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/backup/BackupPanel.html
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/backup/BackupPanel.html?rev=1398067&r1=1398066&r2=1398067&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/backup/BackupPanel.html (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/backup/BackupPanel.html Sun Oct 14 12:30:02 2012
@@ -38,9 +38,9 @@
 	            <span wicket:id="progress">[[upload progressbar]]</span>
 	            <br/>
 	            <!-- Perform Download -->
-				<input type="submit" value="System Import" wicket:id="ajax-backup-download-button" />
+				<input type="submit" value="System Import" wicket:id="ajax-backup-upload-button" />
 				<!-- Perform Upload -->
-				<input type="submit" value="System Backup" wicket:id="ajax-backup-upload-button" />
+				<input type="submit" value="System Backup" wicket:id="ajax-backup-download-button" />
 	            <br/>
 	            <!-- Max upload size -->
 	            <wicket:ommessage key="1491" />

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/backup/BackupPanel.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/backup/BackupPanel.java?rev=1398067&r1=1398066&r2=1398067&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/backup/BackupPanel.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/backup/BackupPanel.java Sun Oct 14 12:30:02 2012
@@ -18,19 +18,33 @@
  */
 package org.apache.openmeetings.web.components.admin.backup;
 
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+
+import org.apache.openmeetings.OpenmeetingsVariables;
 import org.apache.openmeetings.data.basic.dao.ConfigurationDaoImpl;
+import org.apache.openmeetings.servlet.outputhandler.BackupExport;
+import org.apache.openmeetings.servlet.outputhandler.BackupImportController;
 import org.apache.openmeetings.utils.ImportHelper;
+import org.apache.openmeetings.utils.OmFileHelper;
+import org.apache.openmeetings.utils.math.CalendarPatterns;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.components.admin.AdminPanel;
+import org.apache.openmeetings.web.util.AjaxDownload;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.extensions.ajax.markup.html.form.upload.UploadProgressBar;
 import org.apache.wicket.markup.html.form.CheckBox;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.upload.FileUpload;
 import org.apache.wicket.markup.html.form.upload.FileUploadField;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.util.lang.Bytes;
+import org.apache.wicket.util.resource.FileResourceStream;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
 
 /**
  * Panel component to manage Backup Import/Export
@@ -40,8 +54,11 @@ import org.apache.wicket.util.lang.Bytes
  */
 public class BackupPanel extends AdminPanel {
 
+	private static final Logger log = Red5LoggerFactory.getLogger(
+			BackupPanel.class, OpenmeetingsVariables.webAppRootKey);
+
 	private static final long serialVersionUID = -1L;
-	
+
 	// Create feedback panels
 	final FeedbackPanel uploadFeedback;
 
@@ -56,6 +73,7 @@ public class BackupPanel extends AdminPa
 		private static final long serialVersionUID = 1L;
 
 		FileUploadField fileUploadField;
+		CheckBox includeFilesInBackup;
 
 		public BackupForm(String id) {
 			super(id);
@@ -67,20 +85,50 @@ public class BackupPanel extends AdminPa
 			fileUploadField = new FileUploadField("fileInput");
 			add(fileUploadField);
 
-			CheckBox includeFilesInBackup = new CheckBox(
-					"includeFilesInBackup", Model.of(true));
+			includeFilesInBackup = new CheckBox("includeFilesInBackup",
+					Model.of(true));
 			add(includeFilesInBackup);
 
 			// Set maximum size controlled by configuration
 			setMaxSize(Bytes.bytes(ImportHelper.getMaxUploadSize(Application
 					.getBean(ConfigurationDaoImpl.class))));
-			
+
+			// Add a component to download a file without page refresh
+			final AjaxDownload download = new AjaxDownload();
+			add(download);
+
 			// add an download button
 			add(new AjaxButton("ajax-backup-download-button", this) {
 				private static final long serialVersionUID = 839803820502260006L;
 
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+
+					File working_dir = OmFileHelper.getUploadBackupDir();
+
+					String dateString = "backup_"
+							+ CalendarPatterns.getTimeForStreamId(new Date());
+
+					File backup_dir = new File(working_dir, dateString);
+					String requestedFile = dateString + ".zip";
+					File backupFile = new File(backup_dir, requestedFile);
+
+					try {
+						Application.getBean(BackupExport.class).performExport(
+								backupFile,
+								backup_dir,
+								includeFilesInBackup.getConvertedInput()
+										.booleanValue());
+
+						download.setFileName(backupFile.getName());
+						download.setResourceStream(new FileResourceStream(
+					            new org.apache.wicket.util.file.File(backupFile)));
+
+					} catch (Exception e) {
+						log.error("Exception on panel backup download ", e);
+						uploadFeedback.error(e);
+					}
+
 					// repaint the feedback panel so that it is hidden
 					target.add(uploadFeedback);
 
@@ -99,6 +147,22 @@ public class BackupPanel extends AdminPa
 
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+					FileUpload upload = fileUploadField.getFileUpload();
+					try {
+						if (upload.getInputStream() == null) {
+							uploadFeedback.error("File is empty");
+							return;
+						}
+						Application.getBean(BackupImportController.class)
+								.performImport(upload.getInputStream());
+					} catch (IOException e) {
+						log.error("IOException on panel backup upload ", e);
+						uploadFeedback.error(e);
+					} catch (Exception e) {
+						log.error("Exception on panel backup upload ", e);
+						uploadFeedback.error(e);
+					}
+
 					// repaint the feedback panel so that it is hidden
 					target.add(uploadFeedback);
 
@@ -110,6 +174,7 @@ public class BackupPanel extends AdminPa
 					target.add(uploadFeedback);
 				}
 			});
+
 		}
 
 	}

Added: incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/AjaxDownload.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/AjaxDownload.java?rev=1398067&view=auto
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/AjaxDownload.java (added)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/AjaxDownload.java Sun Oct 14 12:30:02 2012
@@ -0,0 +1,82 @@
+package org.apache.openmeetings.web.util;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.behavior.AbstractAjaxBehavior;
+import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
+import org.apache.wicket.request.resource.ContentDisposition;
+import org.apache.wicket.util.resource.IResourceStream;
+
+/**
+ * see: <a href="https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow">
+ * https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow</href>
+ * 
+ */
+public class AjaxDownload extends AbstractAjaxBehavior {
+
+	private static final long serialVersionUID = 1L;
+
+	private boolean addAntiCache;
+
+	private String fileName;
+	private IResourceStream resourceStream;
+
+	public AjaxDownload() {
+		this(true);
+	}
+
+	public AjaxDownload(boolean addAntiCache) {
+		super();
+		this.addAntiCache = addAntiCache;
+	}
+
+	/**
+	 * Call this method to initiate the download.
+	 */
+	public void initiate(AjaxRequestTarget target) {
+		String url = getCallbackUrl().toString();
+
+		if (addAntiCache) {
+			url = url + (url.contains("?") ? "&" : "?");
+			url = url + "antiCache=" + System.currentTimeMillis();
+		}
+
+		// the timeout is needed to let Wicket release the channel
+		target.appendJavaScript("setTimeout(\"window.location.href='" + url
+				+ "'\", 100);");
+	}
+
+	public void onRequest() {
+		ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(
+				getResourceStream(), getFileName());
+		handler.setContentDisposition(ContentDisposition.ATTACHMENT);
+		getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(
+				handler);
+	}
+
+	/**
+	 * Override this method for a file name which will let the browser prompt
+	 * with a save/open dialog.
+	 * 
+	 * @see ResourceStreamRequestTarget#getFileName()
+	 */
+	protected String getFileName() {
+		return this.fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+
+	/**
+	 * Hook method providing the actual resource stream.
+	 */
+	protected IResourceStream getResourceStream() {
+		return resourceStream;
+
+	}
+
+	public void setResourceStream(IResourceStream resourceStream) {
+		this.resourceStream = resourceStream;
+	}
+
+}