/* Ċ Ġ* ĠJ ico fo , Ġthe ĠJ its i ĠConference ĠFocus . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ@ Ġ 2 0 1 5 - Present Ġ 8 x 8 , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġ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 . j its i . j ico fo . j ibri Ċ Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . j its i . j ico fo . J its i Me et Conference Impl Ċ import Ġorg . j its i . j ico fo . j ibri . J ibri Config . Companion . config Ċ import Ġorg . j its i . j ico fo . j ibri . J ibri Session . Start Exception Ċ import Ġorg . j its i . j ico fo . j ibri . J ibri Session . Start Exception . All Busy Ċ import Ġorg . j its i . j ico fo . j ibri . J ibri Session . Start Exception . Not Available Ċ import Ġorg . j its i . utils . logging 2 . Logger Ċ import Ġorg . j its i . x mpp . extensions . j ibri . J ibri Iq Ċ import Ġorg . j its i . x mpp . extensions . j ibri . J ibri Iq . Recording Mode Ċ import Ġorg . j its i . x mpp . extensions . j ibri . J ibri Iq . Status Ċ import Ġorg . j its i . x mpp . extensions . j ibri . Recording Status Ċ import Ġorg . j ives o ftware . sm ack . packet . IQ Ċ import Ġorg . j ives o ftware . sm ack . packet . St anza Error Ċ import Ġorg . j its i . j ico fo . util . ErrorResponse . create Ġas Ġerror Ċ Ċ /** Ċ Ġ* ĠHandles Ġconference Ġrecording Ġthrough ĠJ ibri . Ċ Ġ* ĠW aits Ġfor Ġupdates Ġfrom Ġ[ J ibri Detector ] Ġabout Ġrecorder Ġinstance Ċ Ġ* Ġavailability Ġand Ġpub lishes Ġthat Ġinformation Ġin ĠJ ico fo 's ĠM UC Ġpresence . Ċ Ġ* ĠHandles Ġincoming ĠJ ibri ĠI Qs Ġcoming Ġfrom Ġconference Ġmod erator Ġto Ċ Ġ* Ġstart / stop Ġthe Ġrecording . Ċ Ġ* Ċ Ġ* Ġ@ author ĠP aw el ĠD omas Ċ Ġ* Ġ@ author ĠSam ĠWh ited Ċ Ġ*/ Ċ class ĠJ ibri Recorder ( ĊĠĠĠ Ġconference : ĠJ its i Me et Conference Impl , ĊĠĠĠ Ġj ibri Detector : ĠJ ibri Detector , ĊĠĠĠ Ġparent Logger : ĠLogger Ċ ) Ġ: ĠBase J ibri ( ĊĠĠĠ Ġconference , ĊĠĠĠ Ġparent Logger , ĊĠĠĠ Ġj ibri Detector Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġrecording Ġsession Ġor Ġ< tt > null </ tt >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġj ibri Session : ĠJ ibri Session ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġshutdown () Ġ{ ĊĠĠĠĠĠĠĠ Ġj ibri Session ?. stop ( null ) ĊĠĠĠĠĠĠĠ Ġj ibri Session Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAccept s Ġonly Ġ[ J ibri Iq ] Ġwithout Ġa ĠSIP Ġaddress . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġaccept Type ( packet : ĠJ ibri Iq ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġpacket Ġcannot Ġcontain Ġa ĠSIP Ġaddress Ġ( must Ġbe Ġhandled ĊĠĠĠĠĠĠĠ Ġ// Ġby ĠJ ibri S ip Gateway ) ĊĠĠĠĠĠĠĠ Ġreturn ĠStringUtils . isBlank ( packet . sip Address ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ J ibri Recorder ] Ġhas Ġat Ġmost Ġone Ġj ibri Ġsession . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget J ibri Session For Me et Iq ( iq : ĠJ ibri Iq ): ĠJ ibri Session ? Ġ= Ġj ibri Session ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ{@ inheritDoc } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġj ibri Sessions : ĠList < J ibri Session > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġj ibri Session ?. let Ġ{ ĠlistOf ( it ) Ġ} Ġ?: Ġempty List () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġa Ġrequest Ġto Ġstart Ġa Ġj ibri Ġsession Ġcoming Ġfrom Ġa Ġclient Ġin Ġthe Ġconference Ġand Ġreturns Ġthe Ġresponse Ġto ĊĠĠĠĠ Ġ* Ġbe Ġsent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ Base J ibri ] Ġhas Ġchecked Ġthat Ġthere Ġis Ġno Ġrecording Ġsession Ġcurrently Ġactive . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġhandle Start Request ( iq : ĠJ ibri Iq ): ĠIQ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstream Id IsEmpty Ġ= ĠStringUtils . isBlank ( iq . stream Id ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( stream Id IsEmpty Ġ&& Ġi q . recording Mode Ġ!= ĠRecord ingMode . FILE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStream ĠID Ġis Ġmandatory Ġunless Ġwe 're Ġrecording Ġto Ġa Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( iq , ĠSt anza Error . Condition . bad _ request , Ġ" Stream ĠID Ġis Ġempty Ġor Ġundefined ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! stream Id IsEmpty Ġ&& Ġi q . recording Mode Ġ== ĠRecord ingMode . FILE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStream ĠID Ġshould Ġnot Ġbe Ġprovided Ġwith Ġrequests Ġto Ġrecord Ġto Ġa Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( iq , ĠSt anza Error . Condition . bad _ request , Ġ" Stream ĠID Ġis Ġprovided Ġfor Ġa ĠFILE Ġrecording .") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsessionId Ġ= Ġgenerate SessionId () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ibri Session Ġ= ĠJ ibri Session ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconference . room Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi q . from , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . pending Timeout . seconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . num Retries , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ibri Detector , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , Ġnull , Ġi q . displayName , Ġi q . stream Id , Ġi q . youtube Broadcast Id , ĠsessionId , Ġi q . app Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Started ĠJ ibri Ġsession ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ ibri Iq . create Result ( iq , ĠsessionId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠStart Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ibri Session Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( exc ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAll Busy Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Failed Ġto Ġstart Ġa ĠJ ibri Ġsession , Ġall ĠJ ibr is Ġwere Ġbusy ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( iq , ĠSt anza Error . Condition . resource _ constraint , Ġ" all ĠJ ibr is Ġare Ġbusy ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNot Available Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Failed Ġto Ġstart Ġa ĠJ ibri Ġsession , Ġno ĠJ ibr is Ġavailable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( iq , ĠSt anza Error . Condition . service _ un available , Ġ" no ĠJ ibr is Ġavailable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Failed Ġto Ġstart Ġa ĠJ ibri Ġsession : Ġ${ exc . message }", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( iq , ĠSt anza Error . Condition . internal _ server _ error , Ġexc . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ{@ inheritDoc } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Session StateChanged ( ĊĠĠĠĠĠĠĠ Ġj ibri Session : ĠJ ibri Session , ĊĠĠĠĠĠĠĠ Ġnew Status : ĠStatus , ĊĠĠĠĠĠĠĠ Ġfailure Reason : ĠJ ibri Iq . Failure Reason ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . j ibri Session Ġ!== Ġj ibri Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" on Session StateChanged Ġfor Ġunknown Ġsession : Ġ$ j ibri Session ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpublish J ibri Recording Status ( new Status , Ġfailure Reason ) ĊĠĠĠĠĠĠĠ Ġif Ġ( new Status Ġ== ĠStatus . OFF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . j ibri Session Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġthe Ġnew Ġj ibri Ġstatus Ġas Ġpresence Ġin Ġthe Ġconference ĠM UC . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġpublish J ibri Recording Status ( new Status : ĠStatus , Ġfailure Reason : ĠJ ibri Iq . Failure Reason ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Got Ġj ibri Ġstatus Ġ$ new Status Ġand Ġfailure Ġ$ failure Reason ") ĊĠĠĠĠĠĠĠ Ġval Ġj ibri Session Ġ= Ġj ibri Session ĊĠĠĠĠĠĠĠ Ġif Ġ( j ibri Session Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġpossible Ġback - to - back Ġ' stop ' Ġrequests Ġcould Ġbe Ġreceived , Ġand Ġwhile Ġprocessing Ġthe Ġresult Ġof Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfirst Ġwe Ġset Ġj ibri Session Ġ// Ġto Ġnull , Ġso Ġin Ġthe Ġprocessing Ġof Ġthe Ġsecond Ġone Ġit Ġwill Ġalready Ġbe Ġnull . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" J ibri Ġsession Ġwas Ġalready Ġcleaned Ġup , Ġnot Ġsending Ġnew Ġstatus ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrecording Status Ġ= ĠRecord ing Status (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġnew Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . failure Reason Ġ= Ġfailure Reason ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsessionId Ġ= Ġj ibri Session . sessionId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( new Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . ON Ġ-> Ġinit iator Ġ= Ġj ibri Session . init iator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . OFF Ġ-> Ġinit iator Ġ= Ġj ibri Session . termin ator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġj ibri Session . recording Mode . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= ĠRecord ingMode . UNDEFINED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecording Mode Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info (" Publishing Ġnew Ġj ibri - recording - status : Ġ${ recording Status . to XML ()} Ġin : Ġ" Ġ+ Ġconference . room Name ) ĊĊĠĠĠĠĠĠĠ Ġconference . chat Room ?. set Presence Extension ( recording Status , Ġfalse ) ĊĠĠĠ Ġ} Ċ } Ċ