/* Ċ Ġ* Ġ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 . js r 2 2 3 Ċ Ċ import Ġorg . apache . t inker pop 4 . gre mlin . language . grammar . G re mlin Ant lr To Java Ċ Ċ /** Ċ Ġ* ĠA Ġ[ G re mlin Script Engine ] Ġimplementation Ġthat Ġevaluates ĠG re mlin Ġscripts Ġusing Ġ` gre mlin - language `. ĠAs Ġit Ċ Ġ* Ġuses Ġ` gre mlin - language ` Ġand Ġthus Ġthe ĠAN TLR Ġparser , Ġit Ġis Ġnot Ġcapable Ġof Ġprocess Ġarbitrary Ġscripts Ġas Ġthe Ċ Ġ* Ġ` G re mlin Gro ovy Script Engine ` Ġcan Ġand Ġis Ġtherefore Ġa Ġmore Ġsecure ĠG re mlin Ġevaluator . ĠIt Ġis Ġobviously Ġrestricted Ċ Ġ* Ġto Ġthe Ġcapabilities Ġof Ġthe ĠAN TLR Ġgrammar Ġso Ġtherefore Ġsyntax Ġthat Ġincludes Ġthings Ġlike Ġlamb das Ġare Ġnot Ġsupported . Ċ Ġ* ĠFor Ġbytecode Ġevaluation Ġit Ġsimply Ġuses Ġthe Ġ[ Java Translator ]. Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠAs Ġan Ġinternal Ġnote , Ġtechnically , Ġthis Ġis Ġan Ġincomplete Ġimplementation Ġof Ġthe Ġ[ G re mlin Script Engine ] Ġin Ġthe Ċ Ġ* Ġtraditional Ġsense Ġas Ġa Ġdrop - in Ġreplacement Ġfor Ġsomething Ġlike Ġthe Ġ` G re mlin Gro ovy Script Engine `. ĠAs Ġa Ġresult , Ċ Ġ* Ġthis Ġ[ G re mlin Script Engine ] Ġcannot Ġpass Ġthe Ġ` G re mlin Script Engine Suite ` Ġtests Ġin Ġfull . ĠOn Ġthe Ġother Ġhand , Ċ Ġ* Ġthis Ġlimitation Ġis Ġprecise ly Ġwhat Ġmakes Ġthis Ġimplementation Ġbetter Ġfrom Ġa Ġsecurity Ġperspective . ĠU lt imately , Ġthis Ċ Ġ* Ġimplementation Ġrepresents Ġthe Ġfirst Ġstep Ġto Ġchanges Ġin Ġwhat Ġit Ġmeans Ġto Ġhave Ġa Ġ[ G re mlin Script Engine ]. ĠIn Ġsome Ċ Ġ* Ġsense , Ġthere Ġis Ġquestion Ġwhy Ġa Ġ[ G re mlin Script Engine ] Ġapproach Ġis Ġnecessary Ġat Ġall Ġexcept Ġfor Ġeasily Ġplug ging Ċ Ġ* Ġinto Ġthe Ġexisting Ġinternals Ġof ĠG re mlin ĠServer Ġor Ġmore Ġspecifically Ġthe Ġ` G re mlin Executor `. Ċ Ġ*/ Ċ class ĠG re mlin Lang Script Engine ( var arg Ġcustom izers : ĠCustom izer ?) Ġ: ĠAbstract Script Engine (), ĠG re mlin Script Engine Ġ{ ĊĠĠĠ Ġ@ get : Override ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġfactory : ĠG re mlin Script Engine Factory ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= ĠG re mlin Lang Script Engine Factory () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġinstance Ġusing Ġno Ġ[ Customizer ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor () Ġ: Ġthis (* array Of Null s < Customizer >( 0 )) Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠByte code Ġis Ġevaluated Ġby Ġthe Ġ[ Java Translator ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġ@ Throws ( Script Exception :: class ) ĊĠĠĠ Ġfun Ġeval ( byte code : ĠByte code ?, Ġbindings : ĠBind ings , Ġtraversal Source : ĠString ): ĠTra versal . Admin Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( traversal Source . equals ( HIDDEN _ G )) Ġthrow ĠIllegalArgumentException (" The Ġtraversal Source Ġcannot Ġhave Ġthe Ġname Ġ" Ġ+ ĠHID DEN _ G . toString () Ġ+ Ġ" Ġ- Ġit Ġis Ġreserved ") ĊĠĠĠĠĠĠĠ Ġif Ġ( bindings . containsKey ( HIDDEN _ G )) Ġthrow ĠIllegalArgumentException (" Bindings Ġcannot Ġinclude Ġ" Ġ+ ĠHID DEN _ G . toString () Ġ+ Ġ" Ġ- Ġit Ġis Ġreserved ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! bindings . containsKey ( traversal Source )) Ġthrow ĠIllegalArgumentException (" The Ġbindings Ġavailable Ġto Ġthe ĠScript Engine Ġdo Ġnot Ġcontain Ġa Ġtraversal Source Ġnamed : Ġ$ traversal Source ") ĊĠĠĠĠĠĠĠ Ġval Ġb : ĠObject Ġ= Ġbindings . get ( traversal Source ) ĊĠĠĠĠĠĠĠ Ġif Ġ( b Ġ! is ĠTra versal Source ) Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal Source Ġ+ Ġ" Ġis Ġof Ġtype Ġ" Ġ+ Ġb . getClass () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getSimpleName () Ġ+ Ġ" Ġand Ġis Ġnot Ġan Ġinstance Ġof ĠTra versal Source " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠJava Translator . of ( b Ġas ĠTra versal Source ). translate ( byte code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠG re mlin Ġscripts Ġevaluated Ġby Ġthe Ġgrammar Ġmust Ġbe Ġbound Ġto Ġ" g " Ġand Ġshould Ġevaluate Ġto Ġa Ġ" g " Ġin Ġthe ĊĠĠĠĠ Ġ* Ġ` Script Context ` Ġthat Ġis Ġof Ġtype Ġ[ Traversal Source ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġ@ Throws ( Script Exception :: class ) ĊĠĠĠ Ġfun Ġeval ( script : ĠString ?, Ġcontext : ĠScript Context ): ĠObject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġo : ĠObject Ġ= Ġcontext . getAttribute (" g ") ĊĠĠĠĠĠĠĠ Ġif Ġ( o Ġ! is ĠGraph Traversal Source ) Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" g Ġis Ġof Ġtype Ġ" Ġ+ Ġo . getClass (). getSimpleName (). toString () Ġ+ Ġ" Ġand Ġis Ġnot Ġan Ġinstance Ġof ĠTra versal Source " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġantlr Ġ= ĠG re mlin Ant lr To Java ( o Ġas ĠGraph Traversal Source ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG re mlin QueryParser . parse ( script , Ġantlr ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠScript Exception ( ex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġ@ Throws ( Script Exception :: class ) ĊĠĠĠ Ġfun Ġeval ( reader : ĠReader , Ġcontext : ĠScript Context ?): ĠObject Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġeval ( read Fully ( reader ), Ġcontext ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġfun Ġcreate Bindings (): ĠBind ings Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSimple Bindings () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġthe Ġ` Script Context ` Ġusing Ġa Ġ[ G re mlin Script Context ] Ġwhich Ġavoids Ġa Ġsignificant Ġamount Ġof ĊĠĠĠĠ Ġ* Ġadditional Ġobject Ġcreation Ġon Ġscript Ġevaluation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġprotected Ġfun Ġget Script Context ( nn : ĠBind ings ?): ĠScript Context Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġctxt Ġ= ĠG re mlin Script Context ( context . get Reader (), Ġcontext . get Writer (), Ġcontext . getError Writer ()) ĊĠĠĠĠĠĠĠ Ġval Ġgs : ĠBind ings Ġ= Ġget Bindings ( Script Context . GLOBAL _ SCOPE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( gs Ġ!= Ġnull ) Ġctxt . set Bindings ( gs , ĠScript Context . GLOBAL _ SCOPE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( nn Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctxt . set Bindings ( nn , ĠScript Context . ENGINE _ SCOPE ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNullPointerException (" Engine Ġscope ĠBind ings Ġmay Ġnot Ġbe Ġnull .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġctxt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Script Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġread Fully ( reader : ĠReader ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarr Ġ= ĠChar Array ( 8 1 9 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġnum Chars : ĠInt ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( reader . read ( arr , Ġ 0 , Ġarr . size ). also Ġ{ Ġnum Chars Ġ= Ġit Ġ} Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ( arr , Ġ 0 , Ġnum Chars ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exp : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠScript Exception ( exp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuf . toString () ĊĠĠĠ Ġ} Ċ }