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 2016/11/07 03:43:31 UTC

svn commit: r1768421 [1/2] - in /openmeetings/application: branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ branches/3.1.x/openmeeti...

Author: solomax
Date: Mon Nov  7 03:43:30 2016
New Revision: 1768421

URL: http://svn.apache.org/viewvc?rev=1768421&view=rev
Log:
[OPENMEETINGS-1488] basic work on group edit for group admins

Modified:
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java
    openmeetings/application/branches/3.1.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
    openmeetings/application/branches/3.1.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
    openmeetings/application/branches/3.1.x/openmeetings-web/pom.xml
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java
    openmeetings/application/branches/3.2.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
    openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
    openmeetings/application/branches/3.2.x/openmeetings-web/pom.xml
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java
    openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
    openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
    openmeetings/application/trunk/openmeetings-web/pom.xml
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
    openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java Mon Nov  7 03:43:30 2016
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.db.dao.basic;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_GROUP_ADMIN;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -53,10 +54,25 @@ public class NavigationDao {
 
 	}
 
-	public List<Naviglobal> getMainMenu(boolean admin) {
-		return em.createNamedQuery("getNavigation", Naviglobal.class)
-				.setParameter("levelId", admin ? 3L : 1L)
+	public List<Naviglobal> getMainMenu(int level) {
+		List<Naviglobal> menu = em.createNamedQuery("getNavigation", Naviglobal.class)
+				.setParameter("levelId", level)
 				.getResultList();
+		if (LEVEL_GROUP_ADMIN == level) {
+			// filtering of child objects is not working on JPQL level
+			for (Naviglobal ng : menu) {
+				em.detach(ng);
+				ng.setId(null); // we don't need below changed to be saved
+				List<Navimain> sub = new ArrayList<>();
+				for (Navimain nm : ng.getMainnavi()) {
+					if (nm.getLevelId() <= level) {
+						sub.add(nm);
+					}
+				}
+				ng.setMainnavi(sub);
+			}
+		}
+		return menu;
 	}
 
 	public Naviglobal addGlobalStructure(int naviorder, String labelId, int levelId, String name, String tooltipLabelId) {
@@ -70,7 +86,6 @@ public class NavigationDao {
 		ng.setName(name);
 		ng.setInserted(new Date());
 		ng.setTooltipLabelId(tooltipLabelId);
-		// CriteriaBuilder crit = em.getCriteriaBuilder();
 
 		em.persist(ng);
 		return ng;
@@ -79,8 +94,6 @@ public class NavigationDao {
 	public void addMainStructure(String action, String params, int naviorder, String labelId,
 			int levelId, String name, Long globalId, String tooltipLabelId) {
 		Naviglobal ng = getGlobalMenuEntry(globalId);
-		List<Navimain> mainEntries = ng.getMainnavi();
-		mainEntries = (mainEntries == null) ? new ArrayList<Navimain>() : mainEntries;
 
 		Navimain nm = new Navimain();
 		nm.setAction(action);
@@ -96,10 +109,9 @@ public class NavigationDao {
 		nm.setInserted(new Date());
 		nm.setTooltipLabelId(tooltipLabelId);
 
-		mainEntries.add(nm);
-		ng.setMainnavi(mainEntries);
+		ng.getMainnavi().add(nm);
 
-		em.persist(ng);
+		em.merge(ng);
 	}
 
 }

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java Mon Nov  7 03:43:30 2016
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.db.entity.basic;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -40,9 +41,8 @@ import org.apache.openmeetings.db.entity
 
 @Entity
 @NamedQueries({
-		@NamedQuery(name = "getNavigation", query = "SELECT DISTINCT ng from Naviglobal ng JOIN ng.mainnavi nm "
-				+ "WHERE nm.deleted = false AND ng.levelId <= :levelId AND nm.levelId <= :levelId "
-				+ "AND ng.deleted = false ORDER BY ng.naviorder ASC"),
+		@NamedQuery(name = "getNavigation", query = "SELECT ng FROM Naviglobal ng "
+				+ "WHERE ng.levelId <= :levelId AND ng.deleted = false ORDER BY ng.naviorder ASC"),
 		@NamedQuery(name = "getNavigationById", query = "SELECT ng from Naviglobal ng WHERE ng.id = :id") })
 @Table(name = "naviglobal")
 public class Naviglobal implements IDataProviderEntity {
@@ -68,10 +68,10 @@ public class Naviglobal implements IData
 	@Column(name = "comment")
 	private String comment;
 
-	@Column(name = "naviorder")
+	@Column(name = "naviorder", nullable = false)
 	private int naviorder;
 
-	@Column(name = "level_id")
+	@Column(name = "level_id", nullable = false)
 	private int levelId;
 
 	@Column(name = "deleted", nullable = false)
@@ -84,10 +84,10 @@ public class Naviglobal implements IData
 	private String tooltipLabelId;
 
 	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
-	@JoinColumn(name = "global_id")
+	@JoinColumn(name = "global_id", nullable = false)
 	@ForeignKey(enabled = true)
 	@OrderBy("naviorder")
-	private List<Navimain> mainnavi;
+	private List<Navimain> mainnavi = new ArrayList<>();
 
 	@Override
 	public Long getId() {

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java Mon Nov  7 03:43:30 2016
@@ -63,10 +63,10 @@ public class Navimain implements IDataPr
 	@Column(name = "comment")
 	private String comment;
 
-	@Column(name = "naviorder")
+	@Column(name = "naviorder", nullable = false)
 	private int naviorder;
 
-	@Column(name = "level_id")
+	@Column(name = "level_id", nullable = false)
 	private int levelId;
 
 	@Column(name = "label_id")

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java Mon Nov  7 03:43:30 2016
@@ -39,7 +39,6 @@ import org.simpleframework.xml.Root;
 	, @NamedQuery(name="getGroupByName", query="SELECT o FROM Group AS o WHERE o.name = :name AND o.deleted = false")
 	, @NamedQuery(name="getAnyGroupById", query="SELECT c FROM Group AS c WHERE c.id = :groupId")
 	, @NamedQuery(name="getGroupsByIds", query="SELECT c FROM Group AS c WHERE c.id IN :ids")
-	, @NamedQuery(name="getGroupsByUserId", query="SELECT ou.group FROM User u, IN(u.groupUsers) ou WHERE u.deleted = false AND u.id = :userId")
 	, @NamedQuery(name="getNondeletedGroups", query="SELECT o FROM Group o WHERE o.deleted = false ORDER BY o.id")
 	, @NamedQuery(name="countGroups", query="SELECT COUNT(c) FROM Group AS c WHERE c.deleted = false")
 })

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java Mon Nov  7 03:43:30 2016
@@ -110,6 +110,7 @@ public class User implements IDataProvid
 	@XmlType(namespace="org.apache.openmeetings.user.user.right")
 	public enum Right {
 		Admin			// access to Admin module
+		, GroupAdmin	// partial access to Admin module (should not be directly assigned)
 		, Room			// enter the room
 		, Dashboard		// access the dashboard
 		, Login			// login to Om internal DB

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java Mon Nov  7 03:43:30 2016
@@ -92,6 +92,10 @@ public class AuthLevelUtil {
 		return check(rights, User.Right.Admin);
 	}
 
+	public static boolean hasGroupAdminLevel(Set<User.Right> rights) {
+		return check(rights, User.Right.GroupAdmin);
+	}
+
 	public static boolean hasWebServiceLevel(Set<User.Right> rights) {
 		return check(rights, User.Right.Soap);
 	}

Modified: openmeetings/application/branches/3.1.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java Mon Nov  7 03:43:30 2016
@@ -47,6 +47,9 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS_SHOW;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_QUALITY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_GROUP_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_USER;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_LOGIN_MINIMUM_LENGTH;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_PASSWORD_MINIMUM_LENGTH;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
@@ -116,39 +119,39 @@ public class ImportInitvalues {
 		/*
 		 * ######################## Dashboard Menu Points
 		 */
-		Naviglobal home = navimanagement.addGlobalStructure(1, "124", 1, "home", "582");
-		navimanagement.addMainStructure("dashboardModuleStartScreen", null, 1, "290", 1, "Dashboard", home.getId(), "1450");
-		navimanagement.addMainStructure("dashboardModuleCalendar", null, 2, "291", 1, "Calendar", home.getId(), "1451");
+		Naviglobal home = navimanagement.addGlobalStructure(1, "124", LEVEL_USER, "home", "582");
+		navimanagement.addMainStructure("dashboardModuleStartScreen", null, 1, "290", LEVEL_USER, "Dashboard", home.getId(), "1450");
+		navimanagement.addMainStructure("dashboardModuleCalendar", null, 2, "291", LEVEL_USER, "Calendar", home.getId(), "1451");
 
 		/*
 		 * ######################## Conference Menu Points
 		 */
-		Naviglobal rooms = navimanagement.addGlobalStructure(2, "792", 1, "Conference Rooms", "793");
-		navimanagement.addMainStructure("conferenceModuleRoomList", "publicTabButton", 1, "777", 1, "Public Rooms", rooms.getId(), "1506");
-		navimanagement.addMainStructure("conferenceModuleRoomList", "privateTabButton", 2, "779", 1, "Private Rooms", rooms.getId(), "1507");
-		navimanagement.addMainStructure("conferenceModuleRoomList", "myTabButton", 3, "781", 1, "My Rooms", rooms.getId(), "1508");
+		Naviglobal rooms = navimanagement.addGlobalStructure(2, "792", LEVEL_USER, "Conference Rooms", "793");
+		navimanagement.addMainStructure("conferenceModuleRoomList", "publicTabButton", 1, "777", LEVEL_USER, "Public Rooms", rooms.getId(), "1506");
+		navimanagement.addMainStructure("conferenceModuleRoomList", "privateTabButton", 2, "779", LEVEL_USER, "Private Rooms", rooms.getId(), "1507");
+		navimanagement.addMainStructure("conferenceModuleRoomList", "myTabButton", 3, "781", LEVEL_USER, "My Rooms", rooms.getId(), "1508");
 
 		/*
 		 * ######################## Recording Menu Points
 		 */
-		Naviglobal rec = navimanagement.addGlobalStructure(3, "395", 1, "record", "583");
-		navimanagement.addMainStructure("recordModule", null, 1, "395", 1, "Recordings", rec.getId(), "1452");
+		Naviglobal rec = navimanagement.addGlobalStructure(3, "395", LEVEL_USER, "record", "583");
+		navimanagement.addMainStructure("recordModule", null, 1, "395", LEVEL_USER, "Recordings", rec.getId(), "1452");
 
 		/*
 		 * ######################## Administration Menu Points
 		 */
-		Naviglobal admin = navimanagement.addGlobalStructure(6, "6", 3, "Administration Menu", "586");
-		navimanagement.addMainStructure("adminModuleUser", null, 14, "125", 2, "Administration of Users", admin.getId(), "1454");
-		navimanagement.addMainStructure("adminModuleConnections", null, 15, "597", 3, "Aministration of Connections", admin.getId(), "1455");
-		navimanagement.addMainStructure("adminModuleOrg", null, 16, "127", 3, "Administration of Groups", admin.getId(), "1456");
-		navimanagement.addMainStructure("adminModuleRoom", null, 17, "186", 3, "Administration of Rooms", admin.getId(), "1457");
-		navimanagement.addMainStructure("adminModuleConfiguration", null, 18, "263", 3, "Administration of Configuration", admin.getId(), "1458");
-		navimanagement.addMainStructure("adminModuleLanguages", null, 19, "348", 3, "Administration of Languages", admin.getId(), "1459");
-		navimanagement.addMainStructure("adminModuleLDAP", null, 20, "1103", 3, "Administration of LDAP Configs", admin.getId(), "1460");
-		navimanagement.addMainStructure("adminModuleOAuth", null, 21, "1571", 3, "Administration of OAuth2 servers", admin.getId(), "1572");
-		navimanagement.addMainStructure("adminModuleBackup", null, 22, "367", 3, "Administration of Backups", admin.getId(), "1461");
-		navimanagement.addMainStructure("adminModuleServers", null, 23, "1498", 3, "Administration of Servers", admin.getId(), "1499");
-		navimanagement.addMainStructure("adminModuleEmail", null, 24, "main.menu.admin.email", 3, "Administration of Emails", admin.getId(), "main.menu.admin.email.desc");
+		Naviglobal admin = navimanagement.addGlobalStructure(6, "6", LEVEL_GROUP_ADMIN, "Administration Menu", "586");
+		navimanagement.addMainStructure("adminModuleUser", null, 14, "125", LEVEL_GROUP_ADMIN, "Administration of Users", admin.getId(), "1454");
+		navimanagement.addMainStructure("adminModuleConnections", null, 15, "597", LEVEL_ADMIN, "Aministration of Connections", admin.getId(), "1455");
+		navimanagement.addMainStructure("adminModuleOrg", null, 16, "127", LEVEL_GROUP_ADMIN, "Administration of Groups", admin.getId(), "1456");
+		navimanagement.addMainStructure("adminModuleRoom", null, 17, "186", LEVEL_GROUP_ADMIN, "Administration of Rooms", admin.getId(), "1457");
+		navimanagement.addMainStructure("adminModuleConfiguration", null, 18, "263", LEVEL_ADMIN, "Administration of Configuration", admin.getId(), "1458");
+		navimanagement.addMainStructure("adminModuleLanguages", null, 19, "348", LEVEL_ADMIN, "Administration of Languages", admin.getId(), "1459");
+		navimanagement.addMainStructure("adminModuleLDAP", null, 20, "1103", LEVEL_ADMIN, "Administration of LDAP Configs", admin.getId(), "1460");
+		navimanagement.addMainStructure("adminModuleOAuth", null, 21, "1571", LEVEL_ADMIN, "Administration of OAuth2 servers", admin.getId(), "1572");
+		navimanagement.addMainStructure("adminModuleBackup", null, 22, "367", LEVEL_ADMIN, "Administration of Backups", admin.getId(), "1461");
+		navimanagement.addMainStructure("adminModuleServers", null, 23, "1498", LEVEL_ADMIN, "Administration of Servers", admin.getId(), "1499");
+		navimanagement.addMainStructure("adminModuleEmail", null, 24, "main.menu.admin.email", LEVEL_ADMIN, "Administration of Emails", admin.getId(), "main.menu.admin.email.desc");
 		log.debug("MainMenu ADDED");
 	}
 	

Modified: openmeetings/application/branches/3.1.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java Mon Nov  7 03:43:30 2016
@@ -46,6 +46,9 @@ public class OpenmeetingsVariables {
 	public static final String CONFIG_CALENDAR_FIRST_DAY = "calendar.firstday";
 	public static final String CONFIG_DEFAULT_GROUP_ID = "default_group_id";
 	public static final String CONFIG_GOOGLE_ANALYTICS_CODE = "google.analytics.code";
+	public static final int LEVEL_USER = 1;
+	public static final int LEVEL_GROUP_ADMIN = 2;
+	public static final int LEVEL_ADMIN = 3;
 
 	public static int DEFAULT_MINUTES_REMINDER_SEND = 15;
 	public static String DEFAULT_BASE_URL = "http://localhost:5080/openmeetings/";

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/pom.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/pom.xml?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/pom.xml (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/pom.xml Mon Nov  7 03:43:30 2016
@@ -382,11 +382,6 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
-			<artifactId>wicket-native-websocket-core</artifactId>
-			<version>${wicket.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.wicket</groupId>
 			<artifactId>wicket-native-websocket-javax</artifactId>
 			<version>${wicket.version}</version>
 		</dependency>

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java Mon Nov  7 03:43:30 2016
@@ -24,7 +24,8 @@ import org.apache.wicket.authroles.autho
 @AuthorizeInstantiation("Admin")
 public abstract class AdminPanel extends BasePanel {
 	private static final long serialVersionUID = 1L;
-	protected final static String ROW_CLASS = "clickable ui-widget-content %s";
+	protected final static String BASE_ROW_CLASS = "ui-widget-content";
+	protected final static String ROW_CLASS = BASE_ROW_CLASS + " clickable";
 
 	public AdminPanel(String id) {
 		super(id);

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java Mon Nov  7 03:43:30 2016
@@ -18,7 +18,17 @@
  */
 package org.apache.openmeetings.web.admin.groups;
 
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+
 import org.apache.openmeetings.db.dao.user.GroupDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.web.admin.AdminPanel;
@@ -31,6 +41,7 @@ import org.apache.openmeetings.web.data.
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -43,6 +54,7 @@ import org.apache.wicket.markup.repeater
  * @author swagner
  * 
  */
+@AuthorizeInstantiation({"Admin", "GroupAdmin"})
 public class GroupsPanel extends AdminPanel {
 	private static final long serialVersionUID = 1L;
 	private GroupForm form;
@@ -57,7 +69,16 @@ public class GroupsPanel extends AdminPa
 	public GroupsPanel(String id) {
 		super(id);
 		final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
-	
+		final boolean isGroupAdmin = hasGroupAdminLevel(getRights());
+		final Set<Long> groupIds = new HashSet<>();
+		if (isGroupAdmin) {
+			for (GroupUser gu : getBean(UserDao.class).get(getUserId()).getGroupUsers()) {
+				if (gu.isModerator()) {
+					groupIds.add(gu.getGroup().getId());
+				}
+			}
+		}
+
 		//Adding the Group Form
 		form = new GroupForm("form", listContainer, new Group());
 		add(form);
@@ -68,22 +89,26 @@ public class GroupsPanel extends AdminPa
 
 			@Override
 			protected void populateItem(Item<Group> item) {
-				final Group o = item.getModelObject();
+				final Group g = item.getModelObject();
 				item.add(new Label("id"));
 				item.add(new Label("name"));
-				item.add(new AjaxEventBehavior("click") {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.hideNewRecord();
-						form.setModelObject(o);
-						form.updateView(target);
-						target.add(listContainer);
-						target.appendJavaScript("groupsInit();");
-					}
-				});
-				item.add(AttributeModifier.append("class", getRowClass(o.getId(), form.getModelObject().getId())));
+				if (isGroupAdmin && groupIds.contains(g.getId())) {
+					item.add(new AjaxEventBehavior("click") {
+						private static final long serialVersionUID = 1L;
+	
+						@Override
+						protected void onEvent(AjaxRequestTarget target) {
+							form.hideNewRecord();
+							form.setModelObject(g);
+							form.updateView(target);
+							target.add(listContainer);
+							target.appendJavaScript("groupsInit();");
+						}
+					});
+					item.add(AttributeModifier.append("class", getRowClass(g.getId(), form.getModelObject().getId())));
+				} else {
+					item.add(AttributeModifier.append("class", BASE_ROW_CLASS));
+				}
 			}
 		};
 

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java Mon Nov  7 03:43:30 2016
@@ -32,6 +32,7 @@ import org.apache.openmeetings.web.data.
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
@@ -40,6 +41,7 @@ import org.apache.wicket.markup.html.bas
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 
+@AuthorizeInstantiation({"Admin", "GroupAdmin"})
 public class RoomsPanel extends AdminPanel {
 	private static final long serialVersionUID = -1L;
 	private final static JavaScriptResourceReference ROOM_FUNCTIONS = new JavaScriptResourceReference(RoomsPanel.class, "room.js");

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java Mon Nov  7 03:43:30 2016
@@ -203,6 +203,9 @@ public class UserForm extends AdminBaseF
 			@Override
 			public void query(String term, int page, Response<Right> response) {
 				for (Right r : Right.values()) {
+					if (Right.GroupAdmin == r) {
+						continue;
+					}
 					if (Strings.isEmpty(term) || r.name().contains(term)) {
 						response.add(r);
 					}

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java Mon Nov  7 03:43:30 2016
@@ -34,6 +34,7 @@ import org.apache.openmeetings.web.data.
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -44,6 +45,7 @@ import com.googlecode.wicket.jquery.ui.w
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
 import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
 
+@AuthorizeInstantiation({"Admin", "GroupAdmin"})
 public class UsersPanel extends AdminPanel {
 	private static final long serialVersionUID = 1L;
 	final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Mon Nov  7 03:43:30 2016
@@ -56,9 +56,11 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.server.RemoteSessionObject;
 import org.apache.openmeetings.db.entity.server.SOAPLogin;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
+import org.apache.openmeetings.db.entity.user.GroupUser;
 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.Type;
+import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.db.util.TimezoneUtil;
 import org.apache.openmeetings.util.OmException;
 import org.apache.openmeetings.web.user.dashboard.MyRoomsWidget;
@@ -273,7 +275,16 @@ public class WebSession extends Abstract
 		}
 		userId = u.getId();
 		if (rights == null || rights.isEmpty()) {
-			this.rights = Collections.unmodifiableSet(u.getRights());
+			Set<Right> r = new HashSet<>(u.getRights());
+			if (!AuthLevelUtil.hasAdminLevel(r)) {
+				for (GroupUser gu : u.getGroupUsers()) {
+					if (gu.isModerator()) {
+						r.add(Right.GroupAdmin);
+						break;
+					}
+				}
+			}
+			this.rights = Collections.unmodifiableSet(r);
 		} else {
 			this.rights = Collections.unmodifiableSet(rights);
 		}

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java Mon Nov  7 03:43:30 2016
@@ -19,6 +19,9 @@
 package org.apache.openmeetings.web.common;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_GROUP_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_USER;
 import static org.apache.openmeetings.web.app.Application.addOnlineUser;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.Application.removeOnlineUser;
@@ -30,16 +33,19 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_MESSAGES;
 import static org.apache.openmeetings.web.util.OmUrlFragment.getPanel;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.openmeetings.db.dao.basic.NavigationDao;
 import org.apache.openmeetings.db.entity.basic.Naviglobal;
 import org.apache.openmeetings.db.entity.basic.Navimain;
 import org.apache.openmeetings.db.entity.user.PrivateMessage;
-import org.apache.openmeetings.db.util.AuthLevelUtil;
+import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.WebSession;
@@ -270,9 +276,14 @@ public class MainPanel extends Panel {
 		});
 	}
 
+	private int getLevel() {
+		Set<Right> r = WebSession.getRights();
+		return hasAdminLevel(r) ? LEVEL_ADMIN : (hasGroupAdminLevel(r) ? LEVEL_GROUP_ADMIN : LEVEL_USER);
+	}
+
 	private List<IMenuItem> getMainMenu() {
 		List<IMenuItem> menu = new ArrayList<>();
-		for (Naviglobal gl : getBean(NavigationDao.class).getMainMenu(AuthLevelUtil.hasAdminLevel(WebSession.getRights()))) {
+		for (Naviglobal gl : getBean(NavigationDao.class).getMainMenu(getLevel())) {
 			List<IMenuItem> l = new ArrayList<>();
 			for (Navimain nm : gl.getMainnavi()) {
 				l.add(new MainMenuItem(nm) {

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java Mon Nov  7 03:43:30 2016
@@ -18,6 +18,9 @@
  */
 package org.apache.openmeetings.test.navi;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_GROUP_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_USER;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
@@ -31,29 +34,44 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
 public class TestNavi extends AbstractJUnitDefaults {
-	
 	@Autowired
 	private NavigationDao navimanagement;
-	
+
+	private List<Naviglobal> testGetNavi(int level) {
+		List<Naviglobal> ll = navimanagement.getMainMenu(level);
+
+		assertTrue("GlobalNavi size should be greater than zero: " + ll.size(), ll.size() > 0);
+
+		for (Naviglobal navigl : ll) {
+			assertNotNull("Naviglobal retrieved should not be null", navigl);
+			assertTrue(String.format("Naviglobal retrieved should have level not greater than: %s, has: ", level, navigl.getLevelId()), navigl.getLevelId() <= level);
+
+			assertNotNull("Naviglobal retrieved should have Navimain entries", navigl.getMainnavi());
+			for (Navimain navim : navigl.getMainnavi()) {
+				assertNotNull("Navimain retrieved should not be null", navim);
+				assertTrue(String.format("Navimain retrieved should have level not greater than: %s, has: ", level, navim.getLevelId()), navim.getLevelId() <= level);
+			}
+		}
+		return ll;
+	}
+
 	@Test
-	public void testGetNavi(){
-		
-        List<Naviglobal> ll = navimanagement.getMainMenu(true);
-
-        assertTrue("GlobalNavi size should be greater than zero: " + ll.size(), ll.size() > 0);
-        System.out.println("NaviGlobal size: " + ll.size());
-
-        for (Naviglobal navigl : ll) {
-        	assertNotNull("Naviglobal retrieved should not be null", navigl);
-            System.out.println("Naviglobal label: " + navigl.getLevelId());
-
-        	assertNotNull("Naviglobal retrieved should have Navimain entries", navigl.getMainnavi());
-            for (Navimain navim : navigl.getMainnavi()) {
-            	assertNotNull("Navimain retrieved should not be null", navim);
-                System.out.println("-->" + navim.getLabelId());
-            }
-        }
-		
+	public void testGetUserNavi() {
+		testGetNavi(LEVEL_USER);
 	}
 
+	@Test
+	public void testGetGroupAdminNavi() {
+		testGetNavi(LEVEL_GROUP_ADMIN);
+	}
+
+	@Test
+	public void testGetAdminNavi() {
+		List<Naviglobal> menu = testGetNavi(LEVEL_ADMIN);
+		for (Naviglobal ng : menu) {
+			if (ng.getLevelId() == LEVEL_ADMIN) {
+				assertTrue("Admin menu should conatin more than 4 items: " + ng.getMainnavi().size(), ng.getMainnavi().size() > 4);
+			}
+		}
+	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java Mon Nov  7 03:43:30 2016
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.db.dao.basic;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_GROUP_ADMIN;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -53,10 +54,25 @@ public class NavigationDao {
 
 	}
 
-	public List<Naviglobal> getMainMenu(boolean admin) {
-		return em.createNamedQuery("getNavigation", Naviglobal.class)
-				.setParameter("levelId", admin ? 3L : 1L)
+	public List<Naviglobal> getMainMenu(int level) {
+		List<Naviglobal> menu = em.createNamedQuery("getNavigation", Naviglobal.class)
+				.setParameter("levelId", level)
 				.getResultList();
+		if (LEVEL_GROUP_ADMIN == level) {
+			// filtering of child objects is not working on JPQL level
+			for (Naviglobal ng : menu) {
+				em.detach(ng);
+				ng.setId(null); // we don't need below changed to be saved
+				List<Navimain> sub = new ArrayList<>();
+				for (Navimain nm : ng.getMainnavi()) {
+					if (nm.getLevelId() <= level) {
+						sub.add(nm);
+					}
+				}
+				ng.setMainnavi(sub);
+			}
+		}
+		return menu;
 	}
 
 	public Naviglobal addGlobalStructure(int naviorder, String labelId, int levelId, String name, String tooltipLabelId) {
@@ -70,7 +86,6 @@ public class NavigationDao {
 		ng.setName(name);
 		ng.setInserted(new Date());
 		ng.setTooltipLabelId(tooltipLabelId);
-		// CriteriaBuilder crit = em.getCriteriaBuilder();
 
 		em.persist(ng);
 		return ng;
@@ -79,8 +94,6 @@ public class NavigationDao {
 	public void addMainStructure(String action, String params, int naviorder, String labelId,
 			int levelId, String name, Long globalId, String tooltipLabelId) {
 		Naviglobal ng = getGlobalMenuEntry(globalId);
-		List<Navimain> mainEntries = ng.getMainnavi();
-		mainEntries = (mainEntries == null) ? new ArrayList<Navimain>() : mainEntries;
 
 		Navimain nm = new Navimain();
 		nm.setAction(action);
@@ -96,10 +109,9 @@ public class NavigationDao {
 		nm.setInserted(new Date());
 		nm.setTooltipLabelId(tooltipLabelId);
 
-		mainEntries.add(nm);
-		ng.setMainnavi(mainEntries);
+		ng.getMainnavi().add(nm);
 
-		em.persist(ng);
+		em.merge(ng);
 	}
 
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java Mon Nov  7 03:43:30 2016
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.db.entity.basic;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -40,9 +41,8 @@ import org.apache.openmeetings.db.entity
 
 @Entity
 @NamedQueries({
-		@NamedQuery(name = "getNavigation", query = "SELECT DISTINCT ng from Naviglobal ng JOIN ng.mainnavi nm "
-				+ "WHERE nm.deleted = false AND ng.levelId <= :levelId AND nm.levelId <= :levelId "
-				+ "AND ng.deleted = false ORDER BY ng.naviorder ASC"),
+		@NamedQuery(name = "getNavigation", query = "SELECT ng FROM Naviglobal ng "
+				+ "WHERE ng.levelId <= :levelId AND ng.deleted = false ORDER BY ng.naviorder ASC"),
 		@NamedQuery(name = "getNavigationById", query = "SELECT ng from Naviglobal ng WHERE ng.id = :id") })
 @Table(name = "naviglobal")
 public class Naviglobal implements IDataProviderEntity {
@@ -68,10 +68,10 @@ public class Naviglobal implements IData
 	@Column(name = "comment")
 	private String comment;
 
-	@Column(name = "naviorder")
+	@Column(name = "naviorder", nullable = false)
 	private int naviorder;
 
-	@Column(name = "level_id")
+	@Column(name = "level_id", nullable = false)
 	private int levelId;
 
 	@Column(name = "deleted", nullable = false)
@@ -84,10 +84,10 @@ public class Naviglobal implements IData
 	private String tooltipLabelId;
 
 	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
-	@JoinColumn(name = "global_id")
+	@JoinColumn(name = "global_id", nullable = false)
 	@ForeignKey(enabled = true)
 	@OrderBy("naviorder")
-	private List<Navimain> mainnavi;
+	private List<Navimain> mainnavi = new ArrayList<>();
 
 	@Override
 	public Long getId() {

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java Mon Nov  7 03:43:30 2016
@@ -63,10 +63,10 @@ public class Navimain implements IDataPr
 	@Column(name = "comment")
 	private String comment;
 
-	@Column(name = "naviorder")
+	@Column(name = "naviorder", nullable = false)
 	private int naviorder;
 
-	@Column(name = "level_id")
+	@Column(name = "level_id", nullable = false)
 	private int levelId;
 
 	@Column(name = "label_id")

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java Mon Nov  7 03:43:30 2016
@@ -39,7 +39,6 @@ import org.simpleframework.xml.Root;
 	, @NamedQuery(name="getGroupByName", query="SELECT o FROM Group AS o WHERE o.name = :name AND o.deleted = false")
 	, @NamedQuery(name="getAnyGroupById", query="SELECT c FROM Group AS c WHERE c.id = :groupId")
 	, @NamedQuery(name="getGroupsByIds", query="SELECT c FROM Group AS c WHERE c.id IN :ids")
-	, @NamedQuery(name="getGroupsByUserId", query="SELECT ou.group FROM User u, IN(u.groupUsers) ou WHERE u.deleted = false AND u.id = :userId")
 	, @NamedQuery(name="getNondeletedGroups", query="SELECT o FROM Group o WHERE o.deleted = false ORDER BY o.id")
 	, @NamedQuery(name="countGroups", query="SELECT COUNT(c) FROM Group AS c WHERE c.deleted = false")
 })

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java Mon Nov  7 03:43:30 2016
@@ -110,6 +110,7 @@ public class User implements IDataProvid
 	@XmlType(namespace="org.apache.openmeetings.user.user.right")
 	public enum Right {
 		Admin			// access to Admin module
+		, GroupAdmin	// partial access to Admin module (should not be directly assigned)
 		, Room			// enter the room
 		, Dashboard		// access the dashboard
 		, Login			// login to Om internal DB

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/AuthLevelUtil.java Mon Nov  7 03:43:30 2016
@@ -92,6 +92,10 @@ public class AuthLevelUtil {
 		return check(rights, User.Right.Admin);
 	}
 
+	public static boolean hasGroupAdminLevel(Set<User.Right> rights) {
+		return check(rights, User.Right.GroupAdmin);
+	}
+
 	public static boolean hasWebServiceLevel(Set<User.Right> rights) {
 		return check(rights, User.Right.Soap);
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java Mon Nov  7 03:43:30 2016
@@ -48,6 +48,9 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_QUALITY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ENABLED;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_GROUP_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_USER;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_LOGIN_MINIMUM_LENGTH;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_PASSWORD_MINIMUM_LENGTH;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
@@ -118,39 +121,39 @@ public class ImportInitvalues {
 		/*
 		 * ######################## Dashboard Menu Points
 		 */
-		Naviglobal home = navimanagement.addGlobalStructure(1, "124", 1, "home", "582");
-		navimanagement.addMainStructure("dashboardModuleStartScreen", null, 1, "290", 1, "Dashboard", home.getId(), "1450");
-		navimanagement.addMainStructure("dashboardModuleCalendar", null, 2, "291", 1, "Calendar", home.getId(), "1451");
+		Naviglobal home = navimanagement.addGlobalStructure(1, "124", LEVEL_USER, "home", "582");
+		navimanagement.addMainStructure("dashboardModuleStartScreen", null, 1, "290", LEVEL_USER, "Dashboard", home.getId(), "1450");
+		navimanagement.addMainStructure("dashboardModuleCalendar", null, 2, "291", LEVEL_USER, "Calendar", home.getId(), "1451");
 
 		/*
 		 * ######################## Conference Menu Points
 		 */
-		Naviglobal rooms = navimanagement.addGlobalStructure(2, "792", 1, "Conference Rooms", "793");
-		navimanagement.addMainStructure("conferenceModuleRoomList", "publicTabButton", 1, "777", 1, "Public Rooms", rooms.getId(), "1506");
-		navimanagement.addMainStructure("conferenceModuleRoomList", "privateTabButton", 2, "779", 1, "Private Rooms", rooms.getId(), "1507");
-		navimanagement.addMainStructure("conferenceModuleRoomList", "myTabButton", 3, "781", 1, "My Rooms", rooms.getId(), "1508");
+		Naviglobal rooms = navimanagement.addGlobalStructure(2, "792", LEVEL_USER, "Conference Rooms", "793");
+		navimanagement.addMainStructure("conferenceModuleRoomList", "publicTabButton", 1, "777", LEVEL_USER, "Public Rooms", rooms.getId(), "1506");
+		navimanagement.addMainStructure("conferenceModuleRoomList", "privateTabButton", 2, "779", LEVEL_USER, "Private Rooms", rooms.getId(), "1507");
+		navimanagement.addMainStructure("conferenceModuleRoomList", "myTabButton", 3, "781", LEVEL_USER, "My Rooms", rooms.getId(), "1508");
 
 		/*
 		 * ######################## Recording Menu Points
 		 */
-		Naviglobal rec = navimanagement.addGlobalStructure(3, "395", 1, "record", "583");
-		navimanagement.addMainStructure("recordModule", null, 1, "395", 1, "Recordings", rec.getId(), "1452");
+		Naviglobal rec = navimanagement.addGlobalStructure(3, "395", LEVEL_USER, "record", "583");
+		navimanagement.addMainStructure("recordModule", null, 1, "395", LEVEL_USER, "Recordings", rec.getId(), "1452");
 
 		/*
 		 * ######################## Administration Menu Points
 		 */
-		Naviglobal admin = navimanagement.addGlobalStructure(6, "6", 3, "Administration Menu", "586");
-		navimanagement.addMainStructure("adminModuleUser", null, 14, "125", 2, "Administration of Users", admin.getId(), "1454");
-		navimanagement.addMainStructure("adminModuleConnections", null, 15, "597", 3, "Aministration of Connections", admin.getId(), "1455");
-		navimanagement.addMainStructure("adminModuleOrg", null, 16, "127", 3, "Administration of Groups", admin.getId(), "1456");
-		navimanagement.addMainStructure("adminModuleRoom", null, 17, "186", 3, "Administration of Rooms", admin.getId(), "1457");
-		navimanagement.addMainStructure("adminModuleConfiguration", null, 18, "263", 3, "Administration of Configuration", admin.getId(), "1458");
-		navimanagement.addMainStructure("adminModuleLanguages", null, 19, "348", 3, "Administration of Languages", admin.getId(), "1459");
-		navimanagement.addMainStructure("adminModuleLDAP", null, 20, "1103", 3, "Administration of LDAP Configs", admin.getId(), "1460");
-		navimanagement.addMainStructure("adminModuleOAuth", null, 21, "1571", 3, "Administration of OAuth2 servers", admin.getId(), "1572");
-		navimanagement.addMainStructure("adminModuleBackup", null, 22, "367", 3, "Administration of Backups", admin.getId(), "1461");
-		navimanagement.addMainStructure("adminModuleServers", null, 23, "1498", 3, "Administration of Servers", admin.getId(), "1499");
-		navimanagement.addMainStructure("adminModuleEmail", null, 24, "main.menu.admin.email", 3, "Administration of Emails", admin.getId(), "main.menu.admin.email.desc");
+		Naviglobal admin = navimanagement.addGlobalStructure(6, "6", LEVEL_GROUP_ADMIN, "Administration Menu", "586");
+		navimanagement.addMainStructure("adminModuleUser", null, 14, "125", LEVEL_GROUP_ADMIN, "Administration of Users", admin.getId(), "1454");
+		navimanagement.addMainStructure("adminModuleConnections", null, 15, "597", LEVEL_ADMIN, "Aministration of Connections", admin.getId(), "1455");
+		navimanagement.addMainStructure("adminModuleOrg", null, 16, "127", LEVEL_GROUP_ADMIN, "Administration of Groups", admin.getId(), "1456");
+		navimanagement.addMainStructure("adminModuleRoom", null, 17, "186", LEVEL_GROUP_ADMIN, "Administration of Rooms", admin.getId(), "1457");
+		navimanagement.addMainStructure("adminModuleConfiguration", null, 18, "263", LEVEL_ADMIN, "Administration of Configuration", admin.getId(), "1458");
+		navimanagement.addMainStructure("adminModuleLanguages", null, 19, "348", LEVEL_ADMIN, "Administration of Languages", admin.getId(), "1459");
+		navimanagement.addMainStructure("adminModuleLDAP", null, 20, "1103", LEVEL_ADMIN, "Administration of LDAP Configs", admin.getId(), "1460");
+		navimanagement.addMainStructure("adminModuleOAuth", null, 21, "1571", LEVEL_ADMIN, "Administration of OAuth2 servers", admin.getId(), "1572");
+		navimanagement.addMainStructure("adminModuleBackup", null, 22, "367", LEVEL_ADMIN, "Administration of Backups", admin.getId(), "1461");
+		navimanagement.addMainStructure("adminModuleServers", null, 23, "1498", LEVEL_ADMIN, "Administration of Servers", admin.getId(), "1499");
+		navimanagement.addMainStructure("adminModuleEmail", null, 24, "main.menu.admin.email", LEVEL_ADMIN, "Administration of Emails", admin.getId(), "main.menu.admin.email.desc");
 		log.debug("MainMenu ADDED");
 	}
 	

Modified: openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java Mon Nov  7 03:43:30 2016
@@ -47,6 +47,9 @@ public class OpenmeetingsVariables {
 	public static final String CONFIG_CALENDAR_FIRST_DAY = "calendar.firstday";
 	public static final String CONFIG_DEFAULT_GROUP_ID = "default_group_id";
 	public static final String CONFIG_GOOGLE_ANALYTICS_CODE = "google.analytics.code";
+	public static final int LEVEL_USER = 1;
+	public static final int LEVEL_GROUP_ADMIN = 2;
+	public static final int LEVEL_ADMIN = 3;
 
 	public static int DEFAULT_MINUTES_REMINDER_SEND = 15;
 	public static String DEFAULT_BASE_URL = "http://localhost:5080/openmeetings/";

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/pom.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/pom.xml?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/pom.xml (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/pom.xml Mon Nov  7 03:43:30 2016
@@ -382,11 +382,6 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
-			<artifactId>wicket-native-websocket-core</artifactId>
-			<version>${wicket.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.wicket</groupId>
 			<artifactId>wicket-native-websocket-javax</artifactId>
 			<version>${wicket.version}</version>
 		</dependency>

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminPanel.java Mon Nov  7 03:43:30 2016
@@ -24,7 +24,8 @@ import org.apache.wicket.authroles.autho
 @AuthorizeInstantiation("Admin")
 public abstract class AdminPanel extends BasePanel {
 	private static final long serialVersionUID = 1L;
-	protected final static String ROW_CLASS = "clickable ui-widget-content %s";
+	protected final static String BASE_ROW_CLASS = "ui-widget-content";
+	protected final static String ROW_CLASS = BASE_ROW_CLASS + " clickable";
 
 	public AdminPanel(String id) {
 		super(id);

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java Mon Nov  7 03:43:30 2016
@@ -18,7 +18,17 @@
  */
 package org.apache.openmeetings.web.admin.groups;
 
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+
 import org.apache.openmeetings.db.dao.user.GroupDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.web.admin.AdminPanel;
@@ -31,6 +41,7 @@ import org.apache.openmeetings.web.data.
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -43,6 +54,7 @@ import org.apache.wicket.markup.repeater
  * @author swagner
  * 
  */
+@AuthorizeInstantiation({"Admin", "GroupAdmin"})
 public class GroupsPanel extends AdminPanel {
 	private static final long serialVersionUID = 1L;
 	private GroupForm form;
@@ -57,7 +69,16 @@ public class GroupsPanel extends AdminPa
 	public GroupsPanel(String id) {
 		super(id);
 		final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
-	
+		final boolean isGroupAdmin = hasGroupAdminLevel(getRights());
+		final Set<Long> groupIds = new HashSet<>();
+		if (isGroupAdmin) {
+			for (GroupUser gu : getBean(UserDao.class).get(getUserId()).getGroupUsers()) {
+				if (gu.isModerator()) {
+					groupIds.add(gu.getGroup().getId());
+				}
+			}
+		}
+
 		//Adding the Group Form
 		form = new GroupForm("form", listContainer, new Group());
 		add(form);
@@ -68,22 +89,26 @@ public class GroupsPanel extends AdminPa
 
 			@Override
 			protected void populateItem(Item<Group> item) {
-				final Group o = item.getModelObject();
+				final Group g = item.getModelObject();
 				item.add(new Label("id"));
 				item.add(new Label("name"));
-				item.add(new AjaxEventBehavior("click") {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.hideNewRecord();
-						form.setModelObject(o);
-						form.updateView(target);
-						target.add(listContainer);
-						target.appendJavaScript("groupsInit();");
-					}
-				});
-				item.add(AttributeModifier.append("class", getRowClass(o.getId(), form.getModelObject().getId())));
+				if (isGroupAdmin && groupIds.contains(g.getId())) {
+					item.add(new AjaxEventBehavior("click") {
+						private static final long serialVersionUID = 1L;
+	
+						@Override
+						protected void onEvent(AjaxRequestTarget target) {
+							form.hideNewRecord();
+							form.setModelObject(g);
+							form.updateView(target);
+							target.add(listContainer);
+							target.appendJavaScript("groupsInit();");
+						}
+					});
+					item.add(AttributeModifier.append("class", getRowClass(g.getId(), form.getModelObject().getId())));
+				} else {
+					item.add(AttributeModifier.append("class", BASE_ROW_CLASS));
+				}
 			}
 		};
 

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java Mon Nov  7 03:43:30 2016
@@ -32,6 +32,7 @@ import org.apache.openmeetings.web.data.
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
@@ -40,6 +41,7 @@ import org.apache.wicket.markup.html.bas
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 
+@AuthorizeInstantiation({"Admin", "GroupAdmin"})
 public class RoomsPanel extends AdminPanel {
 	private static final long serialVersionUID = -1L;
 	private final static JavaScriptResourceReference ROOM_FUNCTIONS = new JavaScriptResourceReference(RoomsPanel.class, "room.js");

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java Mon Nov  7 03:43:30 2016
@@ -203,6 +203,9 @@ public class UserForm extends AdminBaseF
 			@Override
 			public void query(String term, int page, Response<Right> response) {
 				for (Right r : Right.values()) {
+					if (Right.GroupAdmin == r) {
+						continue;
+					}
 					if (Strings.isEmpty(term) || r.name().contains(term)) {
 						response.add(r);
 					}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java Mon Nov  7 03:43:30 2016
@@ -34,6 +34,7 @@ import org.apache.openmeetings.web.data.
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -44,6 +45,7 @@ import com.googlecode.wicket.jquery.ui.w
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
 import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
 
+@AuthorizeInstantiation({"Admin", "GroupAdmin"})
 public class UsersPanel extends AdminPanel {
 	private static final long serialVersionUID = 1L;
 	final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Mon Nov  7 03:43:30 2016
@@ -56,9 +56,11 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.server.RemoteSessionObject;
 import org.apache.openmeetings.db.entity.server.SOAPLogin;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
+import org.apache.openmeetings.db.entity.user.GroupUser;
 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.Type;
+import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.db.util.TimezoneUtil;
 import org.apache.openmeetings.util.OmException;
 import org.apache.openmeetings.web.user.dashboard.MyRoomsWidget;
@@ -283,7 +285,16 @@ public class WebSession extends Abstract
 		}
 		userId = u.getId();
 		if (rights == null || rights.isEmpty()) {
-			this.rights = Collections.unmodifiableSet(u.getRights());
+			Set<Right> r = new HashSet<>(u.getRights());
+			if (!AuthLevelUtil.hasAdminLevel(r)) {
+				for (GroupUser gu : u.getGroupUsers()) {
+					if (gu.isModerator()) {
+						r.add(Right.GroupAdmin);
+						break;
+					}
+				}
+			}
+			this.rights = Collections.unmodifiableSet(r);
 		} else {
 			this.rights = Collections.unmodifiableSet(rights);
 		}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java Mon Nov  7 03:43:30 2016
@@ -19,6 +19,9 @@
 package org.apache.openmeetings.web.common;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_GROUP_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_USER;
 import static org.apache.openmeetings.web.app.Application.addOnlineUser;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.Application.removeOnlineUser;
@@ -30,16 +33,19 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_MESSAGES;
 import static org.apache.openmeetings.web.util.OmUrlFragment.getPanel;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.openmeetings.db.dao.basic.NavigationDao;
 import org.apache.openmeetings.db.entity.basic.Naviglobal;
 import org.apache.openmeetings.db.entity.basic.Navimain;
 import org.apache.openmeetings.db.entity.user.PrivateMessage;
-import org.apache.openmeetings.db.util.AuthLevelUtil;
+import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.WebSession;
@@ -288,9 +294,14 @@ public class MainPanel extends Panel {
 		});
 	}
 
+	private int getLevel() {
+		Set<Right> r = WebSession.getRights();
+		return hasAdminLevel(r) ? LEVEL_ADMIN : (hasGroupAdminLevel(r) ? LEVEL_GROUP_ADMIN : LEVEL_USER);
+	}
+
 	private List<IMenuItem> getMainMenu() {
 		List<IMenuItem> menu = new ArrayList<>();
-		for (Naviglobal gl : getBean(NavigationDao.class).getMainMenu(AuthLevelUtil.hasAdminLevel(WebSession.getRights()))) {
+		for (Naviglobal gl : getBean(NavigationDao.class).getMainMenu(getLevel())) {
 			List<IMenuItem> l = new ArrayList<>();
 			for (Navimain nm : gl.getMainnavi()) {
 				l.add(new MainMenuItem(nm) {

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/navi/TestNavi.java Mon Nov  7 03:43:30 2016
@@ -18,6 +18,9 @@
  */
 package org.apache.openmeetings.test.navi;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_GROUP_ADMIN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_USER;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
@@ -31,29 +34,44 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
 public class TestNavi extends AbstractJUnitDefaults {
-	
 	@Autowired
 	private NavigationDao navimanagement;
-	
+
+	private List<Naviglobal> testGetNavi(int level) {
+		List<Naviglobal> ll = navimanagement.getMainMenu(level);
+
+		assertTrue("GlobalNavi size should be greater than zero: " + ll.size(), ll.size() > 0);
+
+		for (Naviglobal navigl : ll) {
+			assertNotNull("Naviglobal retrieved should not be null", navigl);
+			assertTrue(String.format("Naviglobal retrieved should have level not greater than: %s, has: ", level, navigl.getLevelId()), navigl.getLevelId() <= level);
+
+			assertNotNull("Naviglobal retrieved should have Navimain entries", navigl.getMainnavi());
+			for (Navimain navim : navigl.getMainnavi()) {
+				assertNotNull("Navimain retrieved should not be null", navim);
+				assertTrue(String.format("Navimain retrieved should have level not greater than: %s, has: ", level, navim.getLevelId()), navim.getLevelId() <= level);
+			}
+		}
+		return ll;
+	}
+
 	@Test
-	public void testGetNavi(){
-		
-        List<Naviglobal> ll = navimanagement.getMainMenu(true);
-
-        assertTrue("GlobalNavi size should be greater than zero: " + ll.size(), ll.size() > 0);
-        System.out.println("NaviGlobal size: " + ll.size());
-
-        for (Naviglobal navigl : ll) {
-        	assertNotNull("Naviglobal retrieved should not be null", navigl);
-            System.out.println("Naviglobal label: " + navigl.getLevelId());
-
-        	assertNotNull("Naviglobal retrieved should have Navimain entries", navigl.getMainnavi());
-            for (Navimain navim : navigl.getMainnavi()) {
-            	assertNotNull("Navimain retrieved should not be null", navim);
-                System.out.println("-->" + navim.getLabelId());
-            }
-        }
-		
+	public void testGetUserNavi() {
+		testGetNavi(LEVEL_USER);
 	}
 
+	@Test
+	public void testGetGroupAdminNavi() {
+		testGetNavi(LEVEL_GROUP_ADMIN);
+	}
+
+	@Test
+	public void testGetAdminNavi() {
+		List<Naviglobal> menu = testGetNavi(LEVEL_ADMIN);
+		for (Naviglobal ng : menu) {
+			if (ng.getLevelId() == LEVEL_ADMIN) {
+				assertTrue("Admin menu should conatin more than 4 items: " + ng.getMainnavi().size(), ng.getMainnavi().size() > 4);
+			}
+		}
+	}
 }

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/NavigationDao.java Mon Nov  7 03:43:30 2016
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.db.dao.basic;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_GROUP_ADMIN;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -53,10 +54,25 @@ public class NavigationDao {
 
 	}
 
-	public List<Naviglobal> getMainMenu(boolean admin) {
-		return em.createNamedQuery("getNavigation", Naviglobal.class)
-				.setParameter("levelId", admin ? 3L : 1L)
+	public List<Naviglobal> getMainMenu(int level) {
+		List<Naviglobal> menu = em.createNamedQuery("getNavigation", Naviglobal.class)
+				.setParameter("levelId", level)
 				.getResultList();
+		if (LEVEL_GROUP_ADMIN == level) {
+			// filtering of child objects is not working on JPQL level
+			for (Naviglobal ng : menu) {
+				em.detach(ng);
+				ng.setId(null); // we don't need below changed to be saved
+				List<Navimain> sub = new ArrayList<>();
+				for (Navimain nm : ng.getMainnavi()) {
+					if (nm.getLevelId() <= level) {
+						sub.add(nm);
+					}
+				}
+				ng.setMainnavi(sub);
+			}
+		}
+		return menu;
 	}
 
 	public Naviglobal addGlobalStructure(int naviorder, String labelId, int levelId, String name, String tooltipLabelId) {
@@ -70,7 +86,6 @@ public class NavigationDao {
 		ng.setName(name);
 		ng.setInserted(new Date());
 		ng.setTooltipLabelId(tooltipLabelId);
-		// CriteriaBuilder crit = em.getCriteriaBuilder();
 
 		em.persist(ng);
 		return ng;
@@ -79,8 +94,6 @@ public class NavigationDao {
 	public void addMainStructure(String action, String params, int naviorder, String labelId,
 			int levelId, String name, Long globalId, String tooltipLabelId) {
 		Naviglobal ng = getGlobalMenuEntry(globalId);
-		List<Navimain> mainEntries = ng.getMainnavi();
-		mainEntries = (mainEntries == null) ? new ArrayList<Navimain>() : mainEntries;
 
 		Navimain nm = new Navimain();
 		nm.setAction(action);
@@ -96,10 +109,9 @@ public class NavigationDao {
 		nm.setInserted(new Date());
 		nm.setTooltipLabelId(tooltipLabelId);
 
-		mainEntries.add(nm);
-		ng.setMainnavi(mainEntries);
+		ng.getMainnavi().add(nm);
 
-		em.persist(ng);
+		em.merge(ng);
 	}
 
 }

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Naviglobal.java Mon Nov  7 03:43:30 2016
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.db.entity.basic;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -40,9 +41,8 @@ import org.apache.openmeetings.db.entity
 
 @Entity
 @NamedQueries({
-		@NamedQuery(name = "getNavigation", query = "SELECT DISTINCT ng from Naviglobal ng JOIN ng.mainnavi nm "
-				+ "WHERE nm.deleted = false AND ng.levelId <= :levelId AND nm.levelId <= :levelId "
-				+ "AND ng.deleted = false ORDER BY ng.naviorder ASC"),
+		@NamedQuery(name = "getNavigation", query = "SELECT ng FROM Naviglobal ng "
+				+ "WHERE ng.levelId <= :levelId AND ng.deleted = false ORDER BY ng.naviorder ASC"),
 		@NamedQuery(name = "getNavigationById", query = "SELECT ng from Naviglobal ng WHERE ng.id = :id") })
 @Table(name = "naviglobal")
 public class Naviglobal implements IDataProviderEntity {
@@ -68,10 +68,10 @@ public class Naviglobal implements IData
 	@Column(name = "comment")
 	private String comment;
 
-	@Column(name = "naviorder")
+	@Column(name = "naviorder", nullable = false)
 	private int naviorder;
 
-	@Column(name = "level_id")
+	@Column(name = "level_id", nullable = false)
 	private int levelId;
 
 	@Column(name = "deleted", nullable = false)
@@ -84,10 +84,10 @@ public class Naviglobal implements IData
 	private String tooltipLabelId;
 
 	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
-	@JoinColumn(name = "global_id")
+	@JoinColumn(name = "global_id", nullable = false)
 	@ForeignKey(enabled = true)
 	@OrderBy("naviorder")
-	private List<Navimain> mainnavi;
+	private List<Navimain> mainnavi = new ArrayList<>();
 
 	@Override
 	public Long getId() {

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Navimain.java Mon Nov  7 03:43:30 2016
@@ -63,10 +63,10 @@ public class Navimain implements IDataPr
 	@Column(name = "comment")
 	private String comment;
 
-	@Column(name = "naviorder")
+	@Column(name = "naviorder", nullable = false)
 	private int naviorder;
 
-	@Column(name = "level_id")
+	@Column(name = "level_id", nullable = false)
 	private int levelId;
 
 	@Column(name = "label_id")

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java?rev=1768421&r1=1768420&r2=1768421&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java Mon Nov  7 03:43:30 2016
@@ -39,7 +39,6 @@ import org.simpleframework.xml.Root;
 	, @NamedQuery(name="getGroupByName", query="SELECT o FROM Group AS o WHERE o.name = :name AND o.deleted = false")
 	, @NamedQuery(name="getAnyGroupById", query="SELECT c FROM Group AS c WHERE c.id = :groupId")
 	, @NamedQuery(name="getGroupsByIds", query="SELECT c FROM Group AS c WHERE c.id IN :ids")
-	, @NamedQuery(name="getGroupsByUserId", query="SELECT ou.group FROM User u, IN(u.groupUsers) ou WHERE u.deleted = false AND u.id = :userId")
 	, @NamedQuery(name="getNondeletedGroups", query="SELECT o FROM Group o WHERE o.deleted = false ORDER BY o.id")
 	, @NamedQuery(name="countGroups", query="SELECT COUNT(c) FROM Group AS c WHERE c.deleted = false")
 })