/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 . ĠOpen L attice , ĠInc . Ċ Ġ* Ċ Ġ* ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ Ġ* Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġ* Ġthe ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor Ċ Ġ* Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . Ċ Ġ* Ċ Ġ* ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ Ġ* Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ Ġ* ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ Ġ* ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ Ġ* Ġalong Ġwith Ġthis Ġprogram . Ġ ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. Ċ Ġ* Ċ Ġ* ĠYou Ġcan Ġcontact Ġthe Ġowner Ġof Ġthe Ġcopyright Ġat Ġsupport @ open l attice . com Ċ Ġ* Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . open l attice . datastore . analysis . controllers Ċ Ċ import Ġcom . co da h ale . metrics . annotation . Timed Ċ import Ġcom . google . common . base . Preconditions . check Argument Ċ import Ġcom . google . common . base . Preconditions . check State Ċ import Ġcom . open l attice . analysis . Analysis Api Ċ import Ġcom . open l attice . analysis . Analysis Api .* Ċ import Ġcom . open l attice . analysis . Authorized Filtered Neighbors Ranking Ċ import Ġcom . open l attice . analysis . requests . Aggregation Result Ċ import Ġcom . open l attice . analysis . requests . Neighbor Type Ċ import Ġcom . open l attice . analysis . requests . Ranking Aggregation Ċ import Ġcom . open l attice . authorization .* Ċ import Ġcom . open l attice . data . Data Graph Manager Ċ import Ġcom . open l attice . data . requests . FileType Ċ import Ġcom . open l attice . datastore . services . Analysis Service Ċ import Ġcom . open l attice . datastore . services . Edm Service Ċ import Ġcom . open l attice . datastore . services . Entity Set Manager Ċ import Ġcom . open l attice . edm . Edm Constants . Companion . COUNT _ FQ N Ċ import Ġcom . open l attice . edm . Edm Constants . Companion . ID _ FQ N Ċ import Ġcom . open l attice . web . medi at ypes . Custom MediaType Ċ import Ġedu . umd . cs . find bugs . annotations . Suppress FB Warnings Ċ import Ġorg . apache . ol ingo . commons . api . edm . Full QualifiedName Ċ import Ġorg . springframework . http . MediaType Ċ import Ġorg . springframework . web . bind . annotation .* Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . servlet . http . HttpServletResponse Ċ import Ġkotlin . collections . Linked HashSet ĊĊ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ author ĠMat thew ĠT am ay o - R ios Ġ& lt ; mat thew @ open l attice . com & gt ; Ċ Ġ*/ Ċ @ Suppress FB Warnings ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ[" RC N _ RED UND ANT _ NULL CHECK _ WO ULD _ HAVE _ BE EN _ A _ N PE ", Ġ" BC _ BAD _ CAST _ TO _ AB STR ACT _ COLLECTION "], ĊĠĠĠĠĠĠĠ Ġjust ification Ġ= Ġ" Allow ing Ġredundant Ġkotlin Ġnull Ġcheck Ġon Ġlateinit Ġvariables , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Allow ing Ġkotlin Ġcollection Ġmapping Ġcast Ġto ĠList " Ċ ) Ċ @ RestController Ċ @ RequestMapping ( CONTROLLER ) Ċ class ĠAnalysis Controller Ġ: ĠAnalysis Api , ĠAuthor izing Component Ġ{ ĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġanalysis Service : ĠAnalysis Service ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġd gm : ĠData Graph Manager ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġedm : ĠEd m Service ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġauth z Helper : ĠEd m Authorization Helper ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġauthor izations : ĠAuthorization Manager ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġentity Set Manager : ĠEntity Set Manager ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġ@ RequestMapping ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġ[( ENTITY _ SET _ ID _ PATH Ġ+ ĠNUM _ RESULTS _ PATH )], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ= Ġ[( Request Method . POST )], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduces Ġ= Ġ[( MediaType . APPLICATION _ JSON _ VALUE ), Ġ( Custom MediaType . TEXT _ CSV _ VALUE )] ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġget Top Util izers ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable ( ENTITY _ SET _ ID ) Ġentity SetId : ĠUUID , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable ( NUM _ RESULTS ) Ġnum Results : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ RequestBody Ġfiltered Rank ings : ĠRank ing Aggregation , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ RequestParam ( value Ġ= ĠFILE _ TYPE , Ġrequired Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileType : ĠFile Type ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠHttpServletResponse ĊĠĠĠ Ġ): ĠAg gregation Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filtered Rank ings . neighbors . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAg gregation Result ( sorted Set Of (), Ġmap Of (), Ġmap Of ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġensure Read Access ( Acl Key ( entity SetId )) ĊĠĠĠĠĠĠĠ Ġval Ġdownload Type Ġ= ĠfileType Ġ?: ĠFile Type . json ĊĠĠĠĠĠĠĠ Ġ// setContent Disposition ( Ġresponse , Ġentity SetId . toString (), Ġdownload Type Ġ); ĊĠĠĠĠĠĠĠ Ġset Download ContentType ( response , Ġdownload Type ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Top Util izers ( entity SetId , Ġnum Results , Ġfiltered Rank ings , ĠfileType ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Top Util izers ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity SetId : ĠUUID , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Results : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġranking Aggregation : ĠRank ing Aggregation , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileType : ĠFile Type ? ĊĠĠĠ Ġ): ĠAg gregation Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentity Set Ġ= Ġentity Set Manager . getEntity Set ( entity SetId ) !! ĊĠĠĠĠĠĠĠ Ġval Ġcolumn Titles Ġ= Ġget Entity Set Columns ( entity Set Manager . get EntityType By Entity SetId ( entity SetId ). id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! entity Set . is Link ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Filtered Rank ings ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( entity SetId ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Results , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġranking Aggregation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Titles , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set . is Link ing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOptional . empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcheck Argument ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set . linked Entity Sets . isNotEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Linked Ġentity Ġsets Ġdoes Ġnot Ġconsist Ġof Ġany Ġentity Ġsets ." ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Filtered Rank ings ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set . linked Entity Sets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Results , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġranking Aggregation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Titles , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set . is Link ing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOptional . of ( entity SetId ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Entity Set Columns ( entity TypeId : ĠUUID ): ĠLinked HashSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLinked HashSet ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedm . get EntityType ( entity TypeId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. properties ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( edm :: getProperty Type F qn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( Full QualifiedName :: getFull QualifiedName AsString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( COUNT _ FQ N . full QualifiedName AsString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( ID _ FQ N . full QualifiedName AsString ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Filtered Rank ings ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set Ids : ĠSet < UUID >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Results : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Rank ings : ĠRank ing Aggregation , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Titles : ĠLinked HashSet < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlinked : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlinking Entity SetId : ĠOptional < UUID > ĊĠĠĠ Ġ): ĠAg gregation Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauthorized Property Types Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set Ids . map Ġ{ Ġentity SetId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity SetId Ġto Ġauth z Helper . get Authorized Property Types ( entity SetId , ĠEnum Set . of ( Permission . READ )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap (). to Mutable Map () ĊĠĠĠĠĠĠĠ Ġauthorized Property Types Ġ+= Ġanalysis Service . get Authorized Neighbors ( entity Set Ids ) ĊĊĠĠĠĠĠĠĠ Ġval Ġentity Sets Ġ= Ġentity Set Manager . getEntity Sets As Map ( authorized Property Types . keys ) ĊĊĠĠĠĠĠĠĠ Ġval Ġauthorized Filtered Rank ings Ġ= Ġfiltered Rank ings . neighbors . map Ġ{ Ġfiltered Ranking Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthorized Association Property Types Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedm . getProperty Types As Map ( edm . get EntityType ( filtered Ranking . association TypeId ). properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthorized Entity SetProperty Types Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedm . getProperty Types As Map ( edm . get EntityType ( filtered Ranking . neighbor TypeId ). properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthorized Associations Ġ= Ġentity Sets . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . entity TypeId Ġ== Ġfiltered Ranking . association TypeId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . key Ġto Ġauthorized Property Types . getValue ( it . value . id ). keys Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthorized Neighbors Ġ= Ġentity Sets . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . entity TypeId Ġ== Ġfiltered Ranking . neighbor TypeId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . key Ġto Ġauthorized Property Types . getValue ( it . value . id ). keys Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuthor ized Filtered Neighbors Ranking ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Ranking , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthorized Associations , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthorized Association Property Types , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthorized Neighbors , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthorized Entity SetProperty Types ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġd gm . get Filtered Rank ings ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set Ids , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Results , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthorized Filtered Rank ings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthorized Property Types , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinked , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinking Entity SetId ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ RequestMapping ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġ[( ENTITY _ SET _ ID _ PATH Ġ+ ĠTY PES _ PATH )], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ= Ġ[( Request Method . GET )], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduces Ġ= Ġ[( MediaType . APPLICATION _ JSON _ VALUE )] ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget Neighbor Types (@ PathVariable ( ENTITY _ SET _ ID ) Ġentity SetId : ĠUUID ): ĠIterable < Neighbor Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Read Access ( Acl Key ( entity SetId )) ĊĊĠĠĠĠĠĠĠ Ġval Ġentity Set Ġ= Ġentity Set Manager . getEntity Set ( entity SetId ) !! ĊĊĠĠĠĠĠĠĠ Ġval Ġall Entity Set Ids Ġ= Ġif Ġ( entity Set . is Link ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set . linked Entity Sets . isNotEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Linked Ġentity Ġsets Ġare Ġempty Ġfor Ġlinking Ġentity Ġset Ġ% s , Ġid Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity Set . linked Entity Sets . filter Ġ{ Ġis Authorized ( Permission . READ ). test ( Acl Key ( entity SetId )) Ġ}. toSet () ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( entity SetId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġanalysis Service . get Neighbor Types ( all Entity Set Ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Authorization Manager (): ĠAuthorization Manager ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġauthor izations ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Download ContentType ( response : ĠHttpServletResponse , ĠfileType : ĠFile Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fileType Ġ== ĠFile Type . csv ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . contentType Ġ= ĠCustom MediaType . TEXT _ CSV _ VALUE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . contentType Ġ= ĠMediaType . APPLICATION _ JSON _ VALUE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ