package Ġorg . jetbrains . intellij Ċ Ċ import Ġorg . j dom 2 . Attribute Ċ import Ġorg . j dom 2 . Element Ċ import Ġorg . j dom 2 . input . SAX Builder Ċ import Ġjava . io . File Ċ Ċ class ĠStructure Generator Ġ{ ĊĠĠĠ Ġfun Ġgenerate ( project Dir : ĠFile ?): ĠStructure Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġworking Directory Ġ= ĠFile ( System . getProperty (" user . dir ")) ĊĠĠĠĠĠĠĠ Ġval Ġproject Directory Ġ= Ġproject Dir Ġ?: Ġworking Directory ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġload Project Like File ( project Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġload Project Like Directory ( project Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Project Ġnot Ġfound Ġin Ġdirectory : Ġ$ project Directory ") ĊĠĠĠĠĠĠĠ Ġreturn ĠStructure ( project . name , Ġproject . modules ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġoperator Ġfun ĠList < Attribute >. get ( name : ĠString ) Ġ= Ġfirst Ġ{ Ġit . name Ġ== Ġname Ġ}. value !! ĊĊĠĠĠ Ġprivate Ġoperator Ġfun ĠList < Element >. get ( name : ĠString ) Ġ= Ġfilter Ġ{ Ġit . name Ġ== Ġname Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġsafe ( file : ĠFile , Ġapply : Ġ() Ġ-> ĠT ) Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Cannot Ġparse Ġfile Ġ'$ file '", Ġex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Module ( module File : ĠFile ): ĠStructure . Module Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Sets Ġ= Ġsafe ( module File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSAX Builder (). build ( module File ). root Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. children [" component "]. first Ġ{ Ġit . attributes [" name "] Ġ== Ġ" New Module Root Manager " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. children [" content "]. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. children [" source Folder "]. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . attributes [" url "] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . remove Prefix (" file ://${ '$ '} MODULE _ DIR $/ ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFile ( module File . parent File , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠStructure . Module ( module File . name Without Extension , Ġmodule File . parent File , Ġsource Sets ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Project Like File ( project Directory : ĠFile ): ĠProject ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject File Ġ= Ġproject Directory . list Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġit . isFile Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . find Ġ{ Ġit . extension Ġ== Ġ" ipr " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġmodules Ġ= Ġsafe ( project File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSAX Builder (). build ( project File ). root Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. children [" component "]. first Ġ{ Ġit . attributes [" name "] Ġ== Ġ" Project Module Manager " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. children [" modules "]. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. children [" module "]. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . attributes [" filepath "] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . remove Prefix ("${ '$ '} PROJECT _ DIR $/ ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFile ( project File . parent File , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġload Module ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠProject ( project File . name Without Extension , Ġproject Directory , Ġmodules ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Project Like Directory ( project Directory : ĠFile ): ĠProject ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodules File Ġ= ĠFile ( project Directory , Ġ". idea / modules . xml ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! modules File . exists ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġmodules Ġ= Ġsafe ( modules File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSAX Builder (). build ( modules File ). root Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. children [" component "]. first Ġ{ Ġit . attributes [" name "] Ġ== Ġ" Project Module Manager " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. children [" modules "]. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. children [" module "]. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . attributes [" filepath "] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . remove Prefix ("${ '$ '} PROJECT _ DIR $/ ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFile ( project Directory , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġload Module ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġproject Module Ġ= Ġmodules . find Ġ{ Ġit . directory Ġ== Ġproject Directory Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠProject ( project Module . name , Ġproject Directory , Ġmodules ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠProject ( val Ġname : ĠString , Ġval Ġdirectory : ĠFile , Ġval Ġmodules : ĠList < Structure . Module >) Ċ }