You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2018/03/03 18:30:15 UTC

[openmeetings] branch OPENMEETINGS-1649-kurento updated: [OPENMEETINGS-1649] JS errors during broadcast are fixed

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

solomax pushed a commit to branch OPENMEETINGS-1649-kurento
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/OPENMEETINGS-1649-kurento by this push:
     new 5afa80f  [OPENMEETINGS-1649] JS errors during broadcast are fixed
5afa80f is described below

commit 5afa80f1e0d6007f7883185f166fde0a2dbfb31e
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun Mar 4 01:30:01 2018 +0700

    [OPENMEETINGS-1649] JS errors during broadcast are fixed
---
 .../org/apache/openmeetings/core/remote/KRoom.java | 35 +++++--------------
 .../org/apache/openmeetings/core/remote/KUser.java | 15 ++++----
 .../openmeetings/core/remote/KurentoHandler.java   | 16 +++------
 .../apache/openmeetings/web/room/RoomPanel.java    | 35 ++++++++++---------
 .../apache/openmeetings/web/room/video-manager.js  | 40 ++++++++++++++--------
 .../openmeetings/web/room/wb/interview-area.js     |  5 ++-
 .../org/apache/openmeetings/web/room/wb/wb-all.js  | 13 +++++++
 .../org/apache/openmeetings/web/room/wb/wb-area.js | 17 ++-------
 .../apache/openmeetings/web/user/chat/Chat.java    | 10 ++++--
 .../openmeetings/web/user/chat/ChatForm.java       |  8 +++--
 .../openmeetings/web/user/chat/ChatToolbar.java    | 13 ++++---
 11 files changed, 106 insertions(+), 101 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
index 97671d9..2ed5335 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
@@ -33,7 +33,6 @@ import org.kurento.client.MediaPipeline;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 
 /**
@@ -41,7 +40,7 @@ import com.github.openjson.JSONObject;
  * @since 4.3.1
  */
 public class KRoom implements Closeable {
-	private final Logger log = LoggerFactory.getLogger(KRoom.class);
+	private final static Logger log = LoggerFactory.getLogger(KRoom.class);
 
 	private final Map<String, KUser> participants = new ConcurrentHashMap<>();
 	private final MediaPipeline pipeline;
@@ -64,11 +63,11 @@ public class KRoom implements Closeable {
 
 	public KUser join(final KurentoHandler h, String uid) {
 		log.info("ROOM {}: adding participant {}", roomId, uid);
-		final KUser participant = new KUser(h, uid, this.roomId, this.pipeline);
-		joinRoom(h, participant);
-		participants.put(participant.getUid(), participant);
-		sendParticipantNames(h, participant);
-		return participant;
+		final KUser u = new KUser(h, uid, this.roomId, this.pipeline);
+		joinRoom(h, u);
+		participants.put(u.getUid(), u);
+		broadcast(h, u);
+		return u;
 	}
 
 	public void leave(final KurentoHandler h, KUser user) {
@@ -89,7 +88,6 @@ public class KRoom implements Closeable {
 			h.sendClient(participant.getUid(), msg);
 			participantsList.add(participant.getUid());
 		}
-
 		return participantsList;
 	}
 
@@ -111,21 +109,12 @@ public class KRoom implements Closeable {
 			log.debug("ROOM {}: The users {} could not be notified that {} left the room", this.roomId,
 					unnotifiedParticipants, name);
 		}
-
 	}
 
-	public void sendParticipantNames(final KurentoHandler h, KUser user) {
-		final JSONArray participantsArray = new JSONArray();
-		for (final KUser participant : this.getParticipants()) {
-			if (!participant.equals(user)) {
-				participantsArray.put(participant.getUid());
-			}
-		}
-
+	private static void broadcast(final KurentoHandler h, KUser user) {
 		final JSONObject msg = newKurentoMsg();
-		msg.put("id", "existingParticipants");
-		msg.put("data", participantsArray);
-		log.debug("PARTICIPANT {}: sending a list of {} participants", user.getUid(), participantsArray.length());
+		msg.put("id", "broadcast");
+		log.debug("User {}: has started broadcast", user.getUid());
 		h.sendClient(user.getUid(), msg);
 	}
 
@@ -133,10 +122,6 @@ public class KRoom implements Closeable {
 		return participants.values();
 	}
 
-	public KUser getParticipant(String name) {
-		return participants.get(name);
-	}
-
 	@Override
 	public void close() {
 		for (final KUser user : participants.values()) {
@@ -157,8 +142,6 @@ public class KRoom implements Closeable {
 				log.warn("PARTICIPANT {}: Could not release Pipeline", KRoom.this.roomId);
 			}
 		});
-
 		log.debug("Room {} closed", this.roomId);
 	}
-
 }
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KUser.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KUser.java
index 237cc25..85b4e95 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KUser.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KUser.java
@@ -41,19 +41,15 @@ import com.github.openjson.JSONObject;
  * @since 4.3.1
  */
 public class KUser implements Closeable {
-
 	private static final Logger log = LoggerFactory.getLogger(KUser.class);
 
 	private final String uid;
-
 	private final MediaPipeline pipeline;
-
 	private final Long roomId;
 	private final WebRtcEndpoint outgoingMedia;
 	private final ConcurrentMap<String, WebRtcEndpoint> incomingMedia = new ConcurrentHashMap<>();
 
 	public KUser(final KurentoHandler h, final String uid, Long roomId, MediaPipeline pipeline) {
-
 		this.pipeline = pipeline;
 		this.uid = uid;
 		this.roomId = roomId;
@@ -66,7 +62,7 @@ public class KUser implements Closeable {
 				JSONObject response = newKurentoMsg();
 				response.put("id", "iceCandidate");
 				response.put("uid", uid);
-				response.put("candidate", JsonUtils.toJsonObject(event.getCandidate()));
+				response.put("candidate", convert(JsonUtils.toJsonObject(event.getCandidate())));
 				h.sendClient(uid, response);
 			}
 		});
@@ -96,7 +92,7 @@ public class KUser implements Closeable {
 
 		final String ipSdpAnswer = this.getEndpointForUser(h, sender).processOffer(sdpOffer);
 		final JSONObject scParams = newKurentoMsg();
-		scParams.put("id", "receiveVideoAnswer");
+		scParams.put("id", "videoResponse");
 		scParams.put("uid", sender.getUid());
 		scParams.put("sdpAnswer", ipSdpAnswer);
 
@@ -126,7 +122,7 @@ public class KUser implements Closeable {
 					JSONObject response = newKurentoMsg();
 					response.put("id", "iceCandidate");
 					response.put("uid", sender.getUid());
-					response.put("candidate", JsonUtils.toJsonObject(event.getCandidate()));
+					response.put("candidate", convert(JsonUtils.toJsonObject(event.getCandidate())));
 					h.sendClient(uid, response);
 				}
 			});
@@ -212,6 +208,10 @@ public class KUser implements Closeable {
 		}
 	}
 
+	private static JSONObject convert(com.google.gson.JsonObject o) {
+		return new JSONObject(o.toString());
+	}
+
 	/*
 	 * (non-Javadoc)
 	 *
@@ -219,7 +219,6 @@ public class KUser implements Closeable {
 	 */
 	@Override
 	public boolean equals(Object obj) {
-
 		if (this == obj) {
 			return true;
 		}
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
index d6c2f2f..0ab11d6 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
@@ -38,6 +38,8 @@ public class KurentoHandler {
 	private final static Logger log = LoggerFactory.getLogger(KurentoHandler.class);
 	public final static String KURENTO_TYPE = "kurento";
 	private final KurentoClient client = KurentoClient.create();
+	private final Map<Long, KRoom> rooms = new ConcurrentHashMap<>();
+	private final Map<String, KUser> usersByUid = new ConcurrentHashMap<>();
 
 	@Autowired
 	private IClientManager clientManager;
@@ -82,8 +84,9 @@ public class KurentoHandler {
 		log.info("PARTICIPANT {}: trying to join room {}", c, c.getRoomId());
 
 		KRoom room = getRoom(c.getRoomId());
+		clientManager.update(c.addStream(c.getUid()));
 		final KUser user = room.join(this, c.getUid());
-		register(user);
+		usersByUid.put(user.getUid(), user);
 	}
 
 	void sendClient(String uid, JSONObject msg) {
@@ -98,8 +101,6 @@ public class KurentoHandler {
 		}
 	}
 
-	private final Map<Long, KRoom> rooms = new ConcurrentHashMap<>();
-
 	/**
 	 * Looks for a room in the active room list.
 	 *
@@ -113,7 +114,7 @@ public class KurentoHandler {
 		KRoom room = rooms.get(roomId);
 
 		if (room == null) {
-			log.debug("Room {} not existent. Will create now!", roomId);
+			log.debug("Room {} does not exist. Will create now!", roomId);
 			room = new KRoom(roomId, client.createMediaPipeline());
 			rooms.put(roomId, room);
 		}
@@ -133,13 +134,6 @@ public class KurentoHandler {
 		log.info("Room {} removed and closed", room.getRoomId());
 	}
 
-
-	private final Map<String, KUser> usersByUid = new ConcurrentHashMap<>();
-
-	public void register(KUser user) {
-		usersByUid.put(user.getUid(), user);
-	}
-
 	public KUser getByUid(String uid) {
 		return usersByUid.get(uid);
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index fb3d63a..f5076bb 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -86,6 +86,7 @@ import org.apache.wicket.protocol.ws.api.BaseWebSocketBehavior;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceStreamResource;
+import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.resource.AbstractResourceStream;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
@@ -151,7 +152,7 @@ public class RoomPanel extends BasePanel {
 				sidebar.setFilesActive(target);
 			}
 			if (Room.Type.presentation != r.getType()) {
-				List<Client> mods = getBean(ClientManager.class).listByRoom(r.getId(), c -> c.hasRight(Room.Right.moderator));
+				List<Client> mods = cm.listByRoom(r.getId(), c -> c.hasRight(Room.Right.moderator));
 				if (mods.isEmpty()) {
 					waitApplyModeration.open(target);
 				}
@@ -163,7 +164,7 @@ public class RoomPanel extends BasePanel {
 			StringBuilder sb = new StringBuilder();
 			boolean hasStreams = false;
 			Client _c = getClient();
-			for (Client c: getBean(ClientManager.class).listByRoom(getRoom().getId())) {
+			for (Client c: cm.listByRoom(getRoom().getId())) {
 				boolean self = _c.getUid().equals(c.getUid());
 				for (String uid : c.getStreams()) {
 					JSONObject jo = videoJson(c, self, c.getSid(), getBean(StreamClientManager.class), uid);
@@ -223,6 +224,9 @@ public class RoomPanel extends BasePanel {
 	};
 	Component eventDetail = new WebMarkupContainer(EVENT_DETAILS_ID).setVisible(false);
 
+	@SpringBean
+	private ClientManager cm;
+
 	public RoomPanel(String id, Room r) {
 		super(id);
 		this.r = r;
@@ -239,7 +243,6 @@ public class RoomPanel extends BasePanel {
 	protected void onInitialize() {
 		super.onInitialize();
 		//let's refresh user in client
-		ClientManager cm = getBean(ClientManager.class);
 		cm.update(getClient().updateUser(getBean(UserDao.class)));
 		Component accessDenied = new WebMarkupContainer(ACCESS_DENIED_ID).setVisible(false);
 
@@ -399,7 +402,6 @@ public class RoomPanel extends BasePanel {
 			if (wsEvent.getMessage() instanceof RoomMessage) {
 				RoomMessage m = (RoomMessage)wsEvent.getMessage();
 				IPartialPageRequestHandler handler = wsEvent.getHandler();
-				ClientManager cm = getBean(ClientManager.class);
 				switch (m.getType()) {
 					case pollCreated:
 						menu.updatePoll(handler, m.getUserId());
@@ -642,7 +644,7 @@ public class RoomPanel extends BasePanel {
 		if (interview && _c.hasRight(Right.moderator)) {
 			if (recordingUser == null) {
 				boolean hasStreams = false;
-				for (Client cl : getBean(ClientManager.class).listByRoom(r.getId())) {
+				for (Client cl : cm.listByRoom(r.getId())) {
 					if (!cl.getStreams().isEmpty()) {
 						hasStreams = true;
 						break;
@@ -661,7 +663,6 @@ public class RoomPanel extends BasePanel {
 		if (room.isVisible()) {
 			//We are setting initial rights here
 			Client c = getClient();
-			ClientManager cm = getBean(ClientManager.class);
 			cm.addToRoom(c.setRoom(getRoom()));
 			SOAPLogin soap = WebSession.get().getSoapLogin();
 			if (soap != null && soap.isModerator()) {
@@ -677,12 +678,16 @@ public class RoomPanel extends BasePanel {
 		}
 	}
 
-	public static boolean isModerator(long userId, long roomId) {
-		return hasRight(userId, roomId, Right.moderator);
+	public boolean isModerator(long userId, long roomId) {
+		return isModerator(cm, userId, roomId);
+	}
+
+	public static boolean isModerator(ClientManager cm, long userId, long roomId) {
+		return hasRight(cm, userId, roomId, Right.moderator);
 	}
 
-	public static boolean hasRight(long userId, long roomId, Right r) {
-		for (Client c : getBean(ClientManager.class).listByRoom(roomId)) {
+	public static boolean hasRight(ClientManager cm, long userId, long roomId, Right r) {
+		for (Client c : cm.listByRoom(roomId)) {
 			if (c.getUserId().equals(userId) && c.hasRight(r)) {
 				return true;
 			}
@@ -725,7 +730,7 @@ public class RoomPanel extends BasePanel {
 			getMainPanel().getChat().toggle(handler, true);
 		}
 		handler.appendJavaScript("if (typeof(Room) !== 'undefined') { Room.unload(); }");
-		getBean(ClientManager.class).exitRoom(getClient());
+		cm.exitRoom(getClient());
 		getMainPanel().getChat().roomExit(r, handler);
 	}
 
@@ -741,7 +746,6 @@ public class RoomPanel extends BasePanel {
 
 	public void requestRight(Right right, IPartialPageRequestHandler handler) {
 		RoomMessage.Type reqType = null;
-		ClientManager cm = getBean(ClientManager.class);
 		List<Client> mods = cm.listByRoom(r.getId(), c -> c.hasRight(Room.Right.moderator));
 		if (mods.isEmpty()) {
 			if (r.isModerated()) {
@@ -750,7 +754,7 @@ public class RoomPanel extends BasePanel {
 				return;
 			} else {
 				// we found no-one we can ask, allow right
-				broadcast(getBean(ClientManager.class).update(getClient().allow(right)));
+				broadcast(cm.update(getClient().allow(right)));
 			}
 		}
 		// ask
@@ -791,8 +795,7 @@ public class RoomPanel extends BasePanel {
 	}
 
 	public void allowRight(Client client, Right... rights) {
-		client.allow(rights);
-		getBean(ClientManager.class).update(client);
+		cm.update(client.allow(rights));
 		broadcast(client);
 	}
 
@@ -806,7 +809,7 @@ public class RoomPanel extends BasePanel {
 		if (client.hasActivity(Client.Activity.broadcastV) && !client.hasRight(Right.video)) {
 			client.remove(Client.Activity.broadcastV);
 		}
-		getBean(ClientManager.class).update(client);
+		cm.update(client);
 		broadcast(client);
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/video-manager.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/video-manager.js
index fc09c06..ed9ea1a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/video-manager.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/video-manager.js
@@ -8,13 +8,18 @@ var VideoManager = (function() {
 		receiveVideo(request.uid);
 	}
 
-	function receiveVideoResponse(result) {
-		participants[result.uid].rtcPeer.processAnswer (result.sdpAnswer, function (error) {
-			if (error) return console.error (error);
+	function onVideoResponse(m) {
+		const w = $('#' + VideoUtil.getVid(m.uid))
+			, v = w.data()
+
+		v.getPeer().processAnswer(m.sdpAnswer, function (error) {
+			if (error) {
+				return console.error(error);
+			}
 		});
 	}
 
-	function onExistingParticipants(msg) {
+	function onBroadcast(msg) {
 		const uid = Room.getOptions().uid;
 		const w = $('#' + VideoUtil.getVid(uid))
 			, v = w.data()
@@ -44,7 +49,7 @@ var VideoManager = (function() {
 				}
 				this.generateOffer(v.offerToReceiveVideo.bind(v));
 			}));
-		msg.data.forEach(receiveVideo);
+		// TODO FIXME msg.data.forEach(receiveVideo);
 	}
 
 	function leaveRoom() {
@@ -98,8 +103,8 @@ var VideoManager = (function() {
 				console.info('Received message: ' + m);
 
 				switch (m.id) {
-					case 'existingParticipants':
-						onExistingParticipants(m);
+					case 'broadcast':
+						onBroadcast(m);
 						break;
 					case 'newParticipantArrived':
 						onNewParticipant(m);
@@ -107,16 +112,21 @@ var VideoManager = (function() {
 					case 'participantLeft':
 						onParticipantLeft(m);
 						break;
-					case 'receiveVideoAnswer':
-						receiveVideoResponse(m);
+					case 'videoResponse':
+						onVideoResponse(m);
 						break;
 					case 'iceCandidate':
-						participants[m.uid].rtcPeer.addIceCandidate(m.candidate, function (error) {
-							if (error) {
-								console.error("Error adding candidate: " + error);
-								return;
-							}
-						});
+						{
+							const w = $('#' + VideoUtil.getVid(m.uid))
+								, v = w.data()
+
+							v.getPeer().addIceCandidate(m.candidate, function (error) {
+								if (error) {
+									console.error("Error adding candidate: " + error);
+									return;
+								}
+							});
+						}
 						break;
 					default:
 						console.error('Unrecognized message', m);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/interview-area.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/interview-area.js
index ad63f30..b7f7881 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/interview-area.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/interview-area.js
@@ -5,6 +5,7 @@ var InterviewWbArea = function() {
 		, _inited = false, recStart, recStop;
 
 	function _init() {
+		Wicket.Event.subscribe("/websocket/message", wbWsHandler);
 		container = $(".room.wb.area");
 		area = container.find(".wb-area");
 		btns = $('.pod-row .pod-container .pod a.choose-btn');
@@ -79,7 +80,9 @@ var InterviewWbArea = function() {
 	}
 
 	self.init = _init;
-	self.destroy = function() {};
+	self.destroy = function() {
+		Wicket.Event.unsubscribe("/websocket/message", wbWsHandler);
+	};
 	self.setRole = _setRole;
 	self.resize = _resize;
 	self.setRecStartEnabled = _setRecStartEnabled;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-all.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-all.js
index 923d7ad..0764189 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-all.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-all.js
@@ -1,2 +1,15 @@
 /* Licensed under the Apache License, Version 2.0 (the "License") http://www.apache.org/licenses/LICENSE-2.0 */
 var NONE = 'none';
+function wbWsHandler(jqEvent, msg) {
+	try {
+		if (msg instanceof Blob) {
+			return; //ping
+		}
+		const m = jQuery.parseJSON(msg);
+		if (m && 'wb' === m.type && typeof(WbArea) !== 'undefined' && !!m.func) {
+			WbArea[m.func](m.param);
+		}
+	} catch (err) {
+		//no-op
+	}
+}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-area.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-area.js
index 4539086..dff9e3a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-area.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-area.js
@@ -153,6 +153,7 @@ var DrawWbArea = function() {
 		});
 	}
 	self.init = function() {
+		Wicket.Event.subscribe("/websocket/message", wbWsHandler);
 		container = $('.room.wb.area');
 		tabs = container.find('.tabs');
 		if (tabs.length === 0) return;
@@ -184,6 +185,7 @@ var DrawWbArea = function() {
 	};
 	self.destroy = function() {
 		self.removeDeleteHandler();
+		Wicket.Event.unsubscribe("/websocket/message", wbWsHandler);
 	};
 	self.create = function(obj) {
 		if (!_inited) return;
@@ -338,18 +340,3 @@ var DrawWbArea = function() {
 	};
 	return self;
 };
-$(function() {
-	Wicket.Event.subscribe("/websocket/message", function(jqEvent, msg) {
-		try {
-			if (msg instanceof Blob) {
-				return; //ping
-			}
-			const m = jQuery.parseJSON(msg);
-			if (m && 'wb' === m.type && typeof(WbArea) !== 'undefined' && !!m.func) {
-				WbArea[m.func](m.param);
-			}
-		} catch (err) {
-			//no-op
-		}
-	});
-});
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
index d49e99b..4b1616b 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
@@ -55,6 +55,7 @@ import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -79,7 +80,7 @@ public class Chat extends Panel {
 					long msgId = getRequest().getRequestParameters().getParameterValue(PARAM_MSG_ID).toLong();
 					ChatDao dao = getBean(ChatDao.class);
 					ChatMessage m = dao.get(msgId);
-					if (m.isNeedModeration() && isModerator(getUserId(), roomId)) {
+					if (m.isNeedModeration() && isModerator(cm, getUserId(), roomId)) {
 						m.setNeedModeration(false);
 						dao.update(m);
 						WebSocketHelper.sendRoom(m, getMessage(Arrays.asList(m)).put("mode",  "accept"));
@@ -102,6 +103,9 @@ public class Chat extends Panel {
 		}
 	};
 
+	@SpringBean
+	private ClientManager cm;
+
 	public Chat(String id) {
 		super(id);
 		setOutputMarkupPlaceholderTag(true);
@@ -147,7 +151,7 @@ public class Chat extends Panel {
 	public CharSequence addRoom(Room r) {
 		StringBuilder sb = new StringBuilder();
 		sb.append(String.format("Chat.addTab('%1$s%2$d', '%3$s %2$d');", ID_ROOM_PREFIX, r.getId(), getString("406")));
-		List<ChatMessage> list = getBean(ChatDao.class).getRoom(r.getId(), 0, 30, !r.isChatModerated() || isModerator(getUserId(), r.getId()));
+		List<ChatMessage> list = getBean(ChatDao.class).getRoom(r.getId(), 0, 30, !r.isChatModerated() || isModerator(cm, getUserId(), r.getId()));
 		if (!list.isEmpty()) {
 			sb.append("Chat.addMessage(").append(getMessage(list).toString()).append(");");
 		}
@@ -164,7 +168,7 @@ public class Chat extends Panel {
 			ChatDao dao = getBean(ChatDao.class);
 			StringBuilder sb = new StringBuilder(getReinit());
 			List<ChatMessage> list = new ArrayList<>(dao.getGlobal(0, 30));
-			for(Long roomId : getBean(ClientManager.class).listRoomIds(getUserId())) {
+			for(Long roomId : cm.listRoomIds(getUserId())) {
 				Room r = getBean(RoomDao.class).get(roomId);
 				sb.append(addRoom(r));
 			}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
index 30e88af..99c44b9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
@@ -51,6 +51,7 @@ import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.HiddenField;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -111,13 +112,13 @@ public class ChatForm extends Form<Void> {
 					if (!process(
 							() -> getChat().isShowDashboardChat()
 							, r -> {
-								if (getBean(ClientManager.class).isInRoom(r.getId(), getUserId())) {
+								if (cm.isInRoom(r.getId(), getUserId())) {
 									m.setToRoom(r);
 								} else {
 									log.error("It seems like we are being hacked!!!!");
 									return false;
 								}
-								m.setNeedModeration(r.isChatModerated() && !isModerator(m.getFromUser().getId(), r.getId()));
+								m.setNeedModeration(r.isChatModerated() && !isModerator(cm, m.getFromUser().getId(), r.getId()));
 								return true;
 							}, u -> {
 								m.setToUser(u);
@@ -144,6 +145,9 @@ public class ChatForm extends Form<Void> {
 			});
 	}
 
+	@SpringBean
+	private ClientManager cm;
+
 	private Client getClient() {
 		return findParent(MainPanel.class).getClient();
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
index 62872a7..eab74c5 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
@@ -36,6 +36,7 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.openmeetings.db.dao.basic.ChatDao;
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.web.app.ClientManager;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.pages.BasePage;
 import org.apache.wicket.AttributeModifier;
@@ -47,6 +48,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.resource.ResourceStreamResource;
+import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
 
@@ -80,7 +82,7 @@ public class ChatToolbar extends Panel implements IWysiwygToolbar {
 			final boolean admin = hasAdminLevel(getRights());
 			if (!chatForm.process(
 					() -> admin
-					, r -> admin || isModerator(getUserId(), r.getId())
+					, r -> admin || isModerator(cm, getUserId(), r.getId())
 					, u -> true))
 			{
 				rr.setError(HttpServletResponse.SC_FORBIDDEN);
@@ -121,7 +123,7 @@ public class ChatToolbar extends Panel implements IWysiwygToolbar {
 						return true;
 					}
 					, r -> {
-						if (admin || isModerator(getUserId(), r.getId())) {
+						if (admin || isModerator(cm, getUserId(), r.getId())) {
 							setFileName(String.format(CHAT_FNAME_TMPL, "room_" + r.getId()));
 							export(dao.getRoom(r.getId(), 0, Integer.MAX_VALUE, true), sb);
 						}
@@ -137,6 +139,9 @@ public class ChatToolbar extends Panel implements IWysiwygToolbar {
 		}
 	});
 
+	@SpringBean
+	private ClientManager cm;
+
 	/**
 	 * Constructor
 	 *
@@ -192,7 +197,7 @@ public class ChatToolbar extends Panel implements IWysiwygToolbar {
 						return true;
 					}
 					, r -> {
-						if (admin || isModerator(getUserId(), r.getId())) {
+						if (admin || isModerator(cm, getUserId(), r.getId())) {
 							dao.deleteRoom(r.getId());
 							clean(target, scope);
 						}
@@ -229,7 +234,7 @@ public class ChatToolbar extends Panel implements IWysiwygToolbar {
 				return true;
 			}
 			, r -> {
-				final boolean moder = admin || isModerator(getUserId(), r.getId());
+				final boolean moder = admin || isModerator(cm, getUserId(), r.getId());
 				target.add(save.setVisible(moder), delBtn.setVisible(moder));
 				return true;
 			}, u -> {

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.