Repository: openmeetings
Updated Branches:
  refs/heads/master 417fdd64f -> 117e8d6bc


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
index 1527797..50afb36 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
@@ -26,8 +26,8 @@ import static 
org.apache.openmeetings.util.OpenmeetingsVariables.LEVEL_USER;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.MENU_ROOMS_NAME;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.addOnlineUser;
-import static org.apache.openmeetings.web.app.Application.exit;
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.Application.getOnlineClient;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static 
org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getParam;
@@ -101,7 +101,7 @@ public class MainPanel extends Panel {
        private static final String DELIMITER = "     ";
        private static final WebMarkupContainer EMPTY = new 
WebMarkupContainer(CHILD_ID);
        public static final String PARAM_USER_ID = "userId";
-       private Client client = null;
+       private String uid = null;
        private final MenuPanel menu;
        private final WebMarkupContainer topControls = new 
WebMarkupContainer("topControls");
        private final WebMarkupContainer topLinks = new 
WebMarkupContainer("topLinks");
@@ -116,7 +116,7 @@ public class MainPanel extends Panel {
                @Override
                protected void onTimer(AjaxRequestTarget target) {
                        log.debug("Sending WebSocket PING");
-                       WebSocketHelper.sendClient(client, new 
byte[]{getUserId().byteValue()});
+                       WebSocketHelper.sendClient(getClient(), new 
byte[]{getUserId().byteValue()});
                }
        };
 
@@ -150,7 +150,7 @@ public class MainPanel extends Panel {
        protected void onInitialize() {
                super.onInitialize();
                
add(topControls.setOutputMarkupPlaceholderTag(true).setMarkupId("topControls"));
-               add(contents.add(client == null ? EMPTY : 
panel).setOutputMarkupId(true).setMarkupId("contents"));
+               add(contents.add(getClient() == null ? EMPTY : 
panel).setOutputMarkupId(true).setMarkupId("contents"));
                topControls.add(menu.setVisible(false), 
topLinks.setVisible(false).setOutputMarkupPlaceholderTag(true).setMarkupId("topLinks"));
                topLinks.add(new AjaxLink<Void>("messages") {
                        private static final long serialVersionUID = 1L;
@@ -242,7 +242,8 @@ public class MainPanel extends Panel {
                        protected void onConnect(ConnectedMessage msg) {
                                super.onConnect(msg);
                                ExtendedClientProperties cp = 
WebSession.get().getExtendedProperties();
-                               client = new Client(getSession().getId(), 
msg.getKey().hashCode(), getUserId(), getBean(UserDao.class));
+                               final Client client = new 
Client(getSession().getId(), msg.getKey().hashCode(), getUserId(), 
getBean(UserDao.class));
+                               uid = client.getUid();
                                addOnlineUser(cp.update(client));
                                log.debug("WebSocketBehavior::onConnect [uid: 
{}, session: {}, key: {}]", client.getUid(), msg.getSessionId(), msg.getKey());
                        }
@@ -278,10 +279,10 @@ public class MainPanel extends Panel {
 
                        private void closeHandler(AbstractClientMessage msg) {
                                //no chance to stop pingTimer here :(
-                               if (client != null) {
-                                       
log.debug("WebSocketBehavior::closeHandler [uid: {}, session: {}, key: {}]", 
client.getUid(), msg.getSessionId(), msg.getKey());
-                                       exit(client);
-                                       client = null;
+                               if (uid != null) {
+                                       
log.debug("WebSocketBehavior::closeHandler [uid: {}, session: {}, key: {}]", 
uid, msg.getSessionId(), msg.getKey());
+                                       Application.get().exit(uid);
+                                       uid = null;
                                }
                        }
                });
@@ -343,7 +344,7 @@ public class MainPanel extends Panel {
        public void updateContents(OmUrlFragment f, IPartialPageRequestHandler 
handler, boolean updateFragment) {
                BasePanel panel = getPanel(f.getArea(), f.getType());
                if (panel != null) {
-                       if (client != null) {
+                       if (getClient() != null) {
                                updateContents(panel, handler);
                        } else {
                                this.panel = panel;
@@ -383,6 +384,6 @@ public class MainPanel extends Panel {
        }
 
        public Client getClient() {
-               return client;
+               return getOnlineClient(uid);
        }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
index d9e203e..c0af7b7 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
@@ -24,6 +24,7 @@ import static 
org.apache.openmeetings.web.app.Application.getBean;
 import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dto.server.ClientSessionInfo;
+import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.web.app.Application;
 import org.red5.logging.Red5LoggerFactory;
@@ -33,7 +34,7 @@ public class RoomBroadcaster {
        private static final Logger log = 
Red5LoggerFactory.getLogger(RoomBroadcaster.class, webAppRootKey);
 
        public static StreamClient getClient(String publicSid) {
-               ClientSessionInfo csi = 
getBean(SessionManager.class).getClientByPublicSIDAnyServer(publicSid);
+               ClientSessionInfo csi = 
getBean(SessionManager.class).getClientByUidAnyServer(publicSid);
                return csi == null ? null : csi.getRcl();
        }
 
@@ -50,8 +51,9 @@ public class RoomBroadcaster {
                sa.sendToScope(roomId, method, obj);
        }
 
-       public static void 
sendUpdatedClient(org.apache.openmeetings.db.entity.basic.Client client) {
-               StreamClient rcl = 
Application.get().updateClient(getClient(client.getUid()), true);
+       public static void sendUpdatedClient(Client client) {
+               String uid = client.getUid();
+               StreamClient rcl = 
Application.get().updateClient(getClient(uid), true);
                log.debug("-----------  sendUpdatedClient ");
 
                if (rcl == null) {
@@ -59,7 +61,7 @@ public class RoomBroadcaster {
                }
 
                // Put the mod-flag to true for this client
-               
getBean(SessionManager.class).updateClientByStreamId(rcl.getStreamid(), rcl, 
false, null);
+               getBean(SessionManager.class).update(rcl);
                // Notify all clients of the same scope (room)
                broadcast(client.getRoomId(), "clientUpdated", rcl);
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index 8ee4ca9..4ff3dc6 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -22,10 +22,10 @@ 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.exitRoom;
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.Application.getClientBySid;
 import static org.apache.openmeetings.web.app.Application.getOnlineClient;
 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.getSid;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
 import java.util.Calendar;
@@ -158,13 +158,10 @@ public class RoomPanel extends BasePanel {
                StringBuilder sb = new StringBuilder();
                for (Client c: getRoomClients(getRoom().getId()) ) {
                        boolean self = getClient().getUid().equals(c.getUid());
-                       if (c.hasAnyActivity(Client.Activity.broadcastA, 
Client.Activity.broadcastV)) {
-                               sb.append(String.format("VideoManager.play(%s);"
-                                               , RoomHelper.videoJson(c, self, 
getSid(), getBean(ISessionManager.class), false)));
-                       }
-                       if (c.hasActivity(Client.Activity.share)) {
-                               sb.append(String.format("VideoManager.play(%s);"
-                                               , RoomHelper.videoJson(c, self, 
getSid(), getBean(ISessionManager.class), true)));
+                       for (Client.Stream s : c.getStreams()) {
+                               JSONObject jo = RoomHelper.videoJson(c, self, 
c.getSid(), getBean(ISessionManager.class), s.getStreamClientId(), 
s.isSharing())
+                                               .put("broadcastId", 
s.getBroadcastId());
+                               
sb.append(String.format("VideoManager.play(%s);", jo));
                        }
                }
                if (!Strings.isEmpty(sb)) {
@@ -338,7 +335,7 @@ public class RoomPanel extends BasePanel {
                                        case recordingStoped:
                                                {
                                                        String uid = 
((TextRoomMessage)m).getText();
-                                                       Client c = 
getOnlineClient(uid);
+                                                       Client c = 
getClientBySid(uid);
                                                        if (c == null) {
                                                                log.error("Not 
existing/BAD user has stopped recording {} != {} !!!!", uid);
                                                                return;
@@ -351,7 +348,7 @@ public class RoomPanel extends BasePanel {
                                        case recordingStarted:
                                                {
                                                        String uid = 
((TextRoomMessage)m).getText();
-                                                       Client c = 
getOnlineClient(uid);
+                                                       Client c = 
getClientBySid(uid);
                                                        if (c == null) {
                                                                log.error("Not 
existing user has started recording {} !!!!", uid);
                                                                return;
@@ -363,12 +360,13 @@ public class RoomPanel extends BasePanel {
                                                break;
                                        case sharingStoped:
                                                {
-                                                       String uid = 
((TextRoomMessage)m).getText();
-                                                       Client c = 
getOnlineClient(uid);
+                                                       JSONObject obj = new 
JSONObject(((TextRoomMessage)m).getText());
+                                                       Client c = 
getClientBySid(obj.getString("ownerSid"));
                                                        if (c == null) {
-                                                               log.error("Not 
existing user has started sharing {} !!!!", uid);
+                                                               log.error("Not 
existing user has started sharing {} !!!!", obj);
                                                                return;
                                                        }
+                                                       
handler.appendJavaScript(String.format("VideoManager.close('%s', true);", 
obj.getString("uid")));
                                                        sharingUser = null;
                                                        
c.remove(Client.Activity.share);
                                                        menu.update(handler);
@@ -389,9 +387,14 @@ public class RoomPanel extends BasePanel {
                                                break;
                                        case rightUpdated:
                                                {
-                                                       Client c = 
getOnlineClient(((TextRoomMessage)m).getText());
+                                                       String uid = 
((TextRoomMessage)m).getText();
+                                                       Client c = 
getOnlineClient(uid);
+                                                       if (c == null) {
+                                                               log.error("Not 
existing user in rightUpdated {} !!!!", uid);
+                                                               return;
+                                                       }
                                                        
handler.appendJavaScript(String.format("VideoManager.update(%s);"
-                                                                       , 
c.toJson(getClient().getUid().equals(c.getUid())).put("sid", getSid())));
+                                                                       , 
c.toJson(getClient().getUid().equals(c.getUid())).put("sid", 
getClient().getSid())));
                                                        sidebar.update(handler);
                                                        menu.update(handler);
                                                        wb.update(handler);
@@ -400,12 +403,26 @@ public class RoomPanel extends BasePanel {
                                        case newStream:
                                        {
                                                JSONObject obj = new 
JSONObject(((TextRoomMessage)m).getText());
-                                               Client c = 
getOnlineClient(obj.getString("uid"));
-                                               
c.setBroadcastId(obj.getString("stream"));
+                                               boolean share = 
obj.optBoolean("screenShare", false);
+                                               String uid = 
obj.getString("uid");
+                                               Client c = getOnlineClient(uid);
+                                               if (c == null) {
+                                                       // screen client, ext 
video stream ??
+                                                       c = 
getClientBySid(obj.getString("ownerSid"));
+                                               }
+                                               if (c == null) {
+                                                       log.error("Not existing 
user in newStream {} !!!!", uid);
+                                                       return;
+                                               }
                                                boolean self = 
getClient().getUid().equals(c.getUid());
+                                               String broadcastId = 
obj.getString("stream");
+                                               Long streamClientId = 
obj.getLong("streamClientId");
                                                if (!self) {
-                                                       
handler.appendJavaScript(String.format("VideoManager.play(%s);"
-                                                                       , 
RoomHelper.videoJson(c, self, getSid(), getBean(ISessionManager.class), 
obj.optBoolean("screenShare", false))));
+                                                       JSONObject jo = 
RoomHelper.videoJson(c, uid, self, c.getSid(), getBean(ISessionManager.class), 
streamClientId, share)
+                                                                       
.put("broadcastId", broadcastId);
+                                                       
handler.appendJavaScript(String.format("VideoManager.play(%s);", jo));
+                                               } else {
+                                                       
c.addStream(streamClientId, broadcastId, share);
                                                }
                                        }
                                                break;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
index 94abced..d7666c7 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
@@ -29,9 +29,7 @@ import static 
org.apache.openmeetings.web.app.Application.getBean;
 
 import java.net.URL;
 
-import org.apache.directory.api.util.Strings;
 import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
-import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.util.ExtendedClientProperties;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
@@ -65,16 +63,13 @@ public class VideoSettings extends Panel {
                return String.format("%s://%s:%s/%s", protocol, host, port, 
app);
        }
 
-       public static JSONObject getInitJson(ExtendedClientProperties cp, 
String scope, String uid) {
+       public static JSONObject getInitJson(ExtendedClientProperties cp, 
String scope, String sid) {
                JSONObject gs = 
getBean(ScopeApplicationAdapter.class).getFlashSettings();
                JSONObject s = new JSONObject()
                                .put(FLASH_VIDEO_CODEC, 
gs.get(FLASH_VIDEO_CODEC))
                                .put(FLASH_FPS, gs.get(FLASH_FPS))
-                               .put("sid", WebSession.getSid())
+                               .put("sid", sid)
                                .put("wmode", cp.isBrowserInternetExplorer() && 
cp.getBrowserVersionMajor() == 11 ? "opaque" : "direct");
-               if (!Strings.isEmpty(uid)) {
-                       s.put("uid", uid);
-               }
                try {
                        URL url = new URL(cp.getCodebase());
                        String path = url.getPath();

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
index bdb1ea8..ff7891f 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
@@ -301,13 +301,13 @@ public class RoomMenuPanel extends Panel {
                StringBuilder roomTitle = new StringBuilder();
                if (room.getRecordingUser() != null) {
                        ISessionManager sessMngr = 
getBean(ISessionManager.class);
-                       StreamClient recUser = 
sessMngr.getClientByPublicSID(room.getRecordingUser(), null); //TODO check 
server
+                       StreamClient recUser = 
sessMngr.getClientByUid(room.getRecordingUser(), null); //TODO check server
                        if (recUser != null) {
                                roomTitle.append(String.format("%s %s %s %s 
%s", getString("419")
                                                , recUser.getUsername(), 
recUser.getFirstname(), recUser.getLastname(), 
df.format(recUser.getConnectedSince())));
                                roomClass.append(" screen");
                        }
-                       StreamClient pubUser = 
sessMngr.getClientByPublicSID(room.getPublishingUser(), null); //TODO check 
server
+                       StreamClient pubUser = 
sessMngr.getClientByUid(room.getPublishingUser(), null); //TODO check server
                        if (pubUser != null) {
                                if (recUser != null) {
                                        roomTitle.append('\n');

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
index bc0744d..3f935a6 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
@@ -91,8 +91,8 @@ public class StartSharingButton extends OmButton {
                try (InputStream jnlp = 
getClass().getClassLoader().getResourceAsStream("APPLICATION.jnlp")) {
                        ConfigurationDao cfgDao = 
getBean(ConfigurationDao.class);
                        app = IOUtils.toString(jnlp, UTF_8);
-                       String publicSid = c.getUid();
-                       JSONObject s = 
VideoSettings.getInitJson(WebSession.get().getExtendedProperties(), "" + 
c.getRoomId(), publicSid);
+                       String sid = c.getSid();
+                       JSONObject s = 
VideoSettings.getInitJson(WebSession.get().getExtendedProperties(), "" + 
c.getRoomId(), sid);
                        String _url = s.getString(VideoSettings.URL);
                        long roomId = c.getRoomId();
                        Room room = getBean(RoomDao.class).get(roomId);
@@ -102,7 +102,7 @@ public class StartSharingButton extends OmButton {
                                        .replace("$applicationName", 
cfgDao.getAppName())
                                        .replace("$url", _url)
                                        .replace("$fallback", 
s.getString(VideoSettings.FALLBACK))
-                                       .replace("$publicSid", publicSid)
+                                       .replace("$sid", sid)
                                        .replace("$labels", getLabels(730,  
731,  732,  733,  734
                                                        ,  735,  737,  738,  
739,  740
                                                        ,  741,  742,  844,  
869,  870

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
index 7db4666..c076069 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
@@ -16,6 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+var VideoUtil = (function() {
+       var self = {};
+       function _getVid(uid) {
+               return "video" + uid;
+       }
+       function _getShareVid(uid) {
+               return "video-share" + uid;
+       }
+       self.getVid = _getVid;
+       self.getShareVid = _getShareVid;
+       return self;
+})();
 var Video = (function() {
        var self = {}, c, box, v, vc, t, swf, size;
 
@@ -35,7 +47,8 @@ var Video = (function() {
                c = _c;
                box = _box;
                size = {width: c.width, height: c.height};
-               var _id = "video" + c.uid, name = _getName()
+               var _id = !!c.screenShare ? VideoUtil.getShareVid(c.uid) : 
VideoUtil.getVid(c.uid)
+                       , name = _getName()
                        , _w = c.self ? Math.max(300, c.width) : c.width
                        , _h = c.self ? Math.max(200, c.height) : c.height;
                box.append($('#user-video').clone().attr('id', 
_id).attr('title', name).data(self));
@@ -106,6 +119,7 @@ var Video = (function() {
                o.width = c.width;
                o.height = c.height;
                o.sid = c.sid;
+               o.uid = c.uid;
                o.broadcastId = c.broadcastId;
                swf = initVideo(vc, _id + '-swf', o);
                swf.attr('width', _w).attr('height', _h);
@@ -130,11 +144,8 @@ var VideoManager = (function() {
                box = $('.room.box');
                share = box.find('.icon.shared.ui-button');
        }
-       function _getVid(uid) {
-               return "video" + uid;
-       }
        function _update(c) {
-               var _id = _getVid(c.uid)
+               var _id = VideoUtil.getVid(c.uid)
                        , video = c.activities.indexOf('broadcastV') > -1
                        , audio = c.activities.indexOf('broadcastA') > -1
                        , av = audio || video
@@ -156,8 +167,8 @@ var VideoManager = (function() {
        function _play(c) {
                if (!!c.screenShare) {
                        _highlight(share.attr('title', share.data('user') + ' ' 
+ c.user.firstName + ' ' + c.user.lastName + ' ' + share.data('text')).show(), 
10);
-                       share.tooltip().click(function() {
-                               var v = $('#' + _getVid(c.uid))
+                       share.tooltip().off('click').click(function() {
+                               var v = $('#' + VideoUtil.getShareVid(c.uid))
                                if (v.length != 1) {
                                        Video().init(box, options.uid, c);
                                } else {
@@ -168,8 +179,9 @@ var VideoManager = (function() {
                        Video().init(box, options.uid, c);
                }
        }
-       function _close(uid) {
-               var _id = _getVid(uid), v = $('#' + _id);
+       function _close(uid, screenShare) {
+               var _id = !!screenShare ? VideoUtil.getShareVid(uid) : 
VideoUtil.getVid(uid)
+                               , v = $('#' + _id);
                if (v.length == 1) {
                        if (v.data().client().screenShare) {
                                share.off('click').hide();
@@ -193,7 +205,7 @@ var VideoManager = (function() {
        self.update = _update;
        self.play = _play;
        self.close = _close;
-       self.resetSize = function(uid) { $('#' + 
_getVid(uid)).data().resetSize(); };
+       self.resetSize = function(uid) { $('#' + 
VideoUtil.getVid(uid)).data().resetSize(); };
        return self;
 })();
 function setRoomSizes() {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml 
b/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
index 99674d6..0a6729a 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
@@ -75,7 +75,6 @@
 
        <!-- Start of Services -->
        <bean id="xmlcrm.service" 
class="org.apache.openmeetings.core.remote.MainService" />
-       <bean id="userservice.service" 
class="org.apache.openmeetings.core.remote.UserService" />
        <bean id="fileservice.service" 
class="org.apache.openmeetings.core.remote.ConferenceLibrary" />
        <bean id="openmeetings.FileProcessor" 
class="org.apache.openmeetings.core.data.file.FileProcessor" />
        <bean id="openmeetings.FlvExplorerConverter" 
class="org.apache.openmeetings.core.converter.FlvExplorerConverter" />

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml 
b/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
index f173c2a..1009f39 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
@@ -48,7 +48,7 @@
        </appender>
        <appender name="CONSOLE2" class="ch.qos.logback.core.ConsoleAppender">
                <layout class="ch.qos.logback.classic.PatternLayout">
-                       <pattern>%5p %d{MM-dd HH:mm:ss.SSS } %F %r %L %c [%t] - 
%m%n</pattern>
+                       <pattern>%5p %d{MM-dd HH:mm:ss.SSS } %r %L %c{15} [%t] 
- %m%n</pattern>
                </layout>
        </appender>
        <logger name="com.mchange.v2" level="ERROR" />

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/test/java/org/apache/openmeetings/test/poll/TestClientListManager.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/poll/TestClientListManager.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/poll/TestClientListManager.java
deleted file mode 100644
index c5e1b36..0000000
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/poll/TestClientListManager.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.test.poll;
-
-import static org.junit.Assert.assertNotNull;
-
-import java.util.Random;
-
-import org.apache.openmeetings.db.dao.server.ISessionManager;
-import org.apache.openmeetings.test.AbstractJUnitDefaults;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-
-public class TestClientListManager extends AbstractJUnitDefaults {
-       @Autowired
-       private ISessionManager sessionManager;
-       
-       @Test
-       public void addClientListItem() {
-               Random rnd = new Random();
-               assertNotNull("RoomClientId created is null",
-                               sessionManager.addClientListItem(rnd.nextLong() 
+ "ABCDE"
-                                               + rnd.nextLong(), "scopeName", 
66666, "remoteAddress",
-                                               "swfUrl", null));
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java
index 6963911..ccd01d5 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.test.session;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.junit.Assert.assertEquals;
 
 import java.util.List;
@@ -27,7 +28,6 @@ import org.apache.openmeetings.db.dao.server.ServerDao;
 import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.server.Server;
 import org.apache.openmeetings.test.AbstractJUnitDefaults;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import org.junit.Test;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -45,7 +45,7 @@ public class TestDbSession extends AbstractJUnitDefaults {
        @Test
        public void testDbSessionFunctions() {
                clientDao.cleanAllClients();
-               
+
                List<Server> serverList = serverDao.getActiveServers();
 
                Server server = null;
@@ -59,132 +59,93 @@ public class TestDbSession extends AbstractJUnitDefaults {
                }
 
                StreamClient cl1 = new StreamClient();
-               cl1.setStreamid("1");
                cl1.setServer(null);
                cl1.setUserId(1L);
-               cl1.setRoomId(1L);
-               cl1.setPublicSID("public1");
+               cl1.setScope("1");
+               cl1.setUid("public1");
                clientDao.add(cl1);
 
                StreamClient cl2 = new StreamClient();
-               cl2.setStreamid("2");
                cl2.setServer(null);
-               cl2.setRoomId(1L);
+               cl2.setScope("1");
                cl2.setUserId(2L);
-               cl2.setPublicSID("public2");
+               cl2.setUid("public2");
                clientDao.add(cl2);
 
                StreamClient cl3 = new StreamClient();
-               cl3.setStreamid("3");
                cl3.setServer(server);
-               cl3.setRoomId(3L);
+               cl3.setScope("3");
                cl3.setUserId(3L);
-               cl3.setPublicSID("public3");
+               cl3.setUid("public3");
                clientDao.add(cl3);
-               
-               StreamClient clTest = 
clientDao.getClientByServerAndStreamId(null, "1");
-
-               log.debug("cl1 " + cl1);
-               log.debug("clTest " + clTest);
-
-               assertEquals(clTest.getId(), cl1.getId());
-
-               StreamClient clTest3 = 
clientDao.getClientByServerAndStreamId(server, "3");
-
-               log.debug("cl3 " + cl3);
-               log.debug("clTest3 " + clTest3);
-
-               assertEquals(clTest3.getId(), cl3.getId());
 
-               StreamClient clTest_NOT_3 = 
clientDao.getClientByServerAndStreamId(null, "3");
-
-               log.debug("clTest_NOT_3 " + clTest_NOT_3);
-               assertEquals(null, clTest_NOT_3);
-               
-               long numberOfClients1 = 
clientDao.countClientsByServerAndStreamId(null, "1");
-               assertEquals(1, numberOfClients1);
-               
-               long numberOfClients3 = 
clientDao.countClientsByServerAndStreamId(server, "3");
-               assertEquals(1, numberOfClients3);
-               
-               long numberOfClients4 = 
clientDao.countClientsByServerAndStreamId(null, "3");
-               assertEquals(0, numberOfClients4);
-               
-               List<StreamClient> clTest_Pub_1_list = 
clientDao.getClientsByPublicSIDAndServer(null, "public1");
+               List<StreamClient> clTest_Pub_1_list = 
clientDao.getClientsByUidAndServer(null, "public1");
                assertEquals(cl1.getId(), clTest_Pub_1_list.get(0).getId());
-               
-               List<StreamClient> clTest_Pub_3_list = 
clientDao.getClientsByPublicSIDAndServer(server, "public3");
+
+               List<StreamClient> clTest_Pub_3_list = 
clientDao.getClientsByUidAndServer(server, "public3");
                assertEquals(cl3.getId(), clTest_Pub_3_list.get(0).getId());
-               
-               List<StreamClient> clTest_Fail_list = 
clientDao.getClientsByPublicSIDAndServer(null, "public3");
+
+               List<StreamClient> clTest_Fail_list = 
clientDao.getClientsByUidAndServer(null, "public3");
                assertEquals(0, clTest_Fail_list.size());
-               
-               List<StreamClient> clTest_PubAll_1_list = 
clientDao.getClientsByPublicSID("public1");
+
+               List<StreamClient> clTest_PubAll_1_list = 
clientDao.getClientsByUid("public1");
                assertEquals(cl1.getId(), clTest_PubAll_1_list.get(0).getId());
-               
-               List<StreamClient> clTest_PubAll_3_list = 
clientDao.getClientsByPublicSID("public3");
+
+               List<StreamClient> clTest_PubAll_3_list = 
clientDao.getClientsByUid("public3");
                assertEquals(cl3.getId(), clTest_PubAll_3_list.get(0).getId());
-               
-               List<StreamClient> clTest_FailAll_list = 
clientDao.getClientsByPublicSID("public4");
+
+               List<StreamClient> clTest_FailAll_list = 
clientDao.getClientsByUid("public4");
                assertEquals(0, clTest_FailAll_list.size());
-               
+
                List<StreamClient> clientsByServerNull = 
clientDao.getClientsByServer(null);
                assertEquals(2, clientsByServerNull.size());
-               
+
                List<StreamClient> clientsByServer = 
clientDao.getClientsByServer(server);
                assertEquals(1, clientsByServer.size());
-               
+
                List<StreamClient> clientsAll = clientDao.getClients();
                assertEquals(3, clientsAll.size());
-               
+
                //by userid
                List<StreamClient> clTest_User_1_list = 
clientDao.getClientsByUserId(null, 1L);
                assertEquals(cl1.getId(), clTest_User_1_list.get(0).getId());
-               
+
                List<StreamClient> clTest_User_3_list = 
clientDao.getClientsByUserId(server, 3L);
                assertEquals(cl3.getId(), clTest_User_3_list.get(0).getId());
-               
+
                List<StreamClient> clTest_UserFail_list = 
clientDao.getClientsByUserId(null, 3L);
                assertEquals(0, clTest_UserFail_list.size());
-               
+
                //by roomid
                List<StreamClient> clTest_Room_1_list = 
clientDao.getClientsByRoomId(1L);
                assertEquals(2, clTest_Room_1_list.size());
-               
+
                List<StreamClient> clTest_Room_3_list = 
clientDao.getClientsByRoomId(3L);
                assertEquals(cl3.getId(), clTest_Room_3_list.get(0).getId());
-               
+
                List<StreamClient> clTest_RoomFail_list = 
clientDao.getClientsByRoomId(2L);
                assertEquals(0, clTest_RoomFail_list.size());
-               
+
                //count all
                int countAll = clientDao.countClients();
                assertEquals(3, countAll);
-               
+
                //count by server
                int clTest_Count_1_list = clientDao.countClientsByServer(null);
                assertEquals(2, clTest_Count_1_list);
-               
+
                int clTest_Count_3_list = 
clientDao.countClientsByServer(server);
                assertEquals(1, clTest_Count_3_list);
-               
+
                //remove by id
                clientDao.delete(cl1);
-               
+
                int clTest_Count_Delete_list = 
clientDao.countClientsByServer(null);
                assertEquals(1, clTest_Count_Delete_list);
-               
-               //remove by server and streamid
-               clientDao.removeClientByServerAndStreamId(null, "2");
-               
-               clTest_Count_Delete_list = clientDao.countClientsByServer(null);
-               assertEquals(0, clTest_Count_Delete_list);
-               
-               clientDao.removeClientByServerAndStreamId(server, "3");
-               
+
                clTest_Count_Delete_list = 
clientDao.countClientsByServer(server);
                assertEquals(0, clTest_Count_Delete_list);
-               
+
                //delete all
                clientDao.cleanAllClients();
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java
index 946e15c..3225508 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.test.session;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.junit.Assert.assertEquals;
 
 import java.util.List;
@@ -27,7 +28,6 @@ import org.apache.openmeetings.db.dao.server.ServerDao;
 import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.server.Server;
 import org.apache.openmeetings.test.AbstractJUnitDefaults;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import org.junit.Test;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -45,7 +45,7 @@ public class TestDbSessionGetRoomIds extends 
AbstractJUnitDefaults {
        @Test
        public void testDbSessionFunctions() {
                clientDao.cleanAllClients();
-               
+
                List<Server> serverList = serverDao.getActiveServers();
 
                Server server = null;
@@ -59,33 +59,30 @@ public class TestDbSessionGetRoomIds extends 
AbstractJUnitDefaults {
                }
 
                StreamClient cl1 = new StreamClient();
-               cl1.setStreamid("1");
                cl1.setServer(server);
                cl1.setUserId(1L);
-               cl1.setRoomId(1L);
-               cl1.setPublicSID("public1");
+               cl1.setScope("1");
+               cl1.setUid("public1");
                clientDao.add(cl1);
 
                StreamClient cl2 = new StreamClient();
-               cl2.setStreamid("2");
                cl2.setServer(server);
-               cl2.setRoomId(1L);
+               cl2.setScope("1");
                cl2.setUserId(2L);
-               cl2.setPublicSID("public2");
+               cl2.setUid("public2");
                clientDao.add(cl2);
 
                StreamClient cl3 = new StreamClient();
-               cl3.setStreamid("3");
                cl3.setServer(server);
-               cl3.setRoomId(3L);
+               cl3.setScope("3");
                cl3.setUserId(3L);
-               cl3.setPublicSID("public3");
+               cl3.setUid("public3");
                clientDao.add(cl3);
-               
+
                List<Long> roomids = clientDao.getRoomsIdsByServer(server);
 
                assertEquals(2, roomids.size());
-               
+
                //delete all
                clientDao.cleanAllClients();
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java
index 4a50e47..58024a3 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java
@@ -18,74 +18,56 @@
  */
 package org.apache.openmeetings.test.session;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.junit.Assert.assertEquals;
 
-import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.Date;
-import java.util.Random;
+import java.util.UUID;
 
 import org.apache.openmeetings.core.session.store.HashMapStore;
 import org.apache.openmeetings.core.session.store.IClientPersistenceStore;
 import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.test.AbstractJUnitDefaults;
-import org.apache.openmeetings.util.OpenmeetingsVariables;
-import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.junit.Test;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
 public class TestHashMapSession extends AbstractJUnitDefaults {
-       
-       protected static final Logger log = Red5LoggerFactory.getLogger(
-                       TestHashMapSession.class, 
OpenmeetingsVariables.webAppRootKey);
-       
+       protected static final Logger log = 
Red5LoggerFactory.getLogger(TestHashMapSession.class, webAppRootKey);
+
        @Autowired
        private HashMapStore cache;
-       
+
        @Test
        public void testHashMapSession() {
-               
                //make sure the cache is empty before starting the test
                cache.clear();
-               
-               for (int i=0;i<20;i++) {
-                       
-                       String streamId = ""+i;
-                       
+
+               for (int i = 0; i < 20; i++) {
+                       Long id = (long)i;
+
                        StreamClient rcm = new StreamClient();
+                       rcm.setId(id);
                        rcm.setConnectedSince(new Date());
-                       rcm.setStreamid(streamId);
                        rcm.setScope("scopeName");
-                       long random = System.currentTimeMillis() + new 
BigInteger(256, new Random()).longValue();
-                       
-                       
rcm.setPublicSID(CryptProvider.get().hash(String.valueOf(random).toString()));
+
+                       rcm.setUid(UUID.randomUUID().toString());
 
                        rcm.setUserport(0);
                        rcm.setUserip("remoteAddress");
                        rcm.setSwfurl("swfUrl");
-                       rcm.setIsMod(false);
-                       rcm.setCanDraw(false);
+                       rcm.setMod(false);
 
-                       if (cache.containsKey(null, streamId)) {
-                               log.error("Tried to add an existing Client " + 
streamId);
+                       if (cache.containsKey(id)) {
+                               log.error("Tried to add an existing Client " + 
id);
                                break;
                        }
-
-                       cache.put(rcm.getStreamid(), rcm);
-                       
-                       cache.remove(null, streamId);
-               
+                       cache.remove(id);
                }
-               
                String logString = 
cache.getDebugInformation(Arrays.asList(IClientPersistenceStore.DEBUG_DETAILS.SIZE));
-               
-               
                log.debug("######## \n\r "+ logString + " \n\r ########");
-               
                assertEquals(0, cache.size());
-               
        }
-
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
index adcfce6..e9b707d 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
@@ -396,7 +396,7 @@ public class RoomWebService {
                try {
                        Sessiondata sd = sessionDao.check(sid);
                        if 
(AuthLevelUtil.hasWebServiceLevel(userDao.getRights(sd.getUserId()))) {
-                               boolean result = 
userManager.kickUserByStreamId(sid, id);
+                               boolean result = 
userManager.kickUsersByRoomId(id);
                                return new ServiceResult(result ? 1L : 0L, 
"Kicked", Type.SUCCESS);
                        } else {
                                throw new ServiceException("Insufficient 
permissions"); //TODO code -26

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
index 814f5d1..0979a11 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
@@ -26,8 +26,10 @@ import static 
org.apache.openmeetings.webservice.Constants.USER_SERVICE_NAME;
 import static 
org.apache.openmeetings.webservice.Constants.USER_SERVICE_PORT_NAME;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 
 import javax.jws.WebMethod;
 import javax.jws.WebParam;
@@ -44,8 +46,10 @@ import javax.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
 import org.apache.openmeetings.IApplication;
+import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.util.StrongPasswordValidator;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
+import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.SOAPLoginDao;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.IUserManager;
@@ -55,6 +59,7 @@ import 
org.apache.openmeetings.db.dto.basic.ServiceResult.Type;
 import org.apache.openmeetings.db.dto.room.RoomOptionsDTO;
 import org.apache.openmeetings.db.dto.user.ExternalUserDTO;
 import org.apache.openmeetings.db.dto.user.UserDTO;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.server.RemoteSessionObject;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.Address;
@@ -72,6 +77,7 @@ import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.Validatable;
 import org.apache.wicket.validation.ValidationError;
 import org.red5.logging.Red5LoggerFactory;
+import org.red5.server.api.scope.IScope;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -92,13 +98,17 @@ public class UserWebService implements UserService {
        @Autowired
        private ConfigurationDao cfgDao;
        @Autowired
-       private IUserManager userManagement;
+       private IUserManager userManager;
        @Autowired
        private SOAPLoginDao soapLoginDao;
        @Autowired
        private UserDao userDao;
        @Autowired
        private SessiondataDao sessionDao;
+       @Autowired
+       private ISessionManager sessionManager;
+       @Autowired
+       private ScopeApplicationAdapter scopeApplicationAdapter;
 
        /* (non-Javadoc)
         * @see 
org.apache.openmeetings.webservice.cluster.UserService#login(java.lang.String, 
java.lang.String)
@@ -187,7 +197,7 @@ public class UserWebService implements UserService {
                                        }
                                        throw new 
ServiceException(sb.toString());
                                }
-                               Long userId = 
userManagement.registerUser(user.getLogin(), user.getPassword(),
+                               Long userId = 
userManager.registerUser(user.getLogin(), user.getPassword(),
                                                user.getLastname(), 
user.getFirstname(), user.getAddress().getEmail(), new Date(), 
user.getAddress().getStreet(),
                                                
user.getAddress().getAdditionalname(), user.getAddress().getFax(), 
user.getAddress().getZip(), user.getAddress().getCountry()
                                                , user.getAddress().getTown(), 
user.getLanguageId(),
@@ -331,18 +341,51 @@ public class UserWebService implements UserService {
                return new ServiceResult(-1L, "Unknown error", Type.ERROR);
        }
 
+       /**
+        * Kick a user by its publicSID.<br/>
+        * <br/>
+        * <i>Note:</i>
+        * This method will not perform a call to the slave, cause this call 
can only be
+        * invoked from inside the conference room, that means all clients are 
on the
+        * same server, no matter if clustered or not.
+        *
+        * @param sid
+        * @param uid
+        * @return - true in case user have sufficient permissions, null 
otherwise
+        */
+       private boolean kickUserByUid(String uid) {
+               StreamClient rcl = sessionManager.getClientByUid(uid, null);
+
+               if (rcl == null) {
+                       return true;
+               }
+               String scopeName = "hibernate";
+               if (rcl.getRoomId() != null) {
+                       scopeName = rcl.getRoomId().toString();
+               }
+               IScope currentScope = 
scopeApplicationAdapter.getRoomScope(scopeName);
+
+               Map<Integer, String> messageObj = new HashMap<>();
+               messageObj.put(0, "kick");
+
+               scopeApplicationAdapter.sendMessageById(messageObj, 
rcl.getId(), currentScope);
+               scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope);
+
+               return true;
+       }
+
        /* (non-Javadoc)
         * @see 
org.apache.openmeetings.webservice.cluster.UserService#kick(java.lang.String, 
java.lang.String)
         */
        @Override
        @WebMethod
        @POST
-       @Path("/kick/{publicsid}")
-       public ServiceResult kick(@WebParam(name="sid") @QueryParam("sid") 
String sid, @WebParam(name="publicsid") @PathParam("publicsid") String 
publicSID) throws ServiceException {
+       @Path("/kick/{uid}")
+       public ServiceResult kick(@WebParam(name="sid") @QueryParam("sid") 
String sid, @WebParam(name="uid") @PathParam("uid") String uid) throws 
ServiceException {
                try {
                        Sessiondata sd = sessionDao.check(sid);
                        if 
(AuthLevelUtil.hasWebServiceLevel(userDao.getRights(sd.getUserId()))) {
-                               Boolean success = 
userManagement.kickUserByPublicSID(sid, publicSID);
+                               boolean success = kickUserByUid(uid);
 
                                return new 
ServiceResult(Boolean.TRUE.equals(success) ? 1L : 0L, 
Boolean.TRUE.equals(success) ? "deleted" : "not deleted", Type.SUCCESS);
                        } else {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/UserService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/UserService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/UserService.java
index 6ccba83..ee26d20 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/UserService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/UserService.java
@@ -141,12 +141,10 @@ public interface UserService {
         *
         * @param sid
         *            The SID from getSession
-        * @param publicSID
-        *            the publicSID (you can get it from the call to get users 
in a
-        *            room)
+        * @param uid the uid of the client
         * @return - <code>true</code> if user was kicked
         */
-       ServiceResult kick(@WebParam(name="sid") @QueryParam("sid") String sid, 
@WebParam(name="publicsid") @PathParam("publicsid") String publicSID) throws 
ServiceException;
+       ServiceResult kick(@WebParam(name="sid") @QueryParam("sid") String sid, 
@WebParam(name="uid") @PathParam("uid") String uid) throws ServiceException;
 
        /**
         * Returns the count of users currently in the Room with given id

Reply via email to