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/04/28 11:09:50 UTC

svn commit: r1741397 - in /openmeetings/application: branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/ branches/3.2.x/openmeetin...

Author: solomax
Date: Thu Apr 28 09:09:49 2016
New Revision: 1741397

URL: http://svn.apache.org/viewvc?rev=1741397&view=rev
Log:
[OPENMEETINGS-1376] no 'ghost' users are being displayed, user enters the room with the correct rights

Modified:
    openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/SessionManager.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ModeratorRightIcon.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/SessionManager.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ModeratorRightIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java

Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java Thu Apr 28 09:09:49 2016
@@ -32,6 +32,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.data.conference.RoomManager;
 import org.apache.openmeetings.core.data.whiteboard.WhiteboardManager;
 import org.apache.openmeetings.core.remote.RecordingService;
@@ -186,7 +187,7 @@ public class ScopeApplicationAdapter ext
 		rcm.setSwfurl(swfURL);
 		rcm.setTcUrl(tcUrl);
 		rcm.setPublicSID(uid);
-		rcm = sessionManager.add(rcm, null);
+		rcm = sessionManager.add(((IApplication)Application.get(OpenmeetingsVariables.wicketApplicationName)).updateClient(rcm), null);
 		if (rcm == null) {
 			log.warn("Failed to create Client on room connect");
 			return false;
@@ -1418,7 +1419,7 @@ public class ScopeApplicationAdapter ext
 		return roomClientList;
 	}
 
-	public synchronized List<Client> getCurrentModeratorList() {
+	public List<Client> getCurrentModeratorList() {
 		try {
 			IConnection current = Red5.getConnectionLocal();
 			Client client = sessionManager.getClientByStreamId(current.getClient().getId(), null);

Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/SessionManager.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/SessionManager.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/SessionManager.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/SessionManager.java Thu Apr 28 09:09:49 2016
@@ -80,12 +80,11 @@ public class SessionManager implements I
 			server = serverUtil.getCurrentServer();
 		}
 		c.setConnectedSince(new Date());
+		c.setRoomEnter(new Date());
 		if (Strings.isEmpty(c.getPublicSID())) {
 			c.setPublicSID(UUID.randomUUID().toString());
 		}
 		c.setServer(server);
-		c.setIsMod(false);
-		c.setCanDraw(false);
 
 		if (cache.containsKey(null, c.getStreamid())) {
 			log.error("Tried to add an existing Client " + c.getStreamid());

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java Thu Apr 28 09:09:49 2016
@@ -20,6 +20,7 @@ package org.apache.openmeetings;
 
 import javax.servlet.ServletContext;
 
+import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.room.Invitation;
 import org.apache.wicket.request.IExceptionMapper;
 import org.apache.wicket.request.IRequestMapper;
@@ -34,6 +35,7 @@ public interface IApplication {
 	String getOmString(long id);
 	String getOmString(long id, long languageId);
 	String getOmString(String key, long languageId);
+	Client updateClient(Client rcl);
 	String getOmContactsLink();
 	String getOmInvitationLink(String baseUrl, Invitation i);
 	String urlForActivatePage(PageParameters pp);

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Thu Apr 28 09:09:49 2016
@@ -49,6 +49,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.util.InitializationContainer;
+import org.apache.openmeetings.web.app.Client.Right;
 import org.apache.openmeetings.web.pages.ActivatePage;
 import org.apache.openmeetings.web.pages.MainPage;
 import org.apache.openmeetings.web.pages.NotInitedPage;
@@ -105,7 +106,7 @@ public class Application extends Authent
 	private static boolean isInstalled;
 	private static ConcurrentHashMap<String, Client> ONLINE_USERS = new ConcurrentHashMap<>(); 
 	private static ConcurrentHashMap<String, Client> INVALID_SESSIONS = new ConcurrentHashMap<>();
-	private static ConcurrentHashMap<Long, Set<Client>> ROOMS = new ConcurrentHashMap<>();
+	private static ConcurrentHashMap<Long, Set<String>> ROOMS = new ConcurrentHashMap<>();
 	//additional maps for faster searching should be created
 	private DashboardContext dashboardContext;
 	private static Set<String> STRINGS_WITH_APP = new HashSet<>(); //FIXME need to be removed
@@ -222,6 +223,20 @@ public class Application extends Authent
 		}
 	}
 	
+	@Override
+	public org.apache.openmeetings.db.entity.room.Client updateClient(org.apache.openmeetings.db.entity.room.Client rcl) {
+		Client client = getOnlineClient(rcl.getPublicSID());
+		if (rcl == null || client == null) {
+			return rcl;
+		}
+		rcl.setIsSuperModerator(client.hasRight(Right.superModerator));
+		rcl.setIsMod(client.hasRight(Right.moderator));
+		rcl.setIsBroadcasting(client.hasRight(Right.audio));
+		rcl.setCanVideo(client.hasRight(Right.video));
+		rcl.setCanDraw(client.hasRight(Right.whiteBoard));
+		return rcl;
+	}
+	
 	public static Client getOnlineClient(String uid) {
 		return uid == null ? null : ONLINE_USERS.get(uid);
 	}
@@ -284,15 +299,15 @@ public class Application extends Authent
 	}
 	
 	public static void removeInvalidSession(String sessionId) {
-		if (INVALID_SESSIONS.containsKey(sessionId)){
+		if (sessionId != null){
 			INVALID_SESSIONS.remove(sessionId);
 		}
 	}
 	
 	public static Client addUserToRoom(Client c) {
 		log.debug("Adding online room client: {}, room: {}", c.getUid(), c.getRoomId());
-		ROOMS.putIfAbsent(c.getRoomId(), new ConcurrentHashSet<Client>());
-		ROOMS.get(c.getRoomId()).add(c);
+		ROOMS.putIfAbsent(c.getRoomId(), new ConcurrentHashSet<String>());
+		ROOMS.get(c.getRoomId()).add(c.getUid());
 		return c;
 	}
 	
@@ -305,27 +320,35 @@ public class Application extends Authent
 	public static Client removeUserFromRoom(Client c) {
 		log.debug("Removing online room client: {}, room: {}", c.getUid(), c.getRoomId());
 		if (c.getRoomId() != null) {
-			Set<Client> clients = ROOMS.get(c.getRoomId());
+			Set<String> clients = ROOMS.get(c.getRoomId());
 			if (clients != null) {
-				clients.remove(c);
-				if (clients.isEmpty()) {
-					ROOMS.remove(c.getRoomId());
-				}
+				clients.remove(c.getUid());
 				c.setRoomId(null);
 			}
 		}
 		return c;
 	}
 	
-	public static Set<Client> getRoomUsers(long roomId) {
-		return ROOMS.containsKey(roomId) ? ROOMS.get(roomId) : new HashSet<Client>();
+	public static List<Client> getRoomClients(long roomId) {
+		List<Client> clients = new ArrayList<>();
+		Set<String> uids = ROOMS.get(roomId);
+		if (uids != null) {
+			for (String uid : uids) {
+				Client c = getOnlineClient(uid);
+				if (c != null) {
+					clients.add(c);
+				}
+			}
+		}
+		return clients;
 	}
 	
 	public static Set<Long> getUserRooms(long userId) {
-		Set<Long> result = new HashSet<Long>();
-		for (Entry<Long, Set<Client>> me : ROOMS.entrySet()) {
-			for (Client c : me.getValue()) {
-				if (c.getUserId() == userId) {
+		Set<Long> result = new HashSet<>();
+		for (Entry<Long, Set<String>> me : ROOMS.entrySet()) {
+			for (String uid : me.getValue()) {
+				Client c = getOnlineClient(uid);
+				if (c != null && c.getUserId().equals(userId)) {
 					result.add(me.getKey());
 				}
 			}
@@ -334,10 +357,10 @@ public class Application extends Authent
 	}
 	
 	public static boolean isUserInRoom(long roomId, long userId) {
-		if (ROOMS.containsKey(roomId)) {
-			Set<Client> clients = ROOMS.get(roomId);
-			for (Client c : clients) {
-				if (c.getUserId() == userId) {
+		Set<String> clients = ROOMS.get(roomId);
+		if (clients != null) {
+			for (String uid : clients) {
+				if (getOnlineClient(uid).getUserId().equals(userId)) {
 					return true;
 				}
 			}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java Thu Apr 28 09:09:49 2016
@@ -104,6 +104,9 @@ public class Client implements IDataProv
 	}
 
 	public boolean hasRight(Right right) {
+		if (Right.superModerator == right) {
+			return rights.contains(right);
+		}
 		return rights.contains(Right.superModerator) || rights.contains(Right.moderator) ? true : rights.contains(right);
 	}
 
@@ -170,4 +173,10 @@ public class Client implements IDataProv
 			return false;
 		return true;
 	}
+
+	@Override
+	public String toString() {
+		return "Client [uid=" + uid + ", sessionId=" + sessionId + ", pageId=" + pageId + ", userId=" + userId + ", roomId=" + roomId
+				+ ", rights=" + rights + ", activities=" + activities + ", connectedSince=" + connectedSince + "]";
+	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java Thu Apr 28 09:09:49 2016
@@ -36,7 +36,6 @@ import org.apache.openmeetings.web.commo
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
 import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -47,7 +46,6 @@ import org.apache.wicket.markup.html.pan
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.util.time.Duration;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
@@ -143,14 +141,6 @@ public abstract class FileTreePanel exte
 		add(trees.add(treesView).setOutputMarkupId(true));
 		updateSizes();
 		add(sizes.add(new Label("homeSize", homeSize), new Label("publicSize", publicSize)).setOutputMarkupId(true));
-		sizes.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(30)) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onPostProcessTarget(AjaxRequestTarget target) {
-				updateSizes();
-			}
-		});
 		add(errorsDialog);
 	}
 	

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java Thu Apr 28 09:09:49 2016
@@ -25,7 +25,7 @@ import org.apache.openmeetings.core.remo
 import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dto.server.ClientSessionInfo;
 import org.apache.openmeetings.db.entity.room.Client;
-import org.apache.openmeetings.web.app.Client.Right;
+import org.apache.openmeetings.web.app.Application;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
@@ -51,17 +51,12 @@ public class RoomBroadcaster {
 	}
 
 	public static void sendUpdatedClient(org.apache.openmeetings.web.app.Client client) {
-		org.apache.openmeetings.db.entity.room.Client rcl = getClient(client.getUid());
+		org.apache.openmeetings.db.entity.room.Client rcl = Application.get().updateClient(getClient(client.getUid()));
 		log.debug("-----------  sendUpdatedClient ");
 
 		if (rcl == null) {
 			return;
 		}
-		rcl.setIsSuperModerator(client.hasRight(Right.superModerator));
-		rcl.setIsMod(client.hasRight(Right.moderator));
-		rcl.setIsBroadcasting(client.hasRight(Right.audio));
-		rcl.setCanVideo(client.hasRight(Right.video));
-		rcl.setCanDraw(client.hasRight(Right.whiteBoard));
 
 		// Put the mod-flag to true for this client
 		getBean(SessionManager.class).updateClientByStreamId(rcl.getStreamid(), rcl, false, null);

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Thu Apr 28 09:09:49 2016
@@ -21,7 +21,7 @@ package org.apache.openmeetings.web.room
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.addUserToRoom;
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.Application.getRoomUsers;
+import static org.apache.openmeetings.web.app.Application.getRoomClients;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
@@ -31,6 +31,7 @@ import java.util.Calendar;
 
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
+import org.apache.openmeetings.db.dao.user.GroupUserDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
@@ -134,7 +135,6 @@ public class RoomPanel extends BasePanel
 
 	@Override
 	protected void onInitialize() {
-		getClient().setRoomId(r.getId());
 		super.onInitialize();
 		Component accessDenied = new WebMarkupContainer(ACCESS_DENIED_ID).setVisible(false);
 		Component eventDetail = new WebMarkupContainer(EVENT_DETAILS_ID).setVisible(false);
@@ -157,14 +157,14 @@ public class RoomPanel extends BasePanel
 				}
 			}
 		};
-		room.add(wbArea.add(new SwfPanel("whiteboard", getClient())));
+		room.add(wbArea.add(new SwfPanel("whiteboard", r.getId(), getClient().getUid())));
 		room.add(aab);
 		room.add(sidebar = new RoomSidebar("sidebar", this));
 		room.add(activities = new ActivitiesPanel("activities", this));
 		add(roomClosed = new RedirectMessageDialog("room-closed", "1098", r.isClosed(), r.getRedirectURL()));
 		if (r.isClosed()) {
 			room.setVisible(false);
-		} else if (getRoomUsers(r.getId()).size() >= r.getNumberOfPartizipants()) {
+		} else if (getRoomClients(r.getId()).size() >= r.getNumberOfPartizipants()) {
 			accessDenied = new ExpiredMessageDialog(ACCESS_DENIED_ID, getString("99"), menu);
 			room.setVisible(false);
 		} else {
@@ -334,19 +334,31 @@ public class RoomPanel extends BasePanel
 	protected void onBeforeRender() {
 		super.onBeforeRender();
 		if (room.isVisible()) {
-			addUserToRoom(getClient().setRoomId(getRoom().getId()));
+			//We are setting initial rights here
+			Client c = getClient();
+			addUserToRoom(c.setRoomId(getRoom().getId()));
 			User u = getBean(UserDao.class).get(getUserId());
-			//TODO do we need to check GroupModerationRights ????
 			if (AuthLevelUtil.hasAdminLevel(u.getRights())) {
-				getClient().getRights().add(Client.Right.moderator);
+				//admin user get superModerator level, no-one can kick him/her
+				c.getRights().add(Right.superModerator);
 			} else {
-				if (!r.isModerated() && 1 == getRoomUsers(r.getId()).size()) {
-					getClient().getRights().add(Client.Right.moderator);
-				} else if (r.isModerated()) {
-					//TODO why do we need supermoderator ????
-					for (RoomModerator rm : r.getModerators()) {
-						if (getUserId() == rm.getUser().getId()) {
-							getClient().getRights().add(Client.Right.moderator);
+				if (!r.isModerated() && 1 == getRoomClients(r.getId()).size()) {
+					//room is not moderated, first user is moderator!
+					c.getRights().add(Right.moderator);
+				}
+				//performing loop here to set possible 'superModerator' right
+				for (RoomModerator rm : r.getModerators()) {
+					if (getUserId().equals(rm.getUser().getId())) {
+						c.getRights().add(rm.isSuperModerator() ? Right.superModerator : Right.moderator);
+						break;
+					}
+				}
+				//no need to loop if client is moderator
+				if (!c.hasRight(Right.moderator) && !r.getRoomGroups().isEmpty()) {
+					for (RoomGroup rg : r.getRoomGroups()) {
+						GroupUser gu = getBean(GroupUserDao.class).getByGroupAndUser(rg.getGroup().getId(), getUserId());
+						if (gu.isModerator()) {
+							c.getRights().add(Right.moderator);
 							break;
 						}
 					}
@@ -359,7 +371,7 @@ public class RoomPanel extends BasePanel
 		WebSocketSettings settings = WebSocketSettings.Holder.get(Application.get());
 		IWebSocketConnectionRegistry reg = settings.getConnectionRegistry();
 		Executor executor = settings.getWebSocketPushMessageExecutor();
-		for (Client c : getRoomUsers(m.getRoomId())) {
+		for (Client c : getRoomClients(m.getRoomId())) {
 			try {
 				final IWebSocketConnection wsConnection = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
 				if (wsConnection != null) {
@@ -381,8 +393,8 @@ public class RoomPanel extends BasePanel
 	}
 	
 	public static boolean hasRight(long userId, long roomId, Client.Right r) {
-		for (Client c : getRoomUsers(roomId)) {
-			if (c.getUserId() == userId && c.hasRight(r)) {
+		for (Client c : getRoomClients(roomId)) {
+			if (c.getUserId().equals(userId) && c.hasRight(r)) {
 				return true;
 			}
 		}
@@ -391,7 +403,7 @@ public class RoomPanel extends BasePanel
 	
 	public static void sendRoom(long roomId, String msg) {
 		IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
-		for (Client c : getRoomUsers(roomId)) {
+		for (Client c : getRoomClients(roomId)) {
 			try {
 				reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
 			} catch (Exception e) {

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java Thu Apr 28 09:09:49 2016
@@ -35,7 +35,6 @@ import org.apache.openmeetings.db.dao.se
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.entity.server.SOAPLogin;
 import org.apache.openmeetings.db.entity.server.Server;
-import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.wicket.RuntimeConfigurationType;
@@ -67,8 +66,8 @@ public class SwfPanel extends BasePanel
 		this(id, new PageParameters());
 	}
 	
-	public SwfPanel(String id, Client c) {
-		this(id, addServer(c.getRoomId(), true).add("uid", c.getUid()));
+	public SwfPanel(String id, Long roomId, String uid) {
+		this(id, addServer(roomId, true).add("uid", uid));
 	}
 	
 	public SwfPanel(String id, PageParameters pp) {

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java Thu Apr 28 09:09:49 2016
@@ -319,8 +319,7 @@ public class RoomMenuPanel extends Panel
 		Client c = room.getClient();
 		removeUserFromRoom(c);
 		if (broadcast) {
-			RoomMessage m = new RoomMessage(room.getRoom().getId(), c.getUserId(), RoomMessage.Type.roomExit);
-			RoomPanel.broadcast(m);
+			RoomPanel.broadcast(new RoomMessage(room.getRoom().getId(), c.getUserId(), RoomMessage.Type.roomExit));
 		}
 	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Thu Apr 28 09:09:49 2016
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.room
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getOnlineClient;
-import static org.apache.openmeetings.web.app.Application.getRoomUsers;
+import static org.apache.openmeetings.web.app.Application.getRoomClients;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
 
@@ -177,8 +177,7 @@ public class RoomSidebar extends Panel {
 	
 	private ListView<Client> updateUsers() {
 		//TODO do we need sort??
-		users.getList().clear();
-		users.getList().addAll(getRoomUsers(room.getRoom().getId()));
+		users.setList(getRoomClients(room.getRoom().getId()));
 		return users;
 	}
 	

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ModeratorRightIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ModeratorRightIcon.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ModeratorRightIcon.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ModeratorRightIcon.java Thu Apr 28 09:09:49 2016
@@ -32,7 +32,7 @@ public class ModeratorRightIcon extends
 
 	@Override
 	protected boolean isClickable() {
-		return super.isClickable() && !client.hasRight(Right.superModerator);
+		return (self && !hasRight()) || (!self && room.getClient().hasRight(Right.moderator) && !client.hasRight(Right.superModerator));
 	}
 	
 	@Override

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Thu Apr 28 09:09:49 2016
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.user
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.Application.getRoomUsers;
+import static org.apache.openmeetings.web.app.Application.getRoomClients;
 import static org.apache.openmeetings.web.app.Application.getUserRooms;
 import static org.apache.openmeetings.web.app.Application.isUserInRoom;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
@@ -227,7 +227,7 @@ public class ChatPanel extends BasePanel
 	
 	private static void sendRoom(ChatMessage m, String msg) {
 		IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
-		for (Client c : getRoomUsers(m.getToRoom().getId())) {
+		for (Client c : getRoomClients(m.getToRoom().getId())) {
 			try {
 				if (!m.isNeedModeration() || (m.isNeedModeration() && c.hasRight(Client.Right.moderator))) {
 					IWebSocketConnection con = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java Thu Apr 28 09:09:49 2016
@@ -32,6 +32,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.data.conference.RoomManager;
 import org.apache.openmeetings.core.data.whiteboard.WhiteboardManager;
 import org.apache.openmeetings.core.remote.RecordingService;
@@ -186,7 +187,7 @@ public class ScopeApplicationAdapter ext
 		rcm.setSwfurl(swfURL);
 		rcm.setTcUrl(tcUrl);
 		rcm.setPublicSID(uid);
-		rcm = sessionManager.add(rcm, null);
+		rcm = sessionManager.add(((IApplication)Application.get(OpenmeetingsVariables.wicketApplicationName)).updateClient(rcm), null);
 		if (rcm == null) {
 			log.warn("Failed to create Client on room connect");
 			return false;
@@ -1418,7 +1419,7 @@ public class ScopeApplicationAdapter ext
 		return roomClientList;
 	}
 
-	public synchronized List<Client> getCurrentModeratorList() {
+	public List<Client> getCurrentModeratorList() {
 		try {
 			IConnection current = Red5.getConnectionLocal();
 			Client client = sessionManager.getClientByStreamId(current.getClient().getId(), null);

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/SessionManager.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/SessionManager.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/SessionManager.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/SessionManager.java Thu Apr 28 09:09:49 2016
@@ -80,12 +80,11 @@ public class SessionManager implements I
 			server = serverUtil.getCurrentServer();
 		}
 		c.setConnectedSince(new Date());
+		c.setRoomEnter(new Date());
 		if (Strings.isEmpty(c.getPublicSID())) {
 			c.setPublicSID(UUID.randomUUID().toString());
 		}
 		c.setServer(server);
-		c.setIsMod(false);
-		c.setCanDraw(false);
 
 		if (cache.containsKey(null, c.getStreamid())) {
 			log.error("Tried to add an existing Client " + c.getStreamid());

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java Thu Apr 28 09:09:49 2016
@@ -20,6 +20,7 @@ package org.apache.openmeetings;
 
 import javax.servlet.ServletContext;
 
+import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.room.Invitation;
 import org.apache.wicket.request.IExceptionMapper;
 import org.apache.wicket.request.IRequestMapper;
@@ -34,6 +35,7 @@ public interface IApplication {
 	String getOmString(long id);
 	String getOmString(long id, long languageId);
 	String getOmString(String key, long languageId);
+	Client updateClient(Client rcl);
 	String getOmContactsLink();
 	String getOmInvitationLink(String baseUrl, Invitation i);
 	String urlForActivatePage(PageParameters pp);

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Thu Apr 28 09:09:49 2016
@@ -49,6 +49,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.util.InitializationContainer;
+import org.apache.openmeetings.web.app.Client.Right;
 import org.apache.openmeetings.web.pages.ActivatePage;
 import org.apache.openmeetings.web.pages.MainPage;
 import org.apache.openmeetings.web.pages.NotInitedPage;
@@ -105,7 +106,7 @@ public class Application extends Authent
 	private static boolean isInstalled;
 	private static ConcurrentHashMap<String, Client> ONLINE_USERS = new ConcurrentHashMap<>(); 
 	private static ConcurrentHashMap<String, Client> INVALID_SESSIONS = new ConcurrentHashMap<>();
-	private static ConcurrentHashMap<Long, Set<Client>> ROOMS = new ConcurrentHashMap<>();
+	private static ConcurrentHashMap<Long, Set<String>> ROOMS = new ConcurrentHashMap<>();
 	//additional maps for faster searching should be created
 	private DashboardContext dashboardContext;
 	private static Set<String> STRINGS_WITH_APP = new HashSet<>(); //FIXME need to be removed
@@ -222,6 +223,20 @@ public class Application extends Authent
 		}
 	}
 	
+	@Override
+	public org.apache.openmeetings.db.entity.room.Client updateClient(org.apache.openmeetings.db.entity.room.Client rcl) {
+		Client client = getOnlineClient(rcl.getPublicSID());
+		if (rcl == null || client == null) {
+			return rcl;
+		}
+		rcl.setIsSuperModerator(client.hasRight(Right.superModerator));
+		rcl.setIsMod(client.hasRight(Right.moderator));
+		rcl.setIsBroadcasting(client.hasRight(Right.audio));
+		rcl.setCanVideo(client.hasRight(Right.video));
+		rcl.setCanDraw(client.hasRight(Right.whiteBoard));
+		return rcl;
+	}
+	
 	public static Client getOnlineClient(String uid) {
 		return uid == null ? null : ONLINE_USERS.get(uid);
 	}
@@ -284,15 +299,15 @@ public class Application extends Authent
 	}
 	
 	public static void removeInvalidSession(String sessionId) {
-		if (INVALID_SESSIONS.containsKey(sessionId)){
+		if (sessionId != null){
 			INVALID_SESSIONS.remove(sessionId);
 		}
 	}
 	
 	public static Client addUserToRoom(Client c) {
 		log.debug("Adding online room client: {}, room: {}", c.getUid(), c.getRoomId());
-		ROOMS.putIfAbsent(c.getRoomId(), new ConcurrentHashSet<Client>());
-		ROOMS.get(c.getRoomId()).add(c);
+		ROOMS.putIfAbsent(c.getRoomId(), new ConcurrentHashSet<String>());
+		ROOMS.get(c.getRoomId()).add(c.getUid());
 		return c;
 	}
 	
@@ -305,27 +320,35 @@ public class Application extends Authent
 	public static Client removeUserFromRoom(Client c) {
 		log.debug("Removing online room client: {}, room: {}", c.getUid(), c.getRoomId());
 		if (c.getRoomId() != null) {
-			Set<Client> clients = ROOMS.get(c.getRoomId());
+			Set<String> clients = ROOMS.get(c.getRoomId());
 			if (clients != null) {
-				clients.remove(c);
-				if (clients.isEmpty()) {
-					ROOMS.remove(c.getRoomId());
-				}
+				clients.remove(c.getUid());
 				c.setRoomId(null);
 			}
 		}
 		return c;
 	}
 	
-	public static Set<Client> getRoomUsers(long roomId) {
-		return ROOMS.containsKey(roomId) ? ROOMS.get(roomId) : new HashSet<Client>();
+	public static List<Client> getRoomClients(long roomId) {
+		List<Client> clients = new ArrayList<>();
+		Set<String> uids = ROOMS.get(roomId);
+		if (uids != null) {
+			for (String uid : uids) {
+				Client c = getOnlineClient(uid);
+				if (c != null) {
+					clients.add(c);
+				}
+			}
+		}
+		return clients;
 	}
 	
 	public static Set<Long> getUserRooms(long userId) {
-		Set<Long> result = new HashSet<Long>();
-		for (Entry<Long, Set<Client>> me : ROOMS.entrySet()) {
-			for (Client c : me.getValue()) {
-				if (c.getUserId() == userId) {
+		Set<Long> result = new HashSet<>();
+		for (Entry<Long, Set<String>> me : ROOMS.entrySet()) {
+			for (String uid : me.getValue()) {
+				Client c = getOnlineClient(uid);
+				if (c != null && c.getUserId().equals(userId)) {
 					result.add(me.getKey());
 				}
 			}
@@ -334,10 +357,10 @@ public class Application extends Authent
 	}
 	
 	public static boolean isUserInRoom(long roomId, long userId) {
-		if (ROOMS.containsKey(roomId)) {
-			Set<Client> clients = ROOMS.get(roomId);
-			for (Client c : clients) {
-				if (c.getUserId() == userId) {
+		Set<String> clients = ROOMS.get(roomId);
+		if (clients != null) {
+			for (String uid : clients) {
+				if (getOnlineClient(uid).getUserId().equals(userId)) {
 					return true;
 				}
 			}

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java Thu Apr 28 09:09:49 2016
@@ -104,6 +104,9 @@ public class Client implements IDataProv
 	}
 
 	public boolean hasRight(Right right) {
+		if (Right.superModerator == right) {
+			return rights.contains(right);
+		}
 		return rights.contains(Right.superModerator) || rights.contains(Right.moderator) ? true : rights.contains(right);
 	}
 
@@ -170,4 +173,10 @@ public class Client implements IDataProv
 			return false;
 		return true;
 	}
+
+	@Override
+	public String toString() {
+		return "Client [uid=" + uid + ", sessionId=" + sessionId + ", pageId=" + pageId + ", userId=" + userId + ", roomId=" + roomId
+				+ ", rights=" + rights + ", activities=" + activities + ", connectedSince=" + connectedSince + "]";
+	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java Thu Apr 28 09:09:49 2016
@@ -36,7 +36,6 @@ import org.apache.openmeetings.web.commo
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
 import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -47,7 +46,6 @@ import org.apache.wicket.markup.html.pan
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.util.time.Duration;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
@@ -143,14 +141,6 @@ public abstract class FileTreePanel exte
 		add(trees.add(treesView).setOutputMarkupId(true));
 		updateSizes();
 		add(sizes.add(new Label("homeSize", homeSize), new Label("publicSize", publicSize)).setOutputMarkupId(true));
-		sizes.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(30)) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onPostProcessTarget(AjaxRequestTarget target) {
-				updateSizes();
-			}
-		});
 		add(errorsDialog);
 	}
 	

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java Thu Apr 28 09:09:49 2016
@@ -25,7 +25,7 @@ import org.apache.openmeetings.core.remo
 import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dto.server.ClientSessionInfo;
 import org.apache.openmeetings.db.entity.room.Client;
-import org.apache.openmeetings.web.app.Client.Right;
+import org.apache.openmeetings.web.app.Application;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
@@ -51,17 +51,12 @@ public class RoomBroadcaster {
 	}
 
 	public static void sendUpdatedClient(org.apache.openmeetings.web.app.Client client) {
-		org.apache.openmeetings.db.entity.room.Client rcl = getClient(client.getUid());
+		org.apache.openmeetings.db.entity.room.Client rcl = Application.get().updateClient(getClient(client.getUid()));
 		log.debug("-----------  sendUpdatedClient ");
 
 		if (rcl == null) {
 			return;
 		}
-		rcl.setIsSuperModerator(client.hasRight(Right.superModerator));
-		rcl.setIsMod(client.hasRight(Right.moderator));
-		rcl.setIsBroadcasting(client.hasRight(Right.audio));
-		rcl.setCanVideo(client.hasRight(Right.video));
-		rcl.setCanDraw(client.hasRight(Right.whiteBoard));
 
 		// Put the mod-flag to true for this client
 		getBean(SessionManager.class).updateClientByStreamId(rcl.getStreamid(), rcl, false, null);

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Thu Apr 28 09:09:49 2016
@@ -21,7 +21,7 @@ package org.apache.openmeetings.web.room
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.addUserToRoom;
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.Application.getRoomUsers;
+import static org.apache.openmeetings.web.app.Application.getRoomClients;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
@@ -31,6 +31,7 @@ import java.util.Calendar;
 
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
+import org.apache.openmeetings.db.dao.user.GroupUserDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
@@ -150,7 +151,6 @@ public class RoomPanel extends BasePanel
 
 	@Override
 	protected void onInitialize() {
-		getClient().setRoomId(r.getId());
 		super.onInitialize();
 		Component accessDenied = new WebMarkupContainer(ACCESS_DENIED_ID).setVisible(false);
 		Component eventDetail = new WebMarkupContainer(EVENT_DETAILS_ID).setVisible(false);
@@ -182,7 +182,7 @@ public class RoomPanel extends BasePanel
 		add(roomClosed = new RedirectMessageDialog("room-closed", "1098", r.isClosed(), r.getRedirectURL()));
 		if (r.isClosed()) {
 			room.setVisible(false);
-		} else if (getRoomUsers(r.getId()).size() >= r.getNumberOfPartizipants()) {
+		} else if (getRoomClients(r.getId()).size() >= r.getNumberOfPartizipants()) {
 			accessDenied = new ExpiredMessageDialog(ACCESS_DENIED_ID, getString("99"), menu);
 			room.setVisible(false);
 		} else {
@@ -364,19 +364,31 @@ public class RoomPanel extends BasePanel
 	protected void onBeforeRender() {
 		super.onBeforeRender();
 		if (room.isVisible()) {
-			addUserToRoom(getClient().setRoomId(getRoom().getId()));
+			//We are setting initial rights here
+			Client c = getClient();
+			addUserToRoom(c.setRoomId(getRoom().getId()));
 			User u = getBean(UserDao.class).get(getUserId());
-			//TODO do we need to check GroupModerationRights ????
 			if (AuthLevelUtil.hasAdminLevel(u.getRights())) {
-				getClient().getRights().add(Client.Right.moderator);
+				//admin user get superModerator level, no-one can kick him/her
+				c.getRights().add(Right.superModerator);
 			} else {
-				if (!r.isModerated() && 1 == getRoomUsers(r.getId()).size()) {
-					getClient().getRights().add(Client.Right.moderator);
-				} else if (r.isModerated()) {
-					//TODO why do we need supermoderator ????
-					for (RoomModerator rm : r.getModerators()) {
-						if (getUserId() == rm.getUser().getId()) {
-							getClient().getRights().add(Client.Right.moderator);
+				if (!r.isModerated() && 1 == getRoomClients(r.getId()).size()) {
+					//room is not moderated, first user is moderator!
+					c.getRights().add(Right.moderator);
+				}
+				//performing loop here to set possible 'superModerator' right
+				for (RoomModerator rm : r.getModerators()) {
+					if (getUserId().equals(rm.getUser().getId())) {
+						c.getRights().add(rm.isSuperModerator() ? Right.superModerator : Right.moderator);
+						break;
+					}
+				}
+				//no need to loop if client is moderator
+				if (!c.hasRight(Right.moderator) && !r.getRoomGroups().isEmpty()) {
+					for (RoomGroup rg : r.getRoomGroups()) {
+						GroupUser gu = getBean(GroupUserDao.class).getByGroupAndUser(rg.getGroup().getId(), getUserId());
+						if (gu.isModerator()) {
+							c.getRights().add(Right.moderator);
 							break;
 						}
 					}
@@ -389,7 +401,7 @@ public class RoomPanel extends BasePanel
 		WebSocketSettings settings = WebSocketSettings.Holder.get(Application.get());
 		IWebSocketConnectionRegistry reg = settings.getConnectionRegistry();
 		Executor executor = settings.getWebSocketPushMessageExecutor();
-		for (Client c : getRoomUsers(m.getRoomId())) {
+		for (Client c : getRoomClients(m.getRoomId())) {
 			try {
 				final IWebSocketConnection wsConnection = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
 				if (wsConnection != null) {
@@ -411,8 +423,8 @@ public class RoomPanel extends BasePanel
 	}
 	
 	public static boolean hasRight(long userId, long roomId, Client.Right r) {
-		for (Client c : getRoomUsers(roomId)) {
-			if (c.getUserId() == userId && c.hasRight(r)) {
+		for (Client c : getRoomClients(roomId)) {
+			if (c.getUserId().equals(userId) && c.hasRight(r)) {
 				return true;
 			}
 		}
@@ -421,7 +433,7 @@ public class RoomPanel extends BasePanel
 	
 	public static void sendRoom(long roomId, String msg) {
 		IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
-		for (Client c : getRoomUsers(roomId)) {
+		for (Client c : getRoomClients(roomId)) {
 			try {
 				reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
 			} catch (Exception e) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java Thu Apr 28 09:09:49 2016
@@ -57,7 +57,7 @@ public class SwfPanel extends BasePanel
 		add(new Label("init", getInitFunction(pp)).setEscapeModelStrings(false));
 	}
 
-	private ResourceReference newResourceReference() {
+	private static ResourceReference newResourceReference() {
 		return new JavaScriptResourceReference(SwfPanel.class, "swf-functions.js");
 	}
 	

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java Thu Apr 28 09:09:49 2016
@@ -319,8 +319,7 @@ public class RoomMenuPanel extends Panel
 		Client c = room.getClient();
 		removeUserFromRoom(c);
 		if (broadcast) {
-			RoomMessage m = new RoomMessage(room.getRoom().getId(), c.getUserId(), RoomMessage.Type.roomExit);
-			RoomPanel.broadcast(m);
+			RoomPanel.broadcast(new RoomMessage(room.getRoom().getId(), c.getUserId(), RoomMessage.Type.roomExit));
 		}
 	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Thu Apr 28 09:09:49 2016
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.room
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getOnlineClient;
-import static org.apache.openmeetings.web.app.Application.getRoomUsers;
+import static org.apache.openmeetings.web.app.Application.getRoomClients;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
 
@@ -177,8 +177,7 @@ public class RoomSidebar extends Panel {
 	
 	private ListView<Client> updateUsers() {
 		//TODO do we need sort??
-		users.getList().clear();
-		users.getList().addAll(getRoomUsers(room.getRoom().getId()));
+		users.setList(getRoomClients(room.getRoom().getId()));
 		return users;
 	}
 	

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ModeratorRightIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ModeratorRightIcon.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ModeratorRightIcon.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ModeratorRightIcon.java Thu Apr 28 09:09:49 2016
@@ -32,7 +32,7 @@ public class ModeratorRightIcon extends
 
 	@Override
 	protected boolean isClickable() {
-		return super.isClickable() && !client.hasRight(Right.superModerator);
+		return (self && !hasRight()) || (!self && room.getClient().hasRight(Right.moderator) && !client.hasRight(Right.superModerator));
 	}
 	
 	@Override

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1741397&r1=1741396&r2=1741397&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Thu Apr 28 09:09:49 2016
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.user
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.Application.getRoomUsers;
+import static org.apache.openmeetings.web.app.Application.getRoomClients;
 import static org.apache.openmeetings.web.app.Application.getUserRooms;
 import static org.apache.openmeetings.web.app.Application.isUserInRoom;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
@@ -227,7 +227,7 @@ public class ChatPanel extends BasePanel
 	
 	private static void sendRoom(ChatMessage m, String msg) {
 		IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
-		for (Client c : getRoomUsers(m.getToRoom().getId())) {
+		for (Client c : getRoomClients(m.getToRoom().getId())) {
 			try {
 				if (!m.isNeedModeration() || (m.isNeedModeration() && c.hasRight(Client.Right.moderator))) {
 					IWebSocketConnection con = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));