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/14 04:00:07 UTC

svn commit: r1769560 [1/2] - in /openmeetings/application: branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/ branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ branches/3.1.x/openmeetings-db/src...

Author: solomax
Date: Mon Nov 14 04:00:07 2016
New Revision: 1769560

URL: http://svn.apache.org/viewvc?rev=1769560&view=rev
Log:
[OPENMEETINGS-1488] Admin UI is updated to work as expected for group admin

Added:
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
Modified:
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.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-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/RoomForm.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/common/GeneralUserForm.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.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-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/RoomForm.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/common/GeneralUserForm.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.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/RoomForm.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/common/GeneralUserForm.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java

Added: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java?rev=1769560&view=auto
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java (added)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java Mon Nov 14 04:00:07 2016
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+package org.apache.openmeetings.db.dao;
+
+import java.util.List;
+
+import org.apache.openmeetings.db.entity.IDataProviderEntity;
+
+public interface IGroupAdminDataProviderDao<T extends IDataProviderEntity> extends IDataProviderDao<T> {
+	/**
+	 * Get a list of instances of {@link T}
+	 * 
+	 * @param search - string search criteria to filter entities
+	 * @param adminId - id of group admin user
+	 * @param start - the start to range to retrieve
+	 * @param count - maximum instance count to retrieve
+	 * @param order - column and sort order
+	 * @return list of instances in the range specified
+	 */
+	List<T> get(String search, Long adminId, int start, int count, String order);
+
+	/**
+	 * Count the number of instances of {@link T}
+	 * 
+	 * @param search - string search criteria to filter entities
+	 * @param adminId - id of group admin user
+	 * @return count of instances satisfying given search criteria
+	 */
+	long count(String search, Long adminId);
+}

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java Mon Nov 14 04:00:07 2016
@@ -32,7 +32,7 @@ import javax.persistence.TypedQuery;
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.OpenJPAPersistence;
 import org.apache.openjpa.persistence.OpenJPAQuery;
-import org.apache.openmeetings.db.dao.IDataProviderDao;
+import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.Room;
@@ -45,16 +45,16 @@ import org.springframework.beans.factory
 import org.springframework.transaction.annotation.Transactional;
 
 @Transactional
-public class RoomDao implements IDataProviderDao<Room> {
+public class RoomDao implements IGroupAdminDataProviderDao<Room> {
 	private static final Logger log = Red5LoggerFactory.getLogger(RoomDao.class, webAppRootKey);
 	public final static String[] searchFields = {"name"};
 	
 	@PersistenceContext
 	private EntityManager em;
-    @Autowired
+	@Autowired
 	private ConfigurationDao cfgDao;
-    @Autowired
-    private SipDao sipDao;
+	@Autowired
+	private SipDao sipDao;
 	@Autowired
 	private UserDao userDao;
 	@Autowired
@@ -64,7 +64,7 @@ public class RoomDao implements IDataPro
 	public Room get(long id) {
 		return get(Long.valueOf(id));
 	}
-	
+
 	@Override
 	public Room get(Long id) {
 		Room r = null;
@@ -125,6 +125,16 @@ public class RoomDao implements IDataPro
 	}
 
 	@Override
+	public List<Room> get(String search, Long adminId, int start, int count, String order) {
+		TypedQuery<Room> q = em.createQuery(DaoHelper.getSearchQuery("RoomGroup rg, IN(rg.room)", "r", null, search, true, true, false
+				, "rg.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", order, searchFields), Room.class);
+		q.setParameter("adminId", adminId);
+		q.setFirstResult(start);
+		q.setMaxResults(count);
+		return q.getResultList();
+	}
+
+	@Override
 	public long count() {
 		TypedQuery<Long> q = em.createNamedQuery("countRooms", Long.class);
 		return q.getSingleResult();
@@ -136,6 +146,14 @@ public class RoomDao implements IDataPro
 		return q.getSingleResult();
 	}
 
+	@Override
+	public long count(String search, Long adminId) {
+		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("RoomGroup rg, IN(rg.room)", "r", null, search, true, true, true
+				, "rg.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", null, searchFields), Long.class);
+		q.setParameter("adminId", adminId);
+		return q.getSingleResult();
+	}
+
 	public List<Room> getPublicRooms() {
 		return em.createNamedQuery("getPublicRoomsOrdered", Room.class).getResultList();
 	}
@@ -226,7 +244,7 @@ public class RoomDao implements IDataPro
 	}
 
 	public Room getUserRoom(Long ownerId, Room.Type type, String name) {
-		log.debug("getRoomByOwnerAndTypeId : " + ownerId + " || " + type);
+		log.debug("getUserRoom : " + ownerId + " || " + type);
 		Room room = null;
 		List<Room> ll = em.createNamedQuery("getRoomByOwnerAndTypeId", Room.class).setParameter("ownerId", ownerId).setParameter("type", type).getResultList();
 		if (ll.size() > 0) {

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java Mon Nov 14 04:00:07 2016
@@ -27,13 +27,13 @@ import javax.persistence.NoResultExcepti
 import javax.persistence.PersistenceContext;
 import javax.persistence.TypedQuery;
 
-import org.apache.openmeetings.db.dao.IDataProviderDao;
+import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.util.DaoHelper;
 import org.springframework.transaction.annotation.Transactional;
 
 @Transactional
-public class GroupDao implements IDataProviderDao<Group> {
+public class GroupDao implements IGroupAdminDataProviderDao<Group> {
 	public final static String[] searchFields = {"name"};
 	@PersistenceContext
 	private EntityManager em;
@@ -71,12 +71,22 @@ public class GroupDao implements IDataPr
 
 	@Override
 	public List<Group> get(String search, int start, int count, String sort) {
-		TypedQuery<Group> q = em.createQuery(DaoHelper.getSearchQuery("Group", "o", search, true, false, sort, searchFields), Group.class);
+		TypedQuery<Group> q = em.createQuery(DaoHelper.getSearchQuery("Group", "g", search, true, false, sort, searchFields), Group.class);
 		q.setFirstResult(start);
 		q.setMaxResults(count);
 		return q.getResultList();
 	}
-	
+
+	@Override
+	public List<Group> get(String search, Long adminId, int start, int count, String order) {
+		TypedQuery<Group> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.group)", "g", null, search, true, true, false
+				, "gu.user.id = :adminId AND gu.moderator = true", order, searchFields), Group.class);
+		q.setParameter("adminId", adminId);
+		q.setFirstResult(start);
+		q.setMaxResults(count);
+		return q.getResultList();
+	}
+
 	@Override
 	public long count() {
 		TypedQuery<Long> q = em.createNamedQuery("countGroups", Long.class);
@@ -88,7 +98,15 @@ public class GroupDao implements IDataPr
 		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("Group", "o", search, true, true, null, searchFields), Long.class);
 		return q.getSingleResult();
 	}
-	
+
+	@Override
+	public long count(String search, Long adminId) {
+		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.group)", "g", null, search, true, true, true
+				, "gu.user.id = :adminId AND gu.moderator = true", null, searchFields), Long.class);
+		q.setParameter("adminId", adminId);
+		return q.getSingleResult();
+	}
+
 	public List<Group> get(Collection<Long> ids) {
 		return em.createNamedQuery("getGroupsByIds", Group.class).setParameter("ids", ids).getResultList();
 	}

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java Mon Nov 14 04:00:07 2016
@@ -45,7 +45,7 @@ import org.apache.commons.lang3.StringUt
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.OpenJPAPersistence;
 import org.apache.openjpa.persistence.OpenJPAQuery;
-import org.apache.openmeetings.db.dao.IDataProviderDao;
+import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.GroupUser;
@@ -72,7 +72,7 @@ import org.springframework.transaction.a
  * 
  */
 @Transactional
-public class UserDao implements IDataProviderDao<User> {
+public class UserDao implements IGroupAdminDataProviderDao<User> {
 	private static final Logger log = Red5LoggerFactory.getLogger(UserDao.class, webAppRootKey);
 
 	public final static String[] searchFields = {"lastname", "firstname", "login", "address.email", "address.town"};
@@ -164,7 +164,17 @@ public class UserDao implements IDataPro
 		setAdditionalParams(q, params);
 		return q.getResultList();
 	}
-	
+
+	@Override
+	public List<User> get(String search, Long adminId, int start, int count, String order) {
+		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, search, true, true, false
+				, "gu.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", order, searchFields), User.class);
+		q.setParameter("adminId", adminId);
+		q.setFirstResult(start);
+		q.setMaxResults(count);
+		return q.getResultList();
+	}
+
 	@Override
 	public long count() {
 		// get all users
@@ -176,11 +186,11 @@ public class UserDao implements IDataPro
 	public long count(String search) {
 		return count(search, false, Long.valueOf(-1));
 	}
-	
-	public long count(String search, Long currentUserId) {
+
+	public long countUsers(String search, Long currentUserId) {
 		return count(search, false, currentUserId);
 	}
-	
+
 	public long count(String search, boolean filterContacts, Long currentUserId) {
 		Map<String, Object> params = new HashMap<String, Object>();
 		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", getAdditionalJoin(filterContacts), search, true, true, true
@@ -188,7 +198,15 @@ public class UserDao implements IDataPro
 		setAdditionalParams(q, params);
 		return q.getSingleResult();
 	}
-	
+
+	@Override
+	public long count(String search, Long adminId) {
+		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, search, true, true, true
+				, "gu.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", null, searchFields), Long.class);
+		q.setParameter("adminId", adminId);
+		return q.getSingleResult();
+	}
+
 	//This is AdminDao method
 	public List<User> get(String search, boolean excludeContacts, int first, int count) {
 		Map<String, Object> params = new HashMap<String, Object>();

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=1769560&r1=1769559&r2=1769560&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 14 04:00:07 2016
@@ -35,12 +35,12 @@ import org.simpleframework.xml.Root;
 
 @Entity
 @NamedQueries({
-	@NamedQuery(name="getGroupById", query="SELECT c FROM Group AS c WHERE c.id = :id AND c.deleted = false")
-	, @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="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")
+	@NamedQuery(name="getGroupById", query="SELECT g FROM Group AS g WHERE g.id = :id AND g.deleted = false")
+	, @NamedQuery(name="getGroupByName", query="SELECT g FROM Group AS g WHERE g.name = :name AND g.deleted = false")
+	, @NamedQuery(name="getAnyGroupById", query="SELECT g FROM Group AS g WHERE g.id = :groupId")
+	, @NamedQuery(name="getGroupsByIds", query="SELECT g FROM Group AS g WHERE g.id IN :ids")
+	, @NamedQuery(name="getNondeletedGroups", query="SELECT g FROM Group g WHERE g.deleted = false ORDER BY g.id")
+	, @NamedQuery(name="countGroups", query="SELECT COUNT(g) FROM Group AS g WHERE g.deleted = false")
 })
 @Table(name = "om_group")
 @Root(name = "organisation")

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=1769560&r1=1769559&r2=1769560&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 14 04:00:07 2016
@@ -18,17 +18,7 @@
  */
 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;
@@ -37,7 +27,7 @@ import org.apache.openmeetings.web.commo
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
-import org.apache.openmeetings.web.data.SearchableDataProvider;
+import org.apache.openmeetings.web.data.SearchableGroupAdminDataProvider;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -69,22 +59,13 @@ 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);
 
 		//List view
-		SearchableDataView<Group> dataView = new SearchableDataView<Group>("groupList", new SearchableDataProvider<Group>(GroupDao.class)) {
+		SearchableDataView<Group> dataView = new SearchableDataView<Group>("groupList", new SearchableGroupAdminDataProvider<Group>(GroupDao.class)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -92,23 +73,19 @@ public class GroupsPanel extends AdminPa
 				final Group g = item.getModelObject();
 				item.add(new Label("id"));
 				item.add(new Label("name"));
-				if (!isGroupAdmin || (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));
-				}
+				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())));
 			}
 		};
 

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java Mon Nov 14 04:00:07 2016
@@ -18,7 +18,9 @@
  */
 package org.apache.openmeetings.web.admin.rooms;
 
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getSid;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
@@ -76,17 +78,42 @@ public class RoomForm extends AdminBaseF
 	private final static List<Long> DROPDOWN_NUMBER_OF_PARTICIPANTS = Arrays.asList(2L, 4L, 6L, 8L, 10L, 12L, 14L, 16L, 20L, 25L, 32L, 50L,
 			100L, 150L, 200L, 500L, 1000L);
 	private final WebMarkupContainer roomList;
-	private final TextField<String> pin;
+	private final TextField<String> pin = new TextField<>("pin");
 	private final WebMarkupContainer moderatorContainer = new WebMarkupContainer("moderatorContainer");
 	private final WebMarkupContainer clientsContainer = new WebMarkupContainer("clientsContainer");
-	private final ListView<Client> clients;
-	private List<Client> clientsInRoom = null;
+	private final ListView<Client> clients = new ListView<Client>("clients", new ArrayList<>()) {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void populateItem(final ListItem<Client> item) {
+			Client client = item.getModelObject();
+			item.add(new Label("clientId", "" + client.getId()))
+				.add(new Label("clientLogin", "" + client.getUsername()))
+				.add(new ConfirmableAjaxBorder("clientDelete", getString("80"), getString("833")) {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+						Client c = item.getModelObject();
+						getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid()
+								, c.getServer() == null ? 0 : c.getServer().getId());
+						
+						updateClients(target);
+					}
+				});
+		}
+	};
 	private IModel<User> moderator2add = Model.of((User)null);
 	
 	public RoomForm(String id, WebMarkupContainer roomList, final Room room) {
 		super(id, new CompoundPropertyModel<Room>(room));
 		this.roomList = roomList;
 		setOutputMarkupId(true);
+	}
+
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
 		RequiredTextField<String> name = new RequiredTextField<String>("name");
 		name.setLabel(new Model<String>(Application.getString(193)));
 		add(name);
@@ -109,10 +136,13 @@ public class RoomForm extends AdminBaseF
 
 		add(new TextArea<String>("comment"));
 
+		boolean isGroupAdmin = hasGroupAdminLevel(getRights());
 		add(new CheckBox("appointment").setEnabled(false));
-		add(new CheckBox("ispublic"));
+		add(new CheckBox("ispublic").setEnabled(!isGroupAdmin));
 
-		List<Group> orgList = Application.getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
+		List<Group> orgList = isGroupAdmin
+				? getBean(GroupDao.class).get(null, getUserId(), 0, Integer.MAX_VALUE, null)
+				: getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
 		final List<RoomGroup> orgRooms = new ArrayList<RoomGroup>(orgList.size());
 		for (Group org : orgList) {
 			orgRooms.add(new RoomGroup(org, getModelObject()));
@@ -153,7 +183,7 @@ public class RoomForm extends AdminBaseF
 				}
 				return list;
 			}
-		}));
+		}).setLabel(Model.of(getString("828"))).setRequired(isGroupAdmin));
 
 		add(new CheckBox("isDemoRoom"));
 		TextField<Integer> demoTime = new TextField<Integer>("demoTime");
@@ -181,28 +211,6 @@ public class RoomForm extends AdminBaseF
 		add(new CheckBox("autoVideoSelect"));	
 		
 		// Users in this Room 
-		clients = new ListView<Client>("clients", clientsInRoom) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void populateItem(final ListItem<Client> item) {
-				Client client = item.getModelObject();
-				item.add(new Label("clientId", "" + client.getId()))
-					.add(new Label("clientLogin", "" + client.getUsername()))
-					.add(new ConfirmableAjaxBorder("clientDelete", getString("80"), getString("833")) {
-						private static final long serialVersionUID = 1L;
-
-						@Override
-						protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-							Client c = item.getModelObject();
-							getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid()
-									, c.getServer() == null ? 0 : c.getServer().getId());
-							
-							updateClients(target);
-						}
-					});
-			}
-		};
 		add(clientsContainer.add(clients.setOutputMarkupId(true)).setOutputMarkupId(true));
 		
 		// Moderators
@@ -279,8 +287,8 @@ public class RoomForm extends AdminBaseF
 		add(new CheckBox("moderated"));
 
 		add(new TextField<String>("confno").setEnabled(false));
-		add(pin = new TextField<>("pin"));
-		pin.setEnabled(room.isSipEnabled());
+		add(pin);
+		pin.setEnabled(getModelObject().isSipEnabled());
 		add(new TextField<String>("ownerId").setEnabled(false));
 		add(new AjaxCheckBox("sipEnabled") {
 			private static final long serialVersionUID = 1L;
@@ -298,7 +306,7 @@ public class RoomForm extends AdminBaseF
 
 	void updateClients(AjaxRequestTarget target) {
 		long roomId = (getModelObject().getId() != null ? getModelObject().getId() : 0);  
-		final List<Client> clientsInRoom = Application.getBean(ISessionManager.class).getClientListByRoom(roomId);
+		final List<Client> clientsInRoom = getBean(ISessionManager.class).getClientListByRoom(roomId);
 		clients.setDefaultModelObject(clientsInRoom);
 		target.add(clientsContainer);
 	}

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=1769560&r1=1769559&r2=1769560&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 14 04:00:07 2016
@@ -28,7 +28,7 @@ import org.apache.openmeetings.web.commo
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
-import org.apache.openmeetings.web.data.SearchableDataProvider;
+import org.apache.openmeetings.web.data.SearchableGroupAdminDataProvider;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -57,7 +57,7 @@ public class RoomsPanel extends AdminPan
 
 	public RoomsPanel(String id) {
 		super(id);
-		SearchableDataView<Room> dataView = new SearchableDataView<Room>("roomList", new SearchableDataProvider<Room>(RoomDao.class)) {
+		SearchableDataView<Room> dataView = new SearchableDataView<Room>("roomList", new SearchableGroupAdminDataProvider<Room>(RoomDao.class)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override

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=1769560&r1=1769559&r2=1769560&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 14 04:00:07 2016
@@ -18,10 +18,12 @@
  */
 package org.apache.openmeetings.web.admin.users;
 
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 import static org.apache.openmeetings.db.util.UserHelper.getMinLoginLength;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.WEB_DATE_PATTERN;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.wicket.datetime.markup.html.basic.DateLabel.forDatePattern;
 import static org.apache.wicket.validation.validator.StringValidator.minimumLength;
@@ -202,10 +204,14 @@ public class UserForm extends AdminBaseF
 
 			@Override
 			public void query(String term, int page, Response<Right> response) {
+				boolean isGroupAdmin = hasGroupAdminLevel(getRights());
 				for (Right r : Right.values()) {
 					if (Right.GroupAdmin == r) {
 						continue;
 					}
+					if (isGroupAdmin && (Right.Admin == r || Right.Soap == r)) {
+						continue;
+					}
 					if (Strings.isEmpty(term) || r.name().contains(term)) {
 						response.add(r);
 					}
@@ -259,7 +265,7 @@ public class UserForm extends AdminBaseF
 			target.add(domain);
 		}
 	}
-	
+
 	public void update(AjaxRequestTarget target) {
 		updateDomain(target);
 		if (target != null) {
@@ -267,12 +273,12 @@ public class UserForm extends AdminBaseF
 			target.appendJavaScript("omUserPanelInit();");
 		}
 	}
-	
+
 	@Override
 	protected void onValidate() {
 		User u = getModelObject();
 		if(!getBean(UserDao.class).checkLogin(login.getConvertedInput(), u.getType(), u.getDomainId(), u.getId())) {
-			error(Application.getString(105));
+			error(getString("105"));
 		}
 	}
 

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=1769560&r1=1769559&r2=1769560&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 14 04:00:07 2016
@@ -30,7 +30,7 @@ import org.apache.openmeetings.web.commo
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
-import org.apache.openmeetings.web.data.SearchableDataProvider;
+import org.apache.openmeetings.web.data.SearchableGroupAdminDataProvider;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -69,7 +69,7 @@ public class UsersPanel extends AdminPan
 	public UsersPanel(String id) {
 		super(id);
 
-		final SearchableDataView<User> dataView = new SearchableDataView<User>("userList", new SearchableDataProvider<User>(UserDao.class)) {
+		final SearchableDataView<User> dataView = new SearchableDataView<User>("userList", new SearchableGroupAdminDataProvider<User>(UserDao.class)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java Mon Nov 14 04:00:07 2016
@@ -18,9 +18,12 @@
  */
 package org.apache.openmeetings.web.common;
 
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 import static org.apache.openmeetings.db.util.UserHelper.getMinPasswdLength;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.AVAILABLE_TIMEZONES;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.wicket.validation.validator.StringValidator.minimumLength;
 
 import java.util.ArrayList;
@@ -71,9 +74,11 @@ public class GeneralUserForm extends For
 	private final PasswordTextField passwordField;
 	private final RequiredTextField<String> email;
 	private final List<GroupUser> grpUsers = new ArrayList<>();
+	private final boolean isAdminForm;
 
 	public GeneralUserForm(String id, IModel<User> model, boolean isAdminForm) {
 		super(id, model);
+		this.isAdminForm = isAdminForm;
 
 		//TODO should throw exception if non admin User edit somebody else (or make all fields read-only)
 		add(passwordField = new PasswordTextField("password", new Model<String>()));
@@ -123,7 +128,11 @@ public class GeneralUserForm extends For
 		add(new TextField<String>("address.town"));
 		add(new CountryDropDown("address.country"));
 		add(new TextArea<String>("address.comment"));
+	}
 
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
 		add(new Select2MultiChoice<GroupUser>("groupUsers", null, new ChoiceProvider<GroupUser>() {
 			private static final long serialVersionUID = 1L;
 
@@ -162,14 +171,16 @@ public class GeneralUserForm extends For
 				}
 				return list;
 			}
-		}).setEnabled(isAdminForm));
+		}).setLabel(Model.of(getString("161"))).setRequired(isAdminForm && hasGroupAdminLevel(getRights())).setEnabled(isAdminForm));
 	}
 
 	public void updateModelObject(User u, boolean isAdminForm) {
 		grpUsers.clear();
 		grpUsers.addAll(u.getGroupUsers());
 		if (isAdminForm) {
-			List<Group> grpList = getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
+			List<Group> grpList = hasGroupAdminLevel(getRights())
+					? getBean(GroupDao.class).get(null, getUserId(), 0, Integer.MAX_VALUE, null)
+					: getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
 			for (Group g : grpList) {
 				GroupUser gu = new GroupUser(g, u);
 				int idx = grpUsers.indexOf(gu);

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java Mon Nov 14 04:00:07 2016
@@ -43,7 +43,7 @@ public class SearchableDataProvider<T ex
 	public SearchableDataProvider(Class<? extends IDataProviderDao<T>> c) {
 		this.clazz = c;
 	}
-	
+
 	@Override
 	public void detach() {
 		// does nothing
@@ -52,7 +52,7 @@ public class SearchableDataProvider<T ex
 	protected IDataProviderDao<T> getDao() {
 		return getBean(clazz);
 	}
-	
+
 	protected String getSortStr() {
 		String result = null;
 		if (getSort() != null) {
@@ -60,7 +60,7 @@ public class SearchableDataProvider<T ex
 		}
 		return result;
 	}
-	
+
 	@Override
 	public Iterator<? extends T> iterator(long first, long count) {
 		return (search == null && getSort() == null

Added: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java?rev=1769560&view=auto
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java (added)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java Mon Nov 14 04:00:07 2016
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+package org.apache.openmeetings.web.data;
+
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.util.Iterator;
+
+import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
+import org.apache.openmeetings.db.entity.IDataProviderEntity;
+
+public class SearchableGroupAdminDataProvider<T extends IDataProviderEntity> extends SearchableDataProvider<T> {
+	private static final long serialVersionUID = 1L;
+	protected Class<? extends IGroupAdminDataProviderDao<T>> clazz;
+
+	public SearchableGroupAdminDataProvider(Class<? extends IGroupAdminDataProviderDao<T>> c) {
+		super(c);
+		this.clazz = c;
+	}
+
+	@Override
+	protected IGroupAdminDataProviderDao<T> getDao() {
+		return getBean(clazz);
+	}
+
+	@Override
+	public Iterator<? extends T> iterator(long first, long count) {
+		return (hasGroupAdminLevel(getRights())
+				? getDao().get(search, getUserId(), (int)first, (int)count, getSortStr())
+				: getDao().get(search, (int)first, (int)count, getSortStr())).iterator();
+	}
+
+	@Override
+	public long size() {
+		return (hasGroupAdminLevel(getRights())
+				? getDao().count(search, getUserId())
+				: getDao().count(search));
+	}
+}

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java Mon Nov 14 04:00:07 2016
@@ -103,7 +103,7 @@ public class UserChoiceProvider extends
 		UserDao dao = getBean(UserDao.class);
 		response.addAll(dao.get(term, page * PAGE_SIZE, PAGE_SIZE, null, true, getUserId()));
 
-		response.setHasMore(page < dao.count(term, getUserId()) / PAGE_SIZE);
+		response.setHasMore(page < dao.countUsers(term, getUserId()) / PAGE_SIZE);
 	}
 
 	@Override

Added: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java?rev=1769560&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java Mon Nov 14 04:00:07 2016
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+package org.apache.openmeetings.db.dao;
+
+import java.util.List;
+
+import org.apache.openmeetings.db.entity.IDataProviderEntity;
+
+public interface IGroupAdminDataProviderDao<T extends IDataProviderEntity> extends IDataProviderDao<T> {
+	/**
+	 * Get a list of instances of {@link T}
+	 * 
+	 * @param search - string search criteria to filter entities
+	 * @param adminId - id of group admin user
+	 * @param start - the start to range to retrieve
+	 * @param count - maximum instance count to retrieve
+	 * @param order - column and sort order
+	 * @return list of instances in the range specified
+	 */
+	List<T> get(String search, Long adminId, int start, int count, String order);
+
+	/**
+	 * Count the number of instances of {@link T}
+	 * 
+	 * @param search - string search criteria to filter entities
+	 * @param adminId - id of group admin user
+	 * @return count of instances satisfying given search criteria
+	 */
+	long count(String search, Long adminId);
+}

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java Mon Nov 14 04:00:07 2016
@@ -32,7 +32,7 @@ import javax.persistence.TypedQuery;
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.OpenJPAPersistence;
 import org.apache.openjpa.persistence.OpenJPAQuery;
-import org.apache.openmeetings.db.dao.IDataProviderDao;
+import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.Room;
@@ -45,16 +45,16 @@ import org.springframework.beans.factory
 import org.springframework.transaction.annotation.Transactional;
 
 @Transactional
-public class RoomDao implements IDataProviderDao<Room> {
+public class RoomDao implements IGroupAdminDataProviderDao<Room> {
 	private static final Logger log = Red5LoggerFactory.getLogger(RoomDao.class, webAppRootKey);
 	public final static String[] searchFields = {"name"};
 	
 	@PersistenceContext
 	private EntityManager em;
-    @Autowired
+	@Autowired
 	private ConfigurationDao cfgDao;
-    @Autowired
-    private SipDao sipDao;
+	@Autowired
+	private SipDao sipDao;
 	@Autowired
 	private UserDao userDao;
 	@Autowired
@@ -64,7 +64,7 @@ public class RoomDao implements IDataPro
 	public Room get(long id) {
 		return get(Long.valueOf(id));
 	}
-	
+
 	@Override
 	public Room get(Long id) {
 		Room r = null;
@@ -125,6 +125,16 @@ public class RoomDao implements IDataPro
 	}
 
 	@Override
+	public List<Room> get(String search, Long adminId, int start, int count, String order) {
+		TypedQuery<Room> q = em.createQuery(DaoHelper.getSearchQuery("RoomGroup rg, IN(rg.room)", "r", null, search, true, true, false
+				, "rg.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", order, searchFields), Room.class);
+		q.setParameter("adminId", adminId);
+		q.setFirstResult(start);
+		q.setMaxResults(count);
+		return q.getResultList();
+	}
+
+	@Override
 	public long count() {
 		TypedQuery<Long> q = em.createNamedQuery("countRooms", Long.class);
 		return q.getSingleResult();
@@ -136,6 +146,14 @@ public class RoomDao implements IDataPro
 		return q.getSingleResult();
 	}
 
+	@Override
+	public long count(String search, Long adminId) {
+		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("RoomGroup rg, IN(rg.room)", "r", null, search, true, true, true
+				, "rg.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", null, searchFields), Long.class);
+		q.setParameter("adminId", adminId);
+		return q.getSingleResult();
+	}
+
 	public List<Room> getPublicRooms() {
 		return em.createNamedQuery("getPublicRoomsOrdered", Room.class).getResultList();
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java Mon Nov 14 04:00:07 2016
@@ -27,13 +27,13 @@ import javax.persistence.NoResultExcepti
 import javax.persistence.PersistenceContext;
 import javax.persistence.TypedQuery;
 
-import org.apache.openmeetings.db.dao.IDataProviderDao;
+import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.util.DaoHelper;
 import org.springframework.transaction.annotation.Transactional;
 
 @Transactional
-public class GroupDao implements IDataProviderDao<Group> {
+public class GroupDao implements IGroupAdminDataProviderDao<Group> {
 	public final static String[] searchFields = {"name"};
 	@PersistenceContext
 	private EntityManager em;
@@ -71,12 +71,22 @@ public class GroupDao implements IDataPr
 
 	@Override
 	public List<Group> get(String search, int start, int count, String sort) {
-		TypedQuery<Group> q = em.createQuery(DaoHelper.getSearchQuery("Group", "o", search, true, false, sort, searchFields), Group.class);
+		TypedQuery<Group> q = em.createQuery(DaoHelper.getSearchQuery("Group", "g", search, true, false, sort, searchFields), Group.class);
 		q.setFirstResult(start);
 		q.setMaxResults(count);
 		return q.getResultList();
 	}
-	
+
+	@Override
+	public List<Group> get(String search, Long adminId, int start, int count, String order) {
+		TypedQuery<Group> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.group)", "g", null, search, true, true, false
+				, "gu.user.id = :adminId AND gu.moderator = true", order, searchFields), Group.class);
+		q.setParameter("adminId", adminId);
+		q.setFirstResult(start);
+		q.setMaxResults(count);
+		return q.getResultList();
+	}
+
 	@Override
 	public long count() {
 		TypedQuery<Long> q = em.createNamedQuery("countGroups", Long.class);
@@ -88,7 +98,15 @@ public class GroupDao implements IDataPr
 		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("Group", "o", search, true, true, null, searchFields), Long.class);
 		return q.getSingleResult();
 	}
-	
+
+	@Override
+	public long count(String search, Long adminId) {
+		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.group)", "g", null, search, true, true, true
+				, "gu.user.id = :adminId AND gu.moderator = true", null, searchFields), Long.class);
+		q.setParameter("adminId", adminId);
+		return q.getSingleResult();
+	}
+
 	public List<Group> get(Collection<Long> ids) {
 		return em.createNamedQuery("getGroupsByIds", Group.class).setParameter("ids", ids).getResultList();
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java Mon Nov 14 04:00:07 2016
@@ -45,7 +45,7 @@ import org.apache.commons.lang3.StringUt
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.OpenJPAPersistence;
 import org.apache.openjpa.persistence.OpenJPAQuery;
-import org.apache.openmeetings.db.dao.IDataProviderDao;
+import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.GroupUser;
@@ -72,7 +72,7 @@ import org.springframework.transaction.a
  * 
  */
 @Transactional
-public class UserDao implements IDataProviderDao<User> {
+public class UserDao implements IGroupAdminDataProviderDao<User> {
 	private static final Logger log = Red5LoggerFactory.getLogger(UserDao.class, webAppRootKey);
 
 	public final static String[] searchFields = {"lastname", "firstname", "login", "address.email", "address.town"};
@@ -164,7 +164,17 @@ public class UserDao implements IDataPro
 		setAdditionalParams(q, params);
 		return q.getResultList();
 	}
-	
+
+	@Override
+	public List<User> get(String search, Long adminId, int start, int count, String order) {
+		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, search, true, true, false
+				, "gu.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", order, searchFields), User.class);
+		q.setParameter("adminId", adminId);
+		q.setFirstResult(start);
+		q.setMaxResults(count);
+		return q.getResultList();
+	}
+
 	@Override
 	public long count() {
 		// get all users
@@ -176,11 +186,11 @@ public class UserDao implements IDataPro
 	public long count(String search) {
 		return count(search, false, Long.valueOf(-1));
 	}
-	
-	public long count(String search, Long currentUserId) {
+
+	public long countUsers(String search, Long currentUserId) {
 		return count(search, false, currentUserId);
 	}
-	
+
 	public long count(String search, boolean filterContacts, Long currentUserId) {
 		Map<String, Object> params = new HashMap<String, Object>();
 		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", getAdditionalJoin(filterContacts), search, true, true, true
@@ -188,7 +198,15 @@ public class UserDao implements IDataPro
 		setAdditionalParams(q, params);
 		return q.getSingleResult();
 	}
-	
+
+	@Override
+	public long count(String search, Long adminId) {
+		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, search, true, true, true
+				, "gu.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", null, searchFields), Long.class);
+		q.setParameter("adminId", adminId);
+		return q.getSingleResult();
+	}
+
 	//This is AdminDao method
 	public List<User> get(String search, boolean excludeContacts, int first, int count) {
 		Map<String, Object> params = new HashMap<String, Object>();

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=1769560&r1=1769559&r2=1769560&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 14 04:00:07 2016
@@ -35,12 +35,12 @@ import org.simpleframework.xml.Root;
 
 @Entity
 @NamedQueries({
-	@NamedQuery(name="getGroupById", query="SELECT c FROM Group AS c WHERE c.id = :id AND c.deleted = false")
-	, @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="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")
+	@NamedQuery(name="getGroupById", query="SELECT g FROM Group AS g WHERE g.id = :id AND g.deleted = false")
+	, @NamedQuery(name="getGroupByName", query="SELECT g FROM Group AS g WHERE g.name = :name AND g.deleted = false")
+	, @NamedQuery(name="getAnyGroupById", query="SELECT g FROM Group AS g WHERE g.id = :groupId")
+	, @NamedQuery(name="getGroupsByIds", query="SELECT g FROM Group AS g WHERE g.id IN :ids")
+	, @NamedQuery(name="getNondeletedGroups", query="SELECT g FROM Group g WHERE g.deleted = false ORDER BY g.id")
+	, @NamedQuery(name="countGroups", query="SELECT COUNT(g) FROM Group AS g WHERE g.deleted = false")
 })
 @Table(name = "om_group")
 @Root(name = "organisation")

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=1769560&r1=1769559&r2=1769560&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 14 04:00:07 2016
@@ -18,17 +18,7 @@
  */
 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;
@@ -37,7 +27,7 @@ import org.apache.openmeetings.web.commo
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
-import org.apache.openmeetings.web.data.SearchableDataProvider;
+import org.apache.openmeetings.web.data.SearchableGroupAdminDataProvider;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -69,22 +59,13 @@ 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);
 
 		//List view
-		SearchableDataView<Group> dataView = new SearchableDataView<Group>("groupList", new SearchableDataProvider<Group>(GroupDao.class)) {
+		SearchableDataView<Group> dataView = new SearchableDataView<Group>("groupList", new SearchableGroupAdminDataProvider<Group>(GroupDao.class)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -92,23 +73,19 @@ public class GroupsPanel extends AdminPa
 				final Group g = item.getModelObject();
 				item.add(new Label("id"));
 				item.add(new Label("name"));
-				if (!isGroupAdmin || (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));
-				}
+				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())));
 			}
 		};
 

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java Mon Nov 14 04:00:07 2016
@@ -18,7 +18,9 @@
  */
 package org.apache.openmeetings.web.admin.rooms;
 
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getSid;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
@@ -77,17 +79,42 @@ public class RoomForm extends AdminBaseF
 	private final static List<Long> DROPDOWN_NUMBER_OF_PARTICIPANTS = Arrays.asList(2L, 4L, 6L, 8L, 10L, 12L, 14L, 16L, 20L, 25L, 32L, 50L,
 			100L, 150L, 200L, 500L, 1000L);
 	private final WebMarkupContainer roomList;
-	private final TextField<String> pin;
+	private final TextField<String> pin = new TextField<>("pin");
 	private final WebMarkupContainer moderatorContainer = new WebMarkupContainer("moderatorContainer");
 	private final WebMarkupContainer clientsContainer = new WebMarkupContainer("clientsContainer");
-	private final ListView<Client> clients;
-	private List<Client> clientsInRoom = null;
+	private final ListView<Client> clients = new ListView<Client>("clients", new ArrayList<>()) {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void populateItem(final ListItem<Client> item) {
+			Client client = item.getModelObject();
+			item.add(new Label("clientId", "" + client.getId()))
+				.add(new Label("clientLogin", "" + client.getUsername()))
+				.add(new ConfirmableAjaxBorder("clientDelete", getString("80"), getString("833")) {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+						Client c = item.getModelObject();
+						getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid()
+								, c.getServer() == null ? 0 : c.getServer().getId());
+						
+						updateClients(target);
+					}
+				});
+		}
+	};
 	private IModel<User> moderator2add = Model.of((User)null);
 	
 	public RoomForm(String id, WebMarkupContainer roomList, final Room room) {
 		super(id, new CompoundPropertyModel<Room>(room));
 		this.roomList = roomList;
 		setOutputMarkupId(true);
+	}
+
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
 		RequiredTextField<String> name = new RequiredTextField<String>("name");
 		name.setLabel(new Model<String>(Application.getString(193)));
 		add(name);
@@ -110,10 +137,13 @@ public class RoomForm extends AdminBaseF
 
 		add(new TextArea<String>("comment"));
 
+		boolean isGroupAdmin = hasGroupAdminLevel(getRights());
 		add(new CheckBox("appointment").setEnabled(false));
-		add(new CheckBox("ispublic"));
+		add(new CheckBox("ispublic").setEnabled(!isGroupAdmin));
 
-		List<Group> orgList = Application.getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
+		List<Group> orgList = isGroupAdmin
+				? getBean(GroupDao.class).get(null, getUserId(), 0, Integer.MAX_VALUE, null)
+				: getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
 		final List<RoomGroup> orgRooms = new ArrayList<RoomGroup>(orgList.size());
 		for (Group org : orgList) {
 			orgRooms.add(new RoomGroup(org, getModelObject()));
@@ -154,7 +184,7 @@ public class RoomForm extends AdminBaseF
 				}
 				return list;
 			}
-		}));
+		}).setLabel(Model.of(getString("828"))).setRequired(isGroupAdmin));
 
 		add(new CheckBox("isDemoRoom"));
 		TextField<Integer> demoTime = new TextField<Integer>("demoTime");
@@ -204,28 +234,6 @@ public class RoomForm extends AdminBaseF
 		add(new CheckBox("autoVideoSelect"));	
 		
 		// Users in this Room 
-		clients = new ListView<Client>("clients", clientsInRoom) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void populateItem(final ListItem<Client> item) {
-				Client client = item.getModelObject();
-				item.add(new Label("clientId", "" + client.getId()))
-					.add(new Label("clientLogin", "" + client.getUsername()))
-					.add(new ConfirmableAjaxBorder("clientDelete", getString("80"), getString("833")) {
-						private static final long serialVersionUID = 1L;
-
-						@Override
-						protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-							Client c = item.getModelObject();
-							getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid()
-									, c.getServer() == null ? 0 : c.getServer().getId());
-							
-							updateClients(target);
-						}
-					});
-			}
-		};
 		add(clientsContainer.add(clients.setOutputMarkupId(true)).setOutputMarkupId(true));
 		
 		// Moderators
@@ -302,8 +310,8 @@ public class RoomForm extends AdminBaseF
 		add(new CheckBox("moderated"));
 
 		add(new TextField<String>("confno").setEnabled(false));
-		add(pin = new TextField<>("pin"));
-		pin.setEnabled(room.isSipEnabled());
+		add(pin);
+		pin.setEnabled(getModelObject().isSipEnabled());
 		add(new TextField<String>("ownerId").setEnabled(false));
 		add(new AjaxCheckBox("sipEnabled") {
 			private static final long serialVersionUID = 1L;
@@ -321,7 +329,7 @@ public class RoomForm extends AdminBaseF
 
 	void updateClients(AjaxRequestTarget target) {
 		long roomId = (getModelObject().getId() != null ? getModelObject().getId() : 0);  
-		final List<Client> clientsInRoom = Application.getBean(ISessionManager.class).getClientListByRoom(roomId);
+		final List<Client> clientsInRoom = getBean(ISessionManager.class).getClientListByRoom(roomId);
 		clients.setDefaultModelObject(clientsInRoom);
 		target.add(clientsContainer);
 	}

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=1769560&r1=1769559&r2=1769560&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 14 04:00:07 2016
@@ -28,7 +28,7 @@ import org.apache.openmeetings.web.commo
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
-import org.apache.openmeetings.web.data.SearchableDataProvider;
+import org.apache.openmeetings.web.data.SearchableGroupAdminDataProvider;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -57,7 +57,7 @@ public class RoomsPanel extends AdminPan
 
 	public RoomsPanel(String id) {
 		super(id);
-		SearchableDataView<Room> dataView = new SearchableDataView<Room>("roomList", new SearchableDataProvider<Room>(RoomDao.class)) {
+		SearchableDataView<Room> dataView = new SearchableDataView<Room>("roomList", new SearchableGroupAdminDataProvider<Room>(RoomDao.class)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override

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=1769560&r1=1769559&r2=1769560&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 14 04:00:07 2016
@@ -18,10 +18,12 @@
  */
 package org.apache.openmeetings.web.admin.users;
 
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 import static org.apache.openmeetings.db.util.UserHelper.getMinLoginLength;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.WEB_DATE_PATTERN;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.wicket.datetime.markup.html.basic.DateLabel.forDatePattern;
 import static org.apache.wicket.validation.validator.StringValidator.minimumLength;
@@ -202,10 +204,14 @@ public class UserForm extends AdminBaseF
 
 			@Override
 			public void query(String term, int page, Response<Right> response) {
+				boolean isGroupAdmin = hasGroupAdminLevel(getRights());
 				for (Right r : Right.values()) {
 					if (Right.GroupAdmin == r) {
 						continue;
 					}
+					if (isGroupAdmin && (Right.Admin == r || Right.Soap == r)) {
+						continue;
+					}
 					if (Strings.isEmpty(term) || r.name().contains(term)) {
 						response.add(r);
 					}
@@ -259,7 +265,7 @@ public class UserForm extends AdminBaseF
 			target.add(domain);
 		}
 	}
-	
+
 	public void update(AjaxRequestTarget target) {
 		updateDomain(target);
 		if (target != null) {
@@ -267,12 +273,12 @@ public class UserForm extends AdminBaseF
 			target.appendJavaScript("omUserPanelInit();");
 		}
 	}
-	
+
 	@Override
 	protected void onValidate() {
 		User u = getModelObject();
 		if(!getBean(UserDao.class).checkLogin(login.getConvertedInput(), u.getType(), u.getDomainId(), u.getId())) {
-			error(Application.getString(105));
+			error(getString("105"));
 		}
 	}
 

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=1769560&r1=1769559&r2=1769560&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 14 04:00:07 2016
@@ -30,7 +30,7 @@ import org.apache.openmeetings.web.commo
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
-import org.apache.openmeetings.web.data.SearchableDataProvider;
+import org.apache.openmeetings.web.data.SearchableGroupAdminDataProvider;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -69,7 +69,7 @@ public class UsersPanel extends AdminPan
 	public UsersPanel(String id) {
 		super(id);
 
-		final SearchableDataView<User> dataView = new SearchableDataView<User>("userList", new SearchableDataProvider<User>(UserDao.class)) {
+		final SearchableDataView<User> dataView = new SearchableDataView<User>("userList", new SearchableGroupAdminDataProvider<User>(UserDao.class)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java Mon Nov 14 04:00:07 2016
@@ -18,9 +18,12 @@
  */
 package org.apache.openmeetings.web.common;
 
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 import static org.apache.openmeetings.db.util.UserHelper.getMinPasswdLength;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.AVAILABLE_TIMEZONES;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.wicket.validation.validator.StringValidator.minimumLength;
 
 import java.util.ArrayList;
@@ -71,9 +74,11 @@ public class GeneralUserForm extends For
 	private final PasswordTextField passwordField;
 	private final RequiredTextField<String> email;
 	private final List<GroupUser> grpUsers = new ArrayList<>();
+	private final boolean isAdminForm;
 
 	public GeneralUserForm(String id, IModel<User> model, boolean isAdminForm) {
 		super(id, model);
+		this.isAdminForm = isAdminForm;
 
 		//TODO should throw exception if non admin User edit somebody else (or make all fields read-only)
 		add(passwordField = new PasswordTextField("password", new Model<String>()));
@@ -123,7 +128,11 @@ public class GeneralUserForm extends For
 		add(new TextField<String>("address.town"));
 		add(new CountryDropDown("address.country"));
 		add(new TextArea<String>("address.comment"));
+	}
 
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
 		add(new Select2MultiChoice<GroupUser>("groupUsers", null, new ChoiceProvider<GroupUser>() {
 			private static final long serialVersionUID = 1L;
 
@@ -162,14 +171,16 @@ public class GeneralUserForm extends For
 				}
 				return list;
 			}
-		}).setEnabled(isAdminForm));
+		}).setLabel(Model.of(getString("161"))).setRequired(isAdminForm && hasGroupAdminLevel(getRights())).setEnabled(isAdminForm));
 	}
 
 	public void updateModelObject(User u, boolean isAdminForm) {
 		grpUsers.clear();
 		grpUsers.addAll(u.getGroupUsers());
 		if (isAdminForm) {
-			List<Group> grpList = getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
+			List<Group> grpList = hasGroupAdminLevel(getRights())
+					? getBean(GroupDao.class).get(null, getUserId(), 0, Integer.MAX_VALUE, null)
+					: getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
 			for (Group g : grpList) {
 				GroupUser gu = new GroupUser(g, u);
 				int idx = grpUsers.indexOf(gu);

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableDataProvider.java Mon Nov 14 04:00:07 2016
@@ -43,7 +43,7 @@ public class SearchableDataProvider<T ex
 	public SearchableDataProvider(Class<? extends IDataProviderDao<T>> c) {
 		this.clazz = c;
 	}
-	
+
 	@Override
 	public void detach() {
 		// does nothing
@@ -52,7 +52,7 @@ public class SearchableDataProvider<T ex
 	protected IDataProviderDao<T> getDao() {
 		return getBean(clazz);
 	}
-	
+
 	protected String getSortStr() {
 		String result = null;
 		if (getSort() != null) {
@@ -60,7 +60,7 @@ public class SearchableDataProvider<T ex
 		}
 		return result;
 	}
-	
+
 	@Override
 	public Iterator<? extends T> iterator(long first, long count) {
 		return (search == null && getSort() == null

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java?rev=1769560&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java Mon Nov 14 04:00:07 2016
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+package org.apache.openmeetings.web.data;
+
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.util.Iterator;
+
+import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
+import org.apache.openmeetings.db.entity.IDataProviderEntity;
+
+public class SearchableGroupAdminDataProvider<T extends IDataProviderEntity> extends SearchableDataProvider<T> {
+	private static final long serialVersionUID = 1L;
+	protected Class<? extends IGroupAdminDataProviderDao<T>> clazz;
+
+	public SearchableGroupAdminDataProvider(Class<? extends IGroupAdminDataProviderDao<T>> c) {
+		super(c);
+		this.clazz = c;
+	}
+
+	@Override
+	protected IGroupAdminDataProviderDao<T> getDao() {
+		return getBean(clazz);
+	}
+
+	@Override
+	public Iterator<? extends T> iterator(long first, long count) {
+		return (hasGroupAdminLevel(getRights())
+				? getDao().get(search, getUserId(), (int)first, (int)count, getSortStr())
+				: getDao().get(search, (int)first, (int)count, getSortStr())).iterator();
+	}
+
+	@Override
+	public long size() {
+		return (hasGroupAdminLevel(getRights())
+				? getDao().count(search, getUserId())
+				: getDao().count(search));
+	}
+}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java?rev=1769560&r1=1769559&r2=1769560&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java Mon Nov 14 04:00:07 2016
@@ -103,7 +103,7 @@ public class UserChoiceProvider extends
 		UserDao dao = getBean(UserDao.class);
 		response.addAll(dao.get(term, page * PAGE_SIZE, PAGE_SIZE, null, true, getUserId()));
 
-		response.setHasMore(page < dao.count(term, getUserId()) / PAGE_SIZE);
+		response.setHasMore(page < dao.countUsers(term, getUserId()) / PAGE_SIZE);
 	}
 
 	@Override

Added: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java?rev=1769560&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java (added)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java Mon Nov 14 04:00:07 2016
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+package org.apache.openmeetings.db.dao;
+
+import java.util.List;
+
+import org.apache.openmeetings.db.entity.IDataProviderEntity;
+
+public interface IGroupAdminDataProviderDao<T extends IDataProviderEntity> extends IDataProviderDao<T> {
+	/**
+	 * Get a list of instances of {@link T}
+	 * 
+	 * @param search - string search criteria to filter entities
+	 * @param adminId - id of group admin user
+	 * @param start - the start to range to retrieve
+	 * @param count - maximum instance count to retrieve
+	 * @param order - column and sort order
+	 * @return list of instances in the range specified
+	 */
+	List<T> get(String search, Long adminId, int start, int count, String order);
+
+	/**
+	 * Count the number of instances of {@link T}
+	 * 
+	 * @param search - string search criteria to filter entities
+	 * @param adminId - id of group admin user
+	 * @return count of instances satisfying given search criteria
+	 */
+	long count(String search, Long adminId);
+}