/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 1 9 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 Ġio . lett uce Ċ Ċ import Ġreactor . ipc . netty . http . server . HttpServer Request Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ import Ġjava . util . stream . Stream Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMark ĠPal uch Ċ Ġ*/ Ċ data Ġclass ĠArtifact ( ĊĠĠĠĠĠĠĠ Ġval Ġlabel : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġmodule : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġclassifier : ĠClass ifier , ĊĠĠĠĠĠĠĠ Ġval Ġdescription : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġgh Branch : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġpinned Version : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġdeprecated : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġreference : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġwiki : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĊĠĠĠ Ġfun Ġis Reference And Wiki () Ġ= Ġreference Ġ&& Ġwiki Ċ } Ċ Ċ enum Ġclass ĠClass ifier Ġ{ ĊĠĠĠ ĠRelease , ĠM ilestone , ĠSnapshot Ċ } Ċ Ċ data Ġclass ĠModule ( val Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠgroupId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartifact Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbranches : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġga : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmilestone : ĠString ) Ġ{ ĊĊĠĠĠ Ġfun Ġbranch Text (): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( branches . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbranches . get ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbranches . join ToString ("/") ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMark ĠPal uch Ċ Ġ*/ Ċ class ĠModule Request ( val Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule : ĠModule ?) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( req : ĠHttp Server Request , Ġmodules : ĠMap < String , ĠModule >): ĠModule Request Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġreq . param (" module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠModule Request ( name , Ġreq . param (" version "), Ġreq . path (), Ġmodules [ name ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMark ĠPal uch Ċ Ġ*/ Ċ class ĠRequest ed Version ( version : ĠString ?, Ġpath : ĠString ?, Ġmodule : ĠModule ?) Ġ{ ĊĊĠĠĠ Ġvar Ġversion Type : ĠClass ifier ? ĊĠĠĠ Ġvar Ġis Pin ned Version : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġconstructor ( module Request : ĠModule Request ) Ġ: Ġthis ( module Request . version , Ġmodule Request . path , Ġmodule Request . module ) Ġ{} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġversion Type : ĠClass ifier ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( version Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Type Ġ= Ġif Ġ( path !!. contains ("/ snapshot ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass ifier . Snapshot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path . contains ("/ milestone ")) ĠClass ifier . M ilestone Ġelse ĠClass ifier . Release ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pin ned Version Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pin ned Version Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Version Type ( version , Ġmodule !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . version Type Ġ= Ġversion Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Version Type ( version : ĠString , Ġmodule : ĠModule ): ĠClass ifier Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm ilestones Ġ= Ġmodule . milestone . split ("," . to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version . contains ("- SNAPSHOT ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass ifier . Snapshot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( contains ( version , Ġm ilestones )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass ifier . M ilestone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠClass ifier . Release ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcontains ( version : ĠString , Ġneed les : ĠArray < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStream . of (* need les ). any Match Ġ{ Ġversion . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMark ĠPal uch Ċ Ġ*/ Ċ class ĠVersions ( val Ġversions : ĠList < Version >) Ġ{ ĊĊĠĠĠ Ġfun Ġsize (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġversions . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstream (): ĠStream < Version > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġversions . stream () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmerge With ( other : ĠVersions ): ĠVersions Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Version >( this . versions . size Ġ+ Ġother . versions . size ) ĊĠĠĠĠĠĠĠ Ġresult . addAll ( this . versions ) ĊĠĠĠĠĠĠĠ Ġresult . addAll ( other . versions ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠVersions ( result . reversed ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Latest ( version Type : ĠClass ifier ): ĠVersion ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġversions . stream (). filter Ġ{ Ġversion Ġ-> Ġversion . classifier Ġ== Ġversion Type Ġ}. findFirst (). orElse ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Version ( version : ĠString ): ĠVersion ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġversions . stream (). filter Ġ{ Ġv Ġ-> Ġv . version Ġ== Ġversion Ġ}. findFirst (). orElse ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( meta : ĠMaven Metadata , Ġmodule : ĠModule ): ĠVersions Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmilestone Pattern Ġ= Ġmodule . milestone . replace (" Ġ", Ġ""). replace (',', Ġ'| ') ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmilestone Ġ= ĠPattern . compile ( String . format (" (% s )( \\ d + )? ", Ġmilestone Pattern )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversions Ġ= Ġmeta . version ing !!. versions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmatches Branch ( it , Ġmodule . branches ) Ġ}. map Ġ{ Ġidentifier Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġclassifier Ġ= ĠClass ifier . Release ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( identifier . endsWith ("- SNAPSHOT ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier Ġ= ĠClass ifier . Snapshot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( milestone . matcher ( identifier ). find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier Ġ= ĠClass ifier . M ilestone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVersion . create ( identifier , Ġclassifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. reversed () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVersions ( versions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmatches Branch ( it : ĠString , Ġbranches : ĠList < String >): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( branch Ġin Ġbranches ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . startsWith ( branch )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠVersion ( val Ġversion : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclassifier : ĠClass ifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmajor : ĠInt Ġ= Ġ 0 ) Ġ: ĠComparable < Version > Ġ{ ĊĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( o : ĠVersion ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmajor Ġ= ĠInteger . compare ( this . major , Ġo . major ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( major Ġ!= Ġ 0 ) Ġmajor Ġelse Ġthis . version . compareTo ( o . version ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Version ( version ='$ version ', Ġclassifier =$ classifier , Ġmajor =$ major )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( version : ĠString , Ġclassifier : ĠClass ifier ): ĠVersion Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Dot Ġ= Ġversion . indexOf ('.') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmajor Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Dot Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmajor Ġ= ĠInteger . parseInt ( version . substring ( 0 , Ġfirst Dot )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVersion ( version , Ġclassifier , Ġmajor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMark ĠPal uch Ċ Ġ*/ Ċ data Ġclass ĠDocument ed Artifact ( val Ġartifact : ĠArtifact , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule : ĠModule , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion : ĠVersion ) Ġ{ Ċ Ċ } Ċ