http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java index 57a0c25..0ab5c10 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; import org.apache.openmeetings.db.entity.room.StreamClient; import org.apache.openmeetings.db.entity.server.Server; @@ -52,34 +53,46 @@ import org.slf4j.Logger; public class HashMapStore implements IClientPersistenceStore { protected static final Logger log = Red5LoggerFactory.getLogger(HashMapStore.class, webAppRootKey); - private Map<String, StreamClient> clientsByStreamId = new ConcurrentHashMap<>(); + private volatile AtomicLong nextId = new AtomicLong(1); + private Map<Long, StreamClient> clientsById = new ConcurrentHashMap<>(); @Override public void clear() { - clientsByStreamId = new ConcurrentHashMap<>(); + clientsById = new ConcurrentHashMap<>(); } @Override - public void put(String streamId, StreamClient rcl) { - clientsByStreamId.put(rcl.getStreamid(), rcl); + public StreamClient put(StreamClient rcl) { + if (rcl.getId() != null) { + log.error("Tried to add Client with not NULL ID {}", rcl.getId()); + return null; + } else { + rcl.setId(nextId.getAndIncrement()); + } + if (clientsById.containsKey(rcl.getId())) { + log.error("Tried to add an existing Client {}", rcl.getId()); + return null; + } + clientsById.put(rcl.getId(), rcl); + return rcl; } @Override - public boolean containsKey(Server server, String streamId) { - return clientsByStreamId.containsKey(streamId); + public boolean containsKey(Long id) { + return id != null && clientsById.containsKey(id); } @Override - public StreamClient get(Server server, String streamId) { - return clientsByStreamId.get(streamId); + public StreamClient get(Long id) { + return id == null ? null : clientsById.get(id); } @Override - public List<StreamClient> getClientsByPublicSID(Server server, String publicSID) { + public List<StreamClient> getClientsByUid(Server server, String uid) { List<StreamClient> clientList = new ArrayList<>(); - for (Map.Entry<String, StreamClient> e: clientsByStreamId.entrySet()) { + for (Map.Entry<Long, StreamClient> e: clientsById.entrySet()) { StreamClient cl = e.getValue(); - if (cl.getPublicSID().equals(publicSID)) { + if (cl.getUid().equals(uid)) { clientList.add(cl); } } @@ -87,12 +100,12 @@ public class HashMapStore implements IClientPersistenceStore { } @Override - public Map<Long,List<StreamClient>> getClientsByPublicSID(String publicSID) { + public Map<Long,List<StreamClient>> getClientsByUid(String uid) { Map<Long,List<StreamClient>> clientMapList = new HashMap<>(); List<StreamClient> clientList = new ArrayList<>(); - for (Map.Entry<String, StreamClient> e: clientsByStreamId.entrySet()) { + for (Map.Entry<Long, StreamClient> e: clientsById.entrySet()) { StreamClient cl = e.getValue(); - if (cl.getPublicSID().equals(publicSID)) { + if (cl.getUid().equals(uid)) { clientList.add(cl); } } @@ -102,7 +115,7 @@ public class HashMapStore implements IClientPersistenceStore { @Override public Collection<StreamClient> getClients() { - return clientsByStreamId.values(); + return clientsById.values(); } @Override @@ -114,13 +127,13 @@ public class HashMapStore implements IClientPersistenceStore { @Override public Collection<StreamClient> getClientsByServer(Server server) { - return clientsByStreamId.values(); + return clientsById.values(); } @Override public List<StreamClient> getClientsByUserId(Server server, Long userId) { List<StreamClient> clientList = new ArrayList<>(); - for (Map.Entry<String, StreamClient> e: clientsByStreamId.entrySet()) { + for (Map.Entry<Long, StreamClient> e: clientsById.entrySet()) { StreamClient cl = e.getValue(); if (cl.getUserId().equals(userId)) { clientList.add(cl); @@ -132,7 +145,7 @@ public class HashMapStore implements IClientPersistenceStore { @Override public List<StreamClient> getClientsByRoomId(Long roomId) { List<StreamClient> clientList = new ArrayList<>(); - for (Map.Entry<String, StreamClient> e: clientsByStreamId.entrySet()) { + for (Map.Entry<Long, StreamClient> e: clientsById.entrySet()) { StreamClient cl = e.getValue(); if (cl.getRoomId() != null && cl.getRoomId().equals(roomId)) { clientList.add(cl); @@ -142,27 +155,27 @@ public class HashMapStore implements IClientPersistenceStore { } @Override - public void remove(Server server, String streamId) { - clientsByStreamId.remove(streamId); + public void remove(Long id) { + clientsById.remove(id); } @Override public int size() { - return clientsByStreamId.size(); + return clientsById.size(); } @Override public int sizeByServer(Server server) { - return clientsByStreamId.size(); + return clientsById.size(); } @Override public Collection<StreamClient> values() { - return clientsByStreamId.values(); + return clientsById.values(); } public int getTotalNumberOfSessions() { - return clientsByStreamId.size(); + return clientsById.size(); } /** @@ -194,7 +207,7 @@ public class HashMapStore implements IClientPersistenceStore { @Override public List<Long> getRoomsIdsByServer(Server server) { Set<Long> rooms = new HashSet<>(); - for (Map.Entry<String, StreamClient> e: clientsByStreamId.entrySet()) { + for (Map.Entry<Long, StreamClient> e: clientsById.entrySet()) { StreamClient cl = e.getValue(); Long roomId = cl.getRoomId(); if (roomId != null && roomId.longValue() > 0 && !rooms.contains(roomId)) {
http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/IClientPersistenceStore.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/IClientPersistenceStore.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/IClientPersistenceStore.java index 5ca0634..329c578 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/IClientPersistenceStore.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/IClientPersistenceStore.java @@ -30,64 +30,61 @@ public interface IClientPersistenceStore { public enum DEBUG_DETAILS { SIZE } - + /** * called upon start of the session cache */ void clear(); /** - * - * @param streamId + * * @param rcl */ - void put(String streamId, StreamClient rcl); - + StreamClient put(StreamClient rcl); + /** - * - * @param server - * @param streamId + * + * @param id * @return */ - boolean containsKey(Server server, String streamId); + boolean containsKey(Long id); /** * by server and publicSID - * - * @param server - * @param streamId + * + * @param id * @return will return null if the client does not exist in the list */ - StreamClient get(Server server, String streamId); + StreamClient get(Long id); /** - * + * * @param server - * @param publicSID + * @param uid * @return will return an empty list if nothing available */ - List<StreamClient> getClientsByPublicSID(Server server, String publicSID); + List<StreamClient> getClientsByUid(Server server, String uid); /** * Searches for the publicSID across all servers - * - * @param publicSID + * + * @param uid * @return will return a map with the serverId as key and the RoomClients as list in the value */ - Map<Long, List<StreamClient>> getClientsByPublicSID(String publicSID); + Map<Long, List<StreamClient>> getClientsByUid(String uid); Collection<StreamClient> getClients(); - + /** * get all clients by a specific {@link Server} - * + * * @param server * @return will return an empty map if nothing available */ Collection<StreamClient> getClientsByServer(Server server); /** - * + * * @param server * @param userId * @return will return an empty list if nothing available @@ -95,25 +92,25 @@ public interface IClientPersistenceStore { Collection<StreamClient> getClientsByUserId(Server server, Long userId); /** - * + * * We ignore the server here, cause ONE room can only be on ONE server and often we don't know where. - * + * * @param roomId * @return will return an empty map if nothing available */ List<StreamClient> getClientsByRoomId(Long roomId); - void remove(Server server, String streamId); + void remove(Long id); int size(); int sizeByServer(Server server); Collection<StreamClient> values(); - + /** * Get some session statistics - * + * * @param detailLevel * @return */ @@ -121,18 +118,18 @@ public interface IClientPersistenceStore { /** * returns a list of roomIds (unique) that are currently active on the given server - * In case the session is stored in the memory (no-cluster setup) it will always + * In case the session is stored in the memory (no-cluster setup) it will always * return simply all active roomIds - * + * * @param server * @return */ List<Long> getRoomsIdsByServer(Server server); /** - * if database cache + cluster is enabled, the server object will be loaded + * if database cache + cluster is enabled, the server object will be loaded * into the client - * + * * @return */ Collection<StreamClient> getClientsWithServer(); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/IClientUtil.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/IClientUtil.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/IClientUtil.java new file mode 100644 index 0000000..ebc670e --- /dev/null +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/IClientUtil.java @@ -0,0 +1,55 @@ +/* + * 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.core.util; + +import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; + +import org.apache.openmeetings.db.entity.room.StreamClient; +import org.red5.logging.Red5LoggerFactory; +import org.red5.server.api.IClient; +import org.slf4j.Logger; + +public class IClientUtil { + private static final Logger log = Red5LoggerFactory.getLogger(IClientUtil.class, webAppRootKey); + + private enum ConAttrs { + omId + , sharing + } + + public static void init(IClient client, Long id, boolean sharing) { + client.setAttribute(ConAttrs.omId.name(), id); + client.setAttribute(ConAttrs.sharing.name(), sharing); + } + + /** + * Id of {@link StreamClient} for this IConnection + * + * @param conn + * @return - Id of {@link StreamClient} for this IConnection, or <code>null</code> + */ + public static Long getId(IClient client) { + Object o = client.getAttribute(ConAttrs.omId.name()); + return o instanceof Long ? (Long)o : null; + } + + public static boolean isSharing(IClient client) { + return Boolean.TRUE.equals(client.getAttribute(ConAttrs.sharing.name())); + } +} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/RoomHelper.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/RoomHelper.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/RoomHelper.java index e74ce34..734b53a 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/RoomHelper.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/RoomHelper.java @@ -25,17 +25,21 @@ import org.apache.openmeetings.db.entity.room.StreamClient; import com.github.openjson.JSONObject; public class RoomHelper { + public static JSONObject videoJson(Client c, boolean self, String sid, ISessionManager mgr, Long streamClientId, boolean share) { + return videoJson(c, c.getUid(), self, sid, mgr, streamClientId, share); + } - public static JSONObject videoJson(Client c, boolean self, String sid, ISessionManager mgr, boolean share) { + public static JSONObject videoJson(Client c, String uid, boolean self, String sid, ISessionManager mgr, Long streamClientId, boolean share) { JSONObject json = c.toJson(self).put("sid", sid); if (share) { - StreamClient sc = mgr.getClientByPublicSID(c.getUid(), null); //TODO check server + StreamClient sc = mgr.get(streamClientId); json.put("screenShare", true) - .put("uid", sc.getPublicSID()) // unique screen-sharing ID + .put("sid", sid) + .put("uid", sc.getUid()) .put("broadcastId", sc.getBroadCastId()) - .put("width", sc.getVWidth()) - .put("height", sc.getVHeight()); + .put("width", sc.getWidth()) + .put("height", sc.getHeight()); } return json; } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java index 7cd5c29..e0cd5e8 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java @@ -24,8 +24,9 @@ import java.util.function.Supplier; import javax.servlet.ServletContext; -import org.apache.openmeetings.db.entity.room.StreamClient; +import org.apache.openmeetings.db.entity.basic.Client; import org.apache.openmeetings.db.entity.room.Invitation; +import org.apache.openmeetings.db.entity.room.StreamClient; import org.apache.wicket.request.IExceptionMapper; import org.apache.wicket.request.IRequestMapper; import org.apache.wicket.request.mapper.parameter.PageParameters; @@ -39,10 +40,11 @@ public interface IApplication { String getOmString(long id, long languageId); String getOmString(String key, long languageId); String getOmString(String key, final Locale loc, String... params); - org.apache.openmeetings.db.entity.basic.Client getOmClient(String uid); + Client getOmClient(String uid); + Client getOmClientBySid(String sid); StreamClient updateClient(StreamClient rcl, boolean forceSize); - List<org.apache.openmeetings.db.entity.basic.Client> getOmRoomClients(Long roomId); - List<org.apache.openmeetings.db.entity.basic.Client> getOmClients(Long userId); + List<Client> getOmRoomClients(Long roomId); + List<Client> getOmClients(Long userId); String getOmContactsLink(); String getOmInvitationLink(Invitation i); String urlForActivatePage(PageParameters pp); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ClientDao.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ClientDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ClientDao.java index 99af2cb..8ba572d 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ClientDao.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ClientDao.java @@ -45,7 +45,7 @@ public class ClientDao { private static List<Long> EMPTY_LIST = new ArrayList<>(0); public void cleanAllClients() { - em.createNamedQuery("deleteAll").executeUpdate(); + em.createNamedQuery("deleteClientAll").executeUpdate(); } public void cleanClientsByServer(Server server) { @@ -54,6 +54,13 @@ public class ClientDao { executeUpdate(); } + public StreamClient get(Long id) { + List<StreamClient> list = em.createNamedQuery("getClientById", StreamClient.class) + .setParameter("id", id) + .getResultList(); + return list == null || list.isEmpty() ? null : list.get(0); + } + public StreamClient add(StreamClient entity) { em.persist(entity); return entity; @@ -65,15 +72,12 @@ public class ClientDao { } public void delete(StreamClient entity) { - Query q = em.createNamedQuery("deletedById"); - q.setParameter("id", entity.getId()); - q.executeUpdate(); + remove(entity.getId()); } - public void removeClientByServerAndStreamId(Server server, String streamId) { - Query q = em.createNamedQuery("deletedByServerAndStreamId"); - q.setParameter("server", server); - q.setParameter("streamid", streamId); + public void remove(Long id) { + Query q = em.createNamedQuery("deletedClientById"); + q.setParameter("id", id); q.executeUpdate(); } @@ -87,44 +91,16 @@ public class ClientDao { return q.getSingleResult().intValue(); } - public long countClientsByServerAndStreamId(Server server, String streamId) { - TypedQuery<Long> q = em.createNamedQuery("countClientsByServerAndStreamId", Long.class); - q.setParameter("streamid", streamId); - q.setParameter("server", server); - return q.getSingleResult(); - } - - /** - * Query.getSingleResult would throw an error if result is null, - * see: http://stackoverflow.com/questions/2002993/jpa-getsingleresult-or-null - * - * @param server - * @param streamId - * @return - */ - public StreamClient getClientByServerAndStreamId(Server server, String streamId) { - TypedQuery<StreamClient> q = em.createNamedQuery("getClientByServerAndStreamId", StreamClient.class); - q.setParameter("streamid", streamId); - q.setParameter("server", server); - List<StreamClient> ll = q.getResultList(); - if (ll.size() == 1) { - return ll.get(0); - } else if (ll.size() == 0) { - return null; - } - throw new RuntimeException("more then one client was found streamId "+ streamId + " server "+server); - } - - public List<StreamClient> getClientsByPublicSIDAndServer(Server server, String publicSID) { - TypedQuery<StreamClient> q = em.createNamedQuery("getClientsByPublicSIDAndServer", StreamClient.class); + public List<StreamClient> getClientsByUidAndServer(Server server, String uid) { + TypedQuery<StreamClient> q = em.createNamedQuery("getClientsByUidAndServer", StreamClient.class); q.setParameter("server", server); - q.setParameter("publicSID", publicSID); + q.setParameter("uid", uid); return q.getResultList(); } - public List<StreamClient> getClientsByPublicSID(String publicSID) { - TypedQuery<StreamClient> q = em.createNamedQuery("getClientsByPublicSID", StreamClient.class); - q.setParameter("publicSID", publicSID); + public List<StreamClient> getClientsByUid(String uid) { + TypedQuery<StreamClient> q = em.createNamedQuery("getClientsByUid", StreamClient.class); + q.setParameter("uid", uid); return q.getResultList(); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ISessionManager.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ISessionManager.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ISessionManager.java index 3ebd6fb..ce9efb1 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ISessionManager.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ISessionManager.java @@ -43,18 +43,6 @@ public interface ISessionManager { void sessionStart(); StreamClient add(StreamClient c, Server server); - /** - * add a new client item - * - * @param streamId - * @param scopeName - * @param remotePort - * @param remoteAddress - * @param swfUrl - * @param server - * @return - */ - StreamClient addClientListItem(String streamId, String scopeName, int remotePort, String remoteAddress, String swfUrl, Server server); Collection<StreamClient> getClients(); @@ -66,22 +54,21 @@ public interface ISessionManager { Collection<StreamClient> getClientsWithServer(); /** - * Get a client by its streamId + * Get a client by its id * - * @param streamId - * @param server + * @param id * @return */ - StreamClient getClientByStreamId(String streamId, Server server); + StreamClient get(Long id); /** * get a client by its publicSID and the server, * - * @param publicSID + * @param uid * @param server * @return */ - StreamClient getClientByPublicSID(String publicSID, Server server); + StreamClient getClientByUid(String uid, Server server); /** * same as {@link #getClientByPublicSID(String, boolean, Server)} but it ignores @@ -91,32 +78,20 @@ public interface ISessionManager { * This method requires more time to find the user, so under normal circumstances * you should use {@link #getClientByPublicSID(String, boolean, Server)}! * - * @param publicSID + * @param uid * @return */ - ClientSessionInfo getClientByPublicSIDAnyServer(String publicSID); - - /** - * - * @param userId - * @return - * - * @deprecated There could be multiple users logged in with the same userid, - * then this call would return a list not a single user - */ - @Deprecated - StreamClient getClientByUserId(Long userId); + ClientSessionInfo getClientByUidAnyServer(String uid); /** * Update the session object of the audio/video-connection and additionally * swap the values to the session object of the user that holds the full * session object * - * @param streamId - * @param rcm + * @param id * @return */ - boolean updateAVClientByStreamId(String streamId, StreamClient rcm, Server server); + boolean updateAVClient(StreamClient rcm); /** * Update the session object @@ -125,21 +100,21 @@ public interface ISessionManager { * ScopeApplicationAdapter#setRoomValues(Long, Boolean, Boolean, String) * . * - * @param streamId * @param rcm * @param updateRoomCount * true means the count for the room has to be updated + * @param server * @return */ - boolean updateClientByStreamId(String streamId, StreamClient rcm, boolean updateRoomCount, Server server); + boolean update(StreamClient rcm); /** * Remove a client from the session store * - * @param streamId + * @param id * @return */ - boolean removeClient(String streamId, Server server); + boolean remove(Long id); /** * Get all ClientList Objects of that room and domain This Function is @@ -154,14 +129,6 @@ public interface ISessionManager { Collection<StreamClient> getClientListByRoomAll(Long roomId); /** - * get the current Moderator in this room - * - * @param roomname - * @return - */ - List<StreamClient> getCurrentModeratorByRoom(Long roomId); - - /** * Get list of current client sessions * * @param start http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java index 9a6e641..a9f76e8 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java @@ -52,10 +52,9 @@ public interface IUserManager { Long getLanguage(Locale loc); User loginOAuth(Map<String, String> params, long serverId) throws IOException, NoSuchAlgorithmException; - /** TODO FIXME seems to be unused **/ - boolean kickUserByStreamId(String SID, Long roomId); + boolean kickUsersByRoomId(Long roomId); - boolean kickUserByPublicSID(String SID, String publicSID); + boolean kickById(Long id); List<Userdata> getUserdataDashBoard(Long userId); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserService.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserService.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserService.java deleted file mode 100644 index 677a56d..0000000 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserService.java +++ /dev/null @@ -1,26 +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.db.dao.user; - -//FIXME HACK to bypass cross project compilation -public interface IUserService { - boolean kickUserByStreamId(String sid, String streamid, long serverId); - - boolean kickUserBySessionId(String sid, long userId, String sessionId); -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java index ca93a2a..f9e966f 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java @@ -18,9 +18,11 @@ */ package org.apache.openmeetings.db.entity.basic; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -55,6 +57,66 @@ public class Client implements IClient { public enum Pod { none, left, right; } + public static class Stream { + private Long streamClientId = null; + private String broadcastId = null; + private boolean sharing; + + public Stream(Long streamClientId, String broadcastId, boolean sharing) { + this.streamClientId = streamClientId; + this.broadcastId = broadcastId; + this.sharing= sharing; + } + + public Long getStreamClientId() { + return streamClientId; + } + + public void setStreamClientId(Long streamClientId) { + this.streamClientId = streamClientId; + } + + public String getBroadcastId() { + return broadcastId; + } + + public void setBroadcastId(String broadcastId) { + this.broadcastId = broadcastId; + } + + public boolean isSharing() { + return sharing; + } + + public void setSharing(boolean sharing) { + this.sharing = sharing; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((broadcastId == null) ? 0 : broadcastId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Stream other = (Stream) obj; + if (broadcastId == null) { + if (other.broadcastId != null) + return false; + } else if (!broadcastId.equals(other.broadcastId)) + return false; + return true; + } + } private final String sessionId; private int pageId; private User user; @@ -64,13 +126,13 @@ public class Client implements IClient { private String remoteAddress; private final Set<Right> rights = new HashSet<>(); private final Set<Activity> activities = new HashSet<>(); + private final Set<Stream> streams = new HashSet<>(); private final Date connectedSince; private Pod pod; private int cam = -1; private int mic = -1; private int width = 0; private int height = 0; - private String broadcastId = null; public Client(String sessionId, int pageId, Long userId, UserDao dao) { this.sessionId = sessionId; @@ -86,8 +148,8 @@ public class Client implements IClient { this.pageId = 0; this.user = dao.get(rcl.getUserId()); this.connectedSince = new Date(); - uid = rcl.getPublicSID(); - sid = UUID.randomUUID().toString(); + uid = rcl.getUid(); + sid = rcl.getOwnerSid(); this.roomId = rcl.getRoomId(); this.remoteAddress = rcl.getUserip(); } @@ -129,8 +191,10 @@ public class Client implements IClient { return sid; } - public void clearRights() { + public void clear() { + activities.clear(); rights.clear(); + streams.clear(); } public boolean hasRight(Right right) { @@ -213,10 +277,26 @@ public class Client implements IClient { activities.remove(Activity.broadcastA); activities.remove(Activity.broadcastV); break; + case share: + for (Stream s : streams) { + if (s.isSharing()) { + streams.remove(s); + break; + } + } + break; default: } } + public void addStream(Long streamClientId, String broadcastId, boolean sharing) { + streams.add(new Stream(streamClientId, broadcastId, sharing)); + } + + public List<Stream> getStreams() { + return new ArrayList<>(streams); + } + public Date getConnectedSince() { return connectedSince; } @@ -304,15 +384,6 @@ public class Client implements IClient { return this; } - public String getBroadcastId() { - return broadcastId; - } - - public Client setBroadcastId(String broadcastId) { - this.broadcastId = broadcastId; - return this; - } - @Override public int hashCode() { final int prime = 31; @@ -363,7 +434,6 @@ public class Client implements IClient { .put("rights", new JSONArray(rights)) .put("activities", new JSONArray(activities)) .put("pod", pod) - .put("broadcastId", broadcastId) .put("width", width) .put("height", height) .put("self", self); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java index 06612c9..1557d61 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java @@ -116,7 +116,7 @@ public class ConferenceLog implements IDataProviderEntity { this.userId = userId; } - public String getStreamid() { + public String getStreamId() { return streamid; } public void setStreamid(String streamid) { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java index aba737a..dbdef46 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java @@ -31,13 +31,15 @@ import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table; +import javax.persistence.Transient; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import org.apache.openmeetings.db.entity.basic.Client; import org.apache.openmeetings.db.entity.basic.IClient; import org.apache.openmeetings.db.entity.server.Server; -import org.apache.openmeetings.util.CalendarPatterns; +import org.apache.wicket.util.string.StringValue; /** * Can be configured to be stored in memory or in database @@ -46,22 +48,20 @@ import org.apache.openmeetings.util.CalendarPatterns; */ @Entity @NamedQueries({ - @NamedQuery(name = "deleteAll", query = "DELETE FROM StreamClient"), - @NamedQuery(name = "deletedById", query = "DELETE FROM StreamClient c WHERE c.id = :id"), + @NamedQuery(name = "deleteClientAll", query = "DELETE FROM StreamClient"), + @NamedQuery(name = "deleteClientById", query = "DELETE FROM StreamClient c WHERE c.id = :id"), + @NamedQuery(name = "getClientById", query = "SELECT c FROM StreamClient c WHERE c.id = :id"), @NamedQuery(name = "deleteClientsByServer", query = "DELETE FROM StreamClient c WHERE c.server = :server"), - @NamedQuery(name = "deletedByServerAndStreamId", query = "DELETE FROM StreamClient c WHERE c.server = :server AND c.streamid LIKE :streamid"), - @NamedQuery(name = "countClients", query = "SELECT count(c.id) FROM StreamClient c"), - @NamedQuery(name = "countClientsByServer", query = "SELECT count(c.id) FROM StreamClient c WHERE c.server = :server"), - @NamedQuery(name = "countClientsByServerAndStreamId", query = "SELECT count(c.id) FROM StreamClient c WHERE c.streamid LIKE :streamid AND c.server = :server"), - @NamedQuery(name = "getClientByServerAndStreamId", query = "SELECT c FROM StreamClient c WHERE c.streamid LIKE :streamid AND c.server = :server"), - @NamedQuery(name = "getClientsByPublicSIDAndServer", query = "SELECT c FROM StreamClient c WHERE c.publicSID LIKE :publicSID AND c.server = :server"), - @NamedQuery(name = "getClientsByPublicSID", query = "SELECT c FROM StreamClient c WHERE c.publicSID LIKE :publicSID"), + @NamedQuery(name = "countClients", query = "SELECT count(c) FROM StreamClient c"), + @NamedQuery(name = "countClientsByServer", query = "SELECT count(c) FROM StreamClient c WHERE c.server = :server"), + @NamedQuery(name = "getClientsByUidAndServer", query = "SELECT c FROM StreamClient c WHERE c.uid = :uid AND c.server = :server"), + @NamedQuery(name = "getClientsByUid", query = "SELECT c FROM StreamClient c WHERE c.uid = :uid"), @NamedQuery(name = "getClientsByServer", query = "SELECT c FROM StreamClient c WHERE c.server = :server"), @NamedQuery(name = "getClients", query = "SELECT c FROM StreamClient c"), @NamedQuery(name = "getClientsWithServer", query = "SELECT c FROM StreamClient c LEFT JOIN FETCH c.server"), @NamedQuery(name = "getClientsByUserId", query = "SELECT c FROM StreamClient c WHERE c.server = :server AND c.userId = :userId"), - @NamedQuery(name = "getClientsByRoomId", query = "SELECT c FROM StreamClient c WHERE c.roomId = :roomId"), - @NamedQuery(name = "getRoomsIdsByServer", query = "SELECT c.roomId FROM StreamClient c WHERE c.server = :server GROUP BY c.roomId") + @NamedQuery(name = "getClientsByRoomId", query = "SELECT c FROM StreamClient c WHERE c.scope = :roomId"), + @NamedQuery(name = "getRoomsIdsByServer", query = "SELECT c.roomId FROM StreamClient c WHERE c.server = :server GROUP BY c.scope") }) @Table(name = "client") @XmlRootElement @@ -75,88 +75,47 @@ public class StreamClient implements IClient { private Long id; /** - * @see StreamClient#getUsername() - */ - @Column(name = "username") - private String username = ""; - - /** - * @see StreamClient#getStreamid() - */ - @Column(name = "streamid") - private String streamid = ""; - - /** - * @see StreamClient#getScope() + * Red5 scope, can be roomId or 'hibernate' */ @Column(name = "scope") private String scope = ""; /** - * @see StreamClient#getVWidth() - */ - @Column(name = "vwidth") - private int vWidth = 0; - - /** - * @see StreamClient#getVHeight() + * The width of the video */ - @Column(name = "vheight") - private int vHeight = 0; + @Column(name = "width") + private int width = 0; /** - * @see StreamClient#getVX() + * The height of the video */ - @Column(name = "vx") - private int vX = 0; + @Column(name = "height") + private int height = 0; /** - * @see StreamClient#getVY() + * {@link Client#getUid()} of the client this stream is originated from + * */ - @Column(name = "vy") - private int vY = 0; + @Column(name = "uid") + private String uid = null; /** - * @see StreamClient#getStreamPublishName() + * {@link Client#getSid()} of the client who initiated the connection */ - @Column(name = "stream_publish_name") - private String streamPublishName = ""; + @Column(name = "owner_sid") + private String ownerSid = null; /** - * @see StreamClient#getPublicSID() - */ - @Column(name = "public_sid") - private String publicSID = ""; - - /** - * @see StreamClient#getIsMod() + * Is this user moderator */ @Column(name = "is_mod", nullable = false) - private boolean isMod = false; - - /** - * @see StreamClient#getIsSuperModerator() - */ - @Column(name = "is_supermoderator", nullable = false) - private boolean isSuperModerator = false; - - /** - * @see StreamClient#getCanDraw() - */ - @Column(name = "can_draw", nullable = false) - private boolean canDraw = false; - - /** - * @see StreamClient#getCanShare() - */ - @Column(name = "can_share", nullable = false) - private boolean canShare = false; + private boolean mod = false; /** - * @see StreamClient#getCanRemote() + * Is this user "super moderator" */ - @Column(name = "can_remote", nullable = false) - private boolean canRemote = false; + @Column(name = "super_mod", nullable = false) + private boolean superMod = false; /** * @see StreamClient#getCanGiveAudio() @@ -174,30 +133,6 @@ public class StreamClient implements IClient { private Date connectedSince; /** - * @see StreamClient#getFormatedDate() - */ - @Column(name = "formated_date") - private String formatedDate; - - /** - * @see StreamClient#isScreenClient() - */ - @Column(name = "is_screenclient", nullable = false) - private boolean screenClient; - - /** - * @see StreamClient#getUsercolor() - */ - @Column(name = "usercolor") - private String usercolor; - - /** - * @see StreamClient#getUserpos() - */ - @Column(name = "userpos") - private Integer userpos; - - /** * @see StreamClient#getUserip() */ @Column(name = "userip") @@ -210,12 +145,6 @@ public class StreamClient implements IClient { private int userport; /** - * @see StreamClient#getRoomId() - */ - @Column(name = "room_id") - private Long roomId; - - /** * @see StreamClient#getRoomEnter() */ @Column(name = "room_enter") @@ -225,66 +154,35 @@ public class StreamClient implements IClient { * @see StreamClient#getBroadCastID() */ @Column(name = "broadcast_id") - private String broadCastId = "-2"; + private String broadCastId = null; + + @Column(name = "username") + private String username = ""; - /** - * @see StreamClient#getUserId() - */ @Column(name = "user_id") private Long userId = null; - /** - * @see StreamClient#getFirstname() - */ @Column(name = "firstname") private String firstname = ""; - /** - * @see StreamClient#getLastname() - */ @Column(name = "lastname") private String lastname = ""; - /** - * @see StreamClient#getMail() - */ @Column(name = "email") private String email; - /** - * @see StreamClient#getLastLogin() - */ @Column(name = "last_login") private String lastLogin; - /** - * @see StreamClient#getSecurityCode() - */ - @Column(name = "security_code") - private String securityCode; - - /** - * @see StreamClient#getPicture_uri() - */ @Column(name = "picture_uri") private String picture_uri; - /** - * @see StreamClient#getLanguage() - */ @Column(name = "language") private String language = ""; - /** - * @see StreamClient#getAvsettings() - */ @Column(name = "avsettings") private String avsettings = ""; - /** - * @see StreamClient#getSwfurl() - */ - // FIXME: Move to {@link ClientSession} @Column(name = "swfurl", length=2048) private String swfurl; @@ -295,68 +193,38 @@ public class StreamClient implements IClient { private boolean nativeSsl = false; /** - * @see StreamClient#getIsRecording() - */ - @Column(name = "is_recording", nullable = false) - private boolean isRecording = false; - - /** - * @see StreamClient#getRoomRecordingName() + * Is this client connect via mobile application */ - @Column(name = "room_recording_name") - private String roomRecordingName; + @Column(name = "mobile", nullable = false) + private boolean mobile = false; /** - * @see StreamClient#getRecordingId() + * Is this client performs screen sharing */ - @Column(name = "recording_id") - private Long recordingId; + @Column(name = "sharing", nullable = false) + private boolean sharing = false; - /** - * @see StreamClient#getRecordingMetaDataId() - */ - @Column(name = "recording_metadata_id") - private Long recordingMetaDataId; + @Column(name = "recording_started", nullable = false) + private boolean recordingStarted = false; - /** - * @see StreamClient#isStartRecording() - */ - @Column(name = "start_recording", nullable = false) - private boolean startRecording = false; + @Column(name = "sharing_started", nullable = false) + private boolean sharingStarted = false; - /** - * @see StreamClient#isStartStreaming() - */ - @Column(name = "start_streaming", nullable = false) - private boolean startStreaming = false; + @Column(name = "publish_started", nullable = false) + private boolean publishStarted = false; - /** - * @see StreamClient#isScreenPublishStarted() - */ - @Column(name = "screen_publish_started", nullable = false) - private boolean screenPublishStarted = false; + @Column(name = "broadcasting", nullable = false) + private boolean broadcasting = false; - /** - * @see StreamClient#isStreamPublishStarted() - */ - @Column(name = "stream_publish_started", nullable = false) - private boolean streamPublishStarted = false; + @Column(name = "recording_id") + private Long recordingId; - /** - * @see StreamClient#getIsBroadcasting() - */ - @Column(name = "is_broadcasting", nullable = false) - private boolean isBroadcasting = false; + @Column(name = "meta_id") + private Long metaId; - /** - * @see StreamClient#getExternalUserId() - */ @Column(name = "external_user_id") private String externalUserId; - /** - * @see StreamClient#getExternalUserType() - */ @Column(name = "external_user_type") private String externalUserType; @@ -373,12 +241,6 @@ public class StreamClient implements IClient { private boolean allowRecording = true; /** - * @see StreamClient#getZombieCheckFlag() - */ - @Column(name = "zombie_check_flag", nullable = false) - private boolean zombieCheckFlag = false; - - /** * @see StreamClient#getMicMuted() */ @Column(name = "mic_muted", nullable = false) @@ -390,42 +252,14 @@ public class StreamClient implements IClient { @Column(name = "sip_transport", nullable = false) private boolean sipTransport = false; - @Column(name = "mobile", nullable = false) - private boolean mobile = false; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "server_id") private Server server; - public StreamClient() {} - - public StreamClient(String streamid, String publicSID, Long roomId, - Long userId, String firstname, String lastname, - String username, String connectedSince, String scope) { - super(); - this.streamid = streamid; - this.publicSID = publicSID; - this.roomId = roomId; - this.userId = userId; - this.firstname = firstname; - this.lastname = lastname; - this.username = username; - this.connectedSince = CalendarPatterns.parseDateWithHour(connectedSince); - this.scope = scope; - } - - public void setUserObject(Long userId, String username, String firstname, String lastname) { - this.userId = userId; - this.username = username; - this.firstname = firstname; - this.lastname = lastname; - } + @Transient + private Long roomId; - public void setUserObject(String username, String firstname, String lastname) { - this.username = username; - this.firstname = firstname; - this.lastname = lastname; - } + public StreamClient() {} @Override public Long getId() { @@ -437,164 +271,105 @@ public class StreamClient implements IClient { this.id = id; } - public Date getConnectedSince() { - return connectedSince; - } - - public void setConnectedSince(Date connectedSince) { - this.connectedSince = connectedSince; - } - - public boolean getIsMod() { - return isMod; - } - - public void setIsMod(boolean isMod) { - this.isMod = isMod; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getStreamid() { - return streamid; - } - - public void setStreamid(String streamid) { - this.streamid = streamid; - } - public String getScope() { return scope; } public void setScope(String scope) { this.scope = scope; + StringValue scn = StringValue.valueOf(scope); + long roomId = scn.toLong(Long.MIN_VALUE); + if (roomId > 0) { + this.roomId = roomId; + } } - public String getFormatedDate() { - return formatedDate; - } - - public void setFormatedDate(String formatedDate) { - this.formatedDate = formatedDate; + public int getWidth() { + return width; } - public String getUsercolor() { - return usercolor; + public void setWidth(int width) { + this.width = width; } - public void setUsercolor(String usercolor) { - this.usercolor = usercolor; + public int getHeight() { + return height; } - public Integer getUserpos() { - return userpos; + public void setHeight(int height) { + this.height = height; } - public void setUserpos(Integer userpos) { - this.userpos = userpos; + public String getUid() { + return uid; } - public String getUserip() { - return userip; + public void setUid(String uid) { + this.uid = uid; } - public void setUserip(String userip) { - this.userip = userip; + public String getOwnerSid() { + return ownerSid; } - public String getSwfurl() { - return swfurl; + public void setOwnerSid(String ownerSid) { + this.ownerSid = ownerSid; } - public void setSwfurl(String swfurl) { - this.swfurl = swfurl; + public boolean isMod() { + return mod; } - public int getUserport() { - return userport; + public void setMod(boolean mod) { + this.mod = mod; } - public void setUserport(int userport) { - this.userport = userport; + public boolean isSuperMod() { + return superMod; } - public String getFirstname() { - return firstname; - } - - public void setFirstname(String firstname) { - this.firstname = firstname; - } - - public String getLanguage() { - return language; - } - - public void setLanguage(String language) { - this.language = language; - } - - public String getLastLogin() { - return lastLogin; - } - - public void setLastLogin(String lastLogin) { - this.lastLogin = lastLogin; + public void setSuperMod(boolean superMod) { + this.superMod = superMod; } - public String getLastname() { - return lastname; - } - - public void setLastname(String lastname) { - this.lastname = lastname; - } - - public String getEmail() { - return email; + public boolean isCanGiveAudio() { + return canGiveAudio; } - public void setEmail(String email) { - this.email = email; + public void setCanGiveAudio(boolean canGiveAudio) { + this.canGiveAudio = canGiveAudio; } - public String getSecurityCode() { - return securityCode; + public boolean isCanVideo() { + return canVideo; } - public void setSecurityCode(String securityCode) { - this.securityCode = securityCode; + public void setCanVideo(boolean canVideo) { + this.canVideo = canVideo; } - public String getPicture_uri() { - return picture_uri; + public Date getConnectedSince() { + return connectedSince; } - public void setPicture_uri(String picture_uri) { - this.picture_uri = picture_uri; + public void setConnectedSince(Date connectedSince) { + this.connectedSince = connectedSince; } - public Long getUserId() { - return userId; + public String getUserip() { + return userip; } - public void setUserId(Long userId) { - this.userId = userId; + public void setUserip(String userip) { + this.userip = userip; } - public Long getRoomId() { - return roomId; + public int getUserport() { + return userport; } - public void setRoomId(Long roomId) { - this.roomId = roomId; + public void setUserport(int userport) { + this.userport = userport; } public Date getRoomEnter() { @@ -605,156 +380,156 @@ public class StreamClient implements IClient { this.roomEnter = roomEnter; } - public boolean getIsRecording() { - return isRecording; + public String getBroadCastId() { + return broadCastId; } - public void setIsRecording(boolean isRecording) { - this.isRecording = isRecording; + public void setBroadCastId(String broadCastId) { + this.broadCastId = broadCastId; } - public String getRoomRecordingName() { - return roomRecordingName; + public String getUsername() { + return username; } - public void setRoomRecordingName(String roomRecordingName) { - this.roomRecordingName = roomRecordingName; + public void setUsername(String username) { + this.username = username; } - public String getAvsettings() { - return avsettings; + public Long getUserId() { + return userId; } - public void setAvsettings(String avsettings) { - this.avsettings = avsettings; + public void setUserId(Long userId) { + this.userId = userId; } - public String getBroadCastId() { - return broadCastId; + public String getFirstname() { + return firstname; } - public void setBroadCastId(String broadCastId) { - this.broadCastId = broadCastId; + public void setFirstname(String firstname) { + this.firstname = firstname; } - public String getPublicSID() { - return publicSID; + public String getLastname() { + return lastname; } - public void setPublicSID(String publicSID) { - this.publicSID = publicSID; + public void setLastname(String lastname) { + this.lastname = lastname; } - public boolean getZombieCheckFlag() { - return zombieCheckFlag; + public String getEmail() { + return email; } - public void setZombieCheckFlag(boolean zombieCheckFlag) { - this.zombieCheckFlag = zombieCheckFlag; + public void setEmail(String email) { + this.email = email; } - public boolean getMicMuted() { - return micMuted; + public String getLastLogin() { + return lastLogin; } - public void setMicMuted(boolean micMuted) { - this.micMuted = micMuted; + public void setLastLogin(String lastLogin) { + this.lastLogin = lastLogin; } - public boolean getCanDraw() { - return canDraw; + public String getPicture_uri() { + return picture_uri; } - public void setCanDraw(boolean canDraw) { - this.canDraw = canDraw; + public void setPicture_uri(String picture_uri) { + this.picture_uri = picture_uri; } - public boolean getIsBroadcasting() { - return isBroadcasting; + public String getLanguage() { + return language; } - public void setIsBroadcasting(boolean isBroadcasting) { - this.isBroadcasting = isBroadcasting; + public void setLanguage(String language) { + this.language = language; } - public boolean getCanShare() { - return canShare; + public String getAvsettings() { + return avsettings; } - public void setCanShare(boolean canShare) { - this.canShare = canShare; + public void setAvsettings(String avsettings) { + this.avsettings = avsettings; } - public String getExternalUserId() { - return externalUserId; + public String getSwfurl() { + return swfurl; } - public void setExternalUserId(String externalUserId) { - this.externalUserId = externalUserId; + public void setSwfurl(String swfurl) { + this.swfurl = swfurl; } - public String getExternalUserType() { - return externalUserType; + public String getTcUrl() { + return tcUrl; } - public void setExternalUserType(String externalUserType) { - this.externalUserType = externalUserType; + public void setTcUrl(String tcUrl) { + this.tcUrl = tcUrl; } - public boolean getIsSuperModerator() { - return isSuperModerator; + public boolean isNativeSsl() { + return nativeSsl; } - public void setIsSuperModerator(boolean isSuperModerator) { - this.isSuperModerator = isSuperModerator; + public void setNativeSsl(boolean nativeSsl) { + this.nativeSsl = nativeSsl; } - public boolean isScreenClient() { - return screenClient; + public boolean isMobile() { + return mobile; } - public void setScreenClient(boolean screenClient) { - this.screenClient = screenClient; + public void setMobile(boolean mobile) { + this.mobile = mobile; } - public int getVWidth() { - return vWidth; + public boolean isSharing() { + return sharing; } - public void setVWidth(int width) { - vWidth = width; + public void setSharing(boolean sharing) { + this.sharing = sharing; } - public int getVHeight() { - return vHeight; + public boolean isRecordingStarted() { + return recordingStarted; } - public void setVHeight(int height) { - vHeight = height; + public void setRecordingStarted(boolean recordingStarted) { + this.recordingStarted = recordingStarted; } - public int getVX() { - return vX; + public boolean isSharingStarted() { + return sharingStarted; } - public void setVX(int vx) { - vX = vx; + public void setSharingStarted(boolean sharingStarted) { + this.sharingStarted = sharingStarted; } - public int getVY() { - return vY; + public boolean isPublishStarted() { + return publishStarted; } - public void setVY(int vy) { - vY = vy; + public void setPublishStarted(boolean publishStarted) { + this.publishStarted = publishStarted; } - public String getStreamPublishName() { - return streamPublishName; + public boolean isBroadcasting() { + return broadcasting; } - public void setStreamPublishName(String streamPublishName) { - this.streamPublishName = streamPublishName; + public void setBroadcasting(boolean isBroadcasting) { + this.broadcasting = isBroadcasting; } public Long getRecordingId() { @@ -765,36 +540,28 @@ public class StreamClient implements IClient { this.recordingId = recordingId; } - public Long getRecordingMetaDataId() { - return recordingMetaDataId; + public Long getMetaId() { + return metaId; } - public void setRecordingMetaDataId(Long recordingMetaDataId) { - this.recordingMetaDataId = recordingMetaDataId; + public void setMetaId(Long metaId) { + this.metaId = metaId; } - public boolean isScreenPublishStarted() { - return screenPublishStarted; - } - - public void setScreenPublishStarted(boolean screenPublishStarted) { - this.screenPublishStarted = screenPublishStarted; - } - - public boolean isStartRecording() { - return startRecording; + public String getExternalUserId() { + return externalUserId; } - public void setStartRecording(boolean startRecording) { - this.startRecording = startRecording; + public void setExternalUserId(String externalUserId) { + this.externalUserId = externalUserId; } - public boolean isStartStreaming() { - return startStreaming; + public String getExternalUserType() { + return externalUserType; } - public void setStartStreaming(boolean startStreaming) { - this.startStreaming = startStreaming; + public void setExternalUserType(String externalUserType) { + this.externalUserType = externalUserType; } public Integer getInterviewPodId() { @@ -805,30 +572,6 @@ public class StreamClient implements IClient { this.interviewPodId = interviewPodId; } - public boolean getCanRemote() { - return canRemote; - } - - public void setCanRemote(boolean canRemote) { - this.canRemote = canRemote; - } - - public boolean getCanGiveAudio() { - return canGiveAudio; - } - - public void setCanGiveAudio(boolean canGiveAudio) { - this.canGiveAudio = canGiveAudio; - } - - public boolean getCanVideo() { - return canVideo; - } - - public void setCanVideo(boolean canVideo) { - this.canVideo = canVideo; - } - public boolean isAllowRecording() { return allowRecording; } @@ -837,12 +580,12 @@ public class StreamClient implements IClient { this.allowRecording = allowRecording; } - public boolean isStreamPublishStarted() { - return streamPublishStarted; + public boolean isMicMuted() { + return micMuted; } - public void setStreamPublishStarted(boolean streamPublishStarted) { - this.streamPublishStarted = streamPublishStarted; + public void setMicMuted(boolean micMuted) { + this.micMuted = micMuted; } public boolean isSipTransport() { @@ -861,36 +604,15 @@ public class StreamClient implements IClient { this.server = server; } - public boolean isMobile() { - return mobile; - } - - public void setMobile(boolean mobile) { - this.mobile = mobile; - } - - public String getTcUrl() { - return tcUrl; - } - - public void setTcUrl(String tcUrl) { - this.tcUrl = tcUrl; - } - - public boolean isNativeSsl() { - return nativeSsl; - } - - public void setNativeSsl(boolean nativeSsl) { - this.nativeSsl = nativeSsl; + public Long getRoomId() { + return roomId; } @Override public String toString() { - return "Client [streamid=" + streamid + ", publicSID=" + publicSID + ", isScreenClient=" + screenClient - + ", isMobile = " + mobile + ", roomId=" + roomId + ", broadCastID=" + broadCastId + ", userId=" - + userId + ", avsettings=" + avsettings + ", isRecording=" + isRecording + ", recordingId=" - + recordingId + ", recordingMetaDataId=" + recordingMetaDataId + ", screenPublishStarted=" - + screenPublishStarted + ", interviewPodId=" + interviewPodId + ", server=" + server + "]"; + return "StreamClient [scope=" + scope + ", uid=" + uid + ", ownerSid=" + ownerSid + ", broadCastId=" + + broadCastId + ", username=" + username + ", userId=" + userId + ", avsettings=" + avsettings + ", sharing=" + sharing + + ", isBroadcasting=" + broadcasting + "]"; } + } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-flash/src/main/flex/main.mxml ---------------------------------------------------------------------- diff --git a/openmeetings-flash/src/main/flex/main.mxml b/openmeetings-flash/src/main/flex/main.mxml index 585773d..429bdb2 100644 --- a/openmeetings-flash/src/main/flex/main.mxml +++ b/openmeetings-flash/src/main/flex/main.mxml @@ -115,7 +115,9 @@ video.reset(); var cam:Camera = getCam(); video.attachCamera(cam); - video.broadcast(UIDUtil.createUID(), cam, getMic()); + var broadcastId:String = UIDUtil.createUID(); + debug("BroadcastId = " + broadcastId); + video.broadcast(broadcastId, cam, getMic()); ExternalInterface.call("VideoManager.resetSize", params.uid); }); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as ---------------------------------------------------------------------- diff --git a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as index b2a743e..86f5f12 100644 --- a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as +++ b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as @@ -169,7 +169,7 @@ public class OmVideo { private function _connect(url:String):void { nc.connect(url, { uid: params.uid - , sid: params.sid + , ownerSid: params.sid , nativeSsl: 'best' == params.proxyType }); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java ---------------------------------------------------------------------- diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java index 65831ab..738b158 100644 --- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java +++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java @@ -35,6 +35,7 @@ import java.net.ConnectException; import java.net.URI; import java.util.HashMap; import java.util.Map; +import java.util.UUID; import java.util.concurrent.LinkedBlockingQueue; import org.apache.openmeetings.screenshare.gui.ScreenSharerFrame; @@ -82,7 +83,7 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { private String app; private int port; - public String publishName; + public String sid; private CaptureScreen _capture = null; private RTMPClientPublish publishClient = null; @@ -129,7 +130,7 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { if (args.length > 8) { url = new URI(args[0]); fallback = new URI(args[1]); - publishName = args[2]; + sid = args[2]; String labelTexts = args[3]; defaultQuality = Integer.parseInt(args[4]); defaultFPS = Integer.parseInt(args[5]); @@ -193,7 +194,7 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { throw new RuntimeException("Unsupported protocol"); } instance.setServiceProvider(this); - log.debug(String.format("host: %s, port: %s, app: %s, publish: %s", host, port, app, publishName)); + log.debug(String.format("host: %s, port: %s, app: %s, publish: %s", host, port, app, sid)); } public static void main(String[] args) { @@ -228,7 +229,6 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { int y = (int)(Ampl_factor * (mouseP.getY() - spinnerY) * scaleFactor); Map<String, Object> cursorPosition = new HashMap<>(); - cursorPosition.put("publicSID", publishName); cursorPosition.put("cursor_x", x); cursorPosition.put("cursor_y", y); @@ -259,15 +259,12 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { Red5.setConnectionLocal(instance.getConnection()); } Map<String, Object> map = new HashMap<>(); - map.put("screenX", spinnerX); - map.put("screenY", spinnerY); int scaledWidth = (int)(Ampl_factor * resizeX); int scaledHeight = (int)(Ampl_factor * resizeY); map.put("screenWidth", scaledWidth); map.put("screenHeight", scaledHeight); - map.put("publishName", publishName); map.put("startRecording", startRecording); map.put("startStreaming", startSharing); map.put("startPublishing", startPublishing); @@ -304,12 +301,12 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { captureScreenStart(); } - private void connect(String parentSid) { + private void connect(String sid) { setInstance(fallbackUsed ? fallback : url); Map<String, Object> map = instance.makeDefaultConnectionParams(host, port, app); map.put("screenClient", true); Map<String, Object> params = new HashMap<>(); - params.put("uid", parentSid); + params.put("ownerSid", sid); instance.connect(host, port, map, this, new Object[]{params}); } @@ -317,7 +314,7 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { frame.setStatus("Exception: " + e); if (e instanceof ConnectException) { fallbackUsed = true; - connect(publishName); + connect(sid); } } @@ -326,7 +323,7 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { log.debug("captureScreenStart"); if (!isConnected) { - connect(publishName); + connect(sid); } else { setConnectionAsSharingClient(); } @@ -447,7 +444,9 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { stopPublishing(); isConnected = false; - instance.disconnect(); + if (instance != null) { + instance.disconnect(); + } setReadyToRecord(false); getCapture().setStartPublish(false); getCapture().release(); @@ -510,7 +509,7 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { Object code = returnMap.get("code"); if (CONNECT_FAILED.equals(code) && !fallbackUsed) { fallbackUsed = true; - connect(publishName); + connect(sid); frame.setStatus("Re-connecting using fallback"); return; } @@ -553,8 +552,9 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler { if (o != null && o instanceof Number) { getCapture().setStreamId((Number)o); } - log.debug("createPublishStream result stream id: {}; name: {}", getCapture().getStreamId(), publishName); - instance.publish(getCapture().getStreamId(), publishName, "live", this); + final String broadcastId = UUID.randomUUID().toString(); + log.debug("createPublishStream result stream id: {}; name: {}", getCapture().getStreamId(), broadcastId); + instance.publish(getCapture().getStreamId(), broadcastId, "live", this); log.debug("setup capture thread spinnerWidth = {}; spinnerHeight = {};", spinnerWidth, spinnerHeight); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp ---------------------------------------------------------------------- diff --git a/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp b/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp index 2e1c9f8..e6ba15c 100644 --- a/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp +++ b/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp @@ -39,7 +39,7 @@ <application-desc main-class='org.apache.openmeetings.screenshare.Core'> <argument>$url</argument> <argument>$fallback</argument> - <argument>$publicSid</argument> + <argument>$sid</argument> <argument>$labels</argument> <argument>$defaultQuality</argument> <argument>$defaultFps</argument> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java ---------------------------------------------------------------------- diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java index 4ede92b..d8e604d 100644 --- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java +++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java @@ -60,7 +60,6 @@ import org.apache.openmeetings.db.entity.user.User; import org.apache.openmeetings.db.entity.user.User.Right; import org.apache.openmeetings.db.entity.user.User.Type; import org.apache.openmeetings.db.entity.user.Userdata; -import org.apache.openmeetings.db.util.AuthLevelUtil; import org.apache.openmeetings.db.util.TimezoneUtil; import org.apache.openmeetings.service.mail.EmailManager; import org.apache.openmeetings.util.DaoHelper; @@ -410,65 +409,56 @@ public class UserManager implements IUserManager { * @return */ @Override - public boolean kickUserByStreamId(String sid, Long room_id) { + public boolean kickUsersByRoomId(Long roomId) { try { - Sessiondata sd = sessionDao.check(sid); - // admins only - if (AuthLevelUtil.hasAdminLevel(userDao.getRights(sd.getUserId()))) { - - sessionDao.clearSessionByRoomId(room_id); - - for (StreamClient rcl : sessionManager.getClientListByRoom(room_id)) { - if (rcl == null) { - return true; - } - String scopeName = "hibernate"; - if (rcl.getRoomId() != null) { - scopeName = rcl.getRoomId().toString(); - } - IScope currentScope = scopeApplicationAdapter.getRoomScope(scopeName); - scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope); - - Map<Integer, String> messageObj = new HashMap<>(); - messageObj.put(0, "kick"); - scopeApplicationAdapter.sendMessageById(messageObj, rcl.getStreamid(), currentScope); - } - return true; - } - } catch (Exception err) { - log.error("[kickUserByStreamId]", err); - } - return false; - } - - @Override - public boolean kickUserByPublicSID(String sid, String publicSID) { - try { - Sessiondata sd = sessionDao.check(sid); - // admins only - if (AuthLevelUtil.hasWebServiceLevel(userDao.getRights(sd.getUserId()))) { - StreamClient rcl = sessionManager.getClientByPublicSID(publicSID, null); + sessionDao.clearSessionByRoomId(roomId); + for (StreamClient rcl : sessionManager.getClientListByRoom(roomId)) { if (rcl == null) { return true; } - String scopeName = "hibernate"; if (rcl.getRoomId() != null) { scopeName = rcl.getRoomId().toString(); } IScope currentScope = scopeApplicationAdapter.getRoomScope(scopeName); + scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope); Map<Integer, String> messageObj = new HashMap<>(); messageObj.put(0, "kick"); - scopeApplicationAdapter.sendMessageById(messageObj, rcl.getStreamid(), currentScope); + scopeApplicationAdapter.sendMessageById(messageObj, rcl.getId(), currentScope); + } + return true; + } catch (Exception err) { + log.error("[kickUsersByRoomId]", err); + } + return false; + } - scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope); + @Override + public boolean kickById(Long id) { + try { + StreamClient rcl = sessionManager.get(id); + 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; } catch (Exception err) { - log.error("[kickUserByStreamId]", err); + log.error("[kickById]", err); } return false; } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java index 0d8e37d..ad1c752 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java @@ -19,7 +19,6 @@ package org.apache.openmeetings.web.admin.connection; import static org.apache.openmeetings.web.app.Application.getBean; -import static org.apache.openmeetings.web.app.WebSession.getSid; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -28,9 +27,10 @@ import java.util.Iterator; import java.util.List; import org.apache.openmeetings.db.dao.server.ISessionManager; -import org.apache.openmeetings.db.dao.user.IUserService; +import org.apache.openmeetings.db.entity.basic.Client; import org.apache.openmeetings.db.entity.basic.IClient; import org.apache.openmeetings.db.entity.room.StreamClient; +import org.apache.openmeetings.service.user.UserManager; import org.apache.openmeetings.web.admin.AdminPanel; import org.apache.openmeetings.web.admin.SearchableDataView; import org.apache.openmeetings.web.app.Application; @@ -91,11 +91,10 @@ public class ConnectionsPanel extends AdminPanel { IClient _c = item.getModelObject(); if (_c instanceof StreamClient) { StreamClient c = (StreamClient)_c; - getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid() - , c.getServer() == null ? 0 : c.getServer().getId()); + getBean(UserManager.class).kickById(c.getId()); } else { - org.apache.openmeetings.db.entity.basic.Client c = (org.apache.openmeetings.db.entity.basic.Client)_c; - getBean(IUserService.class).kickUserBySessionId(getSid(), c.getUserId(), c.getSessionId()); + Client c = (Client)_c; + Application.get().invalidateClient(c.getUserId(), c.getSessionId()); } target.add(container, details.setVisible(false)); } @@ -107,9 +106,9 @@ public class ConnectionsPanel extends AdminPanel { item.add(new Label("since", c.getConnectedSince())); item.add(new Label("scope")); item.add(new Label("server", c.getServer() == null ? "no cluster" : c.getServer().getAddress())); //FIXME localization - confirm.setEnabled(!c.isScreenClient()); + confirm.setEnabled(!c.isSharing()); } else { - org.apache.openmeetings.db.entity.basic.Client c = (org.apache.openmeetings.db.entity.basic.Client)_c; + Client c = (Client)_c; item.add(new Label("streamid", "")); item.add(new Label("login", c.getUser().getLogin())); item.add(new Label("since", c.getConnectedSince())); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java index e8ffa21..869b36d 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java @@ -21,7 +21,6 @@ package org.apache.openmeetings.web.admin.rooms; import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel; import static org.apache.openmeetings.web.app.Application.getBean; import static org.apache.openmeetings.web.app.WebSession.getRights; -import static org.apache.openmeetings.web.app.WebSession.getSid; import static org.apache.openmeetings.web.app.WebSession.getUserId; import java.util.ArrayList; @@ -32,7 +31,6 @@ import java.util.List; import org.apache.openmeetings.db.dao.room.RoomDao; import org.apache.openmeetings.db.dao.server.ISessionManager; import org.apache.openmeetings.db.dao.user.GroupDao; -import org.apache.openmeetings.db.dao.user.IUserService; import org.apache.openmeetings.db.dao.user.UserDao; import org.apache.openmeetings.db.entity.room.Room; import org.apache.openmeetings.db.entity.room.Room.RoomElement; @@ -42,6 +40,7 @@ import org.apache.openmeetings.db.entity.room.StreamClient; import org.apache.openmeetings.db.entity.user.Address; import org.apache.openmeetings.db.entity.user.Group; import org.apache.openmeetings.db.entity.user.User; +import org.apache.openmeetings.service.user.UserManager; import org.apache.openmeetings.web.admin.AdminBaseForm; import org.apache.openmeetings.web.admin.AdminUserChoiceProvider; import org.apache.openmeetings.web.app.Application; @@ -97,9 +96,7 @@ public class RoomForm extends AdminBaseForm<Room> { @Override protected void onSubmit(AjaxRequestTarget target) { StreamClient c = item.getModelObject(); - getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid() - , c.getServer() == null ? 0 : c.getServer().getId()); - + getBean(UserManager.class).kickById(c.getId()); updateClients(target); } }); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java index 7b68bf9..f6330a9 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java @@ -122,6 +122,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica private static final Logger log = getLogger(Application.class, webAppRootKey); private static boolean isInstalled; private static ConcurrentHashMap<String, Client> ONLINE_USERS = new ConcurrentHashMap<>(); + private static ConcurrentHashMap<String, String> UID_BY_SID = new ConcurrentHashMap<>(); private static ConcurrentHashMap<String, Client> INVALID_SESSIONS = new ConcurrentHashMap<>(); private static ConcurrentHashMap<Long, Set<String>> ROOMS = new ConcurrentHashMap<>(); //additional maps for faster searching should be created @@ -257,6 +258,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica public static void addOnlineUser(Client c) { log.debug("Adding online client: {}, room: {}", c.getUid(), c.getRoomId()); ONLINE_USERS.put(c.getUid(), c); + UID_BY_SID.put(c.getSid(), c.getUid()); } public static void exitRoom(Client c) { @@ -279,13 +281,14 @@ public class Application extends AuthenticatedWebApplication implements IApplica } } - public static void exit(Client c) { + private static void exit(Client c) { if (c != null) { if (c.getRoomId() != null) { exitRoom(c); } log.debug("Removing online client: {}, room: {}", c.getUid(), c.getRoomId()); ONLINE_USERS.remove(c.getUid()); + UID_BY_SID.remove(c.getSid()); } } @@ -302,66 +305,61 @@ public class Application extends AuthenticatedWebApplication implements IApplica if (rcl == null) { return null; } - if (!rcl.isScreenClient() && (!rcl.isMobile() || (rcl.isMobile() && rcl.getUserId() != null))) { - Client client = getOnlineClient(rcl.getPublicSID()); - if (client == null) { - if (!Strings.isEmpty(rcl.getSecurityCode())) { - client = getOnlineClient(rcl.getSecurityCode()); - } - if (client == null && rcl.isMobile()) { - //Mobile client enters the room - client = new Client(rcl, getBean(UserDao.class)); - addOnlineUser(client); - if (rcl.getRoomId() != null) { - client.setCam(0); - client.setMic(0); - addUserToRoom(client); - //FIXME TODO unify this - WebSocketHelper.sendRoom(new RoomMessage(client.getRoomId(), client.getUserId(), RoomMessage.Type.roomEnter)); - } - //FIXME TODO rights - } else if (client == null) { - return null; - } else if (!client.hasRight(Right.audio) && !client.hasRight(Right.video)) { - log.warn("Parent client has no AV rights, going reject client"); - return null; + Client client = getClientBySid(rcl.getOwnerSid()); + if (client == null) { + if (rcl.isMobile()) { + //Mobile client enters the room + client = new Client(rcl, getBean(UserDao.class)); + addOnlineUser(client); + if (rcl.getRoomId() != null) { + client.setCam(0); + client.setMic(0); + addUserToRoom(client); + //FIXME TODO unify this + WebSocketHelper.sendRoom(new RoomMessage(client.getRoomId(), client.getUserId(), RoomMessage.Type.roomEnter)); } + //FIXME TODO rights + } else { + return null; } - rcl.setFirstname(client.getUser().getFirstname()); - rcl.setLastname(client.getUser().getLastname()); - rcl.setIsSuperModerator(client.hasRight(Right.superModerator)); - rcl.setIsMod(client.hasRight(Right.moderator)); - rcl.setCanVideo(client.hasRight(Right.video) && client.isCamEnabled() && client.hasActivity(Activity.broadcastV)); - rcl.setCanDraw(client.hasRight(Right.whiteBoard)); - if (client.hasActivity(Activity.broadcastA) && client.getMic() < 0) { - client.remove(Activity.broadcastA); + } + if (rcl.getRoomId() == null || !rcl.getRoomId().equals(client.getRoomId())) { + //TODO mobile + return null; + } + rcl.setFirstname(client.getUser().getFirstname()); + rcl.setLastname(client.getUser().getLastname()); + rcl.setSuperMod(client.hasRight(Right.superModerator)); + rcl.setMod(client.hasRight(Right.moderator)); + rcl.setCanVideo(client.hasRight(Right.video) && client.isCamEnabled() && client.hasActivity(Activity.broadcastV)); + if (client.hasActivity(Activity.broadcastA) && client.getMic() < 0) { + client.remove(Activity.broadcastA); + } + if (client.hasActivity(Activity.broadcastV) && client.getCam() < 0) { + client.remove(Activity.broadcastV); + } + if (client.hasActivity(Activity.broadcastA) || client.hasActivity(Activity.broadcastV)) { + if (forceSize || rcl.getWidth() == 0 || rcl.getHeight() == 0) { + rcl.setWidth(client.getWidth()); + rcl.setHeight(client.getHeight()); } - if (client.hasActivity(Activity.broadcastV) && client.getCam() < 0) { - client.remove(Activity.broadcastV); + if (client.getPod() != Pod.none) { + rcl.setInterviewPodId(client.getPod() == Pod.left ? 1 : 2); } - if (client.hasActivity(Activity.broadcastA) || client.hasActivity(Activity.broadcastV)) { - if (forceSize || rcl.getVWidth() == 0 || rcl.getVHeight() == 0) { - rcl.setVWidth(client.getWidth()); - rcl.setVHeight(client.getHeight()); - } - if (client.getPod() != Pod.none) { - rcl.setInterviewPodId(client.getPod() == Pod.left ? 1 : 2); - } - StringBuilder sb = new StringBuilder(); - if (client.hasActivity(Activity.broadcastA)) { - sb.append('a'); - } - if (client.hasActivity(Activity.broadcastV)) { - sb.append('v'); - } - if (!rcl.getIsBroadcasting() || hasVideo(rcl) != hasVideo(client)) { - rcl.setIsBroadcasting(true); - } - rcl.setAvsettings(sb.toString()); - } else { - rcl.setAvsettings("n"); - rcl.setIsBroadcasting(false); + StringBuilder sb = new StringBuilder(); + if (client.hasActivity(Activity.broadcastA)) { + sb.append('a'); + } + if (client.hasActivity(Activity.broadcastV)) { + sb.append('v'); + } + if (!rcl.isBroadcasting() || hasVideo(rcl) != hasVideo(client)) { + rcl.setBroadcasting(true); } + rcl.setAvsettings(sb.toString()); + } else { + rcl.setAvsettings("n"); + rcl.setBroadcasting(false); } return rcl; } @@ -370,6 +368,19 @@ public class Application extends AuthenticatedWebApplication implements IApplica return uid == null ? null : ONLINE_USERS.get(uid); } + @Override + public Client getOmClientBySid(String sid) { + return getClientBySid(sid); + } + + public static Client getClientBySid(String sid) { + if (sid == null) { + return null; + } + String uid = UID_BY_SID.get(sid); + return uid == null ? null : ONLINE_USERS.get(uid); + } + public static boolean isUserOnline(Long userId) { boolean isUserOnline = false; for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) { @@ -446,8 +457,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica c.setRoomId(null); } getBean(ScopeApplicationAdapter.class).roomLeaveByScope(c.getUid(), roomId); - c.getActivities().clear(); - c.clearRights(); + c.clear(); } return c; } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java ---------------------------------------------------------------------- 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 72939d8..c624e36 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 @@ -24,10 +24,8 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOAR import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS_KEY; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG_KEY; import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; -import static org.apache.openmeetings.web.app.Application.exit; import static org.apache.openmeetings.web.app.Application.getAuthenticationStrategy; import static org.apache.openmeetings.web.app.Application.getBean; -import static org.apache.openmeetings.web.app.Application.getClientByKeys; import static org.apache.openmeetings.web.app.Application.getDashboardContext; import static org.apache.openmeetings.web.app.Application.isInvaldSession; import static org.apache.openmeetings.web.app.Application.removeInvalidSession; @@ -100,7 +98,6 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS private Long userId = null; private Set<Right> rights = new HashSet<>(); //TODO renew somehow on user edit !!!! private long languageId = -1; //TODO renew somehow on user edit !!!! - private String SID = null; private OmUrlFragment area = null; private TimeZone tz; private TimeZone browserTz; @@ -123,11 +120,10 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS @Override public void invalidate() { - exit(getClientByKeys(userId, getId())); + Application.get().invalidateClient(userId, getId()); super.invalidate(); userId = null; rights = Collections.unmodifiableSet(Collections.<Right>emptySet()); - SID = null; ISO8601FORMAT = null; sdf = null; languageId = -1; @@ -273,7 +269,6 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS } private void setUser(User u, Set<Right> rights) { - String _sid = SID; Long _recordingId = recordingId; Long _roomId = roomId; Invitation _i = i; @@ -281,9 +276,6 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS ClientInfo _info = clientInfo; ExtendedClientProperties _extProps = extProps; replaceSession(); // required to prevent session fixation - if (_sid != null) { - SID = _sid; - } if (_recordingId != null) { recordingId = _recordingId; } @@ -379,23 +371,6 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS return session.languageId; } - public String getValidatedSid() { - SessiondataDao sessionDao = getBean(SessiondataDao.class); - Sessiondata sd = sessionDao.check(SID); - //TODO need to check roomId equality - if (sd.getUserId() == null || !sd.getUserId().equals(userId)) { - if (sd.getId() == null) { - sd = sessionDao.create(userId, roomId, languageId); - } - SID = sd.getSessionId(); - } - return SID; - } - - public static String getSid() { - return get().getValidatedSid(); - } - public static Long getUserId() { checkIsInvalid(); return get().userId;
