try {
//Return Object
RoomStatus roomStatus = new RoomStatus();
IConnection current = Red5.getConnectionLocal();
String streamid = current.getClient().getId();
RoomClient currentClient = this.clientListManager.getClientByStreamId(streamid);
currentClient.setRoom_id(room_id);
currentClient.setRoomEnter(new Date());
currentClient.setOrganization_id(organization_id);
currentClient.setUsercolor(colorObj);
//Inject externalUserId if nothing is set yet
if (currentClient.getExternalUserId() == null) {
Users us = UsersDaoImpl.getInstance().getUser(currentClient.getUser_id());
if (us != null) {
currentClient.setExternalUserId(us.getExternalUserId());
currentClient.setExternalUserType(us.getExternalUserType());
}
}
//This can be set without checking for Moderation Flag
currentClient.setIsSuperModerator(isSuperModerator);
this.clientListManager.updateClientByStreamId(streamid, currentClient);
//Log the User
ConferenceLogDaoImpl.getInstance().addConferenceLog("roomEnter", currentClient.getUser_id(),
streamid, room_id, currentClient.getUserip(), "",
currentClient.getExternalUserId(), currentClient.getExternalUserType(),
currentClient.getMail(),currentClient.getFirstname(),currentClient.getLastname()
);
log.debug("##### setRoomValues : " + currentClient.getUsername()+" "+currentClient.getStreamid()); // just a unique number
//Check for Moderation
//LogicalRoom ENTER
HashMap<String,RoomClient> clientListRoom = this.getRoomClients(room_id);
// appointed meeting or moderated Room?
Rooms room = Roommanagement.getInstance().getRoomById(room_id);
//Check Max Users first
if (room.getNumberOfPartizipants() != null && clientListRoom.size() > room.getNumberOfPartizipants()) {
roomStatus.setRoomFull(true);
return roomStatus;
}
// not really - default logic
if(room.getAppointment() == null || room.getAppointment() == false){
if (room.getIsModeratedRoom()) {
//if this is a Moderated Room then the Room can be only locked off by the Moderator Bit
//List<RoomClient> clientModeratorListRoom = this.clientListManager.getCurrentModeratorByRoom(room_id);
//If there is no Moderator yet we have to check if the current User has the Bit set to true to
//become one, otherwise he won't get Moderation and has to wait
if (becomeModerator) {
currentClient.setIsMod(true);
//There is a need to send an extra Event here, cause at this moment there could be
//already somebody in the Room waiting
//Update the Client List
this.clientListManager.updateClientByStreamId(streamid, currentClient);
List<RoomClient> modRoomList = this.clientListManager.getCurrentModeratorByRoom(currentClient.getRoom_id());
//Notify all clients of the same scope (room)
Collection<Set<IConnection>> conCollection = current.getScope().getConnections();
for (Set<IConnection> conset : conCollection) {
for (IConnection conn : conset) {
if (conn != null) {
RoomClient rcl = this.clientListManager.getClientByStreamId(conn.getClient().getId());
if (rcl == null) {
//continue;
} else if (rcl.getIsScreenClient() != null && rcl.getIsScreenClient()) {
//continue;
} else {
if( !streamid.equals(rcl.getStreamid())){
//It is not needed to send back that event to the actuall Moderator
//as it will be already triggered in the result of this Function
//in the Client
if (conn instanceof IServiceCapableConnection) {
((IServiceCapableConnection) conn).invoke("setNewModeratorByList",new Object[] { modRoomList }, this);
log.debug("sending setNewModeratorByList to " + conn);
}
}
}
}
}
}
} else {
//The current User is not a Teacher/Admin or whatever Role that should get the
//Moderation
currentClient.setIsMod(false);
}
} else {
//If this is a normal Room Moderator rules : first come, first draw ;-)
log.debug("setRoomValues : Room" + room_id + " not appointed! Moderator rules : first come, first draw ;-)" );
if (clientListRoom.size()==1){
log.debug("Room is empty so set this user to be moderation role");
currentClient.setIsMod(true);
} else {
log.debug("Room is already somebody so set this user not to be moderation role");
if (becomeModerator) {
currentClient.setIsMod(true);
//Update the Client List
this.clientListManager.updateClientByStreamId(streamid, currentClient);
List<RoomClient> modRoomList = this.clientListManager.getCurrentModeratorByRoom(currentClient.getRoom_id());
//There is a need to send an extra Event here, cause at this moment there could be
//already somebody in the Room waiting
//Notify all clients of the same scope (room)
Collection<Set<IConnection>> conCollection = current.getScope().getConnections();
for (Set<IConnection> conset : conCollection) {
for (IConnection conn : conset) {
if (conn != null) {
RoomClient rcl = this.clientListManager.getClientByStreamId(conn.getClient().getId());
if (rcl == null) {
//continue;
} else if (rcl.getIsScreenClient() != null && rcl.getIsScreenClient()) {
//continue;
} else {
if( !streamid.equals(rcl.getStreamid())){
//It is not needed to send back that event to the actual Moderator
//as it will be already triggered in the result of this Function
//in the Client
if (conn instanceof IServiceCapableConnection) {
((IServiceCapableConnection) conn).invoke("setNewModeratorByList",new Object[] { modRoomList }, this);
log.debug("sending setNewModeratorByList to " + conn);
}
}
}
}
}
}
} else {
//The current User is not a Teacher/Admin or whatever Role that should get the
//Moderation
currentClient.setIsMod(false);
}
}
}
//Update the Client List
this.clientListManager.updateClientByStreamId(streamid, currentClient);
} else{
//If this is an Appointment then the Moderator will be set to the Invitor
Appointment ment = AppointmentLogic.getInstance().getAppointmentByRoom(room_id);
List<MeetingMember> members = MeetingMemberDaoImpl.getInstance().getMeetingMemberByAppointmentId(ment.getAppointmentId());
Long userIdInRoomClient = currentClient.getUser_id();
boolean found = false;
boolean moderator_set = false;
// Check if current user is set to moderator
for(int i = 0; i< members.size(); i++)
{
MeetingMember member = members.get(i);
// only persistent users can schedule a meeting
// userid is only set for registered users
if(member.getUserid() != null )
{
log.debug("checking user " + member.getFirstname() + " for moderator role - ID : " + member.getUserid().getUser_id());
if ( member.getUserid().getUser_id().equals(userIdInRoomClient) )
{
found = true;
if(member.getInvitor()){
log.debug("User " + userIdInRoomClient + " is moderator due to flag in MeetingMember record");
currentClient.setIsMod(true);
//Update the Client List
this.clientListManager.updateClientByStreamId(streamid, currentClient);
List<RoomClient> modRoomList = this.clientListManager.getCurrentModeratorByRoom(currentClient.getRoom_id());
//There is a need to send an extra Event here, cause at this moment there could be
//already somebody in the Room waiting
//Notify all clients of the same scope (room)
Collection<Set<IConnection>> conCollection = current.getScope().getConnections();
for (Set<IConnection> conset : conCollection) {
for (IConnection conn : conset) {
if (conn != null) {
RoomClient rcl = this.clientListManager.getClientByStreamId(conn.getClient().getId());
if (rcl == null) {
//continue;
} else if (rcl.getIsScreenClient() != null && rcl.getIsScreenClient()) {
//continue;
} else {
if( !streamid.equals(rcl.getStreamid())){
//It is not needed to send back that event to the actual Moderator
//as it will be already triggered in the result of this Function
//in the Client
if (conn instanceof IServiceCapableConnection) {
((IServiceCapableConnection) conn).invoke("setNewModeratorByList",new Object[] { modRoomList }, this);
log.debug("sending setNewModeratorByList to " + conn);
}
}
}
}
}
}
moderator_set = true;
this.clientListManager.updateClientByStreamId(streamid, currentClient);
break;
}
else
{
log.debug("User " + userIdInRoomClient + " is NOT moderator due to flag in MeetingMember record");
currentClient.setIsMod(false);
this.clientListManager.updateClientByStreamId(streamid, currentClient);
break;
}
}
else
{
if(member.getInvitor())
moderator_set = true;
}
}
else
{
if(member.getInvitor())
moderator_set = true;
}
}
if(!found){
log.debug("User " + userIdInRoomClient + " could not be found as MeetingMember -> definiteley no moderator");
currentClient.setIsMod(false);
this.clientListManager.updateClientByStreamId(streamid, currentClient);
}
else{
// if current user is part of the memberlist, but moderator couldn't be retrieved : first come, first draw!
if (clientListRoom.size()==1 && moderator_set == false){
log.debug("");
currentClient.setIsMod(true);
//Update the Client List
this.clientListManager.updateClientByStreamId(streamid, currentClient);
List<RoomClient> modRoomList = this.clientListManager.getCurrentModeratorByRoom(currentClient.getRoom_id());
//There is a need to send an extra Event here, cause at this moment there could be
//already somebody in the Room waiting
//Notify all clients of the same scope (room)
Collection<Set<IConnection>> conCollection = current.getScope().getConnections();
for (Set<IConnection> conset : conCollection) {
for (IConnection conn : conset) {
if (conn != null) {
RoomClient rcl = this.clientListManager.getClientByStreamId(conn.getClient().getId());
if (rcl == null) {
//continue;
} else if (rcl.getIsScreenClient() != null && rcl.getIsScreenClient()) {
//continue;
} else {
if( !streamid.equals(rcl.getStreamid())){
//It is not needed to send back that event to the actual Moderator
//as it will be already triggered in the result of this Function
//in the Client
if (conn instanceof IServiceCapableConnection) {
((IServiceCapableConnection) conn).invoke("setNewModeratorByList",new Object[] { modRoomList }, this);
log.debug("sending setNewModeratorByList to " + conn);
}
}
}
}
}
}
this.clientListManager.updateClientByStreamId(streamid, currentClient);
}
}
}
//Notify all clients of the same scope (room)
Collection<Set<IConnection>> conCollection = current.getScope().getConnections();
for (Set<IConnection> conset : conCollection) {
for (IConnection conn : conset) {
if (conn != null) {
if (conn instanceof IServiceCapableConnection) {
if (conn.equals(current)){
continue;
} else {
RoomClient rcl = this.clientListManager.getClientByStreamId(conn.getClient().getId());
if (rcl == null) {
//continue;
} else if (rcl.getIsScreenClient() != null && rcl.getIsScreenClient()) {
//continue;
} else {
//log.debug("*** setAudienceModus Found Client to " + conn);
//log.debug("*** setAudienceModus Found Client to " + conn.getClient());
if (conn instanceof IServiceCapableConnection) {
((IServiceCapableConnection) conn).invoke("addNewUser",new Object[] { currentClient }, this);
log.debug("sending addNewUser to " + conn);
}
}
}
}
}
}
}
BrowserStatus browserStatus = (BrowserStatus) current.getScope().getAttribute("browserStatus");
if (browserStatus == null) {
browserStatus = new BrowserStatus();
}