/* Ċ Ġ* Ġ ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠFre ya ĠA rb j erg Ġand Ġcontributors Ċ Ġ* Ċ Ġ* Ġ ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġ Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġ Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġ Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġ Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġ Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* Ġ ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġ Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* Ġ ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* Ġ ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* Ġ ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* Ġ ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* Ġ ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* Ġ ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* Ġ ĠSOFTWARE . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġl aval ink . server . io Ċ Ċ import Ġcom . sed mell uq . l ava . extensions . yout uber ot ator . planner . Abstract Route Planner Ċ import Ġcom . sed mell uq . l ava . extensions . yout uber ot ator . planner . Nano Ip Route Planner Ċ import Ġcom . sed mell uq . l ava . extensions . yout uber ot ator . planner . Rot ating Ip Route Planner Ċ import Ġcom . sed mell uq . l ava . extensions . yout uber ot ator . planner . Rot ating Nano Ip Route Planner Ċ import Ġorg . json . JSONObject Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . Response Entity Ċ import Ġorg . springframework . web . bind . annotation . GetMapping Ċ import Ġorg . springframework . web . bind . annotation . PostMapping Ċ import Ġorg . springframework . web . bind . annotation . RequestBody Ċ import Ġorg . springframework . web . bind . annotation . RestController Ċ import Ġorg . springframework . web . server . ResponseStatus Exception Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . Unknown Host Exception Ċ import Ġjava . util .* Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ Ċ @ RestController Ċ class ĠRoute Planner Rest Handler ( private Ġval Ġroute Planner : ĠAbstract Route Planner ?) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġcurrent Ġinformation Ġabout Ġthe Ġactive ĠAbstract Route Planner ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ GetMapping ("/ route planner / status ") ĊĠĠĠ Ġfun ĠgetStatus ( request : ĠHttpServletRequest ): ĠResponseEntity < Route Planner Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġwhen Ġ( route Planner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠRoute Planner Status ( null , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRoute Planner Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute Planner . java Class . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Detail Block ( route Planner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . ok ( status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġa Ġsingle Ġaddress Ġfrom Ġthe Ġaddresses Ġwhich Ġare Ġcurrently Ġmarked Ġas Ġfailing ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ PostMapping ("/ route planner / free / address ") ĊĠĠĠ Ġfun Ġfree Single Address ( request : ĠHttpServletRequest , Ġ@ RequestBody Ġrequest Body : ĠString ): ĠResponseEntity < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġroute Planner Ġ?: Ġthrow ĠRoute Planner Disabled Exception () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠJSONObject ( request Body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= ĠInet Address . get ByName ( jsonObject . getString (" address ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroute Planner . free Address ( address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . no Content (). build () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠUnknown Host Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResponse Status Exception ( HttpStatus . BAD _ REQUEST , Ġ" Invalid Ġaddress : Ġ" Ġ+ Ġexception . message , Ġexception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġall Ġaddresses Ġfrom Ġthe Ġlist Ġwhich Ġholds Ġthe Ġaddresses Ġwhich Ġare Ġmarked Ġfailing ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ PostMapping ("/ route planner / free / all ") ĊĠĠĠ Ġfun Ġfree All Addresses ( request : ĠHttpServletRequest ): ĠResponseEntity < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġroute Planner Ġ?: Ġthrow ĠRoute Planner Disabled Exception () ĊĠĠĠĠĠĠĠ Ġroute Planner . free All Addresses () ĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . no Content (). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetail Ġinformation Ġblock Ġfor Ġan ĠAbstract Route Planner ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Detail Block ( planner : ĠAbstract Route Planner ): ĠI Route Planner Status Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġip Block Ġ= Ġpl anner . ip Block ĊĠĠĠĠĠĠĠ Ġval Ġip Block Status Ġ= ĠIp Block Status ( ip Block . type . simple Name , Ġip Block . size . toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġfailing Addresses Ġ= Ġpl anner . fail ing Addresses ĊĠĠĠĠĠĠĠ Ġval Ġfailing Addresses Status Ġ= Ġfailing Addresses . entries . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF ailing Address ( it . key , Ġit . value , ĠDate ( it . value ). toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( planner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRot ating Ip Route Planner Ġ-> ĠRot ating Ip Route Planner Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Block Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailing Addresses Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl anner . rotate Index . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl anner . index . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl anner . current Address . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠN ano Ip Route Planner Ġ-> ĠN ano Ip Route Planner Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Block Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailing Addresses Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl anner . current Address . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRot ating Nano Ip Route Planner Ġ-> ĠRot ating Nano Ip Route Planner Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Block Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailing Addresses Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl anner . current Block . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl anner . address Index In Block . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠGeneric Route Planner Status ( ip Block Status , Ġfailing Addresses Status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠRoute Planner Status ( val Ġ` class `: ĠString ?, Ġval Ġdetails : ĠI Route Planner Status ?) ĊĊĠĠĠ Ġinterface ĠI Route Planner Status ĊĠĠĠ Ġdata Ġclass ĠGeneric Route Planner Status ( ĊĠĠĠĠĠĠĠ Ġval Ġip Block : ĠIp Block Status , ĊĠĠĠĠĠĠĠ Ġval Ġfailing Addresses : ĠList < Fail ing Address > ĊĠĠĠ Ġ) Ġ: ĠI Route Planner Status ĊĊĠĠĠ Ġdata Ġclass ĠRot ating Ip Route Planner Status ( ĊĠĠĠĠĠĠĠ Ġval Ġip Block : ĠIp Block Status , ĊĠĠĠĠĠĠĠ Ġval Ġfailing Addresses : ĠList < Fail ing Address >, ĊĠĠĠĠĠĠĠ Ġval Ġrotate Index : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġip Index : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Address : ĠString ĊĠĠĠ Ġ) Ġ: ĠI Route Planner Status ĊĊĠĠĠ Ġdata Ġclass ĠN ano Ip Route Planner Status ( ĊĠĠĠĠĠĠĠ Ġval Ġip Block : ĠIp Block Status , ĊĠĠĠĠĠĠĠ Ġval Ġfailing Addresses : ĠList < Fail ing Address >, ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Address Index : ĠString ĊĠĠĠ Ġ) Ġ: ĠI Route Planner Status ĊĊĠĠĠ Ġdata Ġclass ĠRot ating Nano Ip Route Planner Status ( ĊĠĠĠĠĠĠĠ Ġval Ġip Block : ĠIp Block Status , ĊĠĠĠĠĠĠĠ Ġval Ġfailing Addresses : ĠList < Fail ing Address >, ĊĠĠĠĠĠĠĠ Ġval Ġblock Index : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Address Index : ĠString ĊĠĠĠ Ġ) Ġ: ĠI Route Planner Status ĊĊĠĠĠ Ġdata Ġclass ĠF ailing Address ( val Ġfailing Address : ĠString , Ġval Ġfailing Timestamp : ĠLong , Ġval Ġfailing Time : ĠString ) ĊĠĠĠ Ġdata Ġclass ĠIp Block Status ( val Ġtype : ĠString , Ġval Ġsize : ĠString ) ĊĊĠĠĠ Ġclass ĠRoute Planner Disabled Exception Ġ: ĊĠĠĠĠĠĠĠ ĠResponse Status Exception ( HttpStatus . INTERNAL _ SERVER _ ERROR , Ġ" Can 't Ġaccess Ġdisabled Ġroute Ġpl anner ") Ċ } Ċ