/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 Ġvr abel . z den ko @ gmail . com Ċ Ġ* Ċ Ġ* Ġ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 Ġnom ic . app Ċ Ċ import Ġcom . sun . org . apache . xml . internal . security . utils . X alan XPath API . is Installed Ċ import Ġnom ic . app . config . Types afe Config Ċ import Ġnom ic . compiler . Compiler Ċ import Ġnom ic . core .* Ċ import Ġnom ic . core . exception . Box Already Installed Exception Ċ import Ġnom ic . core . exception . W tf Exception Ċ import Ġnom ic . core . fact . Module Fact Ċ import Ġnom ic . core . fact . Require Fact Ċ import Ġnom ic . db . Av ro Db Ċ import Ġnom ic . db . Nom ic Db Ċ import Ġnom ic . hdfs . Hdfs Plugin Ċ import Ġnom ic . hdfs . adapter . Hdfs Adapter Ċ import Ġnom ic . hive . Hive Plugin Ċ import Ġnom ic . oo zie . O oz ie Plugin Ċ Ċ /** Ċ Ġ* Ġ@ author Ġvr abel . z den ko @ gmail . com Ċ Ġ*/ Ċ class ĠN omic App Ġ: ĠN omic Instance Ġ{ ĊĉĊ ĉ //---------------------------------------------------------------- -------------------------------- - Ċ ĉ // Ġproperties Ġ& Ġconstruction Ċ ĉ //---------------------------------------------------------------- -------------------------------- - ĊĊ ĉ override Ġval Ġconfig : ĠN omic Config Ċ ĉ private Ġval Ġcompiler : ĠCompiler Ċ ĉ private Ġval Ġplugins : ĠList < Plugin > Ċ ĉ private Ġval Ġh dfs : ĠH dfs Adapter Ċ ĉ private Ġval Ġdb : ĠN omic Db ĊĊ ĉ constructor ( config : ĠN omic Config , Ġplugins : ĠList < Plugin >) Ġ{ ĊĊĉ ĉ this . plugins Ġ= Ġplugins ĊĊĉ ĉ this . hdfs Ġ= Ġplugins . filter Is Instance ( Hdfs Plugin :: class . java ). first OrNull ()?. hdfs Ġ?: Ġthrow ĠW tf Exception () Ċĉ ĉ this . db Ġ= ĠAv ro Db ( Ċĉĉ ĉ hdfs Ġ= Ġh dfs , Ċĉĉ ĉ nom ic Home Ġ= Ġconfig . hdfs Repository Dir Ċĉ ĉ ) ĊĊĉ ĉ this . config Ġ= Ġthis . Config ( config ) Ċĉ ĉ this . compiler Ġ= ĠCompiler ( Ċĉĉ ĉ user ĠĠĠĠĠ Ġ= Ġconfig . user , Ċĉĉ ĉ home Dir ĠĠ Ġ= Ġconfig . hdfs Home Dir , Ċĉĉ ĉ app Dir ĠĠĠ Ġ= Ġconfig . hdfs App Dir , Ċĉĉ ĉ ex pos ĠĠĠĠ Ġ= Ġplugins . filter Is Instance ( Ex posable :: class . java ). toList () Ċĉ ĉ ) Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ ĊĊĉ ĉ @ Jvm Static Ċĉ ĉ fun Ġcreate Default (): ĠN omic App Ġ= Ċĉĉ ĉ create Default ( Types afe Config . load Default Configuration ()) ĊĊĉ ĉ @ Jvm Static Ċĉ ĉ fun Ġcreate Default ( config : Nom ic Config ): ĠN omic App Ġ{ Ċĉĉ ĉ val Ġconfig Ġ= ĠTypes afe Config . load Default Configuration () Ċĉĉ ĉ val Ġh dfs Plugin Ġ= ĠH dfs Plugin . init ( config ) Ċĉĉ ĉ val Ġh ive Plugin Ġ= ĠHive Plugin ( config ) Ċĉĉ ĉ val Ġo oz ie Plugin Ġ= ĠO oz ie Plugin . init ( config , Ġh dfs Plugin . hdfs ) Ċĉĉ ĉ return ĠN omic App ( config , ĠlistOf ( hdfs Plugin , Ġh ive Plugin , Ġo oz ie Plugin )) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ //---------------------------------------------------------------- -------------------------------- - Ċ ĉ // Ġinner Ġclasses Ċ ĉ //---------------------------------------------------------------- -------------------------------- - ĊĊ ĉ private Ġinner Ġclass ĠConfig ( private Ġval Ġparent : ĠN omic Config ): ĠN omic Config () Ġ{ Ċĉ ĉ override Ġfun Ġget ( name : ĠString ): ĠString ? Ġ{ Ċĉĉ ĉ if Ġ( name Ġ== Ġ" nom ic . hdfs . home ") Ġ{ Ċĉĉĉ ĉ return Ġh dfs . home Directory Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ return Ġparent [ name ] Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ //---------------------------------------------------------------- -------------------------------- - Ċ ĉ // Ġimplemented Ġmethods Ċ ĉ //---------------------------------------------------------------- -------------------------------- - ĊĊĊ ĉ /** Ċĉ Ġ* Ġopen Ġthe Ġbundle Ġand Ġcompile Ġit 's Ġroot Ġ' nom ic . box ' Ġinto Ġ[ Bund led Box ] Ġwith Ġfacts Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġcompile ( bundle : ĠBundle ): ĠApplication Box Ġ= Ċĉ ĉ compile All ( bundle ) Ċĉĉ ĉ . filter Is Instance ( Application Box :: class . java ) Ċĉĉ ĉ . first () ĊĊĊ ĉ /** Ċĉ Ġ* ĠThis Ġfunction Ġcompile Ġthe Ġbundle 's Ġbox Ġand Ġall Ġsub modules . Ċĉ Ġ* Ċĉ Ġ* Ġ@ see ĠN omic Instance . compile All Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġcompile All ( bundle : ĠBundle ): ĠList < Bund led Box > Ġ{ Ċĉ ĉ val Ġfacts Ġ= Ġcompiler . compile ( bundle . script ) Ċĉ ĉ val Ġapp Box Ġ= ĠApplication Box ( bundle , Ġfacts ) Ċĉ ĉ val Ġdependencies Fact s Ġ= Ġmutable ListOf < Require Fact >() ĊĊĉ ĉ return Ġfacts . find Fact sType ( Module Fact :: class . java ) Ċĉĉ ĉ . flatMap Ġ{ Ġmodule Fact Ġ-> Ċĉĉĉ ĉ // Ġcompile Ġchild Ġmodule Ġand Ġchild 's Ġsub modules Ġ( recursion ) Ċĉĉĉ ĉ val Ġchild Module Bundle Ġ= ĠNested Bundle ( app Box , Ġmodule Fact . name ) Ċĉĉĉ ĉ val Ġchild Module Boxes Ġ= Ġcompile All ( child Module Bundle ) ĊĊĉĉĉ ĉ // Ġfind Ġthe Ġroot , Ġcreate Ġrequire Ġfact Ċĉĉĉ ĉ val Ġr Ġ= Ġchild Module Boxes . filter Is Instance ( Application Box :: class . java ). first () Ċĉĉĉ ĉ dependencies Fact s Ġ+= ĠRequire Fact ( box Ġ= Ġr . ref ()) Ċĉĉĉ ĉ child Module Boxes Ċĉĉ ĉ } Ċĉĉ ĉ . map Ġ{ Ġbox Ġ-> Ċĉĉĉ ĉ // Ġmake Ġall Ġnested Ġboxes Ġas ĠMO d ule Box - es Ġ( only Ġone Ġroot Ġmight Ġexist ) Ċĉĉĉ ĉ if Ġ( box Ġis ĠApplication Box ) Ġ{ Ċĉĉĉĉ ĉ box . to Module Box () Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ box Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ . toList () Ġ+ ĠApplication Box ( app Box , Ġfacts Ġ+ Ġdependencies Fact s ) Ċ ĉ } ĊĊĊ ĉ /** Ċĉ Ġ* Ġcompile Ġthe Ġbundle Ġand Ġinstall Ġit Ġif Ġit 's Ġnot Ġinstalled Ġyet . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġforce Ġif Ġit Ġset Ġto Ġtrue , Ġthe Ġbundle Ġwill Ġbe Ġinstalled Ċĉ Ġ* ĠĠĠĠĠĠĠ Ġeven Ġif Ġbox Ġis Ġalready Ġpresent . ĠIt 's Ġgood Ġfor Ċĉ Ġ* ĠĠĠĠĠĠĠ Ġfixing Ġbad Ġinstall ations . Ċĉ Ġ* Ċĉ Ġ* Ġ@ return Ġreferences Ġto Ġall Ġinstalled Ġboxes Ġfrom Ġbundle Ġin Ġorder Ġhow Ċĉ Ġ* ĠĠĠĠĠĠĠĠ Ġthey Ġwas Ġinstalled . Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġinstall ( bundle : ĠBundle , Ġforce : ĠBoolean ): ĠList < Box Ref > Ġ{ Ċĉ ĉ // Ġcompile Ġbundle Ġinto Ġboxes Ġand Ġdo Ġtopology Ġsort Ġof Ġthem Ċĉ ĉ val Ġboxes Ġ= Ġcompile All ( bundle ) Ċĉ ĉ val Ġsorted Boxes Ġ= Ġboxes . topology Sort () ĊĊĉ ĉ // Ġinstall Ġthe Ġboxes Ġin Ġright Ġorder Ċĉ ĉ val Ġinstalled Refs Ġ= Ċĉĉ ĉ sorted Boxes . map Ġ{ Ġbox Ġ-> Ċĉĉĉ ĉ install ( box Ġas ĠBund led Box , Ġforce ) Ċĉĉ ĉ } ĊĊĉ ĉ return Ġinstalled Refs Ċ ĉ } ĊĊĊ ĉ /** Ċĉ Ġ* Ġinstall Ġonce Ġconcrete Ġ[ Bund led Box ] Ċĉ Ġ*/ Ċ ĉ fun Ġinstall ( box : ĠBund led Box , Ġforce : ĠBoolean ): ĠBox Ref Ġ{ Ċĉ ĉ if Ġ(! can Install ( box , Ġforce )) Ġ{ Ċĉĉ ĉ throw ĠBox Already Installed Exception ( box ) Ċĉ ĉ } ĊĊĉ ĉ // Ġsend Ġall Ġfacts Ġinto Ġplugins Ġfor Ġcommit Ċĉ ĉ for ( fact Ġin Ġbox . facts ) Ġ{ Ċĉĉ ĉ commit Fact ( box , Ġfact ) Ċĉ ĉ } ĊĊĉ ĉ // TODO : Ġreplace Ġempty List () Ġby Ġall Ġrequire Ġfacts Ċĉ ĉ db . insert OrUpdate ( box ) Ċĉ ĉ return Ġbox . ref () Ċ ĉ } ĊĊĊ ĉ /** Ċĉ Ġ* Ġuninstall Ġthe Ġbox Ġby Ġreference Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġuninstall ( ref : ĠBox Ref , Ġforce : ĠBoolean ) Ġ Ġ{ Ċĉ ĉ val Ġinstalled Box Ġ= Ġdetails ( ref ) Ċĉ ĉ if Ġ( installed Box Ġ!= Ġnull ) Ġ{ Ċĉĉ ĉ uninstall ( installed Box , Ġforce ) Ċĉ ĉ } Ċ ĉ } ĊĊĊ ĉ /** Ċĉ Ġ* Ġuninstall Ġthe Ġ[ Installed Box ] Ċĉ Ġ*/ Ċ ĉ fun Ġuninstall ( box : ĠInstalled Box , Ġforce : ĠBoolean ) Ġ{ Ċĉ ĉ // Ġfirst Ġuninstall Ġall Ġdependencies Ċĉ ĉ box . dependencies . forEach Ġ{ Ġdep Ġ-> Ċĉĉ ĉ uninstall ( dep , Ġforce ) Ċĉ ĉ } ĊĊĉ ĉ // Ġsend Ġall Ġfacts Ġin Ġreverse Ġorder Ġinto Ġplugins Ġfor Ġrollback Ċĉ ĉ box . facts Ċĉĉ ĉ . reversed () Ċĉĉ ĉ . forEach Ġ{ Ġfact Ġ-> Ċĉĉĉ ĉ rollback Fact ( box , Ġfact ) Ċĉĉ ĉ } ĊĊĉ ĉ db . delete ( box . ref ()) Ċ ĉ } ĊĊĊ ĉ /** Ċĉ Ġ* Ġcompile Ġthe Ġbundle Ġand Ġupgrade Ġit , Ġor Ġinstall Ġif Ġit 's Ġnot Ċĉ Ġ* Ġpresent Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġupgrade ( bundle : ĠBundle ) Ġ= Ċĉ ĉ upgrade ( compile ( bundle )) ĊĊĊ ĉ /** Ċĉ Ġ* Ġupgrade Ġthe Ġbox Ġor Ġinstall Ġif Ġit 's Ġnot Ċĉ Ġ* Ġpresent Ċĉ Ġ*/ Ċ ĉ fun Ġupgrade ( box : ĠBund led Box ) Ġ{ Ċĉ ĉ if Ġ( is Already Installed ( box )) Ġ{ Ċĉĉ ĉ uninstall ( box . ref (), Ġfalse ) Ċĉ ĉ } Ċĉ ĉ install ( box , Ġfalse ) Ċ ĉ } ĊĊĊ ĉ /** Ċĉ Ġ* Ġreturn Ġlist Ġof Ġboxes Ġinstalled / available Ġin Ġsystem Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġinstalled Boxes (): ĠList < Box Ref > Ġ= Ċĉ ĉ db . load All (). map ( Box :: ref ) ĊĊĊ ĉ /** Ċĉ Ġ* Ġreturn Ġconcrete Ġbox Ġwith Ġfacts Ġif Ġit 's Ġpresent , Ġotherwise Ċĉ Ġ* Ġreturns Ġnull . Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġdetails ( info : ĠBox Ref ): ĠInstalled Box ? Ġ= Ċĉ ĉ db . load ( info )?. compile With ( compiler ) ĊĊĊĊ ĉ //---------------------------------------------------------------- -------------------------------- - Ċ ĉ // Ġprivate Ġmethods Ċ ĉ //---------------------------------------------------------------- -------------------------------- - ĊĊ ĉ private Ġfun Ġcan Un install ( box : ĠBox , Ġforce : ĠBoolean ): ĠBoolean Ġ= Ċĉ ĉ is Already Installed ( box ) Ġ|| Ġforce ĊĊ ĉ private Ġfun Ġcan Install ( box : Box , Ġforce : ĠBoolean ): ĠBoolean Ġ= Ċĉ ĉ isNot Installed ( box ) Ġ|| Ġforce ĊĊ ĉ private Ġfun Ġis Already Installed ( box : ĠBox ): ĠBoolean Ġ= Ċĉ ĉ ! isNot Installed ( box ) ĊĊ ĉ private Ġfun Ġis Not Installed ( box : ĠBox ): ĠBoolean Ġ= Ċĉ ĉ db . load ( box . ref ()) Ġ== Ġnull ĊĊ ĉ private Ġfun Ġcommit Fact ( box : ĠBund led Box , Ġfact : ĠFact ) Ġ{ Ċĉ ĉ plugins . as Sequence () Ċĉĉ ĉ . forEach Ġ{ Ġp Ġ-> Ġp . commit ( box , Ġfact ) Ġ} Ċ ĉ } ĊĊ ĉ private Ġfun Ġrollback Fact ( box : ĠInstalled Box , Ġfact : ĠFact ) Ġ{ Ċĉ ĉ plugins . as Sequence () Ċĉĉ ĉ . forEach Ġ{ Ġp Ġ-> Ġp . rollback ( box , Ġfact ) Ġ} Ċ ĉ } Ċ Ċ }