/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 . Ġ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 . users Ċ Ċ import Ġcom . auth 0 . client . mgmt . Management API Ċ import Ġcom . auth 0 . json . mgmt . users . User Ċ import Ġcom . datal oom . map pers . Object Map pers Ċ import Ġcom . ge ek be ast . util . Exponent ial Backoff Ċ import Ġcom . ge ek be ast . util . attempt Ċ import Ġcom . open l attice . users . export . Auth 0 Api Extension Ċ import Ġcom . open l attice . users . export . JobStatus Ċ import Ġcom . open l attice . users . export . User Export JobRequest Ċ import Ġcom . open l attice . users . export . User Export Job Result Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . time . Instant Ċ import Ġjava . util . stream . Collectors Ċ import Ġjava . util . zip . GZIP InputStream Ċ Ċ private Ġconst Ġval ĠDEFAULT _ PAGE _ SIZE Ġ= Ġ 1 0 0 Ċ private Ġconst Ġval ĠMAX _ DELAY Ġ= Ġ 8 L Ġ* Ġ 6 0 L Ġ* Ġ 1 0 0 0 L Ġ// Ġ 8 Ġmin Ċ const Ġval ĠMAX _ RETRY _ COUNT Ġ= Ġ 2 2 Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ author ĠMat thew ĠT am ay o - R ios Ġ& lt ; mat thew @ open l attice . com & gt ; Ċ Ġ*/ Ċ class ĠAuth 0 User Listing Service ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmanagement Api : ĠManagement API , Ġprivate Ġval Ġauth 0 Api Extension : ĠAuth 0 Api Extension Ċ ) Ġ: ĠUser Listing Service Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Auth 0 User Listing Service :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġall Ġusers Ġfrom Ġauth 0 Ġas Ġa Ġresult Ġof Ġan Ġexport Ġjob . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠgetAll Users (): ĠSequence < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Users ( auth 0 Api Extension ). as Sequence () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalls Ġan Ġexport Ġjob Ġto Ġdownload Ġall Ġusers Ġfrom Ġauth 0 Ġto Ġa Ġjson Ġand Ġparses Ġit Ġto Ġa Ġsequence Ġof Ġusers . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : ĠThis Ġexport Ġis Ġused , Ġbecause Ġthe Ġuser ĠAPI Ġhas Ġa Ġ 1 0 0 0 Ġuser Ġlimitation . ĊĠĠĠĠ Ġ* Ġ@ see Ġ< a Ġhref =" https :// auth 0 . com / docs / users / search / v 3 / get - users - endpoint # limitations "> ĠAuth 0 Ġuser Ġendpoint ĊĠĠĠĠ Ġ* Ġlimitations Ġ</ a > ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Users ( auth 0 Api Extension : ĠAuth 0 Api Extension ): ĠList < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexport Entity Ġ= Ġauth 0 Api Extension . user Export () ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġexport Entity . submit Export Job ( User Export JobRequest ( AUTH 0 _ USER _ FIELDS )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwill Ġfail Ġif Ġexport Ġjob Ġhang s Ġtoo Ġlong Ġwith Ġtoo Ġmany Ġrequests Ġerror Ġ( 4 2 9 Ġstatus Ġcode ) ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// auth 0 . com / docs / policies / rate - limits ĊĠĠĠĠĠĠĠ Ġvar Ġexport Job Result Ġ= Ġexport Entity . get Job ( job . id ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( export Job Result . status Ġ== ĠJob Status . PENDING Ġ|| Ġexport Job Result . status Ġ== ĠJob Status . PROCESS ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 ) Ġ// Ġwait Ġbefore Ġcalling Ġagain Ġfor Ġjob Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexport Job Result Ġ= Ġexport Entity . get Job ( job . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġattempt ( Exponent ial Backoff ( MAX _ DELAY ), ĠMAX _ RETRY _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Users From Location ( export Job Result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Users From Location ( export Job Result : ĠUser Export Job Result ): ĠList < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdownload Url Ġ= Ġexport Job Result . location . get () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠObject Map pers . get Mapper ( Object Map pers . Mapper . valueOf ( export Job Result . format . name . toUpperCase ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġdownload Url . open Connection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . setRequest Property (" Accept - Encoding ", Ġ" gzip ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠG ZIP InputStream ( connection . getInputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffered Ġ= ĠBufferedReader ( InputStream Reader ( input , Ġ" UTF - 8 ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexport Ġjson Ġformat Ġhas Ġa Ġline Ġby Ġline Ġuser Ġobject Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġat Ġany Ġpoint Ġwe Ġhave Ġtoo Ġmany Ġusers , Ġwe Ġmight Ġhave Ġto Ġdownload Ġthe Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffered . lines (). map Ġ{ Ġline Ġ-> Ġmapper . readValue ( line , ĠUser :: class . java ) Ġ}. collect ( Collectors . toList ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Couldn 't Ġread Ġlist Ġof Ġusers Ġfrom Ġdownload Ġurl Ġ$ download Url .", e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġusers Ġfrom Ġauth 0 Ġwhere Ġthe Ġupdated _ at Ġproperty Ġis Ġlarger Ġthan Ġ[ from ] Ġ( exclusive ) Ġand Ġsmaller Ġthan ĊĠĠĠĠ Ġ* Ġ[ to ] Ġ( inclusive ) Ġas Ġa Ġsequence . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Updated Users ( from : ĠInstant , Ġto : ĠInstant ): ĠSequence < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠAuth 0 User Listing Result ( management Api , Ġfrom , Ġto ). as Sequence () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAuth 0 User Listing Result ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmanagement Api : ĠManagement API , Ġprivate Ġval Ġfrom : ĠInstant , Ġprivate Ġval Ġto : ĠInstant Ċ ) Ġ: ĠIterable < User > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠAuth 0 User Listing Iterator ( management Api , Ġfrom , Ġto ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAuth 0 User Listing Iterator ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmanagement Api : ĠManagement API , Ġprivate Ġval Ġfrom : ĠInstant , Ġprivate Ġval Ġto : ĠInstant Ċ ) Ġ: ĠIterator < User > Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Auth 0 User Listing Iterator :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġpage Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġpage Of Users Ġ= ĠgetNext Page () ĊĠĠĠ Ġprivate Ġvar Ġpage Iterator Ġ= Ġpage Of Users . iterator () ĊĊĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! page Iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page Of Users . size Ġ== ĠDEFAULT _ PAGE _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Of Users Ġ= ĠgetNext Page () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Iterator Ġ= Ġpage Of Users . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpage Iterator . hasNext () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnext (): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpage Iterator . next () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetNext Page (): ĠList < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Page Ġ= Ġget Updated Users Page ( management Api , Ġfrom , Ġto , Ġpage ++, ĠDEFAULT _ PAGE _ SIZE ). items ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Loaded Ġpage Ġ{} Ġof Ġ{} Ġauth 0 Ġusers ", Ġpage Ġ- Ġ 1 , Ġnext Page . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Ret rofit Ġcalled Ġfailed Ġduring Ġauth 0 Ġsync Ġtask .", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ