This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 95bd6a0  [OPENMEETINGS-2186] initial commit on token
95bd6a0 is described below

commit 95bd6a00c2f75870b4cc7fedaa108e225b2c8c14
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Tue Mar 24 22:35:08 2020 +0700

    [OPENMEETINGS-2186] initial commit on token
---
 .../db/dao/basic/ConfigurationDao.java             | 10 ++++
 .../openmeetings/util/OpenmeetingsVariables.java   |  9 ++++
 .../apache/openmeetings/web/app/ClientManager.java | 57 +++++++++++++++++++---
 .../apache/openmeetings/web/app/WebSession.java    | 13 ++++-
 .../apache/openmeetings/web/common/MainPanel.java  |  4 +-
 .../openmeetings/web/user/MessageDialog.java       |  4 +-
 .../web/user/calendar/AppointmentDialog.java       |  4 +-
 .../openmeetings/web/util/OmUrlFragment.java       | 13 ++---
 8 files changed, 91 insertions(+), 23 deletions(-)

diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
index f912111..70f11e1 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
@@ -50,6 +50,7 @@ import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MIC_RATE
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_BITRATE;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_RATE;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_VIDEO_PRESET;
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PASS_MIN_LENGTH;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_FRONTEND;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_OAUTH;
@@ -87,6 +88,7 @@ import static 
org.apache.openmeetings.util.OpenmeetingsVariables.setMinFnameLeng
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.setMinLnameLength;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.setMinLoginLength;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.setMinPasswdLength;
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.setMyRoomsEnabled;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.setRestAllowOrigin;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.setRoomSettings;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.setSendRegisterEmail;
@@ -393,6 +395,9 @@ public class ConfigurationDao implements 
IDataProviderDao<Configuration> {
                        case CONFIG_DISPLAY_NAME_EDITABLE:
                                reloadDisplayNameEditable();
                                break;
+                       case CONFIG_MYROOMS_ENABLED:
+                               reloadMyRoomsEnabled();
+                               break;
                }
                return entity;
        }
@@ -528,6 +533,10 @@ public class ConfigurationDao implements 
IDataProviderDao<Configuration> {
                setDisplayNameEditable(getBool(CONFIG_DISPLAY_NAME_EDITABLE, 
false));
        }
 
+       private void reloadMyRoomsEnabled() {
+               setMyRoomsEnabled(getBool(CONFIG_MYROOMS_ENABLED, true));
+       }
+
        public void reinit() {
                reloadMaxUpload();
                reloadCrypt();
@@ -557,6 +566,7 @@ public class ConfigurationDao implements 
IDataProviderDao<Configuration> {
                reloadXFrameOptions();
                reloadContentSecurityPolicy();
                reloadDisplayNameEditable();
+               reloadMyRoomsEnabled();
        }
 
        private static JSONObject getHotkey(String value) {
diff --git 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
index d9005ab..2c7f647 100644
--- 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
+++ 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
@@ -142,6 +142,7 @@ public class OpenmeetingsVariables {
        private static String contentSecurityPolicy = HEADER_CSP_SELF;
        private static String xFrameOptions = HEADER_XFRAME_SELF;
        private static boolean displayNameEditable = false;
+       private static boolean myRoomsEnabled = true;
 
        private OpenmeetingsVariables() {}
 
@@ -404,4 +405,12 @@ public class OpenmeetingsVariables {
        public static void setDisplayNameEditable(boolean editable) {
                displayNameEditable = editable;
        }
+
+       public static boolean isMyRoomsEnabled() {
+               return myRoomsEnabled;
+       }
+
+       public static void setMyRoomsEnabled(boolean enabled) {
+               myRoomsEnabled = enabled;
+       }
 }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
index 42f5229..26f2442 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.app;
 
 import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -29,6 +30,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
@@ -44,6 +46,7 @@ import org.apache.openmeetings.db.manager.IClientManager;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.wicket.util.collections.ConcurrentHashSet;
+import org.apache.wicket.util.string.StringValue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -62,6 +65,7 @@ public class ClientManager implements IClientManager {
        private static final String ROOMS_KEY = "ROOMS_KEY";
        private static final String ONLINE_USERS_KEY = "ONLINE_USERS_KEY";
        private static final String SERVERS_KEY = "SERVERS_KEY";
+       private static final String INSTANT_TOKENS_KEY = "INSTANT_TOKENS_KEY";
        private static final String UID_BY_SID_KEY = "UID_BY_SID_KEY";
        private final Map<String, Client> onlineClients = new 
ConcurrentHashMap<>();
        private final Map<Long, Set<String>> onlineRooms = new 
ConcurrentHashMap<>();
@@ -90,6 +94,10 @@ public class ClientManager implements IClientManager {
                return app.hazelcast.getMap(SERVERS_KEY);
        }
 
+       private IMap<String, InstantToken> tokens() {
+               return app.hazelcast.getMap(INSTANT_TOKENS_KEY);
+       }
+
        @PostConstruct
        void init() {
                map().addEntryListener(new ClientListener(), true);
@@ -220,7 +228,13 @@ public class ClientManager implements IClientManager {
                onlineRooms.put(roomId, set);
                rooms.unlock(roomId);
                String serverId = c.getServerId();
-               if (!onlineServers.get(serverId).getRooms().contains(roomId)) {
+               addRoomToServer(serverId, r);
+               update(c);
+               return count;
+       }
+
+       private void addRoomToServer(String serverId, Room r) {
+               if 
(!onlineServers.get(serverId).getRooms().contains(r.getId())) {
                        IMap<String, ServerInfo> servers = servers();
                        servers.lock(serverId);
                        ServerInfo si = servers.get(serverId);
@@ -229,8 +243,6 @@ public class ClientManager implements IClientManager {
                        onlineServers.put(serverId, si);
                        servers.unlock(serverId);
                }
-               update(c);
-               return count;
        }
 
        public Client removeFromRoom(Client c) {
@@ -346,13 +358,13 @@ public class ClientManager implements IClientManager {
                }
        }
 
-       public String getServerUrl(Long roomId) {
-               if (roomId == null || onlineServers.size() == 1) {
+       public String getServerUrl(Room r) {
+               if (onlineServers.size() == 1) {
                        return null;
                }
                final String curServerId = app.getServerId();
                Optional<Map.Entry<String, ServerInfo>> existing = 
onlineServers.entrySet().stream()
-                               .filter(e -> 
e.getValue().getRooms().contains(roomId))
+                               .filter(e -> 
e.getValue().getRooms().contains(r.getId()))
                                .findFirst();
                if (existing.isPresent()) {
                        String serverId = existing.get().getKey();
@@ -361,7 +373,17 @@ public class ClientManager implements IClientManager {
                Optional<Map.Entry<String, ServerInfo>> min = 
onlineServers.entrySet().stream()
                                .min((e1, e2) -> e1.getValue().getCapacity() - 
e2.getValue().getCapacity());
                String serverId = min.get().getKey();
-               return curServerId.equals(serverId) ? null : 
min.get().getValue().getUrl();
+               if (!curServerId.equals(serverId)) {
+                       addRoomToServer(serverId, r);
+                       String uuid = UUID.randomUUID().toString();
+                       tokens().put(uuid, new InstantToken(getUserId(), 
r.getId()));
+                       return min.get().getValue().getUrl() + "?token=" + uuid;
+               }
+               return null;
+       }
+
+       Optional<InstantToken> getToken(StringValue uuid) {
+               return uuid.isEmpty() ? Optional.empty() : 
Optional.ofNullable(tokens().remove(uuid.toString()));
        }
 
        public class ClientListener implements
@@ -453,4 +475,25 @@ public class ClientManager implements IClientManager {
                        return rooms;
                }
        }
+
+       public static class InstantToken implements Serializable {
+               private static final long serialVersionUID = 1L;
+               private final long userId;
+               private final long roomId;
+               private final long created;
+
+               InstantToken(long userId, long roomId) {
+                       this.userId = userId;
+                       this.roomId = roomId;
+                       created = System.currentTimeMillis();
+               }
+
+               public long getUserId() {
+                       return userId;
+               }
+
+               public long getRoomId() {
+                       return roomId;
+               }
+       }
 }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
index a358507..7bce259 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
@@ -23,8 +23,8 @@ import static 
org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
 import static 
org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT_STRING;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_MYROOMS;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS;
-import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultLang;
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
 import static 
org.apache.openmeetings.web.app.Application.getAuthenticationStrategy;
 import static org.apache.openmeetings.web.app.Application.getDashboardContext;
 import static org.apache.openmeetings.web.app.Application.isInvaldSession;
@@ -37,6 +37,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import java.util.TimeZone;
 
@@ -62,6 +63,7 @@ import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.db.util.FormatHelper;
 import org.apache.openmeetings.db.util.LocaleHelper;
 import org.apache.openmeetings.util.OmException;
+import org.apache.openmeetings.web.app.ClientManager.InstantToken;
 import org.apache.openmeetings.web.user.dashboard.MyRoomsWidget;
 import org.apache.openmeetings.web.user.dashboard.MyRoomsWidgetDescriptor;
 import org.apache.openmeetings.web.user.dashboard.RssWidget;
@@ -70,6 +72,7 @@ import 
org.apache.openmeetings.web.user.dashboard.StartWidgetDescriptor;
 import org.apache.openmeetings.web.user.dashboard.WelcomeWidgetDescriptor;
 import org.apache.openmeetings.web.user.dashboard.admin.AdminWidget;
 import org.apache.openmeetings.web.user.dashboard.admin.AdminWidgetDescriptor;
+import org.apache.openmeetings.web.user.rooms.RoomEnterBehavior;
 import org.apache.openmeetings.web.util.ExtendedClientProperties;
 import org.apache.openmeetings.web.util.OmUrlFragment;
 import org.apache.openmeetings.web.util.UserDashboard;
@@ -78,6 +81,7 @@ import 
org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSessio
 import org.apache.wicket.authroles.authorization.strategies.role.Roles;
 import org.apache.wicket.injection.Injector;
 import org.apache.wicket.request.Request;
+import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
@@ -164,6 +168,11 @@ public class WebSession extends 
AbstractAuthenticatedWebSession implements IWebS
 
        @Override
        public boolean isSignedIn() {
+               Optional<InstantToken> token = 
cm.getToken(RequestCycle.get().getRequest().getQueryParameters().getParameterValue("token"));
+               if (token.isPresent()) {
+                       signIn(userDao.get(token.get().getUserId()));
+                       area = 
RoomEnterBehavior.getRoomUrlFragment(token.get().getRoomId());
+               }
                if (userId == null) {
                        IAuthenticationStrategy strategy = 
getAuthenticationStrategy();
                        // get username and password from persistence store
@@ -459,7 +468,7 @@ public class WebSession extends 
AbstractAuthenticatedWebSession implements IWebS
                DashboardContext dashboardContext = getDashboardContext();
                dashboard = 
(UserDashboard)dashboardContext.getDashboardPersister().load();
                boolean existMyRoomWidget = false, existRssWidget = false, 
existAdminWidget = false;
-               boolean showMyRoomConfValue = 
cfgDao.getBool(CONFIG_MYROOMS_ENABLED, true) && 
cfgDao.getBool(CONFIG_DASHBOARD_SHOW_MYROOMS, false);
+               boolean showMyRoomConfValue = isMyRoomsEnabled() && 
cfgDao.getBool(CONFIG_DASHBOARD_SHOW_MYROOMS, false);
                boolean showRssConfValue = 
cfgDao.getBool(CONFIG_DASHBOARD_SHOW_RSS, false);
                boolean showAdminWidget = 
getRights().contains(User.Right.ADMIN);
                boolean save = false;
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 b4e53dc..cc4b6ee 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
@@ -21,8 +21,8 @@ package org.apache.openmeetings.web.common;
 import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
 import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
-import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static 
org.apache.openmeetings.web.common.confirmation.ConfirmableAjaxBorder.newOkCancelConfirm;
 import static 
org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
@@ -334,7 +334,7 @@ public class MainPanel extends Panel {
                        List<INavbarComponent> l = new ArrayList<>();
                        l.add(getSubItem("777", "1506", 
MenuActions.conferenceModuleRoomList, MenuParams.publicTabButton));
                        l.add(getSubItem("779", "1507", 
MenuActions.conferenceModuleRoomList, MenuParams.privateTabButton));
-                       if (cfgDao.getBool(CONFIG_MYROOMS_ENABLED, true)) {
+                       if (isMyRoomsEnabled()) {
                                l.add(getSubItem("781", "1508", 
MenuActions.conferenceModuleRoomList, MenuParams.myTabButton));
                        }
                        List<Room> recent = roomDao.getRecent(getUserId());
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
index 0399af7..b72f77b 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.user;
 
 import static 
org.apache.openmeetings.db.entity.user.PrivateMessage.INBOX_FOLDER_ID;
 import static 
org.apache.openmeetings.db.entity.user.PrivateMessage.SENT_FOLDER_ID;
-import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
 import static org.apache.openmeetings.web.app.Application.getContactsLink;
 import static org.apache.openmeetings.web.app.Application.getInvitationLink;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
@@ -228,7 +228,7 @@ public class MessageDialog extends Modal<PrivateMessage> {
                                target.add(bookedRoom, roomParamsBlock);
                        }
                }));
-               bookedRoom.setVisible(cfgDao.getBool(CONFIG_MYROOMS_ENABLED, 
true));
+               bookedRoom.setVisible(isMyRoomsEnabled());
                roomParamsBlock.add(roomParams);
                roomParams.add(new RoomTypeDropDown("room.type"));
                roomParams.add(start);
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index b46f0a0..338476d 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.web.user.calendar;
 
-import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
 import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static 
org.apache.openmeetings.web.common.confirmation.ConfirmableAjaxBorder.newOkCancelDangerConfirm;
@@ -309,7 +309,7 @@ public class AppointmentDialog extends Modal<Appointment> {
                        super(id, model);
                        setOutputMarkupId(true);
 
-                       myRoomsAllowed = cfgDao.getBool(CONFIG_MYROOMS_ENABLED, 
true);
+                       myRoomsAllowed = isMyRoomsEnabled();
                        createRoom = myRoomsAllowed;
                }
 
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
index e73e3e6..a01f215 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
@@ -19,8 +19,8 @@
 package org.apache.openmeetings.web.util;
 
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANDING_ZONE;
-import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
 import static 
org.apache.openmeetings.web.user.profile.SettingsPanel.EDIT_PROFILE_TAB_ID;
 import static 
org.apache.openmeetings.web.user.profile.SettingsPanel.MESSAGES_TAB_ID;
 
@@ -255,7 +255,7 @@ public class OmUrlFragment implements Serializable {
                                        Long roomId = Long.valueOf(type);
                                        Room r = 
Application.get().getBean(RoomDao.class).get(roomId);
                                        if (r != null) {
-                                               moveToServer(roomId);
+                                               moveToServer(r);
                                                basePanel = new 
RoomPanel(CHILD_ID, r);
                                        }
                                } catch(NumberFormatException ne) {
@@ -269,7 +269,7 @@ public class OmUrlFragment implements Serializable {
                                MenuParams params = MenuParams.publicTabButton;
                                if (TYPE_GROUP.equals(type)) {
                                        params = MenuParams.privateTabButton;
-                               } else if 
(Application.get().getBean(ConfigurationDao.class).getBool(CONFIG_MYROOMS_ENABLED,
 true) && TYPE_MY.equals(type)) {
+                               } else if (isMyRoomsEnabled() && 
TYPE_MY.equals(type)) {
                                        params = MenuParams.myTabButton;
                                }
                                basePanel = new RoomsSelectorPanel(CHILD_ID, 
params);
@@ -293,11 +293,8 @@ public class OmUrlFragment implements Serializable {
                return getBaseUrl() + "#" + getArea().name() + "/" + getType();
        }
 
-       private static void moveToServer(Long roomId) {
-               if (roomId == null) {
-                       return;
-               }
-               String url = 
Application.get().getBean(ClientManager.class).getServerUrl(roomId);
+       private static void moveToServer(Room r) {
+               String url = 
Application.get().getBean(ClientManager.class).getServerUrl(r);
                if (url != null) {
                        throw new RedirectToUrlException(url);
                }

Reply via email to