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/11/18 11:56:04 UTC

[2/3] openmeetings git commit: [OPENMEETINGS-1761] restore of backups earlier than 3.1.3 dropped

[OPENMEETINGS-1761] restore of backups earlier than 3.1.3 dropped


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

Branch: refs/heads/master
Commit: 6683e8b21ab7829aaa55e0f92cbd33ba4aa64e2d
Parents: cddace3
Author: Maxim Solodovnik <so...@gmail.com>
Authored: Sat Nov 18 18:55:05 2017 +0700
Committer: Maxim Solodovnik <so...@gmail.com>
Committed: Sat Nov 18 18:55:05 2017 +0700

----------------------------------------------------------------------
 .../openmeetings/backup/BackupImport.java       | 572 +++----------------
 openmeetings-web/pom.xml                        |  54 --
 2 files changed, 84 insertions(+), 542 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/6683e8b2/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
----------------------------------------------------------------------
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index 49a78e6..c4a843d 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
@@ -104,26 +104,16 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.StringReader;
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
 import java.util.UUID;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.openmeetings.backup.converter.AppointmentConverter;
@@ -167,7 +157,6 @@ import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.record.RecordingMetaData;
 import org.apache.openmeetings.db.entity.room.Room;
-import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.db.entity.room.RoomFile;
 import org.apache.openmeetings.db.entity.room.RoomGroup;
 import org.apache.openmeetings.db.entity.room.RoomModerator;
@@ -175,17 +164,14 @@ import org.apache.openmeetings.db.entity.room.RoomPoll;
 import org.apache.openmeetings.db.entity.room.RoomPollAnswer;
 import org.apache.openmeetings.db.entity.server.LdapConfig;
 import org.apache.openmeetings.db.entity.server.OAuthServer;
-import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.PrivateMessage;
 import org.apache.openmeetings.db.entity.user.PrivateMessageFolder;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Salutation;
 import org.apache.openmeetings.db.entity.user.UserContact;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
-import org.apache.openmeetings.db.util.TimezoneUtil;
 import org.apache.openmeetings.util.CalendarPatterns;
 import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.StoredFile;
@@ -203,16 +189,11 @@ import org.simpleframework.xml.transform.RegistryMatcher;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
 
 @Component
 public class BackupImport {
 	private static final Logger log = Red5LoggerFactory.getLogger(BackupImport.class, getWebAppRootKey());
 	private static final String LDAP_EXT_TYPE = "LDAP";
-	private static final Properties countries = new Properties();
 	private static final Map<String, String> outdatedConfigKeys = new HashMap<>();
 	private static final Map<String, Configuration.Type> configTypes = new HashMap<>();
 	static {
@@ -314,8 +295,6 @@ public class BackupImport {
 	@Autowired
 	private ConfigurationDao cfgDao;
 	@Autowired
-	private TimezoneUtil tzUtil;
-	@Autowired
 	private ChatDao chatDao;
 	@Autowired
 	private OAuth2Dao auth2Dao;
@@ -334,11 +313,8 @@ public class BackupImport {
 	private final Map<Long, Long> userContactMap = new HashMap<>();
 	private final Map<String, String> fileMap = new HashMap<>();
 
-	private static File validate(String _ename, File intended) throws IOException {
+	private static File validate(String ename, File intended) throws IOException {
 		final String intendedPath = intended.getCanonicalPath();
-		String ename = File.pathSeparatorChar != '\\' && _ename.indexOf('\\') > -1
-				? _ename.replace('\\', '/')
-				: _ename;
 		// for each entry to be extracted
 		File fentry = new File(intended, ename);
 		final String canonicalPath = fentry.getCanonicalPath();
@@ -453,7 +429,7 @@ public class BackupImport {
 		registry.bind(Date.class, DateConverter.class);
 		registry.bind(User.class, new UserConverter(userDao, userMap));
 
-		List<Configuration> list = readList(serializer, f, "configs.xml", "configs", Configuration.class, true);
+		List<Configuration> list = readList(serializer, f, "configs.xml", "configs", Configuration.class);
 		for (Configuration c : list) {
 			if (c.getKey() == null || c.isDeleted()) {
 				continue;
@@ -510,7 +486,7 @@ public class BackupImport {
 	private Long importLdap(File f, Serializer simpleSerializer) throws Exception {
 		log.info("Groups import complete, starting LDAP config import");
 		Long defaultLdapId = cfgDao.getLong(CONFIG_DEFAULT_LDAP_ID, null);
-		List<LdapConfig> list = readList(simpleSerializer, f, "ldapconfigs.xml", "ldapconfigs", LdapConfig.class, true);
+		List<LdapConfig> list = readList(simpleSerializer, f, "ldapconfigs.xml", "ldapconfigs", LdapConfig.class);
 		for (LdapConfig c : list) {
 			if (!"local DB [internal]".equals(c.getName())) {
 				c.setId(null);
@@ -528,7 +504,7 @@ public class BackupImport {
 	 */
 	private void importOauth(File f, Serializer simpleSerializer) throws Exception {
 		log.info("Ldap config import complete, starting OAuth2 server import");
-		List<OAuthServer> list = readList(simpleSerializer, f, "oauth2servers.xml", "oauth2servers", OAuthServer.class, true);
+		List<OAuthServer> list = readList(simpleSerializer, f, "oauth2servers.xml", "oauth2servers", OAuthServer.class);
 		for (OAuthServer s : list) {
 			s.setId(null);
 			auth2Dao.update(s, null);
@@ -541,12 +517,50 @@ public class BackupImport {
 	private void importUsers(File f, Long defaultLdapId) throws Exception {
 		log.info("OAuth2 servers import complete, starting user import");
 		String jNameTimeZone = cfgDao.getString(CONFIG_DEFAULT_TIMEZONE, "Europe/Berlin");
-		List<User> list = readUserList(f, "users.xml", "users");
+		//add existence email from database
+		List<User>  users = userDao.getAllUsers();
+		final Map<String, Integer> userEmailMap = new HashMap<>();
+		final Map<String, Integer> userLoginMap = new HashMap<>();
+		for (User u : users){
+			if (u.getAddress() == null || u.getAddress().getEmail() == null || User.Type.user != u.getType()) {
+				continue;
+			}
+			userEmailMap.put(u.getAddress().getEmail(), Integer.valueOf(-1));
+			userLoginMap.put(u.getLogin(), Integer.valueOf(-1));
+		}
+		Registry registry = new Registry();
+		Strategy strategy = new RegistryStrategy(registry);
+		Serializer ser = new Persister(strategy);
+
+		registry.bind(Group.class, new GroupConverter(groupDao, groupMap));
+		registry.bind(Salutation.class, SalutationConverter.class);
+		registry.bind(Date.class, DateConverter.class);
+		List<User> list = readList(ser, f, "users.xml", "users", User.class);
 		int minLoginLength = getMinLoginLength(cfgDao);
 		for (User u : list) {
 			if (u.getLogin() == null) {
 				continue;
 			}
+			// check that email is unique
+			if (u.getAddress() != null && u.getAddress().getEmail() != null && User.Type.user == u.getType()) {
+				if (userEmailMap.containsKey(u.getAddress().getEmail())) {
+					log.warn("Email is duplicated for user " + u.toString());
+					String updateEmail = String.format("modified_by_import_<%s>%s", UUID.randomUUID(), u.getAddress().getEmail());
+					u.getAddress().setEmail(updateEmail);
+				}
+				userEmailMap.put(u.getAddress().getEmail(), Integer.valueOf(userEmailMap.size()));
+			}
+			if (userLoginMap.containsKey(u.getLogin())) {
+				log.warn("Login is duplicated for user " + u.toString());
+				String updateLogin = String.format("modified_by_import_<%s>%s", UUID.randomUUID(), u.getLogin());
+				u.setLogin(updateLogin);
+			}
+			userLoginMap.put(u.getLogin(), Integer.valueOf(userLoginMap.size()));
+			if (u.getGroupUsers() != null) {
+				for (GroupUser gu : u.getGroupUsers()) {
+					gu.setUser(u);
+				}
+			}
 			if (u.getType() == User.Type.contact && u.getLogin().length() < minLoginLength) {
 				u.setLogin(UUID.randomUUID().toString());
 			}
@@ -588,7 +602,16 @@ public class BackupImport {
 	 */
 	private void importRooms(File f) throws Exception {
 		log.info("Users import complete, starting room import");
-		List<Room> list = readRoomList(f, "rooms.xml", "rooms");
+		Registry registry = new Registry();
+		Strategy strategy = new RegistryStrategy(registry);
+		RegistryMatcher matcher = new RegistryMatcher();
+		Serializer ser = new Persister(strategy, matcher);
+
+		matcher.bind(Long.class, LongTransform.class);
+		matcher.bind(Integer.class, IntegerTransform.class);
+		registry.bind(User.class, new UserConverter(userDao, userMap));
+		registry.bind(Room.Type.class, RoomTypeConverter.class);
+		List<Room> list = readList(ser, f, "rooms.xml", "rooms", Room.class);
 		for (Room r : list) {
 			Long roomId = r.getId();
 
@@ -648,7 +671,7 @@ public class BackupImport {
 		registry.bind(Room.class, new RoomConverter(roomDao, roomMap));
 		registry.bind(Date.class, DateConverter.class);
 
-		List<ChatMessage> list = readList(serializer, f, "chat_messages.xml", "chat_messages", ChatMessage.class, true);
+		List<ChatMessage> list = readList(serializer, f, "chat_messages.xml", "chat_messages", ChatMessage.class);
 		for (ChatMessage m : list) {
 			m.setId(null);
 			if (m.getFromUser() == null || m.getFromUser().getId() == null) {
@@ -720,7 +743,13 @@ public class BackupImport {
 	 */
 	private void importMeetingMembers(File f) throws Exception {
 		log.info("Appointement import complete, starting meeting members import");
-		List<MeetingMember> list = readMeetingMemberList(f, "meetingmembers.xml", "meetingmembers");
+		Registry registry = new Registry();
+		Strategy strategy = new RegistryStrategy(registry);
+		Serializer ser = new Persister(strategy);
+
+		registry.bind(User.class, new UserConverter(userDao, userMap));
+		registry.bind(Appointment.class, new AppointmentConverter(appointmentDao, appointmentMap));
+		List<MeetingMember> list = readList(ser, f, "meetingmembers.xml", "meetingmembers", MeetingMember.class);
 		for (MeetingMember ma : list) {
 			ma.setId(null);
 			meetingMemberDao.update(ma);
@@ -732,7 +761,16 @@ public class BackupImport {
 	 */
 	private void importRecordings(File f) throws Exception {
 		log.info("Meeting members import complete, starting recordings server import");
-		List<Recording> list = readRecordingList(f, "flvRecordings.xml", "flvrecordings");
+		Registry registry = new Registry();
+		Strategy strategy = new RegistryStrategy(registry);
+		RegistryMatcher matcher = new RegistryMatcher();
+		Serializer ser = new Persister(strategy, matcher);
+
+		matcher.bind(Long.class, LongTransform.class);
+		matcher.bind(Integer.class, IntegerTransform.class);
+		registry.bind(Date.class, DateConverter.class);
+		registry.bind(Recording.Status.class, RecordingStatusConverter.class);
+		List<Recording> list = readList(ser, f, "flvRecordings.xml", "flvrecordings", Recording.class);
 		for (Recording r : list) {
 			Long recId = r.getId();
 			r.setId(null);
@@ -768,7 +806,7 @@ public class BackupImport {
 	private void importPrivateMsgFolders(File f, Serializer simpleSerializer) throws Exception {
 		log.info("Recording import complete, starting private message folder import");
 		List<PrivateMessageFolder> list = readList(simpleSerializer, f, "privateMessageFolder.xml"
-			, "privatemessagefolders", PrivateMessageFolder.class, true);
+			, "privatemessagefolders", PrivateMessageFolder.class);
 		for (PrivateMessageFolder p : list) {
 			Long folderId = p.getId();
 			PrivateMessageFolder storedFolder = privateMessageFolderDao.get(folderId);
@@ -791,7 +829,7 @@ public class BackupImport {
 
 		registry.bind(User.class, new UserConverter(userDao, userMap));
 
-		List<UserContact> list = readList(serializer, f, "userContacts.xml", "usercontacts", UserContact.class, true);
+		List<UserContact> list = readList(serializer, f, "userContacts.xml", "usercontacts", UserContact.class);
 		for (UserContact uc : list) {
 			Long ucId = uc.getId();
 			UserContact storedUC = userContactDao.get(ucId);
@@ -820,7 +858,7 @@ public class BackupImport {
 		registry.bind(Room.class, new RoomConverter(roomDao, roomMap));
 		registry.bind(Date.class, DateConverter.class);
 
-		List<PrivateMessage> list = readList(serializer, f, "privateMessages.xml", "privatemessages", PrivateMessage.class, true);
+		List<PrivateMessage> list = readList(serializer, f, "privateMessages.xml", "privatemessages", PrivateMessage.class);
 		boolean oldBackup = true;
 		for (PrivateMessage p : list) {
 			if (p.getFolderId() == null || p.getFolderId().longValue() < 0) {
@@ -860,7 +898,15 @@ public class BackupImport {
 	private List<FileItem> importFiles(File f) throws Exception {
 		log.info("Private message import complete, starting file explorer item import");
 		List<FileItem> result = new ArrayList<>();
-		List<FileItem> list = readFileItemList(f, "fileExplorerItems.xml", "fileExplorerItems");
+		Registry registry = new Registry();
+		Strategy strategy = new RegistryStrategy(registry);
+		RegistryMatcher matcher = new RegistryMatcher();
+		Serializer ser = new Persister(strategy, matcher);
+
+		matcher.bind(Long.class, LongTransform.class);
+		matcher.bind(Integer.class, IntegerTransform.class);
+		registry.bind(Date.class, DateConverter.class);
+		List<FileItem> list = readList(ser, f, "fileExplorerItems.xml", "fileExplorerItems", FileItem.class);
 		for (FileItem file : list) {
 			Long fId = file.getId();
 			// We need to reset this as openJPA reject to store them otherwise
@@ -899,7 +945,7 @@ public class BackupImport {
 		registry.bind(RoomPoll.Type.class, PollTypeConverter.class);
 		registry.bind(Date.class, DateConverter.class);
 
-		List<RoomPoll> list = readList(serializer, f, "roompolls.xml", "roompolls", RoomPoll.class, true);
+		List<RoomPoll> list = readList(serializer, f, "roompolls.xml", "roompolls", RoomPoll.class);
 		for (RoomPoll rp : list) {
 			rp.setId(null);
 			if (rp.getRoom() == null || rp.getRoom().getId() == null) {
@@ -976,32 +1022,6 @@ public class BackupImport {
 		return list;
 	}
 
-	private static Node getNode(Node doc, String name) {
-		if (doc != null) {
-			NodeList nl = doc.getChildNodes();
-			for (int i = 0; i < nl.getLength(); ++i) {
-				Node node = nl.item(i);
-				if (node.getNodeType() == Node.ELEMENT_NODE && name.equals(node.getNodeName())) {
-					return node;
-				}
-			}
-		}
-		return null;
-	}
-
-	public List<User> readUserList(InputStream xml, String listNodeName) throws Exception {
-		return readUserList(new InputSource(xml), listNodeName);
-	}
-
-	public List<User> readUserList(File baseDir, String fileName, String listNodeName) throws Exception {
-		File xml = new File(baseDir, fileName);
-		if (!xml.exists()) {
-			throw new BackupException(fileName + " missing");
-		}
-
-		return readUserList(new InputSource(xml.toURI().toASCIIString()), listNodeName);
-	}
-
 	private static Long getProfileId(File f) {
 		String n = f.getName();
 		if (n.indexOf(PROFILES_PREFIX) > -1) {
@@ -1086,17 +1106,6 @@ public class BackupImport {
 		return val;
 	}
 
-	private static String getCountry(String countryId) {
-		if (countries.isEmpty()) {
-			try (InputStream is = BackupImport.class.getResourceAsStream("countries.properties")) {
-				countries.load(is);
-			} catch (IOException e) {
-				log.error("Unexpected exception during countries import", e);
-			}
-		}
-		return countries.getProperty(String.format("country.%s", countryId));
-	}
-
 	private void convertOldPresentation(FileItem fi) {
 		File f = fi.getOriginal();
 		if (f != null && f.exists()) {
@@ -1108,417 +1117,4 @@ public class BackupImport {
 			}
 		}
 	}
-
-	//TODO (need to be removed in later versions) HACK to fix old properties
-	public List<FileItem> readFileItemList(File baseDir, String fileName, String listNodeName) throws Exception {
-		List<FileItem> list = new ArrayList<>();
-		File xml = new File(baseDir, fileName);
-		if (xml.exists()) {
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			RegistryMatcher matcher = new RegistryMatcher();
-			Serializer ser = new Persister(strategy, matcher);
-
-			matcher.bind(Long.class, LongTransform.class);
-			matcher.bind(Integer.class, IntegerTransform.class);
-			registry.bind(Date.class, DateConverter.class);
-
-			try (InputStream rootIs1 = new FileInputStream(xml); InputStream rootIs2 = new FileInputStream(xml);) {
-				InputNode root = NodeBuilder.read(rootIs1);
-				InputNode root1 = NodeBuilder.read(rootIs2); //HACK to handle old isFolder, isImage, isVideo, isRecording, isPresentation, isStoredWmlFile, isChart
-				InputNode listNode = root.getNext();
-				InputNode listNode1 = root1.getNext(); //HACK to handle old isFolder, isImage, isVideo, isRecording, isPresentation, isStoredWmlFile, isChart
-				if (listNodeName.equals(listNode.getName())) {
-					InputNode item = listNode.getNext();
-					InputNode item1 = listNode1.getNext(); //HACK to handle old isFolder, isImage, isVideo, isRecording, isPresentation, isStoredWmlFile, isChart
-					while (item != null) {
-						FileItem f = ser.read(FileItem.class, item, false);
-
-						//HACK to handle old isFolder, isImage, isVideo, isRecording, isPresentation, isStoredWmlFile, isChart, wmlFilePath
-						do {
-							if (item1 == null) {
-								break;
-							}
-							String name = item1.getName();
-							String val = item1.getValue();
-							if ("wmlFilePath".equals(name) && !Strings.isEmpty(val)) {
-								f.setType(BaseFileItem.Type.WmlFile);
-								f.setHash(val);
-							}
-							if (f.getType() == null && "isChart".equals(name) && "true".equals(val)) {
-								f.setType(BaseFileItem.Type.PollChart);
-							}
-							if ("isImage".equals(name) && "true".equals(val)) {
-								f.setType(BaseFileItem.Type.Image);
-							}
-							if ("isVideo".equals(name) && "true".equals(val)) {
-								f.setType(BaseFileItem.Type.Video);
-							}
-							if ("isRecording".equals(name) && "true".equals(val)) {
-								log.warn("Recording is stored in FileExplorer Items");
-								f.setType(BaseFileItem.Type.Video);
-							}
-							if ("isPresentation".equals(name) && "true".equals(val)) {
-								f.setType(BaseFileItem.Type.Presentation);
-							}
-							if ("isStoredWmlFile".equals(name) && "true".equals(val)) {
-								f.setType(BaseFileItem.Type.WmlFile);
-							}
-							if (("folder".equals(name) || "isFolder".equals(name)) && "true".equals(val)) {
-								f.setType(BaseFileItem.Type.Folder);
-							}
-							item1 = listNode1.getNext(); //HACK to handle old isFolder, isImage, isVideo, isRecording, isPresentation, isStoredWmlFile, isChart, wmlFilePath
-						} while (item1 != null && !"fileExplorerItem".equals(item1.getName()));
-
-						//Some hashes were stored with file extension
-						int idx = f.getHash() == null ? -1 : f.getHash().indexOf('.');
-						if (idx > -1) {
-							String hash = f.getHash().substring(0, idx);
-							if (BaseFileItem.Type.Image == f.getType()) {
-								fileMap.put(f.getHash(), String.format("%s/%s", hash, f.getHash()));
-							}
-							f.setHash(hash);
-						}
-						list.add(f);
-						item = listNode.getNext();
-					}
-				}
-			}
-		}
-		return list;
-	}
-
-	public List<Recording> readRecordingList(File baseDir, String fileName, String listNodeName) throws Exception {
-		List<Recording> list = new ArrayList<>();
-		File xml = new File(baseDir, fileName);
-		if (xml.exists()) {
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			RegistryMatcher matcher = new RegistryMatcher();
-			Serializer ser = new Persister(strategy, matcher);
-
-			matcher.bind(Long.class, LongTransform.class);
-			matcher.bind(Integer.class, IntegerTransform.class);
-			registry.bind(Date.class, DateConverter.class);
-			registry.bind(Recording.Status.class, RecordingStatusConverter.class);
-
-			try (InputStream rootIs1 = new FileInputStream(xml); InputStream rootIs2 = new FileInputStream(xml);) {
-				InputNode root = NodeBuilder.read(rootIs1);
-				InputNode root1 = NodeBuilder.read(rootIs2); //HACK to handle old isFolder
-				InputNode listNode = root.getNext();
-				InputNode listNode1 = root1.getNext(); //HACK to handle old isFolder
-				if (listNodeName.equals(listNode.getName())) {
-					InputNode item = listNode.getNext();
-					InputNode item1 = listNode1.getNext(); //HACK to handle old isFolder
-					while (item != null) {
-						Recording r = ser.read(Recording.class, item, false);
-
-						boolean isFolder = false;
-						//HACK to handle old isFolder
-						do {
-							String name = item1.getName();
-							String val = item1.getValue();
-							if (("folder".equals(name) || "isFolder".equals(name)) && "true".equals(val)) {
-								isFolder = true;
-							}
-							item1 = listNode1.getNext(); //HACK to handle Address inside user
-						} while (item1 != null && !"flvrecording".equals(item1.getName()));
-
-						if (r.getType() == null) {
-							r.setType(isFolder ? BaseFileItem.Type.Folder : BaseFileItem.Type.Recording);
-						}
-						list.add(r);
-						item = listNode.getNext();
-					}
-				}
-			}
-		}
-		return list;
-	}
-
-	private List<MeetingMember> readMeetingMemberList(File baseDir, String filename, String listNodeName) throws Exception {
-		Registry registry = new Registry();
-		Strategy strategy = new RegistryStrategy(registry);
-		Serializer ser = new Persister(strategy);
-
-		registry.bind(User.class, new UserConverter(userDao, userMap));
-		registry.bind(Appointment.class, new AppointmentConverter(appointmentDao, appointmentMap));
-
-		File xml = new File(baseDir, filename);
-		if (!xml.exists()) {
-			throw new BackupException(filename + " missing");
-		}
-
-		DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		Document doc = dBuilder.parse(new InputSource(xml.toURI().toASCIIString()));
-
-		StringWriter sw = new StringWriter();
-		Transformer xformer = TransformerFactory.newInstance().newTransformer();
-		xformer.transform(new DOMSource(doc), new StreamResult(sw));
-
-		List<MeetingMember> list = new ArrayList<>();
-		InputNode root = NodeBuilder.read(new StringReader(sw.toString()));
-		InputNode root1 = NodeBuilder.read(new StringReader(sw.toString())); //HACK to handle external attendee's firstname, lastname, email
-		InputNode listNode = root.getNext();
-		InputNode listNode1 = root1.getNext(); //HACK to handle external attendee's firstname, lastname, email
-		if (listNodeName.equals(listNode.getName())) {
-			InputNode item = listNode.getNext();
-			InputNode item1 = listNode1.getNext(); //HACK to handle external attendee's firstname, lastname, email
-			while (item != null) {
-				MeetingMember mm = ser.read(MeetingMember.class, item, false);
-
-				boolean needToSkip1 = true;
-				if (mm.getUser() == null) {
-					mm.setUser(new User());
-				}
-				if (mm.getUser().getId() == null) {
-					//HACK to handle external attendee's firstname, lastname, email
-					boolean contactValid = false;
-					do {
-						String name = item1.getName();
-						String val = item1.getValue();
-						if (User.Type.contact == mm.getUser().getType() && "firstname".equals(name)) {
-							mm.getUser().setFirstname(val);
-						}
-						if (User.Type.contact == mm.getUser().getType() && "lastname".equals(name)) {
-							mm.getUser().setLastname(val);
-						}
-						if ("email".equals(name)) {
-							if (mm.getAppointment() != null && mm.getAppointment().getOwner() != null) {
-								mm.setUser(userDao.getContact(val, mm.getAppointment().getOwner()));
-							}
-							contactValid = true;
-						}
-						item1 = listNode1.getNext(); //HACK to handle old om_time_zone
-					} while (item1 != null && !"meetingmember".equals(item1.getName()));
-					if (!contactValid) {
-						mm = null;
-					}
-					needToSkip1 = false;
-				}
-				if (needToSkip1) {
-					do {
-						item1 = listNode1.getNext(); //HACK to handle Address inside user
-					} while (item1 != null && !"meetingmember".equals(item1.getName()));
-				}
-				item = listNode.getNext();
-				if (mm != null && !mm.isDeleted() && mm.getUser() != null && mm.getAppointment() != null && mm.getAppointment().getId() != null) {
-					mm.setId(null);
-					list.add(mm);
-				}
-			}
-		}
-		return list;
-	}
-
-	private List<User> readUserList(InputSource xml, String listNodeName) throws Exception {
-		Registry registry = new Registry();
-		Strategy strategy = new RegistryStrategy(registry);
-		Serializer ser = new Persister(strategy);
-
-		registry.bind(Group.class, new GroupConverter(groupDao, groupMap));
-		registry.bind(Salutation.class, SalutationConverter.class);
-		registry.bind(Date.class, DateConverter.class);
-
-		DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		Document doc = dBuilder.parse(xml);
-		final Map<String, Integer> userEmailMap = new HashMap<>();
-		final Map<String, Integer> userLoginMap = new HashMap<>();
-		//add existence email from database
-		List<User>  users = userDao.getAllUsers();
-		for (User u : users){
-			if (u.getAddress() == null || u.getAddress().getEmail() == null || User.Type.user != u.getType()) {
-				continue;
-			}
-			userEmailMap.put(u.getAddress().getEmail(), Integer.valueOf(-1));
-			userLoginMap.put(u.getLogin(), Integer.valueOf(-1));
-		}
-		Node nList = getNode(getNode(doc, "root"), listNodeName);
-		if (nList != null) {
-			NodeList nl = nList.getChildNodes();
-			// one of the old OM version created 2 nodes "deleted" this code block handles this
-			for (int i = 0; i < nl.getLength(); ++i) {
-				Node user = nl.item(i);
-				NodeList nl1 = user.getChildNodes();
-				boolean deletedFound = false;
-				for (int j = 0; j < nl1.getLength(); ++j) {
-					Node node = nl1.item(j);
-					if (node.getNodeType() == Node.ELEMENT_NODE && "deleted".equals(node.getNodeName())) {
-						if (deletedFound) {
-							user.removeChild(node);
-							break;
-						}
-						deletedFound = true;
-					}
-				}
-			}
-		}
-
-		StringWriter sw = new StringWriter();
-		Transformer xformer = TransformerFactory.newInstance().newTransformer();
-		xformer.transform(new DOMSource(doc), new StreamResult(sw));
-
-		List<User> list = new ArrayList<>();
-		InputNode root = NodeBuilder.read(new StringReader(sw.toString()));
-		InputNode root1 = NodeBuilder.read(new StringReader(sw.toString())); //HACK to handle Address inside user
-		InputNode root2 = NodeBuilder.read(new StringReader(sw.toString())); //HACK to handle old om_time_zone, level_id, status
-		InputNode listNode = root.getNext();
-		InputNode listNode1 = root1.getNext(); //HACK to handle Address inside user
-		InputNode listNode2 = root2.getNext(); //HACK to handle old om_time_zone
-		if (listNodeName.equals(listNode.getName())) {
-			InputNode item = listNode.getNext();
-			InputNode item1 = listNode1.getNext(); //HACK to handle Address inside user
-			InputNode item2 = listNode2.getNext(); //HACK to handle old om_time_zone, level_id, status
-			while (item != null) {
-				User u = ser.read(User.class, item, false);
-
-				boolean needToSkip1 = true;
-				//HACK to handle Address inside user
-				if (u.getAddress() == null) {
-					Address a = ser.read(Address.class, item1, false);
-					u.setAddress(a);
-					needToSkip1 = false;
-				}
-				if (needToSkip1) {
-					do {
-						item1 = listNode1.getNext(); //HACK to handle Address inside user
-					} while (item1 != null && !"user".equals(item1.getName()));
-				}
-				String levelId = null, status = null, stateId = null;
-				do {
-					String name = item2.getName();
-					String val = item2.getValue();
-					if (u.getTimeZoneId() == null && "omTimeZone".equals(name)) {
-						u.setTimeZoneId(val == null ? null : tzUtil.getTimeZone(val).getID());
-					}
-					if ("level_id".equals(name)) {
-						levelId = val;
-					}
-					if ("status".equals(name)) {
-						status = val;
-					}
-					if ("state_id".equals(name)) {
-						stateId = val;
-					}
-					item2 = listNode2.getNext(); //HACK to handle old om_time_zone, level_id, status
-				} while (item2 != null && !"user".equals(item2.getName()));
-				if (u.getRights().isEmpty()) {
-					u.getRights().add(Right.Room);
-					if ("1".equals(status)) {
-						u.getRights().add(Right.Dashboard);
-						u.getRights().add(Right.Login);
-					}
-					if ("3".equals(levelId)) {
-						u.getRights().add(Right.Admin);
-						u.getRights().add(Right.Soap);
-					}
-					if ("4".equals(levelId)) {
-						u.getRights().add(Right.Soap);
-					}
-				}
-				// check that email is unique
-				if (u.getAddress() != null && u.getAddress().getEmail() != null && User.Type.user == u.getType()) {
-					if (userEmailMap.containsKey(u.getAddress().getEmail())) {
-						log.warn("Email is duplicated for user " + u.toString());
-						String updateEmail = String.format("modified_by_import_<%s>%s", UUID.randomUUID(), u.getAddress().getEmail());
-						u.getAddress().setEmail(updateEmail);
-					}
-					userEmailMap.put(u.getAddress().getEmail(), Integer.valueOf(userEmailMap.size()));
-				}
-				if (userLoginMap.containsKey(u.getLogin())) {
-					log.warn("Login is duplicated for user " + u.toString());
-					String updateLogin = String.format("modified_by_import_<%s>%s", UUID.randomUUID(), u.getLogin());
-					u.setLogin(updateLogin);
-				}
-				userLoginMap.put(u.getLogin(), Integer.valueOf(userLoginMap.size()));
-				// check old stateId
-				if (!Strings.isEmpty(stateId)) {
-					String country = getCountry(stateId);
-					if (!Strings.isEmpty(country)) {
-						if (u.getAddress() == null) {
-							u.setAddress(new Address());
-						}
-						u.getAddress().setCountry(country);
-					}
-				}
-				if (u.getGroupUsers() != null) {
-					for (GroupUser gu : u.getGroupUsers()) {
-						gu.setUser(u);
-					}
-				}
-				list.add(u);
-				item = listNode.getNext();
-			}
-		}
-		return list;
-	}
-
-	private List<Room> readRoomList(File baseDir, String fileName, String listNodeName) throws Exception {
-		List<Room> list = new ArrayList<>();
-		File xml = new File(baseDir, fileName);
-		if (xml.exists()) {
-			Registry registry = new Registry();
-			Strategy strategy = new RegistryStrategy(registry);
-			RegistryMatcher matcher = new RegistryMatcher();
-			Serializer ser = new Persister(strategy, matcher);
-
-			matcher.bind(Long.class, LongTransform.class);
-			matcher.bind(Integer.class, IntegerTransform.class);
-			registry.bind(User.class, new UserConverter(userDao, userMap));
-			registry.bind(Room.Type.class, RoomTypeConverter.class);
-
-			try (InputStream rootIs1 = new FileInputStream(xml); InputStream rootIs2 = new FileInputStream(xml);) {
-				InputNode root = NodeBuilder.read(rootIs1);
-				InputNode root1 = NodeBuilder.read(rootIs2); //HACK to handle old hideTopBar, hideChat, hideActivitiesAndActions, hideFilesExplorer, hideActionsMenu, hideScreenSharing, hideWhiteboard, showMicrophoneStatus
-				InputNode listNode = root.getNext();
-				InputNode listNode1 = root1.getNext(); //HACK to handle old hideTopBar, hideChat, hideActivitiesAndActions, hideFilesExplorer, hideActionsMenu, hideScreenSharing, hideWhiteboard, showMicrophoneStatus
-				if (listNodeName.equals(listNode.getName())) {
-					InputNode item = listNode.getNext();
-					InputNode item1 = listNode1.getNext(); //HACK to handle old hideTopBar, hideChat, hideActivitiesAndActions, hideFilesExplorer, hideActionsMenu, hideScreenSharing, hideWhiteboard, showMicrophoneStatus
-					while (item != null) {
-						Room r = ser.read(Room.class, item, false);
-
-						Boolean showMicrophoneStatus = null;
-						//HACK to handle old hideTopBar, hideChat, hideActivitiesAndActions, hideFilesExplorer, hideActionsMenu, hideScreenSharing, hideWhiteboard, showMicrophoneStatus
-						do {
-							String name = item1.getName();
-							String val = item1.getValue();
-							if ("hideTopBar".equals(name) && "true".equals(val)) {
-								r.hide(RoomElement.TopBar);
-							}
-							if ("hideChat".equals(name) && "true".equals(val)) {
-								r.hide(RoomElement.Chat);
-							}
-							if ("hideActivitiesAndActions".equals(name) && "true".equals(val)) {
-								r.hide(RoomElement.Activities);
-							}
-							if ("hideFilesExplorer".equals(name) && "true".equals(val)) {
-								r.hide(RoomElement.Files);
-							}
-							if ("hideActionsMenu".equals(name) && "true".equals(val)) {
-								r.hide(RoomElement.ActionMenu);
-							}
-							if ("hideScreenSharing".equals(name) && "true".equals(val)) {
-								r.hide(RoomElement.ScreenSharing);
-							}
-							if ("hideWhiteboard".equals(name) && "true".equals(val)) {
-								r.hide(RoomElement.Whiteboard);
-							}
-							if ("showMicrophoneStatus".equals(name)) {
-								showMicrophoneStatus = Boolean.valueOf(val);
-							}
-							item1 = listNode1.getNext(); //HACK to handle Address inside user
-						} while (item1 != null && !"room".equals(item1.getName()));
-
-						if (Boolean.FALSE.equals(showMicrophoneStatus)) {
-							r.hide(RoomElement.MicrophoneStatus);
-						}
-						list.add(r);
-						item = listNode.getNext();
-					}
-				}
-			}
-		}
-		return list;
-	}
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/6683e8b2/openmeetings-web/pom.xml
----------------------------------------------------------------------
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index 7ea39d1..1df361e 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -218,60 +218,6 @@
 								<artifactItem>
 									<groupId>org.apache.openmeetings</groupId>
 									<artifactId>test-backup</artifactId>
-									<version>1.4</version>
-									<type>zip</type>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.apache.openmeetings</groupId>
-									<artifactId>test-backup</artifactId>
-									<version>1.5</version>
-									<type>zip</type>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.apache.openmeetings</groupId>
-									<artifactId>test-backup</artifactId>
-									<version>1.6.2</version>
-									<type>zip</type>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.apache.openmeetings</groupId>
-									<artifactId>test-backup</artifactId>
-									<version>1.7.0</version>
-									<type>zip</type>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.apache.openmeetings</groupId>
-									<artifactId>test-backup</artifactId>
-									<version>1.8.8</version>
-									<type>zip</type>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.apache.openmeetings</groupId>
-									<artifactId>test-backup</artifactId>
-									<version>1.9.1</version>
-									<type>zip</type>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.apache.openmeetings</groupId>
-									<artifactId>test-backup</artifactId>
-									<version>2.0.0</version>
-									<type>zip</type>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.apache.openmeetings</groupId>
-									<artifactId>test-backup</artifactId>
-									<version>3.0.0</version>
-									<type>zip</type>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.apache.openmeetings</groupId>
-									<artifactId>test-backup</artifactId>
-									<version>3.0.7</version>
-									<type>zip</type>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.apache.openmeetings</groupId>
-									<artifactId>test-backup</artifactId>
 									<version>3.1.3</version>
 									<type>zip</type>
 								</artifactItem>