/* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ċ Ġ* Ġor Ġmore Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ċ Ġ* Ġdistributed Ġwith Ġthis Ġwork Ġfor Ġadditional Ġinformation Ċ Ġ* Ġregarding Ġcopyright Ġownership . Ġ ĠThe ĠASF Ġlicenses Ġthis Ġfile Ċ Ġ* Ġto Ġyou Ġ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 . apache . t inker pop 4 . gre mlin . process . traversal . util Ċ Ċ import Ġorg . apache . t inker pop 4 . gre mlin . js r 2 2 3 . Single G re mlin Script Engine Manager Ċ Ċ /** Ċ Ġ* ĠScript Traversal Ġencaps ulates Ġa Ġ[ Script Engine ] Ġand Ġa Ġscript Ġwhich Ġis Ġcompiled Ġinto Ġa Ġ[ Traversal ] Ġat Ġ[ Admin . apply Str ategies ]. Ċ Ġ* ĠThis Ġis Ġuseful Ġfor Ġserial izing Ġtra vers als Ġas Ġthe Ġcompilation Ġcan Ġhappen Ġon Ġthe Ġremote Ġend Ġwhere Ġthe Ġtraversal Ġwill Ġultimately Ġbe Ġprocessed . Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark o ĠA . ĠRod rig ue z Ġ( http :// mark or od rig ue z . com ) Ċ Ġ*/ Ċ class ĠScript Traversal < S , ĠE >( ĊĠĠĠ Ġtraversal Source : ĠTra versal Source , ĊĠĠĠ Ġscript Engine : ĠString , ĊĠĠĠ Ġscript : ĠString , ĊĠĠĠ Ġvar arg Ġbindings : ĠObject Ċ ) Ġ: ĠDefault Traversal < S , ĠE >() Ġ{ ĊĠĠĠ Ġprivate Ġval Ġalias Ġ= Ġ" g " ĊĠĠĠ Ġprivate Ġval Ġfactory : ĠTra versal Source Factory ĊĠĠĠ Ġprivate Ġval Ġscript : ĠString ĊĠĠĠ Ġprivate Ġval Ġscript Engine : ĠString ĊĠĠĠ Ġprivate Ġval Ġbindings : ĠArray < Object > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . graph Ġ= Ġtraversal Source . get Graph () ĊĠĠĠĠĠĠĠ Ġfactory Ġ= ĠTra versal Source Factory ( traversal Source ) ĊĠĠĠĠĠĠĠ Ġthis . script Engine Ġ= Ġscript Engine ĊĠĠĠĠĠĠĠ Ġthis . script Ġ= Ġscript ĊĠĠĠĠĠĠĠ Ġthis . bindings Ġ= Ġbindings ĊĠĠĠĠĠĠĠ Ġif Ġ( this . bindings . size Ġ% Ġ 2 Ġ!= Ġ 0 ) Ġthrow ĠIllegalArgumentException (" The Ġprovided Ġkey / value Ġbindings Ġarray Ġlength Ġmust Ġbe Ġa Ġmultiple Ġof Ġtwo ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġfun Ġapply Str ategies () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( 0 Ġ== Ġthis . get Steps (). size ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġengine : ĠScript Engine Ġ= ĠSingle G re mlin Script Engine Manager . get ( script Engine ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġengine Bindings : ĠBind ings Ġ= Ġengine . create Bindings () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstrategy List : ĠList < Traversal Strategy <* >> Ġ= Ġthis . get Str ategies (). toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine Bindings . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory . create Traversal Source ( this . graph ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Str ategies ( strategy List . toArray ( array Of Null s < Traversal Strategy >( strategy List . size ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine Bindings . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" graph ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . graph ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ// ĠTODO : Ġwe Ġdon 't Ġneed Ġthis Ġas Ġthe Ġtraversal Source . get Graph () Ġexists , Ġbut Ġits Ġnow Ġhere Ġand Ġpeople Ġmight Ġbe Ġusing Ġit Ġ( remove Ġin Ġ 3 . 3 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġbindings . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine Bindings . put ( bindings [ i ] Ġas ĠString , Ġbindings [ i Ġ+ Ġ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġi Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtraversal : ĠTra versal . Admin < S , ĠE > Ġ= Ġengine . eval ( script , Ġengine Bindings ) Ġas ĠTra versal . Admin < S , ĠE > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal . get Side Effects (). merge Into ( this . side Effects ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal . get Steps (). forEach ( this :: add Step ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . str ategies Ġ= Ġtraversal . get Str ategies () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . apply Str ategies () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠScript Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( e . getMessage (), Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }