This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 9be0a78  [OPENMEETINGS-2604] extra menu import/export
9be0a78 is described below

commit 9be0a78399a9ef0318f5b1207f456f1d4c5bf7dc
Author: Maxim Solodovnik <solomax...@gmail.com>
AuthorDate: Sat Jun 19 12:37:17 2021 +0700

    [OPENMEETINGS-2604] extra menu import/export
---
 .../org/apache/openmeetings/db/bind/Constants.java |  2 +
 .../db/entity/basic/Configuration.java             |  3 +
 .../db/entity/calendar/Appointment.java            |  3 +
 .../db/entity/calendar/MeetingMember.java          |  3 +
 .../db/entity/calendar/OmCalendar.java             |  3 +
 .../openmeetings/db/entity/file/FileItem.java      |  3 +
 .../openmeetings/db/entity/record/Recording.java   |  3 +
 .../db/entity/record/RecordingChunk.java           |  3 +
 .../openmeetings/db/entity/room/ExtraMenu.java     |  7 ++
 .../apache/openmeetings/db/entity/room/Room.java   |  3 +
 .../openmeetings/db/entity/room/RoomModerator.java |  3 +
 .../openmeetings/db/entity/server/LdapConfig.java  |  3 +
 .../openmeetings/db/entity/server/OAuthServer.java |  3 +
 .../openmeetings/db/entity/server/Sessiondata.java |  3 +
 .../openmeetings/db/entity/user/Address.java       |  3 +
 .../apache/openmeetings/db/entity/user/Group.java  |  3 +
 .../openmeetings/db/entity/user/GroupUser.java     |  3 +
 .../apache/openmeetings/db/entity/user/User.java   |  3 +
 .../apache/openmeetings/backup/BackupExport.java   | 12 ++++
 .../apache/openmeetings/backup/BackupImport.java   | 26 +++++++-
 .../web/common/tree/FileTreePanel.java             |  6 +-
 .../org/apache/openmeetings/backup/TestImport.java | 30 ++++++---
 .../openmeetings/backup/TestImportCalendar.java    |  7 +-
 .../openmeetings/backup/TestImportConfig.java      |  7 +-
 .../apache/openmeetings/backup/TestImportOld.java  |  3 +-
 .../apache/openmeetings/backup/TestImportRoom.java |  5 +-
 .../apache/openmeetings/backup/TestImportUser.java |  9 +--
 .../apache/openmeetings/backup/menu/extraMenus.xml | 75 ++++++++++++++++++++++
 28 files changed, 213 insertions(+), 24 deletions(-)

diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/Constants.java 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/Constants.java
index 10c15c1..67f1af6 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/Constants.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/Constants.java
@@ -57,6 +57,8 @@ public class Constants {
        public static final String POLL_NODE = "roompoll";
        public static final String ROOM_FILE_LIST_NODE = "RoomFiles";
        public static final String ROOM_FILE_NODE = "RoomFile";
+       public static final String EXTRA_MENU_LIST_NODE = "ExtraMenus";
+       public static final String EXTRA_MENU_NODE = "ExtraMenu";
 
        private Constants() {
                //shoudn't be used
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Configuration.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Configuration.java
index 092b71d..f1a79b1 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Configuration.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Configuration.java
@@ -35,6 +35,8 @@ import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@@ -59,6 +61,7 @@ import org.apache.openmeetings.db.entity.user.User;
                @Index(name = "key_idx", columnList = "om_key", unique = true)
 })
 @XmlRootElement(name = CFG_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class Configuration extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
 
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
index 28572bd..13cb47e 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
@@ -42,6 +42,8 @@ import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -130,6 +132,7 @@ import org.apache.openmeetings.db.entity.user.User;
 @NamedQuery(name = "deleteAppointmentsbyCalendar",
        query = "UPDATE Appointment a SET a.deleted = true WHERE a.calendar.id 
= :calId")
 @XmlRootElement(name = APPOINTMENT_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class Appointment extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
        public static final int REMINDER_NONE_ID = 1;
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/MeetingMember.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/MeetingMember.java
index 3185fa3..63a5de1 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/MeetingMember.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/MeetingMember.java
@@ -32,6 +32,8 @@ import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -53,6 +55,7 @@ import org.apache.openmeetings.db.entity.user.User;
 @NamedQuery(name="getMeetingMemberIdsByAppointment"
                , query="SELECT mm.id FROM MeetingMember mm WHERE mm.deleted = 
false AND mm.appointment.id = :id")
 @XmlRootElement(name = MMEMBER_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class MeetingMember extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
        @Id
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/OmCalendar.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/OmCalendar.java
index c82dabe..0dd1bfc 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/OmCalendar.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/OmCalendar.java
@@ -32,6 +32,8 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@@ -62,6 +64,7 @@ import org.apache.openmeetings.db.entity.user.User;
                + "  AND a.owner.id = :userId AND a.calendar.id = :calId")
 @NamedQuery(name = "getCalendarbyId", query = "SELECT c FROM OmCalendar c 
WHERE c.deleted = false AND c.id = :calId")
 @XmlRootElement(name = CALENDAR_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class OmCalendar extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
 
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
index 3f0b458..90e84f5 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
@@ -23,6 +23,8 @@ import static 
org.apache.openmeetings.db.bind.Constants.FILE_NODE;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.NamedQuery;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@@ -48,6 +50,7 @@ import org.apache.openmeetings.db.bind.adapter.LongAdapter;
                + "AND f.groupId = :groupId AND f.parentId IS NULL AND f.type 
IN :filter "
                + "ORDER BY f.type ASC, f.name")
 @XmlRootElement(name = FILE_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class FileItem extends BaseFileItem {
        private static final long serialVersionUID = 1L;
 
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
index db18cc5..2253b34 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
@@ -35,6 +35,8 @@ import javax.persistence.FetchType;
 import javax.persistence.JoinColumn;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
@@ -98,6 +100,7 @@ import org.apache.openmeetings.db.entity.file.BaseFileItem;
                + "    OR r.roomId IN (SELECT rg.room.id FROM RoomGroup rg 
WHERE rg.group.id = :groupId)"
                + "  ) order by r.inserted ASC")
 @XmlRootElement(name = RECORDING_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class Recording extends BaseFileItem {
        private static final long serialVersionUID = 1L;
 
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
index 369534f..5cf2ee3 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
@@ -32,6 +32,8 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -60,6 +62,7 @@ import org.apache.openmeetings.db.entity.HistoricalEntity;
 @NamedQuery(name = "getScreenChunkByRecording", query = "SELECT c FROM 
RecordingChunk c WHERE c.recording.id = :recordingId AND c.type = :screen")
 @Table(name = "recording_chunk")
 @XmlRootElement(name = "flvrecordingmetadata")
+@XmlAccessorType(XmlAccessType.FIELD)
 public class RecordingChunk extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
        @XmlType(namespace="org.apache.openmeetings.record.chunk")
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java
index 609b0b2..ff280f7 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.db.entity.room;
 
+import static org.apache.openmeetings.db.bind.Constants.EXTRA_MENU_NODE;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -33,8 +35,11 @@ import javax.persistence.JoinColumn;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openmeetings.db.bind.adapter.LongAdapter;
@@ -48,6 +53,8 @@ import org.apache.openmeetings.db.entity.IDataProviderEntity;
        , @NamedQuery(name = "countExtraMenus", query = "SELECT COUNT(m) FROM 
ExtraMenu m")
 })
 @Table(name = "extra_menu")
+@XmlRootElement(name = EXTRA_MENU_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class ExtraMenu implements IDataProviderEntity {
        private static final long serialVersionUID = 1L;
 
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
index bd222a8..4e7f986 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
@@ -47,6 +47,8 @@ import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
@@ -98,6 +100,7 @@ import org.apache.openmeetings.db.entity.user.Group;
                @Index(name = "room_name_idx", columnList = "name")
 })
 @XmlRootElement(name = ROOM_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class Room extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
        public static final int CONFERENCE_TYPE_ID = 1;
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java
index 310a418..f26fd32 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java
@@ -28,6 +28,8 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -47,6 +49,7 @@ import org.apache.openmeetings.db.entity.user.User;
                + "where c.roomId = :roomId AND c.deleted = false AND c.user.id 
= :userId")
 @Table(name = "room_moderator")
 @XmlRootElement(name = "room_moderator")
+@XmlAccessorType(XmlAccessType.FIELD)
 public class RoomModerator extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
 
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/LdapConfig.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/LdapConfig.java
index 1ce2585..1e322e5 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/LdapConfig.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/LdapConfig.java
@@ -31,6 +31,8 @@ import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -48,6 +50,7 @@ import org.apache.openmeetings.db.entity.user.User;
 @NamedQuery(name="getActiveLdapConfigs", query="SELECT c FROM LdapConfig c 
WHERE c.deleted = false AND c.active = :isActive ORDER BY c.id")
 @Table(name = "ldapconfig")
 @XmlRootElement(name = LDAP_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class LdapConfig extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
        @Id
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/OAuthServer.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/OAuthServer.java
index d223706..049eba8 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/OAuthServer.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/OAuthServer.java
@@ -37,6 +37,8 @@ import javax.persistence.JoinColumn;
 import javax.persistence.MapKeyColumn;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAnyElement;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
@@ -55,6 +57,7 @@ import org.apache.openmeetings.db.entity.HistoricalEntity;
 @NamedQuery(name = "getAllOAuthServers", query = "SELECT s FROM OAuthServer s 
WHERE s.deleted = false ORDER BY s.id")
 @NamedQuery(name = "countOAuthServers", query = "select count(s) from 
OAuthServer s WHERE s.deleted = false")
 @XmlRootElement(name = OAUTH_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class OAuthServer extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
 
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Sessiondata.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Sessiondata.java
index edeb124..9ba80c5 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Sessiondata.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Sessiondata.java
@@ -30,6 +30,8 @@ import javax.persistence.Index;
 import javax.persistence.Lob;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 @Entity
@@ -39,6 +41,7 @@ import javax.xml.bind.annotation.XmlRootElement;
                @Index(name = "session_id_idx", columnList = "session_id", 
unique = true)
 })
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
 public class Sessiondata implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
index b60cec8..4836fed 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
@@ -26,6 +26,8 @@ import javax.persistence.Id;
 import javax.persistence.Index;
 import javax.persistence.Lob;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -37,6 +39,7 @@ import org.apache.openmeetings.db.entity.HistoricalEntity;
                @Index(name = "email_idx", columnList = "email")
 })
 @XmlRootElement(name = "address")
+@XmlAccessorType(XmlAccessType.FIELD)
 public class Address extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
        @Id
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
index 95b5d6115..30b0c33 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
@@ -28,6 +28,8 @@ import javax.persistence.Id;
 import javax.persistence.Index;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -52,6 +54,7 @@ import org.apache.openmeetings.db.entity.HistoricalEntity;
                @Index(name = "group_name_idx", columnList = "name")
 })
 @XmlRootElement(name = GROUP_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class Group extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
 
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/GroupUser.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/GroupUser.java
index 4f4b7d1..b693ef5 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/GroupUser.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/GroupUser.java
@@ -28,6 +28,8 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -48,6 +50,7 @@ import org.apache.openmeetings.db.entity.HistoricalEntity;
 @NamedQuery(name = "getGroupModerators", query = "SELECT gu.user FROM 
GroupUser gu WHERE gu.deleted = false AND gu.moderator = true AND  gu.group.id 
= :id")
 @Table(name = "group_user")
 @XmlRootElement(name = "user_organisation")
+@XmlAccessorType(XmlAccessType.FIELD)
 public class GroupUser extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
        @Id
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
index fb9cb98..33a6386 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
@@ -57,6 +57,8 @@ import javax.persistence.OneToOne;
 import javax.persistence.PrimaryKeyJoinColumn;
 import javax.persistence.Table;
 import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
@@ -126,6 +128,7 @@ import org.apache.wicket.util.string.Strings;
                , @Index(name = "type_idx", columnList = "type")
 })
 @XmlRootElement(name = USER_NODE)
+@XmlAccessorType(XmlAccessType.FIELD)
 public class User extends HistoricalEntity {
        private static final long serialVersionUID = 1L;
        public static final String DISPLAY_NAME_NA = "N/A";
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 a12f60b..6990b12 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
@@ -23,6 +23,7 @@ import static 
org.apache.openmeetings.db.bind.Constants.CALENDAR_LIST_NODE;
 import static org.apache.openmeetings.db.bind.Constants.CFG_LIST_NODE;
 import static org.apache.openmeetings.db.bind.Constants.CHAT_LIST_NODE;
 import static org.apache.openmeetings.db.bind.Constants.CONTACT_LIST_NODE;
+import static org.apache.openmeetings.db.bind.Constants.EXTRA_MENU_LIST_NODE;
 import static org.apache.openmeetings.db.bind.Constants.FILE_LIST_NODE;
 import static org.apache.openmeetings.db.bind.Constants.GROUP_LIST_NODE;
 import static org.apache.openmeetings.db.bind.Constants.LDAP_LIST_NODE;
@@ -71,6 +72,7 @@ import 
org.apache.openmeetings.db.dao.calendar.MeetingMemberDao;
 import org.apache.openmeetings.db.dao.calendar.OmCalendarDao;
 import org.apache.openmeetings.db.dao.file.FileItemDao;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.dao.room.ExtraMenuDao;
 import org.apache.openmeetings.db.dao.room.PollDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.server.LdapConfigDao;
@@ -86,6 +88,7 @@ import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.OmCalendar;
 import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.db.entity.room.ExtraMenu;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.RoomPoll;
 import org.apache.openmeetings.db.entity.server.LdapConfig;
@@ -147,6 +150,8 @@ public class BackupExport {
        private GroupDao groupDao;
        @Autowired
        private RoomDao roomDao;
+       @Autowired
+       private ExtraMenuDao menuDao;
 
        public void performExport(File zip, boolean includeFiles, 
ProgressHolder progressHolder) throws Exception {
                if (zip.getParentFile() != null && 
!zip.getParentFile().exists()) {
@@ -195,6 +200,8 @@ public class BackupExport {
                        progressHolder.setProgress(80);
                        exportChat(zos);
                        progressHolder.setProgress(85);
+                       exportExtraMenus(zos);
+                       progressHolder.setProgress(87);
 
                        if (includeFiles) {
                                exportFiles(progressHolder, zos);
@@ -369,6 +376,11 @@ public class BackupExport {
                writeList(zos, "chat_messages.xml", CHAT_LIST_NODE, list);
        }
 
+       private void exportExtraMenus(ZipOutputStream zos) throws Exception {
+               List<ExtraMenu> list = menuDao.get(0, Integer.MAX_VALUE);
+               writeList(zos, "extraMenus.xml", EXTRA_MENU_LIST_NODE, list);
+       }
+
        /*
         * Package private for tests
         */
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 b9906d3..8a66ea9 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
@@ -30,6 +30,8 @@ import static 
org.apache.openmeetings.db.bind.Constants.CHAT_LIST_NODE;
 import static org.apache.openmeetings.db.bind.Constants.CHAT_NODE;
 import static org.apache.openmeetings.db.bind.Constants.CONTACT_LIST_NODE;
 import static org.apache.openmeetings.db.bind.Constants.CONTACT_NODE;
+import static org.apache.openmeetings.db.bind.Constants.EXTRA_MENU_LIST_NODE;
+import static org.apache.openmeetings.db.bind.Constants.EXTRA_MENU_NODE;
 import static org.apache.openmeetings.db.bind.Constants.FILE_LIST_NODE;
 import static org.apache.openmeetings.db.bind.Constants.FILE_NODE;
 import static org.apache.openmeetings.db.bind.Constants.GROUP_LIST_NODE;
@@ -191,6 +193,7 @@ import 
org.apache.openmeetings.db.dao.calendar.OmCalendarDao;
 import org.apache.openmeetings.db.dao.file.BaseFileItemDao;
 import org.apache.openmeetings.db.dao.file.FileItemDao;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.dao.room.ExtraMenuDao;
 import org.apache.openmeetings.db.dao.room.PollDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.server.LdapConfigDao;
@@ -210,6 +213,7 @@ import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.record.RecordingChunk;
+import org.apache.openmeetings.db.entity.room.ExtraMenu;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.RoomFile;
 import org.apache.openmeetings.db.entity.room.RoomGroup;
@@ -347,6 +351,8 @@ public class BackupImport {
        @Autowired
        private GroupDao groupDao;
        @Autowired
+       private ExtraMenuDao menuDao;
+       @Autowired
        private DocumentConverter docConverter;
 
        private final Map<Long, Long> ldapMap = new HashMap<>();
@@ -446,8 +452,10 @@ public class BackupImport {
                progressHolder.setProgress(87);
                importRoomFiles(f);
                progressHolder.setProgress(92);
+               importExtraMenus(f);
+               progressHolder.setProgress(95);
 
-               log.info("Room files import complete, starting copy of files 
and folders");
+               log.info("Extra menus import complete, starting copy of files 
and folders");
                /*
                 * ##################### Import real files and folders
                 */
@@ -1133,6 +1141,22 @@ public class BackupImport {
                }, true);
        }
 
+       void importExtraMenus(File base) throws Exception {
+               log.info("Room files complete, starting extra menus import");
+               Class<ExtraMenu> eClazz = ExtraMenu.class;
+               JAXBContext jc = JAXBContext.newInstance(eClazz);
+               Unmarshaller unmarshaller = jc.createUnmarshaller();
+               unmarshaller.setAdapter(new GroupAdapter(groupDao, groupMap));
+
+               readList(unmarshaller, base, "extraMenus.xml", 
EXTRA_MENU_LIST_NODE, EXTRA_MENU_NODE, eClazz, m -> {
+                       if (Strings.isEmpty(m.getName()) || 
Strings.isEmpty(m.getLink())) {
+                               return;
+                       }
+                       m.setId(null);
+                       menuDao.update(m, null);
+               }, true);
+       }
+
        private static <T> void readList(File baseDir, String fileName, String 
listNodeName, String nodeName, Class<T> clazz, Consumer<T> consumer) {
                readList(baseDir, fileName, listNodeName, nodeName, clazz, 
consumer, false);
        }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
index abf1b7d..8ea79c8 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
@@ -293,7 +293,11 @@ public abstract class FileTreePanel extends Panel {
                                                ? fi.getOriginal() : 
fi.getFile(ext);
                                if (f != null && f.exists()) {
                                        dwnldFile = f;
-                                       dwnldName = fi.getName() + "." + 
OmFileHelper.getFileExt(f.getName());
+                                       String fileExt = 
OmFileHelper.getFileExt(f.getName());
+                                       dwnldName = fi.getName();
+                                       if (!dwnldName.endsWith(fileExt)) {
+                                               dwnldName += "." + fileExt;
+                                       }
                                        downloader.initiate(target);
                                }
                        }
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
index 835e19e..249e38b 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
@@ -25,6 +25,7 @@ import java.io.File;
 
 import org.apache.openmeetings.db.dao.basic.ChatDao;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.dao.room.ExtraMenuDao;
 import org.apache.openmeetings.db.dao.server.LdapConfigDao;
 import org.apache.openmeetings.db.dao.server.OAuth2Dao;
 import org.apache.openmeetings.db.dao.user.PrivateMessageFolderDao;
@@ -34,6 +35,7 @@ import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
 class TestImport extends AbstractTestImport {
+       public static final String BACKUP_ROOT = 
"org/apache/openmeetings/backup/";
        @Autowired
        private LdapConfigDao ldapDao;
        @Autowired
@@ -44,17 +46,19 @@ class TestImport extends AbstractTestImport {
        private RecordingDao recDao;
        @Autowired
        private PrivateMessageFolderDao msgFolderDao;
+       @Autowired
+       private ExtraMenuDao menuDao;
 
        @Test
        void importVersionNE() throws Exception {
-               File configs = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/config/skip/configs.xml").toURI());
+               File configs = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"config/skip/configs.xml").toURI());
                BackupVersion ver = 
BackupImport.getVersion(configs.getParentFile());
                assertEquals(new BackupVersion(), ver);
        }
 
        @Test
        void importVersion() throws Exception {
-               File version = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/version/version.xml").toURI());
+               File version = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"version/version.xml").toURI());
                BackupVersion ver = 
BackupImport.getVersion(version.getParentFile());
                assertEquals(5, ver.getMajor(), "major");
                assertEquals(0, ver.getMinor(), "minor");
@@ -63,7 +67,7 @@ class TestImport extends AbstractTestImport {
        @Test
        void importGroups() throws Exception {
                long grpCount = groupDao.count();
-               File groups = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/group/organizations.xml").toURI());
+               File groups = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"group/organizations.xml").toURI());
                backupImport.importGroups(groups.getParentFile());
                assertEquals(grpCount + 1, groupDao.count(), "Group should be 
added");
        }
@@ -76,7 +80,7 @@ class TestImport extends AbstractTestImport {
                        cfgDao.update(def, null);
                }
                long ldapCount = ldapDao.count();
-               File ldaps = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/ldap/ldapconfigs.xml").toURI());
+               File ldaps = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"ldap/ldapconfigs.xml").toURI());
                Long id = backupImport.importLdap(ldaps.getParentFile());
                assertEquals(ldapCount + 1, ldapDao.count(), "Ldap should be 
added");
                LdapConfig ldap = ldapDao.get(id);
@@ -86,7 +90,7 @@ class TestImport extends AbstractTestImport {
        @Test
        void importOauths() throws Exception {
                long oauthCount = oauthDao.count();
-               File oauths = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/oauth/oauth2servers.xml").toURI());
+               File oauths = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"oauth/oauth2servers.xml").toURI());
                backupImport.importOauth(oauths.getParentFile());
                assertEquals(oauthCount + 2, oauthDao.count(), "OAuth should be 
added");
        }
@@ -94,7 +98,7 @@ class TestImport extends AbstractTestImport {
        @Test
        void importChatSkip() throws Exception {
                long chatCount = chatDao.get(0, Integer.MAX_VALUE).size();
-               File chats = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/chat/skip/chat_messages.xml").toURI());
+               File chats = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"chat/skip/chat_messages.xml").toURI());
                backupImport.importChat(chats.getParentFile());
                assertEquals(chatCount, chatDao.get(0, 
Integer.MAX_VALUE).size(), "No Chat messages should be added");
        }
@@ -102,15 +106,23 @@ class TestImport extends AbstractTestImport {
        @Test
        void importChat() throws Exception {
                long chatCount = chatDao.get(0, Integer.MAX_VALUE).size();
-               File chats = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/chat/chat_messages.xml").toURI());
+               File chats = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"chat/chat_messages.xml").toURI());
                backupImport.importChat(chats.getParentFile());
                assertEquals(chatCount + 3, chatDao.get(0, 
Integer.MAX_VALUE).size(), "Chat messages should be added");
        }
 
        @Test
+       void importExtraMenu() throws Exception {
+               long menuCount = menuDao.count();
+               File menus = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"menu/extraMenus.xml").toURI());
+               backupImport.importExtraMenus(menus.getParentFile());
+               assertEquals(menuCount + 3, menuDao.count(), "Extra menus 
should be added");
+       }
+
+       @Test
        void importRecordings() throws Exception {
                long recCount = recDao.get().size();
-               File recs = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/file/flvRecordings.xml").toURI());
+               File recs = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"file/flvRecordings.xml").toURI());
                backupImport.importRecordings(recs.getParentFile());
                assertEquals(recCount + 4, recDao.get().size(), "Recordings 
should be added");
        }
@@ -118,7 +130,7 @@ class TestImport extends AbstractTestImport {
        @Test
        void importMsgFolders() throws Exception {
                long fldrCount = msgFolderDao.get(0, Integer.MAX_VALUE).size();
-               File fldrs = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/msg/privateMessageFolder.xml").toURI());
+               File fldrs = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"msg/privateMessageFolder.xml").toURI());
                backupImport.importPrivateMsgFolders(fldrs.getParentFile());
                assertEquals(fldrCount + 1, msgFolderDao.get(0, 
Integer.MAX_VALUE).size(), "Message folders should be added");
        }
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java
index ba445a3..46a759a 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.backup;
 
+import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.File;
@@ -36,7 +37,7 @@ class TestImportCalendar extends AbstractTestImport {
        @Test
        void importCalendars() throws Exception {
                long calCount = calendarDao.get().size();
-               File cals = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/calendar/calendars.xml").toURI());
+               File cals = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"calendar/calendars.xml").toURI());
                backupImport.importCalendars(cals.getParentFile());
                assertEquals(calCount + 1, calendarDao.get().size(), "Calendars 
should be added");
        }
@@ -44,7 +45,7 @@ class TestImportCalendar extends AbstractTestImport {
        @Test
        void importAppointmentsSkip() throws Exception {
                long appCount = appointmentDao.get().size();
-               File apps = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/calendar/skip/appointements.xml").toURI());
+               File apps = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"calendar/skip/appointements.xml").toURI());
                backupImport.importAppointments(apps.getParentFile());
                assertEquals(appCount, appointmentDao.get().size(), "No 
Appointments should be added");
        }
@@ -52,7 +53,7 @@ class TestImportCalendar extends AbstractTestImport {
        @Test
        void importAppointments() throws Exception {
                long appCount = appointmentDao.get().size();
-               File apps = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/calendar/appointements.xml").toURI());
+               File apps = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"calendar/appointements.xml").toURI());
                backupImport.importAppointments(apps.getParentFile());
                assertEquals(appCount + 2, appointmentDao.get().size(), 
"Appointments should be added");
 
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportConfig.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportConfig.java
index 5f7d1fe..de3c7b3 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportConfig.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportConfig.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.backup;
 
+import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_FRONTEND;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_OAUTH;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_SOAP;
@@ -34,7 +35,7 @@ class TestImportConfig extends AbstractTestImport {
        @Test
        void importConfigsNoKeyDeleted() throws Exception {
                long configsCount = cfgDao.count();
-               File configs = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/config/skip/configs.xml").toURI());
+               File configs = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"config/skip/configs.xml").toURI());
                backupImport.importConfigs(configs.getParentFile());
                assertEquals(configsCount, cfgDao.count(), "No records should 
be added");
        }
@@ -52,7 +53,7 @@ class TestImportConfig extends AbstractTestImport {
                        cfgNE2.setType(Configuration.Type.BOOL);
                }
                cfgDao.update(cfgNE2, null, true);
-               File configs = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/config/bool/configs.xml").toURI());
+               File configs = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"config/bool/configs.xml").toURI());
                backupImport.importConfigs(configs.getParentFile());
                cfgDao.get(CONFIG_REGISTER_FRONTEND, CONFIG_REGISTER_SOAP, 
CONFIG_REGISTER_OAUTH, CONFIG_REPLY_TO_ORGANIZER).forEach(cfg -> {
                        boolean exp = 
!cfg.getKey().equals(CONFIG_REPLY_TO_ORGANIZER);
@@ -62,7 +63,7 @@ class TestImportConfig extends AbstractTestImport {
 
        @Test
        void importConfigs() throws Exception {
-               File configs = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/config/configs.xml").toURI());
+               File configs = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"config/configs.xml").toURI());
                backupImport.importConfigs(configs.getParentFile());
        }
 }
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
index 2653104..2d80d25 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.backup;
 
+import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -99,7 +100,7 @@ class TestImportOld extends AbstractTestImport {
         */
        @Test
        void importJira2423() throws Exception {
-               try (InputStream is = 
getClass().getClassLoader().getResourceAsStream("org/apache/openmeetings/backup/jira2423/backup_2423.zip"))
 {
+               try (InputStream is = 
getClass().getClassLoader().getResourceAsStream(BACKUP_ROOT + 
"jira2423/backup_2423.zip")) {
                        backupImport.performImport(is, new ProgressHolder());
 
                        Group grp2 = groupDao.get("group2_jira_2423");
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java
index 591088a..e96f0f6 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.backup;
 
+import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.File;
@@ -33,7 +34,7 @@ class TestImportRoom extends AbstractTestImport {
        @Test
        void importRooms() throws Exception {
                long roomsCount = roomDao.count();
-               File rooms = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/room/rooms.xml").toURI());
+               File rooms = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"room/rooms.xml").toURI());
                backupImport.importRooms(rooms.getParentFile());
                assertEquals(roomsCount + 1, roomDao.count(), "Room should be 
added");
        }
@@ -41,7 +42,7 @@ class TestImportRoom extends AbstractTestImport {
        @Test
        void importRoomGroups() throws Exception {
                //TODO need to check it somehow
-               File rooms = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/room/rooms.xml").toURI());
+               File rooms = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"room/rooms.xml").toURI());
                backupImport.importRoomGroups(rooms.getParentFile());
        }
 }
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java
index a6c479e..57b2023 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.backup;
 
+import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
@@ -38,7 +39,7 @@ class TestImportUser extends AbstractTestImport {
        @Test
        void importUserNE() throws Exception {
                Assertions.assertThrows(BackupException.class, () -> {
-                       File configs = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/config/skip/configs.xml").toURI());
+                       File configs = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"config/skip/configs.xml").toURI());
                        backupImport.importUsers(configs.getParentFile());
                });
        }
@@ -46,7 +47,7 @@ class TestImportUser extends AbstractTestImport {
        @Test
        void importUsers() throws Exception {
                long userCount = userDao.count();
-               File users = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/user/users.xml").toURI());
+               File users = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"user/users.xml").toURI());
                backupImport.importUsers(users.getParentFile());
                assertEquals(userCount + 8, userDao.count(), "Users should be 
added");
                User ext = userDao.getExternalUser("234", "TheBestCms");
@@ -56,7 +57,7 @@ class TestImportUser extends AbstractTestImport {
        @Test
        void importNoLoginDeleted() throws Exception {
                long userCount = userDao.count();
-               File users = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/user/skip/users.xml").toURI());
+               File users = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"user/skip/users.xml").toURI());
                backupImport.importUsers(users.getParentFile());
                assertEquals(userCount, userDao.count(), "No records should be 
added");
        }
@@ -69,7 +70,7 @@ class TestImportUser extends AbstractTestImport {
                for (LdapConfig cfg : ldapDao.get(0, Integer.MAX_VALUE)) {
                        ldapDao.delete(cfg, null);
                }
-               File users = new 
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/user/ldap/users.xml").toURI());
+               File users = new 
File(getClass().getClassLoader().getResource(BACKUP_ROOT + 
"user/ldap/users.xml").toURI());
                backupImport.cleanup();
                backupImport.importLdap(users.getParentFile());
                List<LdapConfig> ldapConfigs = ldapDao.get("om_2294_ldap", 0, 
100, null);
diff --git 
a/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/menu/extraMenus.xml
 
b/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/menu/extraMenus.xml
new file mode 100644
index 0000000..d3e4656
--- /dev/null
+++ 
b/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/menu/extraMenus.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+
+-->
+<!-- ###############################################
+This File is auto-generated by the Backup Tool
+you should use the BackupPanel to modify or change this file
+see http://openmeetings.apache.org/Upgrade.html for Details
+###############################################
+ -->
+ <!--###############################################
+This File is auto-generated by the Backup Tool
+you should use the BackupPanel to modify or change this file
+see https://openmeetings.apache.org/Upgrade.html for Details
+###############################################
+-->
+<root>
+<ExtraMenus>
+<ExtraMenu>
+    <id>1</id>
+    <name>test</name>
+    <link>unipro.ru</link>
+    <description>Unipro</description>
+    <groups/>
+</ExtraMenu>
+<ExtraMenu>
+    <id>2</id>
+    <name>aasdadasd</name>
+    <link>asdasdasdsad.com</link>
+    <groups>
+        <group>1</group>
+    </groups>
+</ExtraMenu>
+<ExtraMenu>
+    <id>3</id>
+    <name>wwwwww</name>
+    <link>wwwww.ru</link>
+    <description>test group</description>
+    <groups>
+        <group>2</group>
+    </groups>
+</ExtraMenu>
+<ExtraMenu>
+    <id>4</id>
+    <name></name>
+    <link>aaa.com</link>
+    <description>test no name</description>
+</ExtraMenu>
+<ExtraMenu>
+    <id>5</id>
+    <name>bbbbbb</name>
+    <description>test no link</description>
+</ExtraMenu>
+<ExtraMenu>
+    <id>6</id>
+    <description>test no name and link</description>
+</ExtraMenu>
+</ExtraMenus>
+</root>

Reply via email to