package Ġio . hol unda . poly flow . view . jpa Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġio . hol ix on . ax on . gateway . configuration . query . Enable Revision Aware Query Gateway Ċ import Ġio . hol ix on . ax on . gateway . query . Query Response Message ResponseType Ċ import Ġio . hol ix on . ax on . gateway . query . Revision Value Ċ import Ġio . hol unda . camunda . task pool . api . business . Authorization Change . Companion . addGroup Ċ import Ġio . hol unda . camunda . task pool . api . business . Authorization Change . Companion . add User Ċ import Ġio . hol unda . camunda . task pool . api . business . Data Entry Created Event Ċ import Ġio . hol unda . camunda . task pool . api . business . Data Entry Updated Event Ċ import Ġio . hol unda . camunda . task pool . api . business . Modification Ċ import Ġio . hol unda . camunda . task pool . api . business . Processing Type Ċ import Ġio . hol unda . camunda . variable . serializer . serialize Ċ import Ġio . hol unda . poly flow . view . auth . User Ċ import Ġio . hol unda . poly flow . view . jpa . it est . Test Application Ċ import Ġio . hol unda . poly flow . view . query . data . Data Entries ForUser Query Ċ import Ġio . hol unda . poly flow . view . query . data . Data Entries Query Ċ import Ġio . hol unda . poly flow . view . query . data . Data Entries QueryResult Ċ import Ġmu . K Logging Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . ax on framework . event handling . Generic Event Message Ċ import Ġorg . ax on framework . events ourcing . event store . Event Store Ċ import Ġorg . ax on framework . messaging . Generic Message Ċ import Ġorg . ax on framework . query handling . Query Gateway Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . context . SpringBootTest Ċ import Ġorg . springframework . test . context . Active Profiles Ċ import Ġorg . springframework . test . context . junit 4 . Spring Runner Ċ import Ġjava . time . Instant Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . time . Zone Offset Ċ import Ġjava . time . temporal . Ch rono Unit Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Callable Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjavax . transaction . Transactional Ċ Ċ @ RunWith ( Spring Runner :: class ) Ċ @ SpringBootTest ( ĊĠ Ġclasses Ġ= Ġ[ Test Application :: class ], ĊĠ Ġproperties Ġ= Ġ[ ĊĠĠĠ Ġ" ax on - gateway . query . type = revision - aware ", ĊĠĠĠ Ġ" ax on - gateway . query . revision - aware . default - query - timeout = 1 0 ", ĊĠĠĠ Ġ" poly flow . view . jpa . data - entry - filters . exclude = secret " ĊĠ Ġ] Ċ ) Ċ @ Transactional Ċ @ Active Profiles (" it est ") Ċ @ Enable Revision Aware Query Gateway Ċ internal Ġclass ĠJ pa Poly flow View Service Data Entry Revision Support ITest Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ: ĠK Logging () ĊĊĠ Ġlateinit Ġvar ĠexecutorService : ĠExecutor Service ĊĊĠ Ġ@ Autowired ĊĠ Ġlateinit Ġvar Ġdb Clean er : ĠDb Clean er ĊĊĠ Ġ@ Autowired ĊĠ Ġlateinit Ġvar Ġquery Gateway : ĠQuery Gateway ĊĊĠ Ġ@ Autowired ĊĠ Ġlateinit Ġvar Ġevent Store : ĠEvent Store ĊĊĠ Ġ@ Autowired ĊĠ Ġlateinit Ġvar ĠobjectMapper : ĠObjectMapper ĊĊĠ Ġprivate Ġval Ġid Ġ= ĠUUID . randomUUID (). toString () ĊĠ Ġprivate Ġval Ġnow Ġ= ĠInstant . now () ĊĠ Ġprivate Ġval Ġpayload Ġ= Ġmap Of ( ĊĠĠĠ Ġ" key " Ġto Ġ" value ", ĊĠĠĠ Ġ" key - int " Ġto Ġ 1 , ĊĠĠĠ Ġ" secret " Ġto Ġ" very - secret ", ĊĠĠĠ Ġ" complex " Ġto ĠPo jo ( ĊĠĠĠĠĠ Ġattribute 1 Ġ= Ġ" value ", ĊĠĠĠĠĠ Ġattribute 2 Ġ= ĠDate . from ( now ) ĊĠĠĠ Ġ) ĊĠ Ġ) ĊĊĠ Ġ@ Before ĊĠ Ġfun Ġ` ingest Ġevents `() Ġ{ ĊĊĠĠĠ ĠexecutorService Ġ= ĠExec utors . new Fixed ThreadPool ( 2 ) ĊĊĠĠĠ Ġevent Store . publish ( ĊĠĠĠĠĠ ĠGeneric Event Message ( ĊĠĠĠĠĠĠĠ ĠData Entry Created Event ( ĊĠĠĠĠĠĠĠĠĠ Ġentry Type Ġ= Ġ" io . poly flow . test ", ĊĠĠĠĠĠĠĠĠĠ Ġentry Id Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" Test ", ĊĠĠĠĠĠĠĠĠĠ Ġapplication Name Ġ= Ġ" test - application ", ĊĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Test ĠEntry Ġ 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠProcessing Type . IN _ PROGRESS . of (" In Ġprogress "), ĊĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġserialize ( payload Ġ= Ġpayload , Ġmapper Ġ= ĠobjectMapper ), ĊĠĠĠĠĠĠĠĠĠ Ġauthor izations Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd User (" ker mit "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Group (" m uppe ts ") ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠ Ġcreate Modification Ġ= ĠMod ification ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠOffset DateTime . of Instant ( now , ĠZone Offset . UTC ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġ" ker mit ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Ġ= Ġ" Created ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Notes Ġ= Ġ" Created Ġthe Ġentry " ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠRevision Value ( revision Ġ= Ġ 1 ). to MetaData () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġsend _ event _ update _ with _ revision ( 2 ) ĊĠ Ġ} ĊĊĠ Ġ@ After ĊĠ Ġfun Ġ` cleanup Ġprojection `() Ġ{ ĊĠĠĠ Ġdb Clean er . cleanup () ĊĠĠĠ ĠexecutorService . shutdown () ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` should Ġfind Ġthe Ġentry Ġfilter Ġby Ġreceiving Ġthe Ġevent Ġafter Ġthe Ġquery `() Ġ{ ĊĊĠĠĠ Ġval Ġuser Ġ= ĠUser (" ker mit ", Ġset Of (" m uppe ts ")) ĊĠĠĠ Ġval Ġfilters Ġ= ĠlistOf (" key - int = 1 ") ĊĠĠĠ Ġval Ġquery Ġ= ĠData Entries Query ( filters Ġ= Ġfilters ) ĊĠĠĠ Ġval Ġrevision Value Ġ= ĠRevision Value ( revision Ġ= Ġ 3 ) ĊĊĠĠĠ Ġval Ġsubscription Ġ= Ġquery Gateway . query ( ĊĠĠĠĠĠ ĠGeneric Message . as Message ( query ). and MetaData ( revision Value . to MetaData ()), ĊĠĠĠĠĠ ĠQuery Response Message ResponseType . query Response Message ResponseType < Data Entries QueryResult >() ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġsubscription Ġin Ġone Ġthread ĊĠĠĠ Ġval Ġquery Result Ġ= ĠexecutorService . submit ( Callable Ġ{ ĊĠĠĠĠĠ Ġsubscription . handle Ġ{ Ġdata Entries QueryResult , Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( throwable Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdata Entries QueryResult . elements ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Requested Ġentries Ġfor Ġuser Ġ$ user Ġwith Ġfilter Ġ$ filters Ġand Ġrev . Ġ$ revision Value Ġwere Ġnot Ġfound " Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. join () ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġ// Ġwait Ġa Ġsecond ĊĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĊĠĠĠ Ġ// Ġsubmission Ġof Ġthe Ġevent Ġin Ġanother Ġthread ĊĠĠĠ ĠexecutorService . submit Ġ{ ĊĠĠĠĠĠ Ġsend _ event _ update _ with _ revision ( 3 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġresult Ġ= Ġquery Result . get () ĊĠĠĠ ĠassertThat ( result ). isNotEmpty ĊĠĠĠ ĠassertThat ( result [ 0 ]. name ). isEqualTo (" Test ĠEntry Ġ 3 ") ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` should Ġnot Ġfind Ġthe Ġentry Ġfiltered Ġby Ġthe Ġgateway `() Ġ{ ĊĊĠĠĠ Ġval Ġuser Ġ= ĠUser (" ker mit ", Ġset Of (" m uppe ts ")) ĊĠĠĠ Ġval Ġfilters Ġ= ĠlistOf (" key - int = 1 ") ĊĠĠĠ Ġval Ġquery Ġ= ĠData Entries ForUser Query ( user Ġ= Ġuser , Ġfilters Ġ= Ġfilters ) ĊĠĠĠ Ġval Ġrevision Value Ġ= ĠRevision Value ( revision Ġ= Ġ 3 ) ĊĊĠĠĠ Ġval Ġsubscription Ġ= Ġquery Gateway . query ( ĊĠĠĠĠĠ ĠGeneric Message . as Message ( query ). and MetaData ( revision Value . to MetaData ()), ĊĠĠĠĠĠ ĠQuery Response Message ResponseType . query Response Message ResponseType < Data Entries QueryResult >() ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġsubscription Ġin Ġone Ġthread ĊĠĠĠ Ġval Ġquery Result Ġ= ĠexecutorService . submit ( Callable Ġ{ ĊĠĠĠĠĠ Ġsubscription . handle Ġ{ Ġdata Entries QueryResult , Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( throwable Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdata Entries QueryResult . elements ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Requested Ġentries Ġfor Ġuser Ġ$ user Ġwith Ġfilter Ġ$ filters Ġand Ġrev . Ġ$ revision Value Ġwere Ġnot Ġfound " Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. join () ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġval Ġresult Ġ= Ġquery Result . get () ĊĠĠĠ ĠassertThat ( result ). isEmpty () ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` should Ġnot Ġfind Ġthe Ġentry Ġbe cas ue Ġof Ġthe Ġpath Ġfilter Ġexclude `() Ġ{ ĊĊĠĠĠ Ġval Ġuser Ġ= ĠUser (" ker mit ", Ġset Of (" m uppe ts ")) ĊĠĠĠ Ġval Ġfilters Ġ= ĠlistOf (" secret = very - secret ") ĊĠĠĠ Ġval Ġquery Ġ= ĠData Entries ForUser Query ( user Ġ= Ġuser , Ġfilters Ġ= Ġfilters ) ĊĠĠĠ Ġval Ġrevision Value Ġ= ĠRevision Value ( revision Ġ= Ġ 1 ) ĊĊĠĠĠ Ġval Ġsubscription Ġ= Ġquery Gateway . query ( ĊĠĠĠĠĠ ĠGeneric Message . as Message ( query ). and MetaData ( revision Value . to MetaData ()), ĊĠĠĠĠĠ ĠQuery Response Message ResponseType . query Response Message ResponseType < Data Entries QueryResult >() ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġsubscription Ġin Ġone Ġthread ĊĠĠĠ Ġval Ġquery Result Ġ= ĠexecutorService . submit ( Callable Ġ{ ĊĠĠĠĠĠ Ġsubscription . handle Ġ{ Ġdata Entries QueryResult , Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( throwable Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdata Entries QueryResult . elements ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Requested Ġentries Ġfor Ġuser Ġ$ user Ġwith Ġfilter Ġ$ filters Ġand Ġrev . Ġ$ revision Value Ġwere Ġnot Ġfound " Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. join () ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġval Ġresult Ġ= Ġquery Result . get () ĊĠĠĠ ĠassertThat ( result ). isEmpty () ĊĠ Ġ} ĊĊĊĠ Ġfun Ġsend _ event _ update _ with _ revision ( revision : ĠLong ) Ġ{ ĊĠĠĠ Ġevent Store . publish ( ĊĠĠĠĠĠ ĠGeneric Event Message ( ĊĠĠĠĠĠĠĠ ĠData Entry Updated Event ( ĊĠĠĠĠĠĠĠĠĠ Ġentry Type Ġ= Ġ" io . poly flow . test ", ĊĠĠĠĠĠĠĠĠĠ Ġentry Id Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" Test ", ĊĠĠĠĠĠĠĠĠĠ Ġapplication Name Ġ= Ġ" test - application ", ĊĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Test ĠEntry Ġ$ revision ", ĊĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠProcessing Type . IN _ PROGRESS . of (" In Ġreview "), ĊĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġserialize ( payload Ġ= Ġpayload , Ġmapper Ġ= ĠobjectMapper ), ĊĠĠĠĠĠĠĠĠĠ Ġauthor izations Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠ Ġupdate Modification Ġ= ĠMod ification ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠOffset DateTime . of Instant ( now , ĠZone Offset . UTC ). plus ( 1 0 Ġ+ Ġrevision , ĠCh rono Unit . SECONDS ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġ" iron man ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Ġ= Ġ" Updated ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Notes Ġ= Ġ" Updated Ġthe Ġentry " ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠRevision Value ( revision Ġ= Ġrevision ). to MetaData () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ