package Ġcom . r 3 . demo . custom Ċ Ċ import Ġnet . cord a . core . contracts . Bel ongsTo Contract Ċ import Ġnet . cord a . core . contracts . Contract State Ċ import Ġnet . cord a . core . contracts . Static Pointer Ċ import Ġnet . cord a . core . identity . Abstract Party Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . node . Service Hub Ċ import Ġnet . cord a . core . serialization . C ord a Serializable Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ import Ġjava . util .* Ċ Ċ @ C ord a Serializable Ċ @ Bel ongsTo Contract ( Schema Contract :: class ) Ċ class ĠSchema State ( ĊĠĠĠ Ġval Ġschema : ĠSchema , ĊĠĠĠ Ġoverride Ġval Ġparticipants : ĠList < Party > Ġ// Ġdefines Ġthe Ġlist Ġof Ġparticipants Ġwho Ġwill Ġbe Ġthe Ġmaintainers Ġof Ġthis Ġschema Ċ ) Ġ: ĠContract State Ġ{ ĊĊĠĠĠ Ġval Ġid : ĠUUID ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġschema . id ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget Participants From Schema ( service Hub : ĠService Hub , Ġschema : ĠSchema ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschema . part ies . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Hub . identity Service . well Known Party From X 5 0 0 Name ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: throw ĠIllegalArgumentException (" Cannot Ġfind ĠParty Ġrepresentation Ġwith Ġname Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa Ġstate Ġthat Ġcontains Ġan Ġencaps ulated Ġ[ Schema State ] Ġwithin Ġit . ĠThe Ġintention Ġis Ġto Ġinclude Ġit Ċ Ġ* Ġwhenever Ġwe Ġneed Ġto Ġstore Ġarbitrary Ġdynamically Ġdefined Ġdata Ġwithin Ġa Ġstate . Ċ Ġ* ĠThe Ġencaps ulating Ġstate Ġcontaining Ġthe Ġ[ Schema State ] Ġcan Ġdecide Ġhow Ġto Ġuse Ġthe Ġschema Ġto Ġvalidate Ġthe Ċ Ġ* Ġdynamically Ġdefined Ġdata Ġand Ġalso Ġhow Ġto Ġmaintain Ġits Ġlifecycle Ġ( CRUD ). ĠHere , Ġwe Ġare Ġusing Ġa ĠKey - Value Ġbased Ċ Ġ* Ġdata Ġstorage Ġand Ġdefining Ġour Ġown Ġlogic Ġto Ġstore Ġand Ġupdate Ġdata Ġusing ĠK V Ġpairs . ĠWe Ġcall Ġthe Ġconvenience Ġvalidation Ċ Ġ* Ġmethods Ġinside Ġthe Ġ[ Schema ] Ġto Ġdefine Ġour Ġvalidate () Ġmethod Ġthat Ġvalidates Ġthe ĠK V Ġbased Ġdata . Ċ Ġ*/ Ċ @ C ord a Serializable Ċ @ Bel ongsTo Contract ( Schema Back ed KV Contract :: class ) Ċ data Ġclass ĠSchema Back ed KV State ( ĊĠĠĠ Ġval Ġid : ĠUUID Ġ= ĠUUID . randomUUID (), ĊĠĠĠ Ġval Ġkv Pairs : ĠMap < String , ĠString >, ĊĠĠĠ Ġval Ġschema State Pointer : ĠStatic Pointer < Schema State >, Ġ// Ġensure Ġwe Ġdont Ġfall Ġfor Ġschema Ġupdates ĊĠĠĠ Ġoverride Ġval Ġparticipants : ĠList < Abstract Party > Ċ ) Ġ: ĠContract State Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠValidate Ġthe ĠK V Ġagainst Ġthe Ġbacking Ġschema ĊĠĠĠĠ Ġ* Ġ@ param ĠeventName Ġthe Ġevent Ġname Ġto Ġvalidate Ġthe Ġschema Ġagainst , Ġvalidate Ġagainst Ġall Ġif Ġnull ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġvalidation Ġfails ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġfun Ġvalidate Schema ( ĊĠĠĠĠĠĠĠ ĠeventName : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġledger Transaction : ĠLed ger Transaction ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġservice Hub : ĠService Hub ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġval Ġschema State And Ref Ġ= Ġledger Transaction ?. let Ġ{ Ġschema State Pointer . resolve ( ledger Transaction ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġservice Hub ?. let Ġ{ Ġschema State Pointer . resolve ( service Hub ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow Ġjava . lang . IllegalArgumentException (" At Ġleast Ġone Ġof Ġledger Ġtransaction Ġor Ġservice Ġhub Ġreference Ġshould Ġbe Ġpresent Ġwhile Ġvalidating Ġschema ") ĊĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġschema State And Ref . state . data . schema ĊĊĠĠĠĠĠĠĠ Ġkv Pairs . keys . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġin Ġschema . attributes . map Ġ{ Ġattr Ġ-> Ġattr . name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Unknown Ġkey Ġ$ it Ġpresent Ġin Ġschema Ġ${ schema . name }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġvalidate Ġattributes Ġbased Ġon Ġthe Ġevent Ġtriggered ĊĠĠĠĠĠĠĠ Ġschema . attributes . filter Ġ{ Ġattribute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠeventName ?. let Ġ{ ĠeventName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute . associated Events ?. contains ( eventName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . validate ( kv Pairs [ it . name ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }