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()));


Reply via email to