package Ġorg . dev . gr 3 g . jd ln a . web . servlet Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġorg . dev . gr 3 g . jd ln a . bean . Config Model Ċ import Ġorg . dev . gr 3 g . jd ln a . bean . Up np Ċ import Ġorg . dev . gr 3 g . jd ln a . dao . Database DAO Ċ import Ġorg . dev . gr 3 g . jd ln a . utils . Media FileUtils Ċ import Ġorg . four th line . cl ing . model . message . Connection Ċ import Ġorg . four th line . cl ing . model . message . Stream Request Message Ċ import Ġorg . four th line . cl ing . model . message . Stream Response Message Ċ import Ġorg . four th line . cl ing . model . message . header . ContentType Header Ċ import Ġorg . four th line . cl ing . protocol . Protocol Factory Ċ import Ġorg . four th line . cl ing . transport . impl . Async Servlet Up np Stream Ċ import Ġorg . se am less . util . MimeType Ċ import Ġjava . io . IOException Ċ import Ġjava . io . OutputStream Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . channels . Channels Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util . logging . Level Ċ import Ġjava . util . logging . Logger Ċ import Ġjavax . servlet . Async Context Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ import Ġjavax . servlet . http . HttpServletResponse Ċ Ċ /** Ċ Ġ* Ġ@ author ĠG reg ory ĠTar div el Ċ Ġ*/ Ċ @ Suppress (" NAME _ SH ADO WING ") Ċ class ĠAsync Servlet Up np Stream Impl ( protocol Factory : ĠProtocol Factory ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Context : ĠAsync Context ?, Ġrequest : ĠHttpServletRequest ?) Ġ: ĠAsync Servlet Up np Stream ( protocol Factory , Ġasync Context , Ġrequest ) Ġ{ ĊĊĠĠĠ Ġ/** ĠLogger . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getLogger ( Async Servlet Up np Stream Impl :: class . java . name ) ĊĊĠĠĠ Ġprivate Ġval Ġmapper Ġ= ĠObjectMapper () ĊĠĠĠ Ġprivate Ġvar Ġmessage : ĠString ? Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Connection (): ĠConnection Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠAsync Servlet Connection ( getRequest ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Message Ġ= Ġread Request Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . fine ( String . format (" Processing Ġnew Ġrequest Ġmessage : Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Message . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġget Request (). path Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġget Request (). method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . fine ( String . format (" process (% s ) ĠPATH : Ġ% s ", Ġmethod , Ġpath )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ== ĠUp np . NAMESPACE Ġ|| Ġpath Ġ== ĠUp np . NAMESPACE Ġ+ Ġ"/" Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Index () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ== ĠUp np . NAMESPACE Ġ+ Ġ"/ api / latest / conf " Ġ&& Ġmethod Ġ== Ġ" GET " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Rest Conf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ== ĠUp np . NAMESPACE Ġ+ Ġ"/ api / latest / reload " Ġ&& Ġmethod Ġ== Ġ" POST " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Reload () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ== ĠUp np . NAMESPACE Ġ+ Ġ"/ api / latest / save " Ġ&& Ġmethod Ġ== Ġ" POST " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Save ( request Message . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . contains (". js ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Static ( path , Ġ" text / javascript ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . contains (". css ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Static ( path , Ġ" text / css ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . contains (". png ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Static ( path , Ġ" image / png ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . contains (". ttf ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Static ( path , Ġ" image / ttf ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . contains (". woff ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Static ( path , Ġ" application / font - woff ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . contains (". woff 2 ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Static ( path , Ġ" application / font - woff 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . startsWith ( Up np . NAMESPACE Ġ+ Ġ"/ file ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess File Streaming () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Default ( request Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warning (" Exception Ġoccurred Ġduring ĠUP nP Ġstream Ġprocessing Ġ: Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġexc . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( logger . is Log gable ( Level . F INE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log ( Level . SEVERE , Ġ" Error ", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . response . is Commit ted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warning ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Response Ġhasn 't Ġbeen Ġcommitted , Ġreturning ĠINTERNAL ĠSERVER ĠERROR Ġto Ġclient ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . response . status Ġ= ĠHttpServletResponse . SC _ INTERNAL _ SERVER _ ERROR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Could Ġnot Ġreturn ĠINTERNAL ĠSERVER ĠERROR Ġto Ġclient , Ġresponse Ġwas Ġalready Ġcommitted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġexc . message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Exception ( exc ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomplete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġsend Response () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( response Message Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Response Message ( response Message ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . response . status Ġ= ĠHttpServletResponse . SC _ NOT _ FOUND ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġprocess Default ( request Message : ĠStream Request Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse Message Ġ= Ġsuper . process ( request Message ) ĊĠĠĠĠĠĠĠ Ġsend Response () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġprocess Save ( body : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( body Ġis ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconf Ġ= Ġmapper . readValue ( body , ĠConfig Model :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase DAO . update Conf ( Database DAO . FOLDER _ IMAGE , Ġconf . photo . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase DAO . update Conf ( Database DAO . FOLDER _ VIDEO , Ġconf . video . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase DAO . update Conf ( Database DAO . FOLDER _ M US IC , Ġconf . music . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase DAO . update Conf ( Database DAO . FOLDER _ COVER , Ġconf . cover . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Reload () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġprocess Reload () Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia FileUtils . update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Re charge ment Ġdes Ġfichiers Ġtermin Ã©s " ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log ( Level . SEVERE , Ġ" Error Ġupdate ", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Er reur : Ġ" Ġ+ Ġexc . message ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresponse Message Ġ= ĠStream Response Message ("{ \" status \":\" $ message \" }". toByteArray ( StandardCharsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContentType Header (" application / json ; charset : UTF - 8 ")) ĊĠĠĠĠĠĠĠ Ġsend Response () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġprocess Static ( path : ĠString , ĠmimeType : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Static : ĠString Ġ= Ġ"/ front " Ġ+ Ġpath . substring ( Up np . NAMESPACE . length ) ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġjava Class . getResource ( path Static ). read Bytes () ĊĠĠĠĠĠĠĠ Ġresponse Message Ġ= ĠStream Response Message ( content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMime Type . valueOf ( mime Type )) ĊĠĠĠĠĠĠĠ Ġsend Response () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġprocess Rest Conf () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconf Ġ= ĠDatabase DAO . select Conf () ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġmapper . writeValue As Bytes ( conf ) ĊĠĠĠĠĠĠĠ Ġresponse Message Ġ= ĠStream Response Message ( json , ĠContentType Header (" application / json ; charset : UTF - 8 ")) ĊĠĠĠĠĠĠĠ Ġsend Response () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġprocess Index () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġjava Class . getResource ("/ front / index . html "). read Bytes () ĊĠĠĠĠĠĠĠ Ġresponse Message Ġ= Ġif Ġ( index . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warning (" index . html _ old Ġnot Ġloaded ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Response Message ( index , ĠMime Type . valueOf (" text / html ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsend Response () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġprocess File Streaming () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġget Request (). getParameter (" stream ") ĊĠĠĠĠĠĠĠ Ġif Ġ( stream !!. matches ( Regex (" [- 0 - 9 ]* "))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath : ĠPath Ġ= ĠDatabase DAO . select Path ( stream . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmimeType Ġ= ĠFiles . probe ContentType ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= ĠFiles . size ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠFiles . new InputStream ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . response . status Ġ= ĠHttpServletResponse . SC _ PAR TIAL _ CONTENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . response . add Header (" CONTENT - TYPE ", ĠmimeType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . response . add Header (" CONTENT - LENGTH ", Ġlength . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . response . add Header (" Accept - Ranges ", Ġ" bytes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . response . add Header (" Content - Disposition ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" filename =" Ġ+ Ġpath . fileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout : ĠOutputStream Ġ= Ġthis . response . output Stream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( logger . is Log gable ( Level . F INE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . fine ( String . format (" Stream Ġdu Ġfichier Ġ% s ", Ġstream )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfinal Ġbyte [] Ġbytes Ġ= Ġnew Ġbyte [ BUFFER ]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Ġ= ĠChannels . new Channel ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrite Ġ= ĠChannels . new Channel ( out ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfinal ĠBuffered OutputStream Ġb Out Ġ= Ġnew ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBuffered OutputStream ( out ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhile Ġ( input . read ( bytes ) Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġb Out . write ( bytes ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuff Ġ= ĠByteBuffer . allocate ( BUFFER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( read . read ( buff ) Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . flip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite . write ( buff ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . compact () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warning (" ID Ġis Ġnot Ġan Ġinteger : Ġ$ stream ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBUFFER Ġ= Ġ 1 0 2 4 Ġ* Ġ 1 0 0 ĊĠĠĠ Ġ} Ċ }