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 2020/09/17 11:30:38 UTC

[openmeetings] branch master updated: [OPENMEETINGS-2297] it is now should be possible to enter room by externalId/Type

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4a4fcb6  [OPENMEETINGS-2297] it is now should be possible to enter room by externalId/Type
4a4fcb6 is described below

commit 4a4fcb675e245592bc023d6454e149ed57dbd3d5
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Sep 17 18:27:50 2020 +0700

    [OPENMEETINGS-2297] it is now should be possible to enter room by externalId/Type
---
 .../openmeetings/core/converter/BaseConverter.java |  6 ++++++
 .../openmeetings/core/remote/KurentoHandler.java   |  2 +-
 .../core/util/ChatWebSocketHelper.java             | 15 ++++++++++----
 .../openmeetings/core/util/WebSocketHelper.java    |  8 ++++++--
 .../core/remote/TestRecordingFlowMocked.java       |  6 +++---
 .../db/bind/adapter/OauthMapAdapter.java           |  6 ++----
 .../apache/openmeetings/db/dao/room/RoomDao.java   |  9 +++++++++
 .../openmeetings/db/dao/server/OAuth2Dao.java      |  2 +-
 .../openmeetings/db/dao/server/SOAPLoginDao.java   | 20 +++++++++----------
 .../openmeetings/db/dto/room/RoomOptionsDTO.java   | 20 +++++++++++++++++++
 .../apache/openmeetings/db/entity/room/Room.java   |  3 +++
 .../db/entity/server/RemoteSessionObject.java      | 23 ++++++++++------------
 .../openmeetings/db/entity/server/SOAPLogin.java   | 22 +++++++++++++++++++++
 .../service/calendar/caldav/IcalUtils.java         |  9 +++------
 .../service/quartz/scheduler/AtomReader.java       |  4 ++++
 .../apache/openmeetings/util/CalendarHelper.java   |  4 ++++
 .../apache/openmeetings/web/app/WebSession.java    | 11 ++++++++---
 .../openmeetings/web/common/InvitationForm.java    |  2 +-
 .../web/pages/auth/ForgetPasswordDialog.java       |  2 +-
 .../web/room/wb/WbWebSocketHelper.java             | 13 ++++++++----
 .../openmeetings/web/util/CalendarWebHelper.java   | 14 ++++++++-----
 .../openmeetings/webservice/UserWebService.java    | 11 ++---------
 22 files changed, 145 insertions(+), 67 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
index 5599b11..941c31d 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
@@ -309,6 +309,12 @@ public abstract class BaseConverter {
 		return getDimensions(r, 'x');
 	}
 
+	/**
+	 * This method should be overridden to supply any additional parameters
+	 *
+	 * @param r - recording to get params from
+	 * @return additional conversion parameters
+	 */
 	protected List<String> additionalMp4OutParams(Recording r) {
 		return List.of();
 	}
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 42d6874..1722358 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
@@ -188,7 +188,7 @@ public class KurentoHandler {
 			try {
 				KurentoClient copy = client;
 				client = null;
-				if (copy != null && !copy.isClosed()) {
+				if (!copy.isClosed()) {
 					log.debug("Client will destroyed ...");
 					copy.destroy();
 					log.debug(".... Client is destroyed");
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ChatWebSocketHelper.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ChatWebSocketHelper.java
index 631023b..61d480f 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ChatWebSocketHelper.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ChatWebSocketHelper.java
@@ -18,6 +18,9 @@
  */
 package org.apache.openmeetings.core.util;
 
+import static org.apache.openmeetings.core.util.WebSocketHelper.doSend;
+import static org.apache.openmeetings.core.util.WebSocketHelper.publish;
+
 import java.util.List;
 import java.util.function.BiConsumer;
 
@@ -36,12 +39,16 @@ import org.apache.openmeetings.util.ws.IClusterWsMessage;
 import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 
-public class ChatWebSocketHelper extends WebSocketHelper {
+public class ChatWebSocketHelper {
 	public static final String ID_TAB_PREFIX = "chatTab-";
 	public static final String ID_ALL = ID_TAB_PREFIX + "all";
 	public static final String ID_ROOM_PREFIX = ID_TAB_PREFIX + "r";
 	public static final String ID_USER_PREFIX = ID_TAB_PREFIX + "u";
 
+	private ChatWebSocketHelper() {
+		// denied
+	}
+
 	private static JSONObject setScope(JSONObject o, ChatMessage m, long curUserId) {
 		String scope, scopeName = null;
 		if (m.getToUser() != null) {
@@ -117,7 +124,7 @@ public class ChatWebSocketHelper extends WebSocketHelper {
 		if (publish) {
 			publish(new WsMessageChat(m, msg));
 		}
-		sendRoom(m.getToRoom().getId(), msg
+		WebSocketHelper.sendRoom(m.getToRoom().getId(), msg
 				, c -> !m.isNeedModeration() || (m.isNeedModeration() && c.hasRight(Right.MODERATOR))
 				, (o, c) -> setDates(o, m, c.getUser(), false));
 	}
@@ -130,7 +137,7 @@ public class ChatWebSocketHelper extends WebSocketHelper {
 		if (publish) {
 			publish(new WsMessageChat2User(userId, m, msg));
 		}
-		sendUser(userId, msg, (o, c) -> setDates(o, m, c.getUser(), false), false);
+		WebSocketHelper.sendUser(userId, msg, (o, c) -> setDates(o, m, c.getUser(), false), false);
 	}
 
 	public static void sendAll(ChatMessage m, JSONObject msg) {
@@ -141,7 +148,7 @@ public class ChatWebSocketHelper extends WebSocketHelper {
 		if (publish) {
 			publish(new WsMessageChat2All(m, msg));
 		}
-		send(a -> ((IApplication)a).getBean(IClientManager.class).list()
+		WebSocketHelper.send(a -> ((IApplication)a).getBean(IClientManager.class).list()
 				, (t, c) -> doSend(t, c, msg, (o, cm) -> setDates(o, m, c.getUser(), false), "all"), null);
 	}
 }
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
index cc2b451..10a2de7 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
@@ -55,6 +55,10 @@ import com.github.openjson.JSONObject;
 public class WebSocketHelper {
 	private static final Logger log = LoggerFactory.getLogger(WebSocketHelper.class);
 
+	private WebSocketHelper() {
+		// denied
+	}
+
 	public static void sendClient(final IWsClient omClient, byte[] b) {
 		if (omClient != null) {
 			sendClient(omClient, c -> {
@@ -212,12 +216,12 @@ public class WebSocketHelper {
 		}).start();
 	}
 
-	protected static void publish(IClusterWsMessage m) {
+	public static void publish(IClusterWsMessage m) {
 		IApplication app = getApp();
 		new Thread(() -> app.publishWsTopic(m)).start();
 	}
 
-	protected static void sendRoom(final Long roomId, final JSONObject m, Predicate<Client> check, BiFunction<JSONObject, Client, JSONObject> func) {
+	public static void sendRoom(final Long roomId, final JSONObject m, Predicate<Client> check, BiFunction<JSONObject, Client, JSONObject> func) {
 		log.trace("Sending json WebSocket message to room: {}", m);
 		sendRoom(roomId, (t, c) -> doSend(t, c, m, func, "room"), check);
 	}
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
index cdb24f8..724008b 100644
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
@@ -153,7 +153,7 @@ class TestRecordingFlowMocked extends BaseMockedTest {
 		assertTrue(streamProcessor.isSharing(ROOM_ID));
 
 		// Get current Stream, there should be only 1 KStream created as result of this
-		assertTrue(c.getStreams().size() == 1);
+		assertEquals(1, c.getStreams().size());
 		StreamDesc streamDesc = c.getStreams().get(0);
 
 		//save UID for stopping the stream later
@@ -175,7 +175,7 @@ class TestRecordingFlowMocked extends BaseMockedTest {
 		verify(streamProcessor).startBroadcast(any(), any(), any());
 
 		// Assert that there is still just 1 stream and has only the activities to Record assigned
-		assertTrue(c.getStreams().size() == 1);
+		assertEquals(1, c.getStreams().size());
 		streamDesc = c.getStreams().get(0);
 		assertEquals(1, streamDesc.getActivities().size());
 		assertEquals(Activity.RECORD, streamDesc.getActivities().get(0));
@@ -208,6 +208,6 @@ class TestRecordingFlowMocked extends BaseMockedTest {
 		// Verify it did also stop the sharing stream
 		verify(streamProcessor).pauseSharing(any(), any());
 		// Verify all streams gone
-		assertTrue(c.getStreams().size() == 0);
+		assertTrue(c.getStreams().isEmpty());
 	}
 }
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/OauthMapAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/OauthMapAdapter.java
index aa932bb..e009901 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/OauthMapAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/OauthMapAdapter.java
@@ -82,10 +82,8 @@ public class OauthMapAdapter extends XmlAdapter<Object, Map<String, String>> {
 						key = n;
 						continue;
 					}
-					if (value == null) {
-						value = n;
-						break;
-					}
+					value = n;
+					break;
 				}
 				if (key != null && value != null) {
 					putValue(map, key.getTextContent(), value.getTextContent());
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
index 1f57e55..3d2f039 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
@@ -261,6 +261,15 @@ public class RoomDao implements IGroupAdminDataProviderDao<Room> {
 		}
 	}
 
+	public Room getExternal(String externalType, String externalId) {
+		log.debug("getExternal : {}  - {}", externalType, externalId);
+		return single(fillLazy(em
+				, oem -> oem.createNamedQuery("getExternalRoomNoType", Room.class)
+					.setParameter("externalId", externalId)
+					.setParameter("externalType", externalType)
+				, GRP_GROUPS));
+	}
+
 	public Room getExternal(Type type, String externalType, String externalId) {
 		log.debug("getExternal : {} - {}  - {}", type, externalType, externalId);
 		return single(fillLazy(em
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/OAuth2Dao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/OAuth2Dao.java
index 4a48779..a484cba 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/OAuth2Dao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/OAuth2Dao.java
@@ -44,7 +44,7 @@ public class OAuth2Dao implements IDataProviderDao<OAuthServer> {
 	@PersistenceContext
 	private EntityManager em;
 	@Autowired
-	private ConfigurationDao cfgDao;;
+	private ConfigurationDao cfgDao;
 
 	public List<OAuthServer> getActive() {
 		if (!isAllowRegisterOauth()) {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java
index e7b8e3c..8996843 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java
@@ -26,6 +26,7 @@ import java.util.List;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 
+import org.apache.openmeetings.db.dto.room.RoomOptionsDTO;
 import org.apache.openmeetings.db.entity.server.SOAPLogin;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,21 +41,20 @@ public class SOAPLoginDao {
 	@PersistenceContext
 	private EntityManager em;
 
-	public String addSOAPLogin(String sessionHash, Long roomId,
-			boolean becomemoderator, boolean showAudioVideoTest,
-			boolean allowSameURLMultipleTimes, Long recordingId,
-			boolean allowRecording) {
+	public String addSOAPLogin(String sessionHash, RoomOptionsDTO options) {
 		SOAPLogin soapLogin = new SOAPLogin();
 		soapLogin.setCreated(new Date());
 		soapLogin.setUsed(false);
-		soapLogin.setRoomId(roomId);
-		soapLogin.setAllowSameURLMultipleTimes(allowSameURLMultipleTimes);
+		soapLogin.setRoomId(options.getRoomId());
+		soapLogin.setExternalRoomId(options.getExternalRoomId());
+		soapLogin.setExternalType(options.getExternalType());
+		soapLogin.setAllowSameURLMultipleTimes(options.isAllowSameURLMultipleTimes());
 		soapLogin.setHash(randomUUID().toString());
-		soapLogin.setRecordingId(recordingId);
+		soapLogin.setRecordingId(options.getRecordingId());
 		soapLogin.setSessionHash(sessionHash);
-		soapLogin.setModerator(becomemoderator);
-		soapLogin.setShowAudioVideoTest(showAudioVideoTest);
-		soapLogin.setAllowRecording(allowRecording);
+		soapLogin.setModerator(options.isModerator());
+		soapLogin.setShowAudioVideoTest(options.isShowAudioVideoTest());
+		soapLogin.setAllowRecording(options.isAllowRecording());
 
 		em.persist(soapLogin);
 		em.flush();
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
index 07c5428..000762a 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
@@ -33,6 +33,8 @@ import com.github.openjson.JSONObject;
 public class RoomOptionsDTO implements Serializable {
 	private static final long serialVersionUID = 1L;
 	private Long roomId;
+	private String externalRoomId;
+	private String externalType;
 	private Long recordingId;
 	private boolean moderator;
 	private boolean showAudioVideoTest;
@@ -52,6 +54,22 @@ public class RoomOptionsDTO implements Serializable {
 		return this;
 	}
 
+	public String getExternalRoomId() {
+		return externalRoomId;
+	}
+
+	public void setExternalRoomId(String externalRoomId) {
+		this.externalRoomId = externalRoomId;
+	}
+
+	public String getExternalType() {
+		return externalType;
+	}
+
+	public void setExternalType(String externalType) {
+		this.externalType = externalType;
+	}
+
 	public Long getRecordingId() {
 		return recordingId;
 	}
@@ -101,6 +119,8 @@ public class RoomOptionsDTO implements Serializable {
 		ro.moderator = o.optBoolean("moderator", false);
 		ro.recordingId = optLong(o, "recordingId");
 		ro.roomId = optLong(o, "roomId");
+		ro.externalRoomId = o.optString("externalRoomId");
+		ro.externalType = o.optString("externalType");
 		ro.showAudioVideoTest = o.optBoolean("showAudioVideoTest", false);
 		return ro;
 	}
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
index 72663a7..e9e021c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
@@ -81,6 +81,9 @@ import org.apache.openmeetings.db.entity.user.Group;
 @NamedQuery(name = "getExternalRoom", query = "SELECT rg.room FROM RoomGroup rg WHERE "
 		+ "rg.group.deleted = false AND rg.group.external = true AND rg.group.name = :externalType "
 		+ "AND rg.room.deleted = false AND rg.room.type = :type AND rg.room.externalId = :externalId")
+@NamedQuery(name = "getExternalRoomNoType", query = "SELECT rg.room FROM RoomGroup rg WHERE "
+		+ "rg.group.deleted = false AND rg.group.external = true AND rg.group.name = :externalType "
+		+ "AND rg.room.deleted = false AND rg.room.externalId = :externalId")
 @NamedQuery(name = "getPublicRoomsOrdered", query = "SELECT r from Room r WHERE r.ispublic= true AND r.deleted= false AND r.appointment = false ORDER BY r.name ASC")
 @NamedQuery(name = "getRoomById", query = "SELECT r FROM Room r WHERE r.deleted = false AND r.id = :id")
 @NamedQuery(name = "getRoomsByIds", query = "SELECT r FROM Room r WHERE r.deleted = false AND r.id IN :ids")
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/RemoteSessionObject.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/RemoteSessionObject.java
index 284048b..4c9df11 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/RemoteSessionObject.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/RemoteSessionObject.java
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.db.entity.server;
 
+import org.apache.openmeetings.db.dto.user.ExternalUserDTO;
+
 import com.github.openjson.JSONObject;
 
 /**
@@ -40,10 +42,6 @@ public class RemoteSessionObject {
 		// def constructor
 	}
 
-	public RemoteSessionObject(String username, String firstname, String lastname, String pictureUrl, String email) {
-		this(username, firstname, lastname, pictureUrl, email, "0", "");
-	}
-
 	/**
 	 * @param username
 	 *            - username
@@ -62,15 +60,14 @@ public class RemoteSessionObject {
 	 *
 	 *            06.09.2009 17:05:48 sebastianwagner
 	 */
-	public RemoteSessionObject(String username, String firstname, String lastname, String pictureUrl, String email,
-			String externalId, String externalType) {
-		this.username = username;
-		this.firstname = firstname;
-		this.lastname = lastname;
-		this.pictureUrl = pictureUrl;
-		this.email = email;
-		this.externalId = externalId;
-		this.externalType = externalType;
+	public RemoteSessionObject(ExternalUserDTO user) {
+		this.username = user.getLogin();
+		this.firstname = user.getFirstname();
+		this.lastname = user.getLastname();
+		this.pictureUrl = user.getProfilePictureUrl();
+		this.email = user.getEmail();
+		this.externalId = user.getExternalId();
+		this.externalType = user.getExternalType();
 	}
 
 	public String getUsername() {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/SOAPLogin.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/SOAPLogin.java
index 9800f9e..6f884a6 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/SOAPLogin.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/SOAPLogin.java
@@ -48,6 +48,12 @@ public class SOAPLogin implements Serializable {
 	@Column(name = "room_id")
 	private Long roomId;
 
+	@Column(name = "external_room_id")
+	private String externalRoomId;
+
+	@Column(name = "external_type")
+	private String externalType;
+
 	@Column(name = "session_hash")
 	private String sessionHash;
 
@@ -102,6 +108,22 @@ public class SOAPLogin implements Serializable {
 		this.roomId = roomId;
 	}
 
+	public String getExternalRoomId() {
+		return externalRoomId;
+	}
+
+	public void setExternalRoomId(String externalRoomId) {
+		this.externalRoomId = externalRoomId;
+	}
+
+	public String getExternalType() {
+		return externalType;
+	}
+
+	public void setExternalType(String externalType) {
+		this.externalType = externalType;
+	}
+
 	public String getSessionHash() {
 		return sessionHash;
 	}
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
index f34c217..53a8cae 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
@@ -403,7 +403,7 @@ public class IcalUtils {
 		DateTime start = new DateTime(appointment.getStart()), end = new DateTime(appointment.getEnd());
 
 		VEvent meeting = new VEvent(start, end, appointment.getTitle());
-		meeting = addVEventpropsfromAppointment(appointment, meeting);
+		addVEventpropsfromAppointment(appointment, meeting);
 		icsCalendar.getComponents().add(meeting);
 
 		return icsCalendar;
@@ -416,8 +416,7 @@ public class IcalUtils {
 	 * @param meeting     VEvent of the Appointment
 	 * @return Updated VEvent
 	 */
-	private static VEvent addVEventpropsfromAppointment(Appointment appointment, VEvent meeting) {
-
+	private static void addVEventpropsfromAppointment(Appointment appointment, VEvent meeting) {
 		if (appointment.getLocation() != null) {
 			meeting.getProperties().add(new Location(appointment.getLocation()));
 		}
@@ -457,8 +456,6 @@ public class IcalUtils {
 		Organizer organizer = new Organizer(orgUri);
 		organizer.getParameters().add(orgCn);
 		meeting.getProperties().add(organizer);
-
-		return meeting;
 	}
 
 	/**
@@ -488,7 +485,7 @@ public class IcalUtils {
 			DateTime start = new DateTime(appointment.getStart()), end = new DateTime(appointment.getEnd());
 
 			VEvent meeting = new VEvent(start, end, appointment.getTitle());
-			meeting = addVEventpropsfromAppointment(appointment, meeting);
+			addVEventpropsfromAppointment(appointment, meeting);
 			icsCalendar.getComponents().add(meeting);
 		}
 		return icsCalendar;
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AtomReader.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AtomReader.java
index 0513a95..ca3e46e 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AtomReader.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AtomReader.java
@@ -67,6 +67,10 @@ public class AtomReader {
 			.add(new Field("author"));
 	}
 
+	private AtomReader() {
+		// denied
+	}
+
 	private static Spec add(String name) {
 		Spec s = new Spec(name);
 		specs.put(name, s);
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarHelper.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarHelper.java
index b880245..3b2a39f 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarHelper.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarHelper.java
@@ -27,6 +27,10 @@ import java.util.Date;
 import java.util.concurrent.TimeUnit;
 
 public class CalendarHelper {
+	private CalendarHelper() {
+		// denied
+	}
+
 	public static ZoneId getZoneId(String tzId) {
 		return ZoneId.of(tzId, ZoneId.SHORT_IDS);
 	}
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 f59f17d..2a312bf 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
@@ -286,8 +286,13 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS
 			if (sd.getXml() != null) {
 				RemoteSessionObject remoteUser = RemoteSessionObject.fromString(sd.getXml());
 				log.debug("Hash data was parsed successfuly ? {}, containg exterlaId ? {}", (remoteUser != null), !Strings.isEmpty(remoteUser.getExternalId()));
-				if (remoteUser != null && !Strings.isEmpty(remoteUser.getExternalId())) {
-					Room r = roomDao.get(soapLogin.getRoomId());
+				if (!Strings.isEmpty(remoteUser.getExternalId())) {
+					Room r;
+					if (Strings.isEmpty(soapLogin.getExternalRoomId()) || Strings.isEmpty(soapLogin.getExternalType())) {
+						r = roomDao.get(soapLogin.getRoomId());
+					} else {
+						r = roomDao.getExternal(soapLogin.getExternalType(), soapLogin.getExternalRoomId());
+					}
 					if (r == null) {
 						log.warn("Room was not found");
 					} else {
@@ -317,7 +322,7 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS
 						soapLogin.setUseDate(new Date());
 						soapDao.update(soapLogin);
 					}
-					roomId = soapLogin.getRoomId();
+					roomId = r == null ? null : r.getId();
 					sd.setUserId(user.getId());
 					sd.setRoomId(roomId);
 					sessionDao.update(sd);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
index 33ef7f0..9657f7d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
@@ -87,7 +87,7 @@ public abstract class InvitationForm extends Form<Invitation> {
 	public enum Action {
 		GENERATE
 		, SEND
-	};
+	}
 
 	public InvitationForm(String id) {
 		super(id, new CompoundPropertyModel<>(new Invitation()));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
index 465449b..7923aa2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
@@ -268,5 +268,5 @@ public class ForgetPasswordDialog extends Modal<String> {
 			wasReset = true;
 			ForgetPasswordDialog.this.close(target);
 		}
-	};
+	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java
index af62dae..c7b8232 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java
@@ -18,12 +18,13 @@
  */
 package org.apache.openmeetings.web.room.wb;
 
+import static org.apache.openmeetings.core.util.WebSocketHelper.publish;
+import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_SRC;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM__SRC;
 
 import java.util.function.Predicate;
 
-import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.util.NullStringer;
@@ -40,10 +41,14 @@ import org.apache.wicket.resource.FileSystemResourceReference;
 
 import com.github.openjson.JSONObject;
 
-public class WbWebSocketHelper extends WebSocketHelper {
+public class WbWebSocketHelper {
 	public static final String PARAM_OBJ = "obj";
 	private static final String PARAM__POSTER = "_poster";
 
+	private WbWebSocketHelper() {
+		// denied
+	}
+
 	public static boolean send(IClusterWsMessage inMsg) {
 		if (inMsg instanceof WsMessageWb) {
 			WsMessageWb m = (WsMessageWb)inMsg;
@@ -163,7 +168,7 @@ public class WbWebSocketHelper extends WebSocketHelper {
 			publish(new WsMessageWbFile(roomId, wbId, ruid, file, fi));
 		}
 		final JSONObject f = addFileUrl(ruid, file, fi, null);
-		WebSocketHelper.sendRoom(
+		sendRoom(
 				roomId
 				, new JSONObject().put("type", "wb")
 				, null
@@ -172,7 +177,7 @@ public class WbWebSocketHelper extends WebSocketHelper {
 	}
 
 	private static void sendWb(Long roomId, WbAction meth, JSONObject obj, Predicate<Client> check) {
-		WebSocketHelper.sendRoom(
+		sendRoom(
 				roomId
 				, new JSONObject().put("type", "wb")
 				, check
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/CalendarWebHelper.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/CalendarWebHelper.java
index d5b5106..d05a0c1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/CalendarWebHelper.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/CalendarWebHelper.java
@@ -27,20 +27,24 @@ import java.util.Date;
 
 import org.apache.openmeetings.util.CalendarHelper;
 
-public class CalendarWebHelper extends CalendarHelper {
+public class CalendarWebHelper {
+	private CalendarWebHelper() {
+		// denied
+	}
+
 	public static ZoneId getZoneId() {
-		return getZoneId(getUserTimeZone().getID());
+		return CalendarHelper.getZoneId(getUserTimeZone().getID());
 	}
 
 	public static Date getDate(LocalDateTime d) {
-		return getDate(d, getUserTimeZone().getID());
+		return CalendarHelper.getDate(d, getUserTimeZone().getID());
 	}
 
 	public static Date getDate(LocalDate d) {
-		return getDate(d, getUserTimeZone().getID());
+		return CalendarHelper.getDate(d, getUserTimeZone().getID());
 	}
 
 	public static LocalDateTime getDateTime(Date d) {
-		return getDateTime(d, getUserTimeZone().getID());
+		return CalendarHelper.getDateTime(d, getUserTimeZone().getID());
 	}
 }
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
index 65ca5e2..7d469de 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
@@ -300,10 +300,7 @@ public class UserWebService extends BaseWebService {
 			if (Strings.isEmpty(user.getExternalId()) || Strings.isEmpty(user.getExternalType())) {
 				return new ServiceResult("externalId and/or externalType are not set", Type.ERROR);
 			}
-			RemoteSessionObject remoteSessionObject = new RemoteSessionObject(
-					user.getLogin(), user.getFirstname(), user.getLastname()
-					, user.getProfilePictureUrl(), user.getEmail()
-					, user.getExternalId(), user.getExternalType());
+			RemoteSessionObject remoteSessionObject = new RemoteSessionObject(user);
 
 			log.debug(remoteSessionObject.toString());
 
@@ -311,11 +308,7 @@ public class UserWebService extends BaseWebService {
 
 			log.debug("jsonString {}", xmlString);
 
-			String hash = soapDao.addSOAPLogin(sid, options.getRoomId(),
-					options.isModerator(), options.isShowAudioVideoTest(), options.isAllowSameURLMultipleTimes(),
-					options.getRecordingId(),
-					options.isAllowRecording()
-					);
+			String hash = soapDao.addSOAPLogin(sid, options);
 
 			if (hash != null) {
 				if (options.isAllowSameURLMultipleTimes()) {