diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 2a959ce833fa8e5ada82d59f1b2cd378c447422f..1ec39e2558293a3f2f99bc1ca21e291bff5abad3 100755 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -133,6 +133,7 @@ On your akka-fsesl terminal, start akka-fsesl ``` cd ~/dev/bigbluebutton/akka-bbb-fsesl +sbt clean sbt run ``` diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala index 127ae4af5899c8932f8eaff0377f307e17c764d6..e7a2cefacfadc6dc566016a0207db65db27fc654 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala @@ -60,7 +60,6 @@ class BigBlueButtonActor(val system: ActorSystem, case msg: BbbCommonEnvCoreMsg => handleBbbCommonEnvCoreMsg(msg) // 1x messages - case msg: CreateMeeting => handleCreateMeeting(msg) case msg: DestroyMeeting => handleDestroyMeeting(msg) case msg: KeepAliveMessage => handleKeepAliveMessage(msg) case msg: PubSubPing => handlePubSubPingMessage(msg) @@ -285,10 +284,6 @@ class BigBlueButtonActor(val system: ActorSystem, */ } - private def handleCreateMeeting(msg: CreateMeeting): Unit = { - - } - private def handleGetAllMeetingsRequest(msg: GetAllMeetingsRequest) { val len = RunningMeetings.numMeetings(meetings) var currPosition = len - 1 diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala index 02f8c22e9f2010cdf2e4ed9b5f7f1c73923a780d..413336d709a0bd514176bc72752991464ea8b282 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala @@ -7,8 +7,6 @@ import java.util.concurrent.TimeUnit import org.bigbluebutton.core.api.GuestPolicy.GuestPolicy case object StopMeetingActor -case class MeetingProperties(deskshareBridge: String, createDate: String, - red5DeskShareIP: String, red5DeskShareApp: String) case class MeetingExtensionProp(maxExtensions: Int = 2, numExtensions: Int = 0, extendByMinutes: Int = 20, sendNotice: Boolean = true, sent15MinNotice: Boolean = false, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala index 605e5a6d9d6cc8b40f77eca8a69b616f546a4151..a78de73e226fcb7dc997dfbd2c304f7f8838d9a6 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala @@ -4,7 +4,6 @@ import org.bigbluebutton.core.api.GuestPolicy._ import org.bigbluebutton.core.api.SharedNotesOperation._ import org.bigbluebutton.core.apps.AnnotationVO import org.bigbluebutton.core.apps.Presentation -import org.bigbluebutton.core.MeetingProperties import org.bigbluebutton.core.apps.BreakoutUser import spray.json.JsObject @@ -34,7 +33,6 @@ case class KeepAliveMessage(aliveID: String) extends InMessage case class MonitorNumberOfUsers(meetingID: String) extends InMessage case class SendTimeRemainingUpdate(meetingId: String) extends InMessage case class ExtendMeetingDuration(meetingId: String, userId: String) extends InMessage -case class CreateMeeting(meetingID: String, mProps: MeetingProperties) extends InMessage case class InitializeMeeting(meetingID: String, recorded: Boolean) extends InMessage case class DestroyMeeting(meetingID: String) extends InMessage case class StartMeeting(meetingID: String) extends InMessage @@ -222,4 +220,4 @@ case class GetCurrentDocumentRequest(meetingID: String, requesterID: String) ext case class CreateAdditionalNotesRequest(meetingID: String, requesterID: String, noteName: String) extends InMessage case class DestroyAdditionalNotesRequest(meetingID: String, requesterID: String, noteID: String) extends InMessage case class RequestAdditionalNotesSetRequest(meetingID: String, requesterID: String, additionalNotesSetSize: Int) extends InMessage -case class SharedNotesSyncNoteRequest(meetingID: String, requesterID: String, noteID: String) extends InMessage \ No newline at end of file +case class SharedNotesSyncNoteRequest(meetingID: String, requesterID: String, noteID: String) extends InMessage diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users.scala index c07ed2f6b2a37bf057b1fb138c3470832523ca24..cf0ad7c3632526735eda71c58bbc43dd6614f125 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users.scala @@ -254,33 +254,12 @@ class Users { case class UserIdAndName(id: String, name: String) -case class UserVO( - id: String, - externalId: String, - name: String, - role: String, - guest: Boolean, - authed: Boolean, - waitingForAcceptance: Boolean, - emojiStatus: String, - presenter: Boolean, - hasStream: Boolean, - locked: Boolean, - webcamStreams: Set[String], - phoneUser: Boolean, - voiceUser: VoiceUser, - listenOnly: Boolean, - avatarURL: String, +case class UserVO(id: String, externalId: String, name: String, role: String, + guest: Boolean, authed: Boolean, waitingForAcceptance: Boolean, emojiStatus: String, + presenter: Boolean, hasStream: Boolean, locked: Boolean, webcamStreams: Set[String], + phoneUser: Boolean, voiceUser: VoiceUser, listenOnly: Boolean, avatarURL: String, joinedWeb: Boolean) -case class VoiceUser( - userId: String, - webUserId: String, - callerName: String, - callerNum: String, - joined: Boolean, - locked: Boolean, - muted: Boolean, - talking: Boolean, - avatarURL: String, - listenOnly: Boolean) +case class VoiceUser(userId: String, webUserId: String, callerName: String, + callerNum: String, joined: Boolean, locked: Boolean, muted: Boolean, + talking: Boolean, avatarURL: String, listenOnly: Boolean) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Webcams.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Webcams.scala new file mode 100755 index 0000000000000000000000000000000000000000..4ae5197ee88caa1a62c1c370e16fc104b0236686 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Webcams.scala @@ -0,0 +1,31 @@ +package org.bigbluebutton.core.models + +object Webcams { + def findWithStreamId(webcams: Webcams, streamId: String): Option[WebcamStream] = { + webcams.toVector.find(w => w.stream.id == streamId) + } + + def findWebcamsForUser(webcams: Webcams, userId: String): Vector[WebcamStream] = { + webcams.toVector.filter(w => w.userId == userId) + } + +} + +class Webcams { + private var webcams: collection.immutable.HashMap[String, WebcamStream] = new collection.immutable.HashMap[String, WebcamStream] + + private def toVector: Vector[WebcamStream] = webcams.values.toVector + + private def save(webcam: WebcamStream): WebcamStream = { + webcams += webcam.stream.id -> webcam + webcam + } + + private def remove(streamId: String): Option[WebcamStream] = { + val webcam = webcams.get(streamId) + webcam foreach (u => webcams -= streamId) + webcam + } +} + +case class WebcamStream(userId: String, stream: Stream) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgDeserializer.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgDeserializer.scala new file mode 100755 index 0000000000000000000000000000000000000000..57444588ce675cd84057368987c288150b894b73 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgDeserializer.scala @@ -0,0 +1,44 @@ +package org.bigbluebutton.core.pubsub.senders + +import com.fasterxml.jackson.databind.JsonNode +import org.bigbluebutton.SystemConfiguration +import org.bigbluebutton.common2.messages._ +import org.bigbluebutton.core.bus.{ BbbMsgEvent, BbbMsgRouterEventBus, ReceivedJsonMessage } + +import scala.util.{ Failure, Success } + +trait ReceivedJsonMsgDeserializer extends SystemConfiguration { + this: ReceivedJsonMsgHandlerActor => + + object JsonDeserializer extends Deserializer + + def deserializeCreateMeetingReqMsg(jsonNode: JsonNode): Option[CreateMeetingReqMsg] = { + JsonDeserializer.toBbbCommonMsg[CreateMeetingReqMsg](jsonNode) match { + case Success(msg) => Some(msg.asInstanceOf[CreateMeetingReqMsg]) + case Failure(ex) => + log.error("Failed to CreateMeetingReqMsg message " + ex) + None + } + } + + def routeValidateAuthTokenReqMsg(jsonNode: JsonNode): Option[ValidateAuthTokenReqMsg] = { + JsonDeserializer.toBbbCommonMsg[ValidateAuthTokenReqMsg](jsonNode) match { + case Success(msg) => Some(msg.asInstanceOf[ValidateAuthTokenReqMsg]) + case Failure(ex) => + log.error("Failed to ValidateAuthTokenReqMsg message " + ex) + None + } + } + + def routeRegisterUserReqMsg(jsonNode: JsonNode): Option[RegisterUserReqMsg] = { + JsonDeserializer.toBbbCommonMsg[RegisterUserReqMsg](jsonNode) match { + case Success(msg) => + // Route via meeting manager as there is a race condition if we send directly to meeting + // because the meeting actor might not have been created yet. + Some(msg.asInstanceOf[RegisterUserReqMsg]) + case Failure(ex) => + log.error("Failed to RegisterUserReqMsg message " + ex) + None + } + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala index 1dfca9cc2d5e4190b2668eb2b1c4716dab443a97..e757ca039d06051809f7e85dbc0674bf486f331d 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala @@ -2,7 +2,12 @@ package org.bigbluebutton.core.pubsub.senders import akka.actor.{ Actor, ActorLogging, Props } import org.bigbluebutton.SystemConfiguration +import com.fasterxml.jackson.databind.JsonNode +import org.bigbluebutton.common2.messages.{ BbbCoreEnvelope, CreateMeetingReqMsg, RegisterUserReqMsg, ValidateAuthTokenReqMsg } import org.bigbluebutton.core.bus._ +import org.bigbluebutton.core2.ReceivedMessageRouter + +import scala.util.{ Failure, Success } object ReceivedJsonMsgHandlerActor { def props(eventBus: BbbMsgRouterEventBus, incomingJsonMessageBus: IncomingJsonMessageBus): Props = @@ -12,7 +17,10 @@ object ReceivedJsonMsgHandlerActor { class ReceivedJsonMsgHandlerActor( val eventBus: BbbMsgRouterEventBus, val incomingJsonMessageBus: IncomingJsonMessageBus) - extends Actor with ActorLogging with SystemConfiguration with ReceivedJsonMsgHandlerTrait { + extends Actor with ActorLogging + with SystemConfiguration + with ReceivedJsonMsgDeserializer + with ReceivedMessageRouter { def receive = { case msg: ReceivedJsonMessage => @@ -21,4 +29,42 @@ class ReceivedJsonMsgHandlerActor( case _ => // do nothing } + def handleReceivedJsonMessage(msg: ReceivedJsonMessage): Unit = { + for { + envJsonNode <- JsonDeserializer.toBbbCommonEnvJsNodeMsg(msg.data) + } yield route(envJsonNode.envelope, envJsonNode.core) + } + + def route(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Unit = { + log.debug("*************** Route envelope name " + envelope.name) + envelope.name match { + case CreateMeetingReqMsg.NAME => + log.debug("**************** Route CreateMeetingReqMsg") + for { + m <- deserializeCreateMeetingReqMsg(jsonNode) + } yield { + log.debug("************ Sending CreateMeetingReqMsg") + send(envelope, m) + } + case ValidateAuthTokenReqMsg.NAME => + log.debug("**************** Route ValidateAuthTokenReqMsg") + for { + m <- routeValidateAuthTokenReqMsg(jsonNode) + } yield { + log.debug("************ Sending ValidateAuthTokenReqMsg") + send(envelope, m) + } + case RegisterUserReqMsg.NAME => + log.debug("**************** Route RegisterUserReqMsg") + for { + m <- routeRegisterUserReqMsg(jsonNode) + } yield { + log.debug("************ Sending RegisterUserReqMsg") + send(envelope, m) + } + case _ => + log.debug("************ Cannot route envelope name " + envelope.name) + // do nothing + } + } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerTrait.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerTrait.scala deleted file mode 100755 index 4e8fa53d8eaada5ba4941a53cf1a36d8eee12990..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerTrait.scala +++ /dev/null @@ -1,81 +0,0 @@ -package org.bigbluebutton.core.pubsub.senders - -import com.fasterxml.jackson.databind.JsonNode -import org.bigbluebutton.SystemConfiguration -import org.bigbluebutton.common2.messages._ -import org.bigbluebutton.core.bus.{ BbbMsgEvent, BbbMsgRouterEventBus, ReceivedJsonMessage } - -trait ReceivedJsonMsgHandlerTrait extends SystemConfiguration { - val eventBus: BbbMsgRouterEventBus - object JsonDeserializer extends Deserializer - - def send(msg: BbbMsgEvent): Unit = { - println("******************** Routing " + msg.payload.envelope.name) - eventBus.publish(msg) - } - - def handleReceivedJsonMessage(msg: ReceivedJsonMessage): Unit = { - for { - envJsonNode <- JsonDeserializer.toJBbbCommonEnvJsNodeMsg(msg.data) - } yield route(envJsonNode.envelope, envJsonNode.core) - } - - def route(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Unit = { - println("*************** Route envelope name " + envelope.name) - envelope.name match { - case CreateMeetingReqMsg.NAME => - println("**************** Route CreateMeetingReqMsg") - for { - m <- routeCreateMeetingReqMsg(envelope, jsonNode) - } yield { - println("************ Sending CreateMeetingReqMsg") - send(m) - } - case ValidateAuthTokenReqMsg.NAME => - println("**************** Route ValidateAuthTokenReqMsg") - for { - m <- routeValidateAuthTokenReqMsg(envelope, jsonNode) - } yield { - println("************ Sending ValidateAuthTokenReqMsg") - send(m) - } - case RegisterUserReqMsg.NAME => - println("**************** Route RegisterUserReqMsg") - for { - m <- routeRegisterUserReqMsg(envelope, jsonNode) - } yield { - println("************ Sending RegisterUserReqMsg") - send(m) - } - case _ => - println("************ Cannot route envelope name " + envelope.name) - // do nothing - } - } - - def routeCreateMeetingReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[BbbMsgEvent] = { - for { - msg <- JsonDeserializer.toCreateMeetingReqMsg(envelope, jsonNode) - } yield { - BbbMsgEvent(meetingManagerChannel, BbbCommonEnvCoreMsg(envelope, msg)) - } - } - - def routeValidateAuthTokenReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[BbbMsgEvent] = { - for { - msg <- JsonDeserializer.toValidateAuthTokenReqMsg(envelope, jsonNode) - } yield { - BbbMsgEvent(msg.header.meetingId, BbbCommonEnvCoreMsg(envelope, msg)) - } - } - - def routeRegisterUserReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[BbbMsgEvent] = { - for { - msg <- JsonDeserializer.toRegisterUserReqMsg(envelope, jsonNode) - } yield { - // Route via meeting manager as there is a race condition if we send directly to meeting - // because the meeting actor might not have been created yet. - BbbMsgEvent(meetingManagerChannel, BbbCommonEnvCoreMsg(envelope, msg)) - } - } -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala index b6d23e6927dfb18802e960cfebb8140d7538d6f1..fd42cf707b7d0743dd25d2067d70702b212edbad 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala @@ -6,7 +6,6 @@ import org.bigbluebutton.common2.domain.DefaultProps import org.bigbluebutton.core.api._ import org.bigbluebutton.core.apps._ import org.bigbluebutton.core.models.{ RegisteredUsers, Users } -import org.bigbluebutton.core.{ MeetingModel, MeetingProperties } import org.bigbluebutton.core2.MeetingStatus2x class LiveMeeting(val props: DefaultProps, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala index 7db90eac49040c2dd970c07518a019bd731a200a..f8e704dc89fa656a13f91995801e1efb3ac88dec 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala @@ -206,7 +206,7 @@ class MeetingActor(val props: DefaultProps, val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka", "msgType" -> "direct", "meetingId" -> props.meetingProp.intId, "userId" -> msg.body.userId) val envelope = BbbCoreEnvelope(ValidateAuthTokenRespMsg.NAME, routing) - val header = BbbCoreHeaderWithMeetingId(ValidateAuthTokenRespMsg.NAME, props.meetingProp.intId) + val header = BbbClientMsgHeader(ValidateAuthTokenRespMsg.NAME, props.meetingProp.intId, msg.body.userId) RegisteredUsers.getRegisteredUserWithToken(msg.body.authToken, msg.body.userId, liveMeeting.registeredUsers) match { case Some(u) => diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala index 55f63294c1b8a71e57e1ff5b4735e49a4af01fba..09a757e2732ff89b8871a70d13235e357f30c550 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala @@ -11,7 +11,7 @@ import akka.actor.SupervisorStrategy.Resume import scala.concurrent.duration._ import org.bigbluebutton.SystemConfiguration import org.bigbluebutton.common2.domain.DefaultProps -import org.bigbluebutton.core.{ MeetingProperties, OutMessageGateway } +import org.bigbluebutton.core.{ OutMessageGateway } import org.bigbluebutton.core.api._ import org.bigbluebutton.core.bus.{ BigBlueButtonEvent, IncomingEventBus } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala index d5fd6de3aad8f091dabdca3d4c356fed32190a7e..4401f94fcddd716ebbf8de401b8764401cca8035 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala @@ -5,7 +5,7 @@ import org.bigbluebutton.common2.domain.{ DefaultProps, Meeting2x } import org.bigbluebutton.core.apps._ import org.bigbluebutton.core.bus._ import org.bigbluebutton.core.models.{ RegisteredUsers, Users } -import org.bigbluebutton.core.{ MeetingModel, MeetingProperties, OutMessageGateway } +import org.bigbluebutton.core.{ OutMessageGateway } import org.bigbluebutton.core2.MeetingStatus2x object RunningMeeting { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/ReceivedMessageRouter.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/ReceivedMessageRouter.scala new file mode 100755 index 0000000000000000000000000000000000000000..14a4b1d764966e6ff67b539fe9c39965c95ae5ef --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/ReceivedMessageRouter.scala @@ -0,0 +1,28 @@ +package org.bigbluebutton.core2 + +import org.bigbluebutton.SystemConfiguration +import org.bigbluebutton.common2.messages._ +import org.bigbluebutton.core.bus.{ BbbMsgEvent, BbbMsgRouterEventBus } + +trait ReceivedMessageRouter extends SystemConfiguration { + val eventBus: BbbMsgRouterEventBus + + def publish(msg: BbbMsgEvent): Unit = { + eventBus.publish(msg) + } + + def send(envelope: BbbCoreEnvelope, msg: CreateMeetingReqMsg): Unit = { + val event = BbbMsgEvent(meetingManagerChannel, BbbCommonEnvCoreMsg(envelope, msg)) + publish(event) + } + + def send(envelope: BbbCoreEnvelope, msg: ValidateAuthTokenReqMsg): Unit = { + val event = BbbMsgEvent(msg.header.meetingId, BbbCommonEnvCoreMsg(envelope, msg)) + publish(event) + } + + def send(envelope: BbbCoreEnvelope, msg: RegisterUserReqMsg): Unit = { + val event = BbbMsgEvent(meetingManagerChannel, BbbCommonEnvCoreMsg(envelope, msg)) + publish(event) + } +} diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala index 23c1f32e096f5787efd419ee8624bbda1e65b828..9762b3f9de3260e8a8cc79faa631d11e5d17e8fa 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala @@ -1,10 +1,10 @@ package org.bigbluebutton.core import org.bigbluebutton.common2.domain._ - import org.bigbluebutton.core.api.GuestPolicy import org.bigbluebutton.core.apps._ import org.bigbluebutton.core.models.{ RegisteredUsers, Users } +import org.bigbluebutton.core2.MeetingStatus2x trait AppsTestFixtures { @@ -32,23 +32,16 @@ trait AppsTestFixtures { val maxUsers = 25 val guestPolicy = "ALWAYS_ASK" - val red5DeskShareIP = "127.0.0.1" - val red5DeskShareApp = "red5App" + val red5DeskShareIPTestFixture = "127.0.0.1" + val red5DeskShareAppTestFixtures = "red5App" val metadata: collection.immutable.Map[String, String] = Map("foo" -> "bar", "bar" -> "baz", "baz" -> "foo") + val screenshareProps = ScreenshareProps("TODO", "TODO", "TODO") + val breakoutProps = BreakoutProps(parentMeetingId, sequence, Vector()) - val mProps = new MeetingProperties(meetingId, externalMeetingId, parentMeetingId, - meetingName, record, - voiceConfId, deskshareConfId, - durationInMinutes, - autoStartRecording, allowStartStopRecording, webcamsOnlyForModerator, - moderatorPassword, viewerPassword, - createTime, createDate, red5DeskShareIP, red5DeskShareApp, - isBreakout, sequence, metadata, GuestPolicy.ALWAYS_ACCEPT) - + val meetingStatux2x = new MeetingStatus2x val chatModel = new ChatModel() val layoutModel = new LayoutModel() val meetingModel = new MeetingModel() - val usersModel = new UsersModel() val pollModel = new PollModel() val wbModel = new WhiteboardModel() val presModel = new PresentationModel() @@ -58,22 +51,20 @@ trait AppsTestFixtures { val users = new Users val registeredUsers = new RegisteredUsers - meetingModel.setGuestPolicy(mProps.guestPolicy) - val meetingProp = MeetingProp(name = meetingName, extId = externalMeetingId, intId = meetingId, isBreakout = isBreakout.booleanValue()) - val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime) + val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime, createdDate = createDate) val password = PasswordProp(moderatorPass = moderatorPassword, viewerPass = viewerPassword) val recordProp = RecordProp(record = record, autoStartRecording = autoStartRecording, allowStartStopRecording = allowStartStopRecording) val welcomeProp = WelcomeProp(welcomeMsgTemplate = welcomeMsgTemplate, welcomeMsg = welcomeMsg, modOnlyMessage = modOnlyMessage) - val voiceProp = VoiceProp(telVoice = voiceConfId, webVoice = voiceConfId, dialNumber = dialNumber) + val voiceProp = VoiceProp(telVoice = voiceConfId, voiceConf = voiceConfId, dialNumber = dialNumber) val usersProp = UsersProp(maxUsers = maxUsers, webcamsOnlyForModerator = webcamsOnlyForModerator, guestPolicy = guestPolicy) val metadataProp = new MetadataProp(metadata) - val defaultProps = DefaultProps(meetingProp, durationProps, password, recordProp, welcomeProp, voiceProp, - usersProp, metadataProp) + val defaultProps = DefaultProps(meetingProp, breakoutProps, durationProps, password, recordProp, welcomeProp, voiceProp, + usersProp, metadataProp, screenshareProps) } diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/ChatModelTest.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/ChatModelTest.scala index 9422550c070eddb25957e5dced3a1fab8f16b32b..ba039c600d4a5233cf6f5e1eae391ba06f29b584 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/ChatModelTest.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/ChatModelTest.scala @@ -6,8 +6,8 @@ import scala.collection.immutable.List class ChatModelTest extends UnitSpec with AppsTestFixtures { - val liveMeeting = new LiveMeeting(mProps, - chatModel, layoutModel, meetingModel, usersModel, users, registeredUsers, pollModel, + val liveMeeting = new LiveMeeting(defaultProps, meetingStatux2x, + chatModel, layoutModel, users, registeredUsers, pollModel, wbModel, presModel, breakoutModel, captionModel, notesModel) "A Stack" should "pop values in last-in-first-out order" in { diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/pubsub/sender/ReceivedJsonMsgHandlerTraitTests.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/pubsub/sender/ReceivedJsonMsgHandlerTraitTests.scala index ecd324836970a5e9d7d899ce7d715875b57b6875..253415451d2dcf922823cae0aba641256fb95b12 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/pubsub/sender/ReceivedJsonMsgHandlerTraitTests.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/pubsub/sender/ReceivedJsonMsgHandlerTraitTests.scala @@ -1,44 +1,40 @@ package org.bigbluebutton.core.pubsub.sender import com.fasterxml.jackson.databind.JsonDeserializer +import org.bigbluebutton.SystemConfiguration import org.bigbluebutton.common2.messages.MessageBody.CreateMeetingReqMsgBody import org.bigbluebutton.core.{ AppsTestFixtures, UnitSpec } import org.bigbluebutton.common2.messages._ import org.bigbluebutton.common2.util.JsonUtil -import org.bigbluebutton.core.bus.{ BbbMsgRouterEventBus, ReceivedJsonMessage } -import org.bigbluebutton.core.pubsub.senders.ReceivedJsonMsgHandlerTrait +import org.bigbluebutton.core.bus.{ BbbMsgEvent, BbbMsgRouterEventBus, ReceivedJsonMessage } +import org.bigbluebutton.core.pubsub.senders.ReceivedJsonMsgDeserializer +import org.bigbluebutton.core2.ReceivedMessageRouter import org.mockito.Mockito._ -import org.scalatest.mock.MockitoSugar +import org.scalatest.mockito.MockitoSugar -class ReceivedJsonMsgHandlerTraitTests extends UnitSpec with AppsTestFixtures with MockitoSugar { +class ReceivedJsonMsgHandlerTraitTests extends UnitSpec + with AppsTestFixtures with MockitoSugar with SystemConfiguration { - class MessageRouter(val eventBus: BbbMsgRouterEventBus) extends ReceivedJsonMsgHandlerTrait { + class MessageRouter(val eventBus: BbbMsgRouterEventBus) extends ReceivedMessageRouter { } "It" should "be able to decode envelope and core message" in { - val mockEventBus = mock[BbbMsgRouterEventBus] - val classUnderTest = new MessageRouter(mockEventBus) - val routing = collection.immutable.HashMap("sender" -> "bbb-web") val envelope = BbbCoreEnvelope(CreateMeetingReqMsg.NAME, routing) val header = BbbCoreBaseHeader(CreateMeetingReqMsg.NAME) val body = CreateMeetingReqMsgBody(defaultProps) val req = CreateMeetingReqMsg(header, body) - val msg = BbbCommonEnvCoreMsg(envelope, req) - println(msg) object JsonDeserializer extends Deserializer - val receivedJson = ReceivedJsonMessage("test-channel", JsonUtil.toJson(msg)) - for { - envJsonNode <- JsonDeserializer.toJBbbCommonEnvJsNodeMsg(receivedJson.data) - } yield classUnderTest.routeCreateMeetingReqMsg(envJsonNode.envelope, envJsonNode.core) + classUnderTest.send(envelope, req) // Then verify the class under test used the mock object as expected // The disconnect user shouldn't be called as user has ability to eject another user - //verify(mockEventBus, times(1)).publish() + val event = BbbMsgEvent(meetingManagerChannel, BbbCommonEnvCoreMsg(envelope, req)) + verify(mockEventBus, times(1)).publish(event) } } diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/BbbCoreEnvelope.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/BbbCoreEnvelope.scala index e9f4ee89f2ae4934f6c6621dc7f24014ca99ba3b..b33a9cec2b87b866ce0d4e0aa3a3229c8d7dcb2b 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/BbbCoreEnvelope.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/BbbCoreEnvelope.scala @@ -4,6 +4,8 @@ import com.fasterxml.jackson.databind.JsonNode import org.bigbluebutton.common2.messages.MessageBody._ +// seal trait to force all classes that extends this trait +// to be defined in this file. sealed trait BbbCoreMsg sealed trait BbbCommonMsg sealed trait BbbCoreHeader @@ -11,33 +13,39 @@ sealed trait BbbCoreHeader case class BbbCommonEnvCoreMsg(envelope: BbbCoreEnvelope, core: BbbCoreMsg) extends BbbCommonMsg case class BbbCommonEnvJsNodeMsg(envelope: BbbCoreEnvelope, core: JsonNode) extends BbbCommonMsg case class BbbCoreEnvelope(name: String, routing: collection.immutable.Map[String, String]) - case class BbbCoreBaseHeader(name: String) extends BbbCoreHeader case class BbbCoreHeaderWithMeetingId(name: String, meetingId: String) extends BbbCoreHeader - +case class BbbClientMsgHeader(name: String, meetingId: String, userId: String) extends BbbCoreHeader case class BbbCoreHeaderBody(header: BbbCoreHeader, body: JsonNode) - object CreateMeetingReqMsg { val NAME = "CreateMeetingReqMsg" } case class CreateMeetingReqMsg(header: BbbCoreBaseHeader, body: CreateMeetingReqMsgBody) extends BbbCoreMsg - object MeetingCreatedEvtMsg { val NAME = "MeetingCreatedEvtMsg"} case class MeetingCreatedEvtMsg(header: BbbCoreBaseHeader, body: MeetingCreatedEvtBody) extends BbbCoreMsg - object RegisterUserReqMsg { val NAME = "RegisterUserReqMsg" } case class RegisterUserReqMsg(header: BbbCoreHeaderWithMeetingId, body: RegisterUserReqMsgBody) extends BbbCoreMsg - object ValidateAuthTokenReqMsg { val NAME = "ValidateAuthTokenReqMsg" } case class ValidateAuthTokenReqMsg(header: BbbCoreHeaderWithMeetingId, body: ValidateAuthTokenReqMsgBody) extends BbbCoreMsg - object ValidateAuthTokenRespMsg { val NAME = "ValidateAuthTokenRespMsg" } -case class ValidateAuthTokenRespMsg(header: BbbCoreHeaderWithMeetingId, +case class ValidateAuthTokenRespMsg(header: BbbClientMsgHeader, body: ValidateAuthTokenRespMsgBody) extends BbbCoreMsg +object UserJoinReqMsg { val NAME = "UserJoinReqMsg" } +case class UserJoinReqMsg(header: BbbClientMsgHeader, body: UserJoinReqMsgBody) extends BbbCoreMsg + +object UserLeaveReqMsg { val NAME = "UserLeaveReqMsg" } +case class UserLeaveReqMsg(header: BbbClientMsgHeader, body: UserLeaveReqMsgBody) extends BbbCoreMsg + +object GetUsersReqMsg { val NAME = "GetUsersReqMsg" } +case class GetUsersReqMsg(header: BbbClientMsgHeader, body: GetUsersReqMsgBody) extends BbbCoreMsg + +object UserShareWebcamMsg { val NAME = "UserShareWebcamMsg" } +case class UserShareWebcamMsg(header: BbbClientMsgHeader, body: UserShareWebcamMsgBody) + case class AkkaAppsCheckAliveReqBody(timestamp: Long) case class AkkaAppsCheckAliveReqMsg(header: BbbCoreHeader, body: AkkaAppsCheckAliveReqBody) case class AkkaAppsCheckAliveReq(envelope: BbbCoreEnvelope, msg: AkkaAppsCheckAliveReqMsg) extends BbbCoreMsg diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/Deserializer.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/Deserializer.scala index ed42ace58923cfdf5b12b06446269b9a44db4d1e..def47b98bc501bf5b7beea5a3f38085af51be8ab 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/Deserializer.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/Deserializer.scala @@ -9,34 +9,36 @@ import scala.util.{Failure, Success, Try} trait Deserializer { - def toJBbbCommonEnvJsNodeMsg(json: String): Option[BbbCommonEnvJsNodeMsg] = { - def convertFromJson(json: String): Try[BbbCommonEnvJsNodeMsg] = { + def toBbbCommonMsg[V](jsonNode: JsonNode)(implicit m: Manifest[V]): Try[V] = { + val json = JsonUtil.toJson(jsonNode) + for { + msg <- fromJson[V](json) + } yield msg + } + + def toBbbCommonEnvJsNodeMsg(json: String): Try[BbbCommonEnvJsNodeMsg] = { for { - msg <- Try(fromJson[BbbCommonEnvJsNodeMsg](json)) + msg <- fromJson[BbbCommonEnvJsNodeMsg](json) } yield msg - } - - convertFromJson(json) match { - case Success(msg) => Some(msg) - case Failure(ex) => println(s"************ Problem deserializing json: ${json}") - println(s"************* Exception deserializing json: ${ex.getMessage}") - None - - } } def toCreateMeetingReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[CreateMeetingReqMsg] = { def convertFromJson(json: String): Try[CreateMeetingReqMsg] = { for { - msg <- Try(fromJson[CreateMeetingReqMsg](json)) + msg <- fromJson[CreateMeetingReqMsg](json) } yield msg } val json = JsonUtil.toJson(jsonNode) - convertFromJson(json) match { + val result = for { + result <- convertFromJson(json) + } yield result + + + result match { case Success(msg) => Some(msg) - case Failure(ex) => println(s"************ Problem deserializing json: ${json}") + case Failure(ex) => println(s"************ Problem deserializing json: ${jsonNode}") println(s"*********** Exception deserializing json: ${ex.getMessage}") None } @@ -45,15 +47,20 @@ trait Deserializer { def toValidateAuthTokenReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[ValidateAuthTokenReqMsg] = { def convertFromJson(json: String): Try[ValidateAuthTokenReqMsg] = { for { - msg <- Try(fromJson[ValidateAuthTokenReqMsg](json)) + msg <- fromJson[ValidateAuthTokenReqMsg](json) } yield msg } val json = JsonUtil.toJson(jsonNode) - convertFromJson(json) match { + val result = for { + result <- convertFromJson(json) + } yield result + + + result match { case Success(msg) => Some(msg) - case Failure(ex) => println(s"************ Problem deserializing json: ${json}") + case Failure(ex) => println(s"************ Problem deserializing json: ${jsonNode}") println(s"*********** Exception deserializing json: ${ex.getMessage}") None } @@ -62,15 +69,19 @@ trait Deserializer { def toMeetingCreatedEvtMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[MeetingCreatedEvtMsg] = { def convertFromJson(json: String): Try[MeetingCreatedEvtMsg] = { for { - msg <- Try(fromJson[MeetingCreatedEvtMsg](json)) + msg <- fromJson[MeetingCreatedEvtMsg](json) } yield msg } val json = JsonUtil.toJson(jsonNode) - convertFromJson(json) match { + val result = for { + result <- convertFromJson(json) + } yield result + + result match { case Success(msg) => Some(msg) - case Failure(ex) => println(s"************ Problem deserializing json: ${json}") + case Failure(ex) => println(s"************ Problem deserializing json: ${jsonNode}") println(s"*********** Exception deserializing json: ${ex.getMessage}") None } @@ -79,15 +90,19 @@ trait Deserializer { def toRegisterUserReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[RegisterUserReqMsg] = { def convertFromJson(json: String): Try[RegisterUserReqMsg] = { for { - msg <- Try(fromJson[RegisterUserReqMsg](json)) + msg <- fromJson[RegisterUserReqMsg](json) } yield msg } val json = JsonUtil.toJson(jsonNode) - convertFromJson(json) match { + val result = for { + result <- convertFromJson(json) + } yield result + + result match { case Success(msg) => Some(msg) - case Failure(ex) => println(s"************ Problem deserializing json: ${json}") + case Failure(ex) => println(s"************ Problem deserializing json: ${jsonNode}") println(s"*********** Exception deserializing json: ${ex.getMessage}") None } diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/MessageBody.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/MessageBody.scala index 17f94dc74f91e7471cde4cbc6ea2e7ab71ae413e..63ea6a1444998f2f1cd0d0e0ccd0ad9be910f795 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/MessageBody.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/MessageBody.scala @@ -10,4 +10,18 @@ object MessageBody { extUserId: String, authToken: String, avatarURL: String, guest: Boolean, authed: Boolean) case class ValidateAuthTokenRespMsgBody(userId: String, authToken: String, valid: Boolean) + case class UserJoinReqMsgBody(userId: String, authToken: String) + case class UserLeaveReqMsgBody(userId: String, sessionId: String) + case class GetUsersReqMsgBody(requesterId: String) + case class UserEmojiStatusChangeReqMsgBody(userId: String, emoji: String) + case class EjectUserFromMeetingReqMsgBody(userId: String, requesterId: String) + case class UserShareWebcamMsgBody(userId: String, stream: String) + case class UserUnshareWebcamMsgBody(userId: String, stream: String) + case class ChangeUserStatusReqMsgBody(userId: String, status: String, value: String) + case class ChangeUserRoleReqMsgBody(userId: String, role: String) + case class AssignPresenterReqMsgBody(userId: String, requesterId: String) + case class SetRecordingReqMsgBody(recording: Boolean, requesterId: String) + case class GetRecordingStatusReqMsgBody(requesterId: String) + case class AllowUserToShareDesktopReqMsgBody(userId: String) + } diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/util/JsonUtil.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/util/JsonUtil.scala index 52f68a17f33a6d662a6c0abbf8ebe61d81e1a552..dd648a418fb4c8af17bd290d054a6c0da2527bfe 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/util/JsonUtil.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/util/JsonUtil.scala @@ -5,6 +5,8 @@ import com.fasterxml.jackson.module.scala.DefaultScalaModule import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper import com.fasterxml.jackson.annotation.JsonInclude +import scala.util.Try + object JsonUtil { val mapper = new ObjectMapper() with ScalaObjectMapper @@ -21,17 +23,18 @@ object JsonUtil { mapper.writeValueAsString(value) } - def toMap[V](json: String)(implicit m: Manifest[V]) = fromJson[Map[String, V]](json) + def toMap[V](json: String)(implicit m: Manifest[V]): Try[Map[String, V]] = { + fromJson[Map[String, V]](json) + } + + def fromJson[T](json: String)(implicit m: Manifest[T]): Try[T] = { + for { + result <- Try(mapper.readValue[T](json)) + } yield result - def fromJson[T](json: String)(implicit m: Manifest[T]): T = { - mapper.readValue[T](json) } - def toJsonNode(json: String): JsonNode = { + def toJsonNode(json: String): Try[JsonNode] = { fromJson[JsonNode](json) } - - - - } diff --git a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/TestFixtures.scala b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/TestFixtures.scala index a519898dc60ad856dcf2c3bb6880213678eb9fb4..d2a42e7dffe3c62f49da15b23c8f54b205409559 100755 --- a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/TestFixtures.scala +++ b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/TestFixtures.scala @@ -30,17 +30,19 @@ trait TestFixtures { val meetingProp = MeetingProp(name = meetingName, extId = externalMeetingId, intId = meetingId, isBreakout = isBreakout.booleanValue()) - val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime) + val breakoutProps = BreakoutProps(parentId = parentMeetingId, sequence = sequence, breakoutRooms = Vector()) + val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime, createdDate = createDate) val password = PasswordProp(moderatorPass = moderatorPassword, viewerPass = viewerPassword) val recordProp = RecordProp(record = record, autoStartRecording = autoStartRecording, allowStartStopRecording = allowStartStopRecording) val welcomeProp = WelcomeProp(welcomeMsgTemplate = welcomeMsgTemplate, welcomeMsg = welcomeMsg, modOnlyMessage = modOnlyMessage) - val voiceProp = VoiceProp(telVoice = voiceConfId, webVoice = voiceConfId, dialNumber = dialNumber) + val voiceProp = VoiceProp(telVoice = voiceConfId, voiceConf = voiceConfId, dialNumber = dialNumber) val usersProp = UsersProp(maxUsers = maxUsers, webcamsOnlyForModerator = webcamsOnlyForModerator, guestPolicy = guestPolicy) val metadataProp = new MetadataProp(metadata) - - val defaultProps = DefaultProps(meetingProp, durationProps, password, recordProp, welcomeProp, voiceProp, - usersProp, metadataProp) + val screenshareProps = ScreenshareProps(screenshareConf = "FixMe!", red5ScreenshareIp = "fixMe!", + red5ScreenshareApp = "fixMe!") + val defaultProps = DefaultProps(meetingProp, breakoutProps, durationProps, password, recordProp, welcomeProp, voiceProp, + usersProp, metadataProp, screenshareProps) } diff --git a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/messages/DeserializerTests.scala b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/messages/DeserializerTests.scala index 17f20e2cf587129abeee506ea81e33ed9b4a14a4..50770dd2979c55c5104d6a7cdb761be260c6034d 100755 --- a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/messages/DeserializerTests.scala +++ b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/messages/DeserializerTests.scala @@ -1,9 +1,12 @@ package org.bigbluebutton.common2.messages import com.fasterxml.jackson.databind.JsonNode +import org.bigbluebutton.common2.messages.MessageBody.CreateMeetingReqMsgBody import org.bigbluebutton.common2.util.JsonUtil import org.bigbluebutton.common2.{TestFixtures, UnitSpec2} +import scala.util.{Failure, Success} + class DeserializerTests extends UnitSpec2 with TestFixtures { @@ -19,11 +22,13 @@ class DeserializerTests extends UnitSpec2 with TestFixtures { println(msg) assert(msg.envelope.name == CreateMeetingReqMsg.NAME) assert(msg.core.isInstanceOf[CreateMeetingReqMsg]) - val map = Deserializer.toJBbbCommonEnvJsNodeMsg(JsonUtil.toJson(msg)) + val json = JsonUtil.toJson(msg) + println(json) + val map = Deserializer.toBbbCommonEnvJsNodeMsg(json) println(map) map match { - case Some(envJsNodeMsg) => assert(envJsNodeMsg.core.isInstanceOf[JsonNode]) - case None => fail("Failed to decode json message") + case Success(envJsNodeMsg) => assert(envJsNodeMsg.core.isInstanceOf[JsonNode]) + case Failure(ex) => fail("Failed to decode json message " + ex) } } @@ -37,20 +42,43 @@ class DeserializerTests extends UnitSpec2 with TestFixtures { println(msg) assert(msg.envelope.name == CreateMeetingReqMsg.NAME) assert(msg.core.isInstanceOf[CreateMeetingReqMsg]) - val map = Deserializer.toJBbbCommonEnvJsNodeMsg(JsonUtil.toJson(msg)) + val map = Deserializer.toBbbCommonEnvJsNodeMsg(JsonUtil.toJson(msg)) println(map) map match { - case Some(envJsNodeMsg) => assert(envJsNodeMsg.core.isInstanceOf[JsonNode]) + case Success(envJsNodeMsg) => assert(envJsNodeMsg.core.isInstanceOf[JsonNode]) val createMeetingReqMsg = Deserializer.toCreateMeetingReqMsg(envJsNodeMsg.envelope, envJsNodeMsg.core) createMeetingReqMsg match { case Some(cmrq) => assert(cmrq.isInstanceOf[CreateMeetingReqMsg]) case None => fail("Failed to decode CreateMeetingReqMsg") } - case None => fail("Failed to decode json message") + case Failure(ex) => fail("Failed to decode json message " + ex) } + } + "It" should "be able to decode BbbCoreMsg" in { + val routing = collection.immutable.HashMap("sender" -> "bbb-web") + val envelope = BbbCoreEnvelope(CreateMeetingReqMsg.NAME, routing) + val header = BbbCoreBaseHeader(CreateMeetingReqMsg.NAME) + val body = CreateMeetingReqMsgBody(defaultProps) + val req = CreateMeetingReqMsg(header, body) + val msg = BbbCommonEnvCoreMsg(envelope, req) + println(msg) + assert(msg.envelope.name == CreateMeetingReqMsg.NAME) + assert(msg.core.isInstanceOf[CreateMeetingReqMsg]) + val map = Deserializer.toBbbCommonEnvJsNodeMsg(JsonUtil.toJson(msg)) + println(map) + map match { + case Success(envJsNodeMsg) => assert(envJsNodeMsg.core.isInstanceOf[JsonNode]) + val createMeetingReqMsg = Deserializer.toBbbCommonMsg[CreateMeetingReqMsg](envJsNodeMsg.envelope, envJsNodeMsg.core) + createMeetingReqMsg match { + case Success(cmrq) => assert(cmrq.isInstanceOf[CreateMeetingReqMsg]) + case Failure(ex) => fail("Failed to decode CreateMeetingReqMsg " + ex) + } + case Failure(ex) => fail("Failed to decode json message " + ex) + } } + } diff --git a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/util/JsonUtilTest.scala b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/util/JsonUtilTest.scala index 91b858a2820dd7a6ad1397671543c36edab4592d..f701a432de2a92dc520fe585b4b17ec5b00d13ae 100755 --- a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/util/JsonUtilTest.scala +++ b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/util/JsonUtilTest.scala @@ -5,6 +5,9 @@ import org.bigbluebutton.common2.messages._ import scala.collection.immutable.List import com.fasterxml.jackson.databind.JsonNode +import org.bigbluebutton.common2.messages.MessageBody.ValidateAuthTokenReqMsgBody + +import scala.util.{Failure, Success} case class Person(name: String, age: Int) @@ -22,9 +25,9 @@ class JsonUtilTest extends UnitSpec2 with TestFixtures { val map = JsonUtil.toMap[Seq[Int]](json) // map: Map[String,Seq[Int]] = Map(a -> List(1, 2), b -> List(3, 4, 5), c -> List()) println(map) - map.get("a") match { - case Some(a) => assert(a.length == 2) - case None => fail("Failed to decode json message") + map match { + case Success(a) => assert(a.values.size == 3) + case Failure(ex) => fail("Failed to decode json message") } } @@ -50,8 +53,7 @@ class JsonUtilTest extends UnitSpec2 with TestFixtures { "JsonUtil" should "unmarshall a ValidateAuthTokenReq" in { val header: BbbCoreHeaderWithMeetingId = new BbbCoreHeaderWithMeetingId("foo", "mId") - val body: ValidateAuthTokenReqMsgBody = new ValidateAuthTokenReqMsgBody(meetingId = "mId", userId = "uId", token = "myToken", - replyTo = "replyHere", sessionId = "mySessionId") + val body: ValidateAuthTokenReqMsgBody = new ValidateAuthTokenReqMsgBody(userId = "uId", authToken = "myToken") val msg: ValidateAuthTokenReqMsg = new ValidateAuthTokenReqMsg(header, body) val json = JsonUtil.toJson(msg) println(json) @@ -80,13 +82,24 @@ class JsonUtilTest extends UnitSpec2 with TestFixtures { """.stripMargin val finalMsg = JsonUtil.fromJson[FooNode](jsonMsg) - val finalMsg2 = JsonUtil.fromJson[ValidateAuthTokenReqMsg](JsonUtil.toJson(finalMsg)) + + val json = JsonUtil.toJson(finalMsg) + + val finalMsg2 = for { + result <- JsonUtil.fromJson[ValidateAuthTokenReqMsg](json) + } yield result + println(finalMsg2) val map = JsonUtil.toMap[Map[String, Any]](jsonMsg) - for { - header <- map.get("header") - meetingId <- header.get("meetingId") - } yield println(meetingId) + map match { + case Success(m) => + for { + header <- m.get("header") + meetingId <- header.get("meetingId") + } yield println(meetingId) + case Failure(ex) => fail("Failed to convert message.") + } + } }