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 2017/05/01 06:09:09 UTC

[23/50] [abbrv] openmeetings git commit: [OPENMEETINGS-1617] backup export is improved

[OPENMEETINGS-1617] backup export is improved


Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/d532ba9a
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/d532ba9a
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/d532ba9a

Branch: refs/heads/3.2.x
Commit: d532ba9aed1fb5b44a549630a0b7c01d36eaa53b
Parents: 0d93bd2
Author: Maxim Solodovnik <so...@apache.org>
Authored: Wed Mar 29 14:03:28 2017 +0000
Committer: Maxim Solodovnik <so...@apache.org>
Committed: Wed Mar 29 14:03:28 2017 +0000

----------------------------------------------------------------------
 .../openmeetings/backup/BackupExport.java       | 557 +++++++++----------
 .../java/org/apache/openmeetings/cli/Admin.java |   2 +-
 .../web/admin/backup/BackupPanel.java           |  12 +-
 3 files changed, 268 insertions(+), 303 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/d532ba9a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
----------------------------------------------------------------------
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
index 53eb680..7522528 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
@@ -25,6 +25,7 @@ import static org.apache.openmeetings.util.OmFileHelper.BCKP_ROOM_FILES;
 import static org.apache.openmeetings.util.OmFileHelper.IMPORT_DIR;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -81,13 +82,13 @@ import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
- * 
+ *
  * @author sebastianwagner
- * 
+ *
  */
 public class BackupExport {
 	private static final Logger log = Red5LoggerFactory.getLogger(BackupExport.class, webAppRootKey);
-	private static final String BACKUP_COMMENT = 
+	private static final String BACKUP_COMMENT =
 			"###############################################\n"
 			+ "This File is auto-generated by the Backup Tool \n"
 			+ "you should use the BackupPanel to modify or change this file \n"
@@ -131,315 +132,297 @@ public class BackupExport {
 	@Autowired
 	private RoomGroupDao roomGroupDao;
 
-	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 Groups
-		 */
-		writeList(simpleSerializer, backup_dir, "organizations.xml", "organisations", groupDao.get(0, Integer.MAX_VALUE));
-		progressHolder.setProgress(5);
-		/*
-		 * ##################### Backup Users
-		 */
-		exportUsers(backup_dir, userDao.getAllBackupUsers());
-		progressHolder.setProgress(10);
-
-		/*
-		 * ##################### Backup Room
-		 */
-		{
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-	
-			registry.bind(User.class, UserConverter.class);
-			registry.bind(Room.Type.class, RoomTypeConverter.class);
-			
-			writeList(serializer, backup_dir, "rooms.xml", "rooms", roomDao.get());
-			progressHolder.setProgress(15);
+	public void performExport(File zip, boolean includeFiles, ProgressHolder progressHolder) throws Exception {
+		if (!zip.getParentFile().exists()) {
+			zip.getParentFile().mkdirs();
 		}
+		try (FileOutputStream fos = new FileOutputStream(zip); ZipOutputStream zos = new ZipOutputStream(fos)) {
 
-		/*
-		 * ##################### Backup Room Groups
-		 */
-		{
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-	
-			registry.bind(Group.class, GroupConverter.class);
-			registry.bind(Room.class, RoomConverter.class);
-			
-			writeList(serializer, backup_dir, "rooms_organisation.xml", "room_organisations", roomGroupDao.get());
-			progressHolder.setProgress(17);
-		}
+			Serializer ser = new Persister();
 
-		/*
-		 * ##################### Backup Calendars
-		 */
-		{
-			List<OmCalendar> list = calendarDao.get();
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-			registry.bind(User.class, UserConverter.class);
-
-			writeList(serializer, backup_dir, "calendars.xml", "calendars", list);
-			progressHolder.setProgress(22);
-		}
-		/*
-		 * ##################### Backup Appointments
-		 */
-		{
-			List<Appointment> list = appointmentDao.get();
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-
-			registry.bind(User.class, UserConverter.class);
-			registry.bind(Appointment.Reminder.class, AppointmentReminderTypeConverter.class);
-			registry.bind(Room.class, RoomConverter.class);
-			if (list != null && !list.isEmpty()) {
-				for (Appointment a : list) {
-					if (a.getStart() != null) {
-						registry.bind(a.getStart().getClass(), DateConverter.class);
-						break;
-					} else if (a.getInserted() != null) {
-						registry.bind(a.getInserted().getClass(), DateConverter.class);
-						break;
-					}
-				}
+			progressHolder.setProgress(0);
+			/*
+			 * ##################### Backup Groups
+			 */
+			writeList(ser, zos, "organizations.xml", "organisations", groupDao.get(0, Integer.MAX_VALUE));
+			progressHolder.setProgress(5);
+			/*
+			 * ##################### Backup Users
+			 */
+			exportUsers(zos, userDao.getAllBackupUsers());
+			progressHolder.setProgress(10);
+
+			/*
+			 * ##################### Backup Room
+			 */
+			{
+				Registry registry = new Registry();
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+
+				registry.bind(User.class, UserConverter.class);
+				registry.bind(Room.Type.class, RoomTypeConverter.class);
+
+				writeList(serializer, zos, "rooms.xml", "rooms", roomDao.get());
+				progressHolder.setProgress(15);
 			}
 
-			writeList(serializer, backup_dir, "appointements.xml", "appointments", list);
-			progressHolder.setProgress(25);
-		}
+			/*
+			 * ##################### Backup Room Groups
+			 */
+			{
+				Registry registry = new Registry();
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
 
-		/*
-		 * ##################### Backup Meeting Members
-		 */
-		{
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-	
-			registry.bind(User.class, UserConverter.class);
-			registry.bind(Appointment.class, AppointmentConverter.class);
-			
-			writeList(serializer, backup_dir, "meetingmembers.xml",
-					"meetingmembers", meetingMemberDao.getMeetingMembers());
-			progressHolder.setProgress(30);
-		}
+				registry.bind(Group.class, GroupConverter.class);
+				registry.bind(Room.class, RoomConverter.class);
 
-		/*
-		 * ##################### LDAP Configs
-		 */
-		List<LdapConfig> ldapList = ldapConfigDao.get();
-		if (!ldapList.isEmpty()) {
-			ldapList.remove(0);
-		}
-		writeList(simpleSerializer, backup_dir, "ldapconfigs.xml", "ldapconfigs", ldapList);
-		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
-		 */
-		{
-			List<PrivateMessage> list = privateMessageDao.get(0, Integer.MAX_VALUE);
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-	
-			registry.bind(User.class, UserConverter.class);
-			registry.bind(Room.class, RoomConverter.class);
-			if (list != null && !list.isEmpty()) {
-				registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
+				writeList(serializer, zos, "rooms_organisation.xml", "room_organisations", roomGroupDao.get());
+				progressHolder.setProgress(17);
 			}
-			
-			writeList(serializer, backup_dir, "privateMessages.xml",
-					"privatemessages", list);
-			progressHolder.setProgress(50);
-		}
 
-		/*
-		 * ##################### Private Message Folders
-		 */
-		writeList(simpleSerializer, backup_dir, "privateMessageFolder.xml",
-				"privatemessagefolders", privateMessageFolderDao.get(0, Integer.MAX_VALUE));
-		progressHolder.setProgress(55);
-
-		/*
-		 * ##################### User Contacts
-		 */
-		{
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-	
-			registry.bind(User.class, UserConverter.class);
-			
-			writeList(serializer, backup_dir, "userContacts.xml",
-					"usercontacts", userContactDao.get());
-			progressHolder.setProgress(60);
-		}
+			/*
+			 * ##################### Backup Calendars
+			 */
+			{
+				List<OmCalendar> list = calendarDao.get();
+				Registry registry = new Registry();
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+				registry.bind(User.class, UserConverter.class);
+
+				writeList(serializer, zos, "calendars.xml", "calendars", list);
+				progressHolder.setProgress(22);
+			}
+			/*
+			 * ##################### Backup Appointments
+			 */
+			{
+				List<Appointment> list = appointmentDao.get();
+				Registry registry = new Registry();
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+
+				registry.bind(User.class, UserConverter.class);
+				registry.bind(Appointment.Reminder.class, AppointmentReminderTypeConverter.class);
+				registry.bind(Room.class, RoomConverter.class);
+				if (list != null && !list.isEmpty()) {
+					for (Appointment a : list) {
+						if (a.getStart() != null) {
+							registry.bind(a.getStart().getClass(), DateConverter.class);
+							break;
+						} else if (a.getInserted() != null) {
+							registry.bind(a.getInserted().getClass(), DateConverter.class);
+							break;
+						}
+					}
+				}
 
-		/*
-		 * ##################### File-Explorer
-		 */
-		{
-			List<FileExplorerItem> list = fileExplorerItemDao.get();
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-	
-			if (list != null && !list.isEmpty()) {
-				registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
+				writeList(serializer, zos, "appointements.xml", "appointments", list);
+				progressHolder.setProgress(25);
 			}
-			
-			writeList(serializer, backup_dir, "fileExplorerItems.xml",
-					"fileExplorerItems", list);
-			progressHolder.setProgress(65);
-		}
 
-		/*
-		 * ##################### Recordings
-		 */
-		{
-			List<Recording> list = recordingDao.get();
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-	
-			if (list != null && !list.isEmpty()) {
-				registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
+			/*
+			 * ##################### Backup Meeting Members
+			 */
+			{
+				Registry registry = new Registry();
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+
+				registry.bind(User.class, UserConverter.class);
+				registry.bind(Appointment.class, AppointmentConverter.class);
+
+				writeList(serializer, zos, "meetingmembers.xml",
+						"meetingmembers", meetingMemberDao.getMeetingMembers());
+				progressHolder.setProgress(30);
 			}
-			
-			writeList(serializer, backup_dir, "flvRecordings.xml", "flvrecordings", list);
-			progressHolder.setProgress(70);
-		}
 
-		/*
-		 * ##################### Polls
-		 */
-		{
-			List<RoomPoll> list = pollManager.get();
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-	
-			registry.bind(User.class, UserConverter.class);
-			registry.bind(Room.class, RoomConverter.class);
-			registry.bind(RoomPoll.Type.class, PollTypeConverter.class);
-			if (list != null && !list.isEmpty()) {
-				registry.bind(list.get(0).getCreated().getClass(), DateConverter.class);
+			/*
+			 * ##################### LDAP Configs
+			 */
+			List<LdapConfig> ldapList = ldapConfigDao.get();
+			if (!ldapList.isEmpty()) {
+				ldapList.remove(0);
 			}
-			
-			writeList(serializer, backup_dir, "roompolls.xml", "roompolls", list);
-			progressHolder.setProgress(75);
-		}
+			writeList(ser, zos, "ldapconfigs.xml", "ldapconfigs", ldapList);
+			progressHolder.setProgress(35);
+
+			/*
+			 * ##################### Cluster servers
+			 */
+			writeList(ser, zos, "servers.xml", "servers", serverDao.get(0, Integer.MAX_VALUE));
+			progressHolder.setProgress(40);
+
+			/*
+			 * ##################### OAuth2 servers
+			 */
+			writeList(ser, zos, "oauth2servers.xml", "oauth2servers", auth2Dao.get(0, Integer.MAX_VALUE));
+			progressHolder.setProgress(45);
+
+			/*
+			 * ##################### Private Messages
+			 */
+			{
+				List<PrivateMessage> list = privateMessageDao.get(0, Integer.MAX_VALUE);
+				Registry registry = new Registry();
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+
+				registry.bind(User.class, UserConverter.class);
+				registry.bind(Room.class, RoomConverter.class);
+				if (list != null && !list.isEmpty()) {
+					registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
+				}
 
-		/*
-		 * ##################### Config
-		 */
-		{
-			List<Configuration> list = configurationDao.getConfigurations(0, Integer.MAX_VALUE, "c.id", true);
-			Registry registry = new Registry();
-			registry.bind(User.class, UserConverter.class);
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-	
-			if (list != null && !list.isEmpty()) {
-				registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
+				writeList(serializer, zos, "privateMessages.xml",
+						"privatemessages", list);
+				progressHolder.setProgress(50);
 			}
-			
-			writeList(serializer, backup_dir, "configs.xml", "configs", list);
-			progressHolder.setProgress(80);
-		}
-		
-		/*
-		 * ##################### Chat
-		 */
-		{
-			List<ChatMessage> list = chatDao.get(0, Integer.MAX_VALUE);
-			Registry registry = new Registry();
-			registry.bind(User.class, UserConverter.class);
-			registry.bind(Room.class, RoomConverter.class);
-			Strategy strategy = new RegistryStrategy(registry);
-			Serializer serializer = new Persister(strategy);
-	
-			if (list != null && !list.isEmpty()) {
-				registry.bind(list.get(0).getSent().getClass(), DateConverter.class);
+
+			/*
+			 * ##################### Private Message Folders
+			 */
+			writeList(ser, zos, "privateMessageFolder.xml",
+					"privatemessagefolders", privateMessageFolderDao.get(0, Integer.MAX_VALUE));
+			progressHolder.setProgress(55);
+
+			/*
+			 * ##################### User Contacts
+			 */
+			{
+				Registry registry = new Registry();
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+
+				registry.bind(User.class, UserConverter.class);
+
+				writeList(serializer, zos, "userContacts.xml", "usercontacts", userContactDao.get());
+				progressHolder.setProgress(60);
 			}
-			
-			writeList(serializer, backup_dir, "chat_messages.xml", "chat_messages", list);
-			progressHolder.setProgress(85);
-		}
-		if (includeFiles) {
+
 			/*
-			 * ##################### Backup Room Files
+			 * ##################### File-Explorer
 			 */
-			File targetRootDir = new File(backup_dir, BCKP_ROOM_FILES);
+			{
+				List<FileExplorerItem> list = fileExplorerItemDao.get();
+				Registry registry = new Registry();
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+
+				if (list != null && !list.isEmpty()) {
+					registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
+				}
 
-			if (!targetRootDir.exists()) {
-				targetRootDir.mkdir();
+				writeList(serializer, zos, "fileExplorerItems.xml", "fileExplorerItems", list);
+				progressHolder.setProgress(65);
 			}
 
-			File sourceDir = OmFileHelper.getUploadDir();
+			/*
+			 * ##################### Recordings
+			 */
+			{
+				List<Recording> list = recordingDao.get();
+				Registry registry = new Registry();
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+
+				if (list != null && !list.isEmpty()) {
+					registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
+				}
 
-			File[] files = sourceDir.listFiles();
-			for (File file : files) {
-				if (file.isDirectory()) {
-					String fName = file.getName();
-					if (!IMPORT_DIR.equals(fName) && !BACKUP_DIR.equals(fName)) {
-						log.debug("### " + file.getName());
+				writeList(serializer, zos, "flvRecordings.xml", "flvrecordings", list);
+				progressHolder.setProgress(70);
+			}
 
-						FileUtils.copyDirectory(file, new File(targetRootDir, file.getName()));
-					}
+			/*
+			 * ##################### Polls
+			 */
+			{
+				List<RoomPoll> list = pollManager.get();
+				Registry registry = new Registry();
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+
+				registry.bind(User.class, UserConverter.class);
+				registry.bind(Room.class, RoomConverter.class);
+				registry.bind(RoomPoll.Type.class, PollTypeConverter.class);
+				if (list != null && !list.isEmpty()) {
+					registry.bind(list.get(0).getCreated().getClass(), DateConverter.class);
 				}
+
+				writeList(serializer, zos, "roompolls.xml", "roompolls", list);
+				progressHolder.setProgress(75);
 			}
 
 			/*
-			 * ##################### Backup Recording Files
+			 * ##################### Config
 			 */
-			File targetDirRec = new File(backup_dir, BCKP_RECORD_FILES);
+			{
+				List<Configuration> list = configurationDao.getConfigurations(0, Integer.MAX_VALUE, "c.id", true);
+				Registry registry = new Registry();
+				registry.bind(User.class, UserConverter.class);
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+
+				if (list != null && !list.isEmpty()) {
+					registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
+				}
 
-			if (!targetDirRec.exists()) {
-				targetDirRec.mkdir();
+				writeList(serializer, zos, "configs.xml", "configs", list);
+				progressHolder.setProgress(80);
 			}
 
-			File sourceDirRec = OmFileHelper.getStreamsHibernateDir();
+			/*
+			 * ##################### Chat
+			 */
+			{
+				List<ChatMessage> list = chatDao.get(0, Integer.MAX_VALUE);
+				Registry registry = new Registry();
+				registry.bind(User.class, UserConverter.class);
+				registry.bind(Room.class, RoomConverter.class);
+				Strategy strategy = new RegistryStrategy(registry);
+				Serializer serializer = new Persister(strategy);
+
+				if (list != null && !list.isEmpty()) {
+					registry.bind(list.get(0).getSent().getClass(), DateConverter.class);
+				}
 
-			FileUtils.copyDirectory(sourceDirRec, targetDirRec);
-			progressHolder.setProgress(90);
-		}
+				writeList(serializer, zos, "chat_messages.xml", "chat_messages", list);
+				progressHolder.setProgress(85);
+			}
+			if (includeFiles) {
+				//##################### Backup Room Files
+				for (File file : OmFileHelper.getUploadDir().listFiles()) {
+					if (file.isDirectory()) {
+						String fName = file.getName();
+						if (!IMPORT_DIR.equals(fName) && !BACKUP_DIR.equals(fName)) {
+							log.debug("### " + file.getName());
+							writeZipDir(BCKP_ROOM_FILES, file.getParentFile().toURI(), file, zos);
+						}
+					}
+				}
 
-		writeZipDir(backup_dir, filePath);
+				//##################### Backup Recording Files
+				File recDir = OmFileHelper.getStreamsHibernateDir();
+				writeZipDir(BCKP_RECORD_FILES, recDir.toURI(), recDir, zos);
+				progressHolder.setProgress(90);
+			}
+		}
 		progressHolder.setProgress(100);
 		log.debug("---Done");
 	}
-	
-	private static <T> void writeList(Serializer ser, File backup_dir, String fileName, String listElement, List<T> list) throws Exception {
-		FileOutputStream fos = new FileOutputStream(new File(backup_dir, fileName));
-		writeList(ser, fos, listElement, list);
+
+	private static <T> void writeList(Serializer ser, ZipOutputStream zos, String fileName, String listElement, List<T> list) throws Exception {
+		ZipEntry e = new ZipEntry(fileName);
+		zos.putNextEntry(e);
+		ByteArrayOutputStream baos = new ByteArrayOutputStream(10 * 1024); //10K
+		writeList(ser, baos, listElement, list);
+		zos.write(baos.toByteArray());
+		zos.closeEntry();
 	}
-	
+
 	private static <T> void writeList(Serializer ser, OutputStream os, String listElement, List<T> list) throws Exception {
 		Format format = new Format("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
 		OutputNode doc = NodeBuilder.write(new OutputStreamWriter(os, UTF_8), format);
@@ -459,15 +442,10 @@ public class BackupExport {
 		root.commit();
 	}
 
-	public void exportUsers(File backup_dir, List<User> list) throws Exception {
-		FileOutputStream fos = new FileOutputStream(new File(backup_dir, "users.xml"));
-		exportUsers(fos, list);
-	}
-	
-	public void exportUsers(OutputStream os, List<User> list) throws Exception {
+	public void exportUsers(ZipOutputStream zos, List<User> list) throws Exception {
 		Registry registry = new Registry();
 		Strategy strategy = new RegistryStrategy(registry);
-		Serializer serializer = new Persister(strategy);
+		Serializer ser = new Persister(strategy);
 
 		registry.bind(Group.class, GroupConverter.class);
 		registry.bind(Salutation.class, SalutationConverter.class);
@@ -475,25 +453,16 @@ public class BackupExport {
 			Class<?> dateClass = list.get(0).getRegdate() != null ? list.get(0).getRegdate().getClass() : list.get(0).getInserted().getClass();
 			registry.bind(dateClass, DateConverter.class);
 		}
-		
-		writeList(serializer, os, "users", list);
-	}
 
-	private void writeZipDir(File directoryToZip, File zipFile) throws IOException {
-		try (FileOutputStream fos = new FileOutputStream(zipFile); ZipOutputStream zos = new ZipOutputStream(fos)) {
-			writeZipDir(directoryToZip.toURI(), directoryToZip, zos, zipFile);
-		}
+		writeList(ser, zos, "users.xml", "users", list);
 	}
-	
-	private void writeZipDir(URI base, File dir, ZipOutputStream zos, File zipFile) throws IOException {
+
+	private void writeZipDir(String prefix, URI base, File dir, ZipOutputStream zos) throws IOException {
 		for (File file : dir.listFiles()) {
-			if (zipFile.equals(file)) {
-				continue;
-			}
 			if (file.isDirectory()) {
-				writeZipDir(base, file, zos, zipFile);
+				writeZipDir(prefix, base, file, zos);
 			} else {
-				String path = base.relativize(file.toURI()).toString();
+				String path = prefix + "/" + base.relativize(file.toURI()).toString();
 				log.debug("Writing '" + path + "' to zip file");
 				ZipEntry zipEntry = new ZipEntry(path);
 				zos.putNextEntry(zipEntry);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/d532ba9a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
----------------------------------------------------------------------
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
index f5375ea..2162223 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
@@ -295,7 +295,7 @@ public class Admin {
 					backup_dir.mkdirs();
 
 					BackupExport export = getApplicationContext().getBean(BackupExport.class);
-					export.performExport(f, backup_dir, includeFiles, new ProgressHolder());
+					export.performExport(f, includeFiles, new ProgressHolder());
 					FileUtils.deleteDirectory(backup_dir);
 					backup_dir.delete();
 				} catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/d532ba9a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
index 74020d9..f804ba6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
@@ -114,16 +114,14 @@ public class BackupPanel extends AdminPanel {
 
 				@Override
 				protected void onSubmit(AjaxRequestTarget target) {
-					File workingDir = OmFileHelper.getUploadBackupDir();
 					String dateString = "backup_" + CalendarPatterns.getTimeForStreamId(new Date());
-					File backupDir = new File(workingDir, dateString);
-					backupFile = new File(backupDir, dateString + ".zip");
+					backupFile = new File(OmFileHelper.getUploadBackupDir(), dateString + ".zip");
 					th = null;
 					started = true;
 					progressHolder = new ProgressHolder();
 
 					timer.restart(target);
-					new Thread(new BackupProcess(getBean(BackupExport.class), backupDir, includeFilesInBackup.getObject())
+					new Thread(new BackupProcess(getBean(BackupExport.class), includeFilesInBackup.getObject())
 						, "Openmeetings - " + dateString).start();
 
 					// repaint the feedback panel so that it is hidden
@@ -209,12 +207,10 @@ public class BackupPanel extends AdminPanel {
 
 		private class BackupProcess implements Runnable {
 			private BackupExport backup;
-			private File backupDir;
 			private boolean includeFiles;
 
-			public BackupProcess(BackupExport backup, File backupDir, boolean includeFiles) {
+			public BackupProcess(BackupExport backup, boolean includeFiles) {
 				this.backup = backup;
-				this.backupDir = backupDir;
 				this.includeFiles = includeFiles;
 				th = null;
 			}
@@ -222,7 +218,7 @@ public class BackupPanel extends AdminPanel {
 			@Override
 			public void run() {
 				try {
-					backup.performExport(backupFile, backupDir, includeFiles, progressHolder);
+					backup.performExport(backupFile, includeFiles, progressHolder);
 				} catch (Exception e) {
 					log.error("Exception on panel backup download ", e);
 					th = e;