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 2017/04/30 17:29:58 UTC

[46/50] [abbrv] openmeetings git commit: [OPENMEETINGS-551] existing video streams are being played on room enter

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Client.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Client.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Client.java
deleted file mode 100644
index 1fc7406..0000000
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Client.java
+++ /dev/null
@@ -1,896 +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.entity.room;
-
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-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.IClient;
-import org.apache.openmeetings.db.entity.server.Server;
-import org.apache.openmeetings.util.CalendarPatterns;
-
-/**
- * Can be configured to be stored in memory or in database
- *
- * @author sebawagner
- */
-@Entity
-@NamedQueries({
-	@NamedQuery(name = "deleteAll", query = "DELETE FROM Client"),
-	@NamedQuery(name = "deletedById", query = "DELETE FROM Client c WHERE c.id = :id"),
-	@NamedQuery(name = "deleteClientsByServer", query = "DELETE FROM Client c WHERE c.server = :server"),
-	@NamedQuery(name = "deletedByServerAndStreamId", query = "DELETE FROM Client c WHERE c.server = :server AND c.streamid LIKE :streamid"),
-	@NamedQuery(name = "countClients", query = "SELECT count(c.id) FROM Client c"),
-	@NamedQuery(name = "countClientsByServer", query = "SELECT count(c.id) FROM Client c WHERE c.server = :server"),
-	@NamedQuery(name = "countClientsByServerAndStreamId", query = "SELECT count(c.id) FROM Client c WHERE c.streamid LIKE :streamid AND c.server = :server"),
-	@NamedQuery(name = "getClientByServerAndStreamId", query = "SELECT c FROM Client c WHERE c.streamid LIKE :streamid AND c.server = :server"),
-	@NamedQuery(name = "getClientsByPublicSIDAndServer", query = "SELECT c FROM Client c WHERE c.publicSID LIKE :publicSID AND c.server = :server"),
-	@NamedQuery(name = "getClientsByPublicSID", query = "SELECT c FROM Client c WHERE c.publicSID LIKE :publicSID"),
-	@NamedQuery(name = "getClientsByServer", query = "SELECT c FROM Client c WHERE c.server = :server"),
-	@NamedQuery(name = "getClients", query = "SELECT c FROM Client c"),
-	@NamedQuery(name = "getClientsWithServer", query = "SELECT c FROM Client c LEFT JOIN FETCH c.server"),
-	@NamedQuery(name = "getClientsByUserId", query = "SELECT c FROM Client c WHERE c.server = :server AND c.userId = :userId"),
-	@NamedQuery(name = "getClientsByRoomId", query = "SELECT c FROM Client c WHERE c.roomId = :roomId"),
-	@NamedQuery(name = "getRoomsIdsByServer", query = "SELECT c.roomId FROM Client c WHERE c.server = :server GROUP BY c.roomId")
-})
-@Table(name = "client")
-@XmlRootElement
-@XmlAccessorType(XmlAccessType.FIELD)
-public class Client implements IClient {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.IDENTITY)
-	@Column(name = "id")
-	private Long id;
-
-	/**
-	 * @see Client#getUsername()
-	 */
-	@Column(name = "username")
-	private String username = "";
-
-	/**
-	 * @see Client#getStreamid()
-	 */
-	@Column(name = "streamid")
-	private String streamid = "";
-
-	/**
-	 * @see Client#getScope()
-	 */
-	@Column(name = "scope")
-	private String scope = "";
-
-	/**
-	 * @see Client#getVWidth()
-	 */
-	@Column(name = "vwidth")
-	private int vWidth = 0;
-
-	/**
-	 * @see Client#getVHeight()
-	 */
-	@Column(name = "vheight")
-	private int vHeight = 0;
-
-	/**
-	 * @see Client#getVX()
-	 */
-	@Column(name = "vx")
-	private int vX = 0;
-
-	/**
-	 * @see Client#getVY()
-	 */
-	@Column(name = "vy")
-	private int vY = 0;
-
-	/**
-	 * @see Client#getStreamPublishName()
-	 */
-	@Column(name = "stream_publish_name")
-	private String streamPublishName = "";
-
-	/**
-	 * @see Client#getPublicSID()
-	 */
-	@Column(name = "public_sid")
-	private String publicSID = "";
-
-	/**
-	 * @see Client#getIsMod()
-	 */
-	@Column(name = "is_mod", nullable = false)
-	private boolean isMod = false;
-
-	/**
-	 * @see Client#getIsSuperModerator()
-	 */
-	@Column(name = "is_supermoderator", nullable = false)
-	private boolean isSuperModerator = false;
-
-	/**
-	 * @see Client#getCanDraw()
-	 */
-	@Column(name = "can_draw", nullable = false)
-	private boolean canDraw = false;
-
-	/**
-	 * @see Client#getCanShare()
-	 */
-	@Column(name = "can_share", nullable = false)
-	private boolean canShare = false;
-
-	/**
-	 * @see Client#getCanRemote()
-	 */
-	@Column(name = "can_remote", nullable = false)
-	private boolean canRemote = false;
-
-	/**
-	 * @see Client#getCanGiveAudio()
-	 */
-	@Column(name = "can_giveaudio", nullable = false)
-	private boolean canGiveAudio = false;
-
-	@Column(name = "can_video", nullable = false)
-	private boolean canVideo = false;
-
-	/**
-	 * @see Client#getConnectedSince()
-	 */
-	@Column(name = "connected_since")
-	private Date connectedSince;
-
-	/**
-	 * @see Client#getFormatedDate()
-	 */
-	@Column(name = "formated_date")
-	private String formatedDate;
-
-	/**
-	 * @see Client#isScreenClient()
-	 */
-	@Column(name = "is_screenclient", nullable = false)
-	private boolean screenClient;
-
-	/**
-	 * @see Client#getUsercolor()
-	 */
-	@Column(name = "usercolor")
-	private String usercolor;
-
-	/**
-	 * @see Client#getUserpos()
-	 */
-	@Column(name = "userpos")
-	private Integer userpos;
-
-	/**
-	 * @see Client#getUserip()
-	 */
-	@Column(name = "userip")
-	private String userip;
-
-	/**
-	 * @see Client#getUserport()
-	 */
-	@Column(name = "userport")
-	private int userport;
-
-	/**
-	 * @see Client#getRoomId()
-	 */
-	@Column(name = "room_id")
-	private Long roomId;
-
-	/**
-	 * @see Client#getRoomEnter()
-	 */
-	@Column(name = "room_enter")
-	private Date roomEnter = null;
-
-	/**
-	 * @see Client#getBroadCastID()
-	 */
-	@Column(name = "broadcast_id")
-	private long broadCastID = -2;
-
-	/**
-	 * @see Client#getUserId()
-	 */
-	@Column(name = "user_id")
-	private Long userId = null;
-
-	/**
-	 * @see Client#getFirstname()
-	 */
-	@Column(name = "firstname")
-	private String firstname = "";
-
-	/**
-	 * @see Client#getLastname()
-	 */
-	@Column(name = "lastname")
-	private String lastname = "";
-
-	/**
-	 * @see Client#getMail()
-	 */
-	@Column(name = "email")
-	private String email;
-
-	/**
-	 * @see Client#getLastLogin()
-	 */
-	@Column(name = "last_login")
-	private String lastLogin;
-
-	/**
-	 * @see Client#getSecurityCode()
-	 */
-	@Column(name = "security_code")
-	private String securityCode;
-
-	/**
-	 * @see Client#getPicture_uri()
-	 */
-	@Column(name = "picture_uri")
-	private String picture_uri;
-
-	/**
-	 * @see Client#getLanguage()
-	 */
-	@Column(name = "language")
-	private String language = "";
-
-	/**
-	 * @see Client#getAvsettings()
-	 */
-	@Column(name = "avsettings")
-	private String avsettings = "";
-
-	/**
-	 * @see Client#getSwfurl()
-	 */
-	// FIXME: Move to {@link ClientSession}
-	@Column(name = "swfurl", length=2048)
-	private String swfurl;
-
-	@Column(name = "tcurl", length=2048)
-	private String tcUrl;
-
-	@Column(name = "nativeSsl", nullable = false)
-	private boolean nativeSsl = false;
-
-	/**
-	 * @see Client#getIsRecording()
-	 */
-	@Column(name = "is_recording", nullable = false)
-	private boolean isRecording = false;
-
-	/**
-	 * @see Client#getRoomRecordingName()
-	 */
-	@Column(name = "room_recording_name")
-	private String roomRecordingName;
-
-	/**
-	 * @see Client#getRecordingId()
-	 */
-	@Column(name = "recording_id")
-	private Long recordingId;
-
-	/**
-	 * @see Client#getRecordingMetaDataId()
-	 */
-	@Column(name = "recording_metadata_id")
-	private Long recordingMetaDataId;
-
-	/**
-	 * @see Client#isStartRecording()
-	 */
-	@Column(name = "start_recording", nullable = false)
-	private boolean startRecording = false;
-
-	/**
-	 * @see Client#isStartStreaming()
-	 */
-	@Column(name = "start_streaming", nullable = false)
-	private boolean startStreaming = false;
-
-	/**
-	 * @see Client#isScreenPublishStarted()
-	 */
-	@Column(name = "screen_publish_started", nullable = false)
-	private boolean screenPublishStarted = false;
-
-	/**
-	 * @see Client#isStreamPublishStarted()
-	 */
-	@Column(name = "stream_publish_started", nullable = false)
-	private boolean streamPublishStarted = false;
-
-	/**
-	 * @see Client#getIsBroadcasting()
-	 */
-	@Column(name = "is_broadcasting", nullable = false)
-	private boolean isBroadcasting = false;
-
-	/**
-	 * @see Client#getExternalUserId()
-	 */
-	@Column(name = "external_user_id")
-	private String externalUserId;
-
-	/**
-	 * @see Client#getExternalUserType()
-	 */
-	@Column(name = "external_user_type")
-	private String externalUserType;
-
-	/**
-	 * @see Client#getInterviewPodId()
-	 */
-	@Column(name = "interview_pod_id")
-	private Integer interviewPodId = null;
-
-	/**
-	 * @see Client#isAllowRecording()
-	 */
-	@Column(name = "allow_recording", nullable = false)
-	private boolean allowRecording = true;
-
-	/**
-	 * @see Client#getZombieCheckFlag()
-	 */
-	@Column(name = "zombie_check_flag", nullable = false)
-	private boolean zombieCheckFlag = false;
-
-	/**
-	 * @see Client#getMicMuted()
-	 */
-	@Column(name = "mic_muted", nullable = false)
-	private boolean micMuted = false;
-
-	/**
-	 * @see Client#isSipTransport()
-	 */
-	@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 Client() {}
-
-	public Client(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;
-	}
-
-	public void setUserObject(String username, String firstname, String lastname) {
-		this.username = username;
-		this.firstname = firstname;
-		this.lastname = lastname;
-	}
-
-	@Override
-	public Long getId() {
-		return id;
-	}
-
-	@Override
-	public void setId(Long id) {
-		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;
-	}
-
-	public String getFormatedDate() {
-		return formatedDate;
-	}
-
-	public void setFormatedDate(String formatedDate) {
-		this.formatedDate = formatedDate;
-	}
-
-	public String getUsercolor() {
-		return usercolor;
-	}
-
-	public void setUsercolor(String usercolor) {
-		this.usercolor = usercolor;
-	}
-
-	public Integer getUserpos() {
-		return userpos;
-	}
-
-	public void setUserpos(Integer userpos) {
-		this.userpos = userpos;
-	}
-
-	public String getUserip() {
-		return userip;
-	}
-
-	public void setUserip(String userip) {
-		this.userip = userip;
-	}
-
-	public String getSwfurl() {
-		return swfurl;
-	}
-
-	public void setSwfurl(String swfurl) {
-		this.swfurl = swfurl;
-	}
-
-	public int getUserport() {
-		return userport;
-	}
-
-	public void setUserport(int userport) {
-		this.userport = userport;
-	}
-
-	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 String getLastname() {
-		return lastname;
-	}
-
-	public void setLastname(String lastname) {
-		this.lastname = lastname;
-	}
-
-	public String getEmail() {
-		return email;
-	}
-
-	public void setEmail(String email) {
-		this.email = email;
-	}
-
-	public String getSecurityCode() {
-		return securityCode;
-	}
-
-	public void setSecurityCode(String securityCode) {
-		this.securityCode = securityCode;
-	}
-
-	public String getPicture_uri() {
-		return picture_uri;
-	}
-
-	public void setPicture_uri(String picture_uri) {
-		this.picture_uri = picture_uri;
-	}
-
-	public Long getUserId() {
-		return userId;
-	}
-
-	public void setUserId(Long userId) {
-		this.userId = userId;
-	}
-
-	public Long getRoomId() {
-		return roomId;
-	}
-
-	public void setRoomId(Long roomId) {
-		this.roomId = roomId;
-	}
-
-	public Date getRoomEnter() {
-		return roomEnter;
-	}
-
-	public void setRoomEnter(Date roomEnter) {
-		this.roomEnter = roomEnter;
-	}
-
-	public boolean getIsRecording() {
-		return isRecording;
-	}
-
-	public void setIsRecording(boolean isRecording) {
-		this.isRecording = isRecording;
-	}
-
-	public String getRoomRecordingName() {
-		return roomRecordingName;
-	}
-
-	public void setRoomRecordingName(String roomRecordingName) {
-		this.roomRecordingName = roomRecordingName;
-	}
-
-	public String getAvsettings() {
-		return avsettings;
-	}
-
-	public void setAvsettings(String avsettings) {
-		this.avsettings = avsettings;
-	}
-
-	public long getBroadCastID() {
-		return broadCastID;
-	}
-
-	public void setBroadCastID(long broadCastID) {
-		this.broadCastID = broadCastID;
-	}
-
-	public String getPublicSID() {
-		return publicSID;
-	}
-
-	public void setPublicSID(String publicSID) {
-		this.publicSID = publicSID;
-	}
-
-	public boolean getZombieCheckFlag() {
-		return zombieCheckFlag;
-	}
-
-	public void setZombieCheckFlag(boolean zombieCheckFlag) {
-		this.zombieCheckFlag = zombieCheckFlag;
-	}
-
-	public boolean getMicMuted() {
-		return micMuted;
-	}
-
-	public void setMicMuted(boolean micMuted) {
-		this.micMuted = micMuted;
-	}
-
-	public boolean getCanDraw() {
-		return canDraw;
-	}
-
-	public void setCanDraw(boolean canDraw) {
-		this.canDraw = canDraw;
-	}
-
-	public boolean getIsBroadcasting() {
-		return isBroadcasting;
-	}
-
-	public void setIsBroadcasting(boolean isBroadcasting) {
-		this.isBroadcasting = isBroadcasting;
-	}
-
-	public boolean getCanShare() {
-		return canShare;
-	}
-
-	public void setCanShare(boolean canShare) {
-		this.canShare = canShare;
-	}
-
-	public String getExternalUserId() {
-		return externalUserId;
-	}
-
-	public void setExternalUserId(String externalUserId) {
-		this.externalUserId = externalUserId;
-	}
-
-	public String getExternalUserType() {
-		return externalUserType;
-	}
-
-	public void setExternalUserType(String externalUserType) {
-		this.externalUserType = externalUserType;
-	}
-
-	public boolean getIsSuperModerator() {
-		return isSuperModerator;
-	}
-
-	public void setIsSuperModerator(boolean isSuperModerator) {
-		this.isSuperModerator = isSuperModerator;
-	}
-
-	public boolean isScreenClient() {
-		return screenClient;
-	}
-
-	public void setScreenClient(boolean screenClient) {
-		this.screenClient = screenClient;
-	}
-
-	public int getVWidth() {
-		return vWidth;
-	}
-
-	public void setVWidth(int width) {
-		vWidth = width;
-	}
-
-	public int getVHeight() {
-		return vHeight;
-	}
-
-	public void setVHeight(int height) {
-		vHeight = height;
-	}
-
-	public int getVX() {
-		return vX;
-	}
-
-	public void setVX(int vx) {
-		vX = vx;
-	}
-
-	public int getVY() {
-		return vY;
-	}
-
-	public void setVY(int vy) {
-		vY = vy;
-	}
-
-	public String getStreamPublishName() {
-		return streamPublishName;
-	}
-
-	public void setStreamPublishName(String streamPublishName) {
-		this.streamPublishName = streamPublishName;
-	}
-
-	public Long getRecordingId() {
-		return recordingId;
-	}
-
-	public void setRecordingId(Long recordingId) {
-		this.recordingId = recordingId;
-	}
-
-	public Long getRecordingMetaDataId() {
-		return recordingMetaDataId;
-	}
-
-	public void setRecordingMetaDataId(Long recordingMetaDataId) {
-		this.recordingMetaDataId = recordingMetaDataId;
-	}
-
-	public boolean isScreenPublishStarted() {
-		return screenPublishStarted;
-	}
-
-	public void setScreenPublishStarted(boolean screenPublishStarted) {
-		this.screenPublishStarted = screenPublishStarted;
-	}
-
-	public boolean isStartRecording() {
-		return startRecording;
-	}
-
-	public void setStartRecording(boolean startRecording) {
-		this.startRecording = startRecording;
-	}
-
-	public boolean isStartStreaming() {
-		return startStreaming;
-	}
-
-	public void setStartStreaming(boolean startStreaming) {
-		this.startStreaming = startStreaming;
-	}
-
-	public Integer getInterviewPodId() {
-		return interviewPodId;
-	}
-
-	public void setInterviewPodId(Integer interviewPodId) {
-		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;
-	}
-
-	public void setAllowRecording(boolean allowRecording) {
-		this.allowRecording = allowRecording;
-	}
-
-	public boolean isStreamPublishStarted() {
-		return streamPublishStarted;
-	}
-
-	public void setStreamPublishStarted(boolean streamPublishStarted) {
-		this.streamPublishStarted = streamPublishStarted;
-	}
-
-	public boolean isSipTransport() {
-		return sipTransport;
-	}
-
-	public void setSipTransport(boolean sipTransport) {
-		this.sipTransport = sipTransport;
-	}
-
-	public Server getServer() {
-		return server;
-	}
-
-	public void setServer(Server server) {
-		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;
-	}
-
-	@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 + "]";
-	}
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
----------------------------------------------------------------------
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 36cfd33..3e095cf 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
@@ -303,7 +303,7 @@ public class Room implements IDataProviderEntity {
 	private List<RoomGroup> roomGroups = new ArrayList<>();
 
 	@Transient
-	private List<Client> currentusers;
+	private List<StreamClient> currentusers;
 
 	public String getComment() {
 		return comment;
@@ -371,11 +371,11 @@ public class Room implements IDataProviderEntity {
 		this.ispublic = ispublic;
 	}
 
-	public List<Client> getCurrentusers() {
+	public List<StreamClient> getCurrentusers() {
 		return currentusers;
 	}
 
-	public void setCurrentusers(List<Client> currentusers) {
+	public void setCurrentusers(List<StreamClient> currentusers) {
 		this.currentusers = currentusers;
 	}
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/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
new file mode 100644
index 0000000..2dc1fae
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java
@@ -0,0 +1,896 @@
+/*
+ * 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.entity.room;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+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.IClient;
+import org.apache.openmeetings.db.entity.server.Server;
+import org.apache.openmeetings.util.CalendarPatterns;
+
+/**
+ * Can be configured to be stored in memory or in database
+ *
+ * @author sebawagner
+ */
+@Entity
+@NamedQueries({
+	@NamedQuery(name = "deleteAll", query = "DELETE FROM Client"),
+	@NamedQuery(name = "deletedById", query = "DELETE FROM Client c WHERE c.id = :id"),
+	@NamedQuery(name = "deleteClientsByServer", query = "DELETE FROM Client c WHERE c.server = :server"),
+	@NamedQuery(name = "deletedByServerAndStreamId", query = "DELETE FROM Client c WHERE c.server = :server AND c.streamid LIKE :streamid"),
+	@NamedQuery(name = "countClients", query = "SELECT count(c.id) FROM Client c"),
+	@NamedQuery(name = "countClientsByServer", query = "SELECT count(c.id) FROM Client c WHERE c.server = :server"),
+	@NamedQuery(name = "countClientsByServerAndStreamId", query = "SELECT count(c.id) FROM Client c WHERE c.streamid LIKE :streamid AND c.server = :server"),
+	@NamedQuery(name = "getClientByServerAndStreamId", query = "SELECT c FROM Client c WHERE c.streamid LIKE :streamid AND c.server = :server"),
+	@NamedQuery(name = "getClientsByPublicSIDAndServer", query = "SELECT c FROM Client c WHERE c.publicSID LIKE :publicSID AND c.server = :server"),
+	@NamedQuery(name = "getClientsByPublicSID", query = "SELECT c FROM Client c WHERE c.publicSID LIKE :publicSID"),
+	@NamedQuery(name = "getClientsByServer", query = "SELECT c FROM Client c WHERE c.server = :server"),
+	@NamedQuery(name = "getClients", query = "SELECT c FROM Client c"),
+	@NamedQuery(name = "getClientsWithServer", query = "SELECT c FROM Client c LEFT JOIN FETCH c.server"),
+	@NamedQuery(name = "getClientsByUserId", query = "SELECT c FROM Client c WHERE c.server = :server AND c.userId = :userId"),
+	@NamedQuery(name = "getClientsByRoomId", query = "SELECT c FROM Client c WHERE c.roomId = :roomId"),
+	@NamedQuery(name = "getRoomsIdsByServer", query = "SELECT c.roomId FROM Client c WHERE c.server = :server GROUP BY c.roomId")
+})
+@Table(name = "client")
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class StreamClient implements IClient {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name = "id")
+	private Long id;
+
+	/**
+	 * @see StreamClient#getUsername()
+	 */
+	@Column(name = "username")
+	private String username = "";
+
+	/**
+	 * @see StreamClient#getStreamid()
+	 */
+	@Column(name = "streamid")
+	private String streamid = "";
+
+	/**
+	 * @see StreamClient#getScope()
+	 */
+	@Column(name = "scope")
+	private String scope = "";
+
+	/**
+	 * @see StreamClient#getVWidth()
+	 */
+	@Column(name = "vwidth")
+	private int vWidth = 0;
+
+	/**
+	 * @see StreamClient#getVHeight()
+	 */
+	@Column(name = "vheight")
+	private int vHeight = 0;
+
+	/**
+	 * @see StreamClient#getVX()
+	 */
+	@Column(name = "vx")
+	private int vX = 0;
+
+	/**
+	 * @see StreamClient#getVY()
+	 */
+	@Column(name = "vy")
+	private int vY = 0;
+
+	/**
+	 * @see StreamClient#getStreamPublishName()
+	 */
+	@Column(name = "stream_publish_name")
+	private String streamPublishName = "";
+
+	/**
+	 * @see StreamClient#getPublicSID()
+	 */
+	@Column(name = "public_sid")
+	private String publicSID = "";
+
+	/**
+	 * @see StreamClient#getIsMod()
+	 */
+	@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;
+
+	/**
+	 * @see StreamClient#getCanRemote()
+	 */
+	@Column(name = "can_remote", nullable = false)
+	private boolean canRemote = false;
+
+	/**
+	 * @see StreamClient#getCanGiveAudio()
+	 */
+	@Column(name = "can_giveaudio", nullable = false)
+	private boolean canGiveAudio = false;
+
+	@Column(name = "can_video", nullable = false)
+	private boolean canVideo = false;
+
+	/**
+	 * @see StreamClient#getConnectedSince()
+	 */
+	@Column(name = "connected_since")
+	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")
+	private String userip;
+
+	/**
+	 * @see StreamClient#getUserport()
+	 */
+	@Column(name = "userport")
+	private int userport;
+
+	/**
+	 * @see StreamClient#getRoomId()
+	 */
+	@Column(name = "room_id")
+	private Long roomId;
+
+	/**
+	 * @see StreamClient#getRoomEnter()
+	 */
+	@Column(name = "room_enter")
+	private Date roomEnter = null;
+
+	/**
+	 * @see StreamClient#getBroadCastID()
+	 */
+	@Column(name = "broadcast_id")
+	private long broadCastID = -2;
+
+	/**
+	 * @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;
+
+	@Column(name = "tcurl", length=2048)
+	private String tcUrl;
+
+	@Column(name = "nativeSsl", nullable = false)
+	private boolean nativeSsl = false;
+
+	/**
+	 * @see StreamClient#getIsRecording()
+	 */
+	@Column(name = "is_recording", nullable = false)
+	private boolean isRecording = false;
+
+	/**
+	 * @see StreamClient#getRoomRecordingName()
+	 */
+	@Column(name = "room_recording_name")
+	private String roomRecordingName;
+
+	/**
+	 * @see StreamClient#getRecordingId()
+	 */
+	@Column(name = "recording_id")
+	private Long recordingId;
+
+	/**
+	 * @see StreamClient#getRecordingMetaDataId()
+	 */
+	@Column(name = "recording_metadata_id")
+	private Long recordingMetaDataId;
+
+	/**
+	 * @see StreamClient#isStartRecording()
+	 */
+	@Column(name = "start_recording", nullable = false)
+	private boolean startRecording = false;
+
+	/**
+	 * @see StreamClient#isStartStreaming()
+	 */
+	@Column(name = "start_streaming", nullable = false)
+	private boolean startStreaming = false;
+
+	/**
+	 * @see StreamClient#isScreenPublishStarted()
+	 */
+	@Column(name = "screen_publish_started", nullable = false)
+	private boolean screenPublishStarted = false;
+
+	/**
+	 * @see StreamClient#isStreamPublishStarted()
+	 */
+	@Column(name = "stream_publish_started", nullable = false)
+	private boolean streamPublishStarted = false;
+
+	/**
+	 * @see StreamClient#getIsBroadcasting()
+	 */
+	@Column(name = "is_broadcasting", nullable = false)
+	private boolean isBroadcasting = false;
+
+	/**
+	 * @see StreamClient#getExternalUserId()
+	 */
+	@Column(name = "external_user_id")
+	private String externalUserId;
+
+	/**
+	 * @see StreamClient#getExternalUserType()
+	 */
+	@Column(name = "external_user_type")
+	private String externalUserType;
+
+	/**
+	 * @see StreamClient#getInterviewPodId()
+	 */
+	@Column(name = "interview_pod_id")
+	private Integer interviewPodId = null;
+
+	/**
+	 * @see StreamClient#isAllowRecording()
+	 */
+	@Column(name = "allow_recording", nullable = false)
+	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)
+	private boolean micMuted = false;
+
+	/**
+	 * @see StreamClient#isSipTransport()
+	 */
+	@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;
+	}
+
+	public void setUserObject(String username, String firstname, String lastname) {
+		this.username = username;
+		this.firstname = firstname;
+		this.lastname = lastname;
+	}
+
+	@Override
+	public Long getId() {
+		return id;
+	}
+
+	@Override
+	public void setId(Long id) {
+		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;
+	}
+
+	public String getFormatedDate() {
+		return formatedDate;
+	}
+
+	public void setFormatedDate(String formatedDate) {
+		this.formatedDate = formatedDate;
+	}
+
+	public String getUsercolor() {
+		return usercolor;
+	}
+
+	public void setUsercolor(String usercolor) {
+		this.usercolor = usercolor;
+	}
+
+	public Integer getUserpos() {
+		return userpos;
+	}
+
+	public void setUserpos(Integer userpos) {
+		this.userpos = userpos;
+	}
+
+	public String getUserip() {
+		return userip;
+	}
+
+	public void setUserip(String userip) {
+		this.userip = userip;
+	}
+
+	public String getSwfurl() {
+		return swfurl;
+	}
+
+	public void setSwfurl(String swfurl) {
+		this.swfurl = swfurl;
+	}
+
+	public int getUserport() {
+		return userport;
+	}
+
+	public void setUserport(int userport) {
+		this.userport = userport;
+	}
+
+	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 String getLastname() {
+		return lastname;
+	}
+
+	public void setLastname(String lastname) {
+		this.lastname = lastname;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public String getSecurityCode() {
+		return securityCode;
+	}
+
+	public void setSecurityCode(String securityCode) {
+		this.securityCode = securityCode;
+	}
+
+	public String getPicture_uri() {
+		return picture_uri;
+	}
+
+	public void setPicture_uri(String picture_uri) {
+		this.picture_uri = picture_uri;
+	}
+
+	public Long getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+
+	public Long getRoomId() {
+		return roomId;
+	}
+
+	public void setRoomId(Long roomId) {
+		this.roomId = roomId;
+	}
+
+	public Date getRoomEnter() {
+		return roomEnter;
+	}
+
+	public void setRoomEnter(Date roomEnter) {
+		this.roomEnter = roomEnter;
+	}
+
+	public boolean getIsRecording() {
+		return isRecording;
+	}
+
+	public void setIsRecording(boolean isRecording) {
+		this.isRecording = isRecording;
+	}
+
+	public String getRoomRecordingName() {
+		return roomRecordingName;
+	}
+
+	public void setRoomRecordingName(String roomRecordingName) {
+		this.roomRecordingName = roomRecordingName;
+	}
+
+	public String getAvsettings() {
+		return avsettings;
+	}
+
+	public void setAvsettings(String avsettings) {
+		this.avsettings = avsettings;
+	}
+
+	public long getBroadCastID() {
+		return broadCastID;
+	}
+
+	public void setBroadCastID(long broadCastID) {
+		this.broadCastID = broadCastID;
+	}
+
+	public String getPublicSID() {
+		return publicSID;
+	}
+
+	public void setPublicSID(String publicSID) {
+		this.publicSID = publicSID;
+	}
+
+	public boolean getZombieCheckFlag() {
+		return zombieCheckFlag;
+	}
+
+	public void setZombieCheckFlag(boolean zombieCheckFlag) {
+		this.zombieCheckFlag = zombieCheckFlag;
+	}
+
+	public boolean getMicMuted() {
+		return micMuted;
+	}
+
+	public void setMicMuted(boolean micMuted) {
+		this.micMuted = micMuted;
+	}
+
+	public boolean getCanDraw() {
+		return canDraw;
+	}
+
+	public void setCanDraw(boolean canDraw) {
+		this.canDraw = canDraw;
+	}
+
+	public boolean getIsBroadcasting() {
+		return isBroadcasting;
+	}
+
+	public void setIsBroadcasting(boolean isBroadcasting) {
+		this.isBroadcasting = isBroadcasting;
+	}
+
+	public boolean getCanShare() {
+		return canShare;
+	}
+
+	public void setCanShare(boolean canShare) {
+		this.canShare = canShare;
+	}
+
+	public String getExternalUserId() {
+		return externalUserId;
+	}
+
+	public void setExternalUserId(String externalUserId) {
+		this.externalUserId = externalUserId;
+	}
+
+	public String getExternalUserType() {
+		return externalUserType;
+	}
+
+	public void setExternalUserType(String externalUserType) {
+		this.externalUserType = externalUserType;
+	}
+
+	public boolean getIsSuperModerator() {
+		return isSuperModerator;
+	}
+
+	public void setIsSuperModerator(boolean isSuperModerator) {
+		this.isSuperModerator = isSuperModerator;
+	}
+
+	public boolean isScreenClient() {
+		return screenClient;
+	}
+
+	public void setScreenClient(boolean screenClient) {
+		this.screenClient = screenClient;
+	}
+
+	public int getVWidth() {
+		return vWidth;
+	}
+
+	public void setVWidth(int width) {
+		vWidth = width;
+	}
+
+	public int getVHeight() {
+		return vHeight;
+	}
+
+	public void setVHeight(int height) {
+		vHeight = height;
+	}
+
+	public int getVX() {
+		return vX;
+	}
+
+	public void setVX(int vx) {
+		vX = vx;
+	}
+
+	public int getVY() {
+		return vY;
+	}
+
+	public void setVY(int vy) {
+		vY = vy;
+	}
+
+	public String getStreamPublishName() {
+		return streamPublishName;
+	}
+
+	public void setStreamPublishName(String streamPublishName) {
+		this.streamPublishName = streamPublishName;
+	}
+
+	public Long getRecordingId() {
+		return recordingId;
+	}
+
+	public void setRecordingId(Long recordingId) {
+		this.recordingId = recordingId;
+	}
+
+	public Long getRecordingMetaDataId() {
+		return recordingMetaDataId;
+	}
+
+	public void setRecordingMetaDataId(Long recordingMetaDataId) {
+		this.recordingMetaDataId = recordingMetaDataId;
+	}
+
+	public boolean isScreenPublishStarted() {
+		return screenPublishStarted;
+	}
+
+	public void setScreenPublishStarted(boolean screenPublishStarted) {
+		this.screenPublishStarted = screenPublishStarted;
+	}
+
+	public boolean isStartRecording() {
+		return startRecording;
+	}
+
+	public void setStartRecording(boolean startRecording) {
+		this.startRecording = startRecording;
+	}
+
+	public boolean isStartStreaming() {
+		return startStreaming;
+	}
+
+	public void setStartStreaming(boolean startStreaming) {
+		this.startStreaming = startStreaming;
+	}
+
+	public Integer getInterviewPodId() {
+		return interviewPodId;
+	}
+
+	public void setInterviewPodId(Integer interviewPodId) {
+		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;
+	}
+
+	public void setAllowRecording(boolean allowRecording) {
+		this.allowRecording = allowRecording;
+	}
+
+	public boolean isStreamPublishStarted() {
+		return streamPublishStarted;
+	}
+
+	public void setStreamPublishStarted(boolean streamPublishStarted) {
+		this.streamPublishStarted = streamPublishStarted;
+	}
+
+	public boolean isSipTransport() {
+		return sipTransport;
+	}
+
+	public void setSipTransport(boolean sipTransport) {
+		this.sipTransport = sipTransport;
+	}
+
+	public Server getServer() {
+		return server;
+	}
+
+	public void setServer(Server server) {
+		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;
+	}
+
+	@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 + "]";
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/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 37f8d92..0eeea98 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
@@ -52,7 +52,7 @@ import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dao.user.IUserManager;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.basic.SearchResult;
-import org.apache.openmeetings.db.entity.room.Client;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.GroupUser;
@@ -420,7 +420,7 @@ public class UserManager implements IUserManager {
 
 				sessionDao.clearSessionByRoomId(room_id);
 
-				for (Client rcl : sessionManager.getClientListByRoom(room_id)) {
+				for (StreamClient rcl : sessionManager.getClientListByRoom(room_id)) {
 					if (rcl == null) {
 						return true;
 					}
@@ -449,7 +449,7 @@ public class UserManager implements IUserManager {
 			Sessiondata sd = sessionDao.check(sid);
 			// admins only
 			if (AuthLevelUtil.hasWebServiceLevel(userDao.getRights(sd.getUserId()))) {
-				Client rcl = sessionManager.getClientByPublicSID(publicSID, null);
+				StreamClient rcl = sessionManager.getClientByPublicSID(publicSID, null);
 
 				if (rcl == null) {
 					return true;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/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 b213480..0d8e37d 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
@@ -30,7 +30,7 @@ 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.IClient;
-import org.apache.openmeetings.db.entity.room.Client;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.web.admin.AdminPanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
 import org.apache.openmeetings.web.app.Application;
@@ -89,8 +89,8 @@ public class ConnectionsPanel extends AdminPanel {
 					@Override
 					protected void onSubmit(AjaxRequestTarget target) {
 						IClient _c = item.getModelObject();
-						if (_c instanceof Client) {
-							Client c = (Client)_c;
+						if (_c instanceof StreamClient) {
+							StreamClient c = (StreamClient)_c;
 							getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid()
 									, c.getServer() == null ? 0 : c.getServer().getId());
 						} else {
@@ -100,8 +100,8 @@ public class ConnectionsPanel extends AdminPanel {
 						target.add(container, details.setVisible(false));
 					}
 				};
-				if (_c instanceof Client) {
-					Client c = (Client)_c;
+				if (_c instanceof StreamClient) {
+					StreamClient c = (StreamClient)_c;
 					item.add(new Label("streamid"));
 					item.add(new Label("login", c.getUsername()));
 					item.add(new Label("since", c.getConnectedSince()));

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/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 aa234b5..1d7d12a 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
@@ -34,7 +34,7 @@ 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.Client;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.db.entity.room.RoomGroup;
@@ -82,12 +82,12 @@ public class RoomForm extends AdminBaseForm<Room> {
 	private final TextField<String> pin = new TextField<>("pin");
 	private final WebMarkupContainer moderatorContainer = new WebMarkupContainer("moderatorContainer");
 	private final WebMarkupContainer clientsContainer = new WebMarkupContainer("clientsContainer");
-	private final ListView<Client> clients = new ListView<Client>("clients", new ArrayList<>()) {
+	private final ListView<StreamClient> clients = new ListView<StreamClient>("clients", new ArrayList<>()) {
 		private static final long serialVersionUID = 1L;
 
 		@Override
-		protected void populateItem(final ListItem<Client> item) {
-			Client client = item.getModelObject();
+		protected void populateItem(final ListItem<StreamClient> item) {
+			StreamClient client = item.getModelObject();
 			item.add(new Label("clientId", "" + client.getId()))
 				.add(new Label("clientLogin", "" + client.getUsername()))
 				.add(new ConfirmableAjaxBorder("clientDelete", getString("80"), getString("833")) {
@@ -95,7 +95,7 @@ public class RoomForm extends AdminBaseForm<Room> {
 
 					@Override
 					protected void onSubmit(AjaxRequestTarget target) {
-						Client c = item.getModelObject();
+						StreamClient c = item.getModelObject();
 						getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid()
 								, c.getServer() == null ? 0 : c.getServer().getId());
 
@@ -329,7 +329,7 @@ public class RoomForm extends AdminBaseForm<Room> {
 
 	void updateClients(AjaxRequestTarget target) {
 		long roomId = (getModelObject().getId() != null ? getModelObject().getId() : 0);
-		final List<Client> clientsInRoom = getBean(ISessionManager.class).getClientListByRoom(roomId);
+		final List<StreamClient> clientsInRoom = getBean(ISessionManager.class).getClientListByRoom(roomId);
 		clients.setDefaultModelObject(clientsInRoom);
 		target.add(clientsContainer);
 	}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/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 ac7cfa8..2718c5f 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
@@ -56,6 +56,7 @@ import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.room.Invitation;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.Right;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.util.InitializationContainer;
@@ -257,7 +258,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 		}
 	}
 
-	private static boolean hasVideo(org.apache.openmeetings.db.entity.room.Client rcl) {
+	private static boolean hasVideo(StreamClient rcl) {
 		return rcl != null && rcl.getAvsettings().contains("v");
 	}
 
@@ -266,7 +267,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 	}
 
 	@Override
-	public org.apache.openmeetings.db.entity.room.Client updateClient(org.apache.openmeetings.db.entity.room.Client rcl, boolean forceSize) {
+	public StreamClient updateClient(StreamClient rcl, boolean forceSize) {
 		if (rcl == null) {
 			return null;
 		}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
index 17a0a57..d9e203e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
@@ -24,7 +24,7 @@ import static org.apache.openmeetings.web.app.Application.getBean;
 import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dto.server.ClientSessionInfo;
-import org.apache.openmeetings.db.entity.room.Client;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.web.app.Application;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -32,13 +32,13 @@ import org.slf4j.Logger;
 public class RoomBroadcaster {
 	private static final Logger log = Red5LoggerFactory.getLogger(RoomBroadcaster.class, webAppRootKey);
 
-	public static Client getClient(String publicSid) {
+	public static StreamClient getClient(String publicSid) {
 		ClientSessionInfo csi = getBean(SessionManager.class).getClientByPublicSIDAnyServer(publicSid);
 		return csi == null ? null : csi.getRcl();
 	}
 
 	public static void broadcast(String publicSid, String method, Object obj) {
-		Client rc = getClient(publicSid);
+		StreamClient rc = getClient(publicSid);
 		if (rc == null) {
 			return;
 		}
@@ -51,7 +51,7 @@ public class RoomBroadcaster {
 	}
 
 	public static void sendUpdatedClient(org.apache.openmeetings.db.entity.basic.Client client) {
-		org.apache.openmeetings.db.entity.room.Client rcl = Application.get().updateClient(getClient(client.getUid()), true);
+		StreamClient rcl = Application.get().updateClient(getClient(client.getUid()), true);
 		log.debug("-----------  sendUpdatedClient ");
 
 		if (rcl == null) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index 0cf02f3..6341021 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
@@ -34,10 +34,11 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.UUID;
 
-import org.apache.directory.api.util.Strings;
+import org.apache.openmeetings.core.util.RoomHelper;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
 import org.apache.openmeetings.db.dao.log.ConferenceLogDao;
+import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
@@ -78,6 +79,7 @@ import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.util.string.Strings;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
@@ -122,7 +124,7 @@ public class RoomPanel extends BasePanel {
 			target.appendJavaScript(String.format("VideoManager.init(%s);", options));
 			WebSocketHelper.sendRoom(new RoomMessage(r.getId(), getUserId(), RoomMessage.Type.roomEnter));
 			// play video from other participants
-			playVideos(target);
+			initVideos(target);
 			getMainPanel().getChat().roomEnter(r, target);
 			if (r.isFilesOpened()) {
 				sidebar.setFilesActive(target);
@@ -157,14 +159,21 @@ public class RoomPanel extends BasePanel {
 		//private String publishingUser = null;
 	}
 
-	private void playVideos(AjaxRequestTarget target) {
-		for (Client c: getRoomClients(getRoom().getId()) ){
+	private void initVideos(AjaxRequestTarget target) {
+		StringBuilder sb = new StringBuilder();
+		for (Client c: getRoomClients(getRoom().getId()) ) {
 			boolean self = getClient().getUid().equals(c.getUid());
-			if (!self) {
-				JSONObject json = c.toJson(self).put("sid", getSid());
-				// TODO we should check if client is screenShare, see onEvent newStream case.
-				target.appendJavaScript(String.format("VideoManager.play(%s);", json));
+			if (c.hasAnyActivity(Client.Activity.broadcastA, Client.Activity.broadcastV)) {
+				sb.append(String.format("VideoManager.play(%s);"
+						, RoomHelper.videoJson(c, self, getSid(), getBean(ISessionManager.class), false)));
 			}
+			if (c.hasActivity(Client.Activity.share)) {
+				sb.append(String.format("VideoManager.play(%s);"
+						, RoomHelper.videoJson(c, self, getSid(), getBean(ISessionManager.class), true)));
+			}
+		}
+		if (!Strings.isEmpty(sb)) {
+			target.appendJavaScript(sb);
 		}
 	}
 
@@ -399,15 +408,8 @@ public class RoomPanel extends BasePanel {
 						Client c = getOnlineClient(obj.getString("uid"));
 						boolean self = getClient().getUid().equals(c.getUid());
 						if (!self) {
-							JSONObject json = c.toJson(self).put("sid", getSid());
-							if (obj.optBoolean("screenShare", false)) {
-								json.put("screenShare", true)
-									.put("uid", obj.getString("suid")) // unique screen-sharing ID
-									.put("broadcastId", obj.getString("broadcastId"))
-									.put("width", obj.getInt("width"))
-									.put("height", obj.getInt("height"));
-							}
-							handler.appendJavaScript(String.format("VideoManager.play(%s);", json));
+							handler.appendJavaScript(String.format("VideoManager.play(%s);"
+									, RoomHelper.videoJson(c, self, getSid(), getBean(ISessionManager.class), obj.optBoolean("screenShare", false))));
 						}
 					}
 						break;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
index 37d7115..bdb1ea8 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
@@ -38,6 +38,7 @@ import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.db.entity.room.RoomPoll;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.message.RoomMessage.Type;
@@ -300,13 +301,13 @@ public class RoomMenuPanel extends Panel {
 		StringBuilder roomTitle = new StringBuilder();
 		if (room.getRecordingUser() != null) {
 			ISessionManager sessMngr = getBean(ISessionManager.class);
-			org.apache.openmeetings.db.entity.room.Client recUser = sessMngr.getClientByPublicSID(room.getRecordingUser(), null); //TODO check server
+			StreamClient recUser = sessMngr.getClientByPublicSID(room.getRecordingUser(), null); //TODO check server
 			if (recUser != null) {
 				roomTitle.append(String.format("%s %s %s %s %s", getString("419")
 						, recUser.getUsername(), recUser.getFirstname(), recUser.getLastname(), df.format(recUser.getConnectedSince())));
 				roomClass.append(" screen");
 			}
-			org.apache.openmeetings.db.entity.room.Client pubUser = sessMngr.getClientByPublicSID(room.getPublishingUser(), null); //TODO check server
+			StreamClient pubUser = sessMngr.getClientByPublicSID(room.getPublishingUser(), null); //TODO check server
 			if (pubUser != null) {
 				if (recUser != null) {
 					roomTitle.append('\n');

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
index 1b2d687..f9e1087 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
@@ -31,7 +31,7 @@ var Video = (function() {
 		vc.width(w).height(h);
 		swf.attr('width', w).attr('height', h);
 	}
-	function _init(_box, _c) {
+	function _init(_box, _uid, _c) {
 		c = _c;
 		box = _box;
 		size = {width: c.width, height: c.height};
@@ -95,12 +95,13 @@ var Video = (function() {
 			o.cam = c.cam;
 			o.mic = c.mic;
 			o.mode = 'broadcast';
+			o.uid = c.uid;
 		} else {
 			o.mode = 'play';
+			o.uid = _uid;
 		}
 		o.width = c.width;
 		o.height = c.height;
-		o.uid = c.uid;
 		o.sid = c.sid;
 		o.broadcastId = c.broadcastId;
 		swf = initVideo(vc, _id + '-swf', o);
@@ -134,7 +135,7 @@ var VideoManager = (function() {
 			, av = audio || video
 			, v = $('#' + _id);
 		if (av && v.length != 1 && !!c.self) {
-			Video().init(box, c);
+			Video().init(box, options.uid, c);
 		} else if (av && v.length == 1) {
 			v.data().update(c);
 		} else if (!av && v.length == 1) {
@@ -142,7 +143,7 @@ var VideoManager = (function() {
 		}
 	}
 	function _play(c) {
-		Video().init(box, c);
+		Video().init(box, options.uid, c);
 	}
 	function _close(uid) {
 		var _id = _getVid(uid), v = $('#' + _id);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml
index 388277e..6a138b9 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml
@@ -46,7 +46,7 @@
 		<class>org.apache.openmeetings.db.entity.log.ConferenceLog</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
-		<class>org.apache.openmeetings.db.entity.room.Client</class>
+		<class>org.apache.openmeetings.db.entity.room.StreamClient</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.Room</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomGroup</class>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml
index 1d2b86b..4304fe5 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml
@@ -46,7 +46,7 @@
 		<class>org.apache.openmeetings.db.entity.log.ConferenceLog</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
-		<class>org.apache.openmeetings.db.entity.room.Client</class>
+		<class>org.apache.openmeetings.db.entity.room.StreamClient</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.Room</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomGroup</class>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml
index e1124ba..46237d3 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml
@@ -45,7 +45,7 @@
 		<class>org.apache.openmeetings.db.entity.log.ConferenceLog</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
-		<class>org.apache.openmeetings.db.entity.room.Client</class>
+		<class>org.apache.openmeetings.db.entity.room.StreamClient</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.Room</class>
 		<class>org.apache.openmeetings.db.entity.room.Whiteboard</class>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml
index 5263a8e..798ec15 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml
@@ -46,7 +46,7 @@
 		<class>org.apache.openmeetings.db.entity.log.ConferenceLog</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
-		<class>org.apache.openmeetings.db.entity.room.Client</class>
+		<class>org.apache.openmeetings.db.entity.room.StreamClient</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.Room</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomGroup</class>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml
index 21367c0..2a62983 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml
@@ -46,7 +46,7 @@
 		<class>org.apache.openmeetings.db.entity.log.ConferenceLog</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
-		<class>org.apache.openmeetings.db.entity.room.Client</class>
+		<class>org.apache.openmeetings.db.entity.room.StreamClient</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.Room</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomGroup</class>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml
index baa331f..a93c70d 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml
@@ -46,7 +46,7 @@
 		<class>org.apache.openmeetings.db.entity.log.ConferenceLog</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
-		<class>org.apache.openmeetings.db.entity.room.Client</class>
+		<class>org.apache.openmeetings.db.entity.room.StreamClient</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.Room</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomGroup</class>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java
index 720a7fc..6963911 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java
@@ -24,7 +24,7 @@ import java.util.List;
 
 import org.apache.openmeetings.db.dao.room.ClientDao;
 import org.apache.openmeetings.db.dao.server.ServerDao;
-import org.apache.openmeetings.db.entity.room.Client;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.server.Server;
 import org.apache.openmeetings.test.AbstractJUnitDefaults;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
@@ -58,7 +58,7 @@ public class TestDbSession extends AbstractJUnitDefaults {
 			serverDao.update(server, null);
 		}
 
-		Client cl1 = new Client();
+		StreamClient cl1 = new StreamClient();
 		cl1.setStreamid("1");
 		cl1.setServer(null);
 		cl1.setUserId(1L);
@@ -66,7 +66,7 @@ public class TestDbSession extends AbstractJUnitDefaults {
 		cl1.setPublicSID("public1");
 		clientDao.add(cl1);
 
-		Client cl2 = new Client();
+		StreamClient cl2 = new StreamClient();
 		cl2.setStreamid("2");
 		cl2.setServer(null);
 		cl2.setRoomId(1L);
@@ -74,7 +74,7 @@ public class TestDbSession extends AbstractJUnitDefaults {
 		cl2.setPublicSID("public2");
 		clientDao.add(cl2);
 
-		Client cl3 = new Client();
+		StreamClient cl3 = new StreamClient();
 		cl3.setStreamid("3");
 		cl3.setServer(server);
 		cl3.setRoomId(3L);
@@ -82,21 +82,21 @@ public class TestDbSession extends AbstractJUnitDefaults {
 		cl3.setPublicSID("public3");
 		clientDao.add(cl3);
 		
-		Client clTest = clientDao.getClientByServerAndStreamId(null, "1");
+		StreamClient clTest = clientDao.getClientByServerAndStreamId(null, "1");
 
 		log.debug("cl1 " + cl1);
 		log.debug("clTest " + clTest);
 
 		assertEquals(clTest.getId(), cl1.getId());
 
-		Client clTest3 = clientDao.getClientByServerAndStreamId(server, "3");
+		StreamClient clTest3 = clientDao.getClientByServerAndStreamId(server, "3");
 
 		log.debug("cl3 " + cl3);
 		log.debug("clTest3 " + clTest3);
 
 		assertEquals(clTest3.getId(), cl3.getId());
 
-		Client clTest_NOT_3 = clientDao.getClientByServerAndStreamId(null, "3");
+		StreamClient clTest_NOT_3 = clientDao.getClientByServerAndStreamId(null, "3");
 
 		log.debug("clTest_NOT_3 " + clTest_NOT_3);
 		assertEquals(null, clTest_NOT_3);
@@ -110,51 +110,51 @@ public class TestDbSession extends AbstractJUnitDefaults {
 		long numberOfClients4 = clientDao.countClientsByServerAndStreamId(null, "3");
 		assertEquals(0, numberOfClients4);
 		
-		List<Client> clTest_Pub_1_list = clientDao.getClientsByPublicSIDAndServer(null, "public1");
+		List<StreamClient> clTest_Pub_1_list = clientDao.getClientsByPublicSIDAndServer(null, "public1");
 		assertEquals(cl1.getId(), clTest_Pub_1_list.get(0).getId());
 		
-		List<Client> clTest_Pub_3_list = clientDao.getClientsByPublicSIDAndServer(server, "public3");
+		List<StreamClient> clTest_Pub_3_list = clientDao.getClientsByPublicSIDAndServer(server, "public3");
 		assertEquals(cl3.getId(), clTest_Pub_3_list.get(0).getId());
 		
-		List<Client> clTest_Fail_list = clientDao.getClientsByPublicSIDAndServer(null, "public3");
+		List<StreamClient> clTest_Fail_list = clientDao.getClientsByPublicSIDAndServer(null, "public3");
 		assertEquals(0, clTest_Fail_list.size());
 		
-		List<Client> clTest_PubAll_1_list = clientDao.getClientsByPublicSID("public1");
+		List<StreamClient> clTest_PubAll_1_list = clientDao.getClientsByPublicSID("public1");
 		assertEquals(cl1.getId(), clTest_PubAll_1_list.get(0).getId());
 		
-		List<Client> clTest_PubAll_3_list = clientDao.getClientsByPublicSID("public3");
+		List<StreamClient> clTest_PubAll_3_list = clientDao.getClientsByPublicSID("public3");
 		assertEquals(cl3.getId(), clTest_PubAll_3_list.get(0).getId());
 		
-		List<Client> clTest_FailAll_list = clientDao.getClientsByPublicSID("public4");
+		List<StreamClient> clTest_FailAll_list = clientDao.getClientsByPublicSID("public4");
 		assertEquals(0, clTest_FailAll_list.size());
 		
-		List<Client> clientsByServerNull = clientDao.getClientsByServer(null);
+		List<StreamClient> clientsByServerNull = clientDao.getClientsByServer(null);
 		assertEquals(2, clientsByServerNull.size());
 		
-		List<Client> clientsByServer = clientDao.getClientsByServer(server);
+		List<StreamClient> clientsByServer = clientDao.getClientsByServer(server);
 		assertEquals(1, clientsByServer.size());
 		
-		List<Client> clientsAll = clientDao.getClients();
+		List<StreamClient> clientsAll = clientDao.getClients();
 		assertEquals(3, clientsAll.size());
 		
 		//by userid
-		List<Client> clTest_User_1_list = clientDao.getClientsByUserId(null, 1L);
+		List<StreamClient> clTest_User_1_list = clientDao.getClientsByUserId(null, 1L);
 		assertEquals(cl1.getId(), clTest_User_1_list.get(0).getId());
 		
-		List<Client> clTest_User_3_list = clientDao.getClientsByUserId(server, 3L);
+		List<StreamClient> clTest_User_3_list = clientDao.getClientsByUserId(server, 3L);
 		assertEquals(cl3.getId(), clTest_User_3_list.get(0).getId());
 		
-		List<Client> clTest_UserFail_list = clientDao.getClientsByUserId(null, 3L);
+		List<StreamClient> clTest_UserFail_list = clientDao.getClientsByUserId(null, 3L);
 		assertEquals(0, clTest_UserFail_list.size());
 		
 		//by roomid
-		List<Client> clTest_Room_1_list = clientDao.getClientsByRoomId(1L);
+		List<StreamClient> clTest_Room_1_list = clientDao.getClientsByRoomId(1L);
 		assertEquals(2, clTest_Room_1_list.size());
 		
-		List<Client> clTest_Room_3_list = clientDao.getClientsByRoomId(3L);
+		List<StreamClient> clTest_Room_3_list = clientDao.getClientsByRoomId(3L);
 		assertEquals(cl3.getId(), clTest_Room_3_list.get(0).getId());
 		
-		List<Client> clTest_RoomFail_list = clientDao.getClientsByRoomId(2L);
+		List<StreamClient> clTest_RoomFail_list = clientDao.getClientsByRoomId(2L);
 		assertEquals(0, clTest_RoomFail_list.size());
 		
 		//count all

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java
index 30a0ec1..946e15c 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java
@@ -24,7 +24,7 @@ import java.util.List;
 
 import org.apache.openmeetings.db.dao.room.ClientDao;
 import org.apache.openmeetings.db.dao.server.ServerDao;
-import org.apache.openmeetings.db.entity.room.Client;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.server.Server;
 import org.apache.openmeetings.test.AbstractJUnitDefaults;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
@@ -58,7 +58,7 @@ public class TestDbSessionGetRoomIds extends AbstractJUnitDefaults {
 			serverDao.update(server, null);
 		}
 
-		Client cl1 = new Client();
+		StreamClient cl1 = new StreamClient();
 		cl1.setStreamid("1");
 		cl1.setServer(server);
 		cl1.setUserId(1L);
@@ -66,7 +66,7 @@ public class TestDbSessionGetRoomIds extends AbstractJUnitDefaults {
 		cl1.setPublicSID("public1");
 		clientDao.add(cl1);
 
-		Client cl2 = new Client();
+		StreamClient cl2 = new StreamClient();
 		cl2.setStreamid("2");
 		cl2.setServer(server);
 		cl2.setRoomId(1L);
@@ -74,7 +74,7 @@ public class TestDbSessionGetRoomIds extends AbstractJUnitDefaults {
 		cl2.setPublicSID("public2");
 		clientDao.add(cl2);
 
-		Client cl3 = new Client();
+		StreamClient cl3 = new StreamClient();
 		cl3.setStreamid("3");
 		cl3.setServer(server);
 		cl3.setRoomId(3L);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a260f5a8/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java
index e3dd291..4a50e47 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java
@@ -27,7 +27,7 @@ import java.util.Random;
 
 import org.apache.openmeetings.core.session.store.HashMapStore;
 import org.apache.openmeetings.core.session.store.IClientPersistenceStore;
-import org.apache.openmeetings.db.entity.room.Client;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.test.AbstractJUnitDefaults;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.apache.openmeetings.util.crypt.CryptProvider;
@@ -54,7 +54,7 @@ public class TestHashMapSession extends AbstractJUnitDefaults {
 			
 			String streamId = ""+i;
 			
-			Client rcm = new Client();
+			StreamClient rcm = new StreamClient();
 			rcm.setConnectedSince(new Date());
 			rcm.setStreamid(streamId);
 			rcm.setScope("scopeName");