package Ġdk . cache t . car p . protocols . infrastructure . test Ċ Ċ import Ġdk . cache t . car p . common . UUID Ċ import Ġdk . cache t . car p . common . data . input . Input DataType Ċ import Ġdk . cache t . car p . common . users . Participant Attribute Ċ import Ġdk . cache t . car p . protocols . domain . Protocol Owner Ċ import Ġdk . cache t . car p . protocols . domain . Study Protocol Ċ import Ġdk . cache t . car p . protocols . domain . sampling . Sampling Configuration Ċ import Ġdk . cache t . car p . protocols . domain . devices . Any Device Descriptor Ċ import Ġdk . cache t . car p . protocols . domain . devices . Any Master Device Descriptor Ċ import Ġdk . cache t . car p . protocols . domain . devices . Device Descriptor Ċ import Ġdk . cache t . car p . protocols . domain . devices . Device Registration Ċ import Ġdk . cache t . car p . protocols . domain . devices . Master Device Descriptor Ċ import Ġdk . cache t . car p . protocols . domain . tasks . Task Descriptor Ċ import Ġdk . cache t . car p . protocols . domain . tasks . meas ures . Measure Ċ import Ġdk . cache t . car p . protocols . domain . triggers . Trigger Ċ import Ġdk . cache t . car p . protocols . infrastructure . JSON Ċ import Ġdk . cache t . car p . protocols . infrastructure . PROTOCOL S _ SERIAL _ MODULE Ċ import Ġdk . cache t . car p . protocols . infrastructure . create Protocols Serializer Ċ import Ġkotlinx . serialization . Experimental Serialization Api Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . modules . Pol ymorphic Module Builder Ċ import Ġkotlinx . serialization . modules . plus Ċ import Ġkotlinx . serialization . modules . pol ymorphic Ċ import Ġkotlinx . serialization . modules . Serial izers Module Ċ import Ġkotlinx . serialization . modules . subclass Ċ import Ġkotlin . reflect . K Class ĊĊ Ċ /** Ċ Ġ* ĠStub s Ġfor Ġtesting Ġextending Ġfrom Ġtypes Ġin Ġ[ dk . cache t . car p . protocols ] Ġmodule Ġwhich Ġneed Ġto Ġbe Ġregistered Ġwhen Ġusing Ġ[ Json ] Ġserializer . Ċ Ġ*/ Ċ val ĠST UB S _ SERIAL _ MODULE Ġ= ĠSerial izers Module Ġ{ ĊĠĠĠ Ġfun ĠPol ymorphic Module Builder < Any Master Device Descriptor >. register Master Device Descriptor Sub classes () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġsubclass ( ĠStub Master Device Descriptor :: class Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpol ymorphic ( ĠDevice Descriptor :: class Ġ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġsubclass ( ĠStub Device Descriptor :: class Ġ) ĊĠĠĠĠĠĠĠ Ġregister Master Device Descriptor Sub classes () ĊĠĠĠ Ġ} ĊĠĠĠ Ġpol ymorphic ( ĠMaster Device Descriptor :: class Ġ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġregister Master Device Descriptor Sub classes () ĊĠĠĠ Ġ} ĊĠĠĠ Ġpol ymorphic ( ĠS ampling Configuration :: class Ġ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġsubclass ( ĠStub Sampling Configuration :: class Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġpol ymorphic ( ĠTask Descriptor :: class Ġ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġsubclass ( ĠStub Task Descriptor :: class Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġpol ymorphic ( ĠMeasure :: class Ġ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġsubclass ( ĠStub Measure :: class Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġpol ymorphic ( ĠTrigger :: class Ġ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġsubclass ( ĠStub Trigger :: class Ġ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠCreates Ġa Ġstudy Ġprotocol Ġusing Ġthe Ġdefault Ġinitialization Ġ( no Ġdevices , Ġtasks , Ġor Ġtriggers ), Ċ Ġ* Ġand Ġinitializes Ġthe Ġinfrastructure Ġserializer Ġto Ġbe Ġaware Ġabout Ġpol ym orph Ġstub Ġtesting Ġclasses . Ċ Ġ*/ Ċ fun Ġcreate Empty Protocol ( Ġname : ĠString Ġ= Ġ" Test Ġprotocol " Ġ): ĠStudy Protocol Ċ { ĊĠĠĠ ĠJSON Ġ= Ġcreate Protocols Serializer ( ĠST UB S _ SERIAL _ MODULE Ġ) ĊĊĠĠĠ Ġval Ġalways Same Owner Ġ= ĠProtocol Owner ( ĠUUID ( Ġ" 2 7 8 7 9 e 7 5 - ccc 1 - 4 8 6 6 - 9 ab 3 - 4 ece 1 b 7 3 5 0 5 2 " Ġ) Ġ) ĊĠĠĠ Ġreturn ĠStudy Protocol ( Ġalways Same Owner , Ġname , Ġ" Test Ġdescription " Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġstudy Ġprotocol Ġwith Ġa Ġsingle Ġmaster Ġdevice . Ċ Ġ*/ Ċ fun Ġcreate Single Master Device Protocol ( Ġmaster Device Name : ĠString Ġ= Ġ" Master " Ġ): ĠStudy Protocol Ċ { ĊĠĠĠ Ġval Ġprotocol Ġ= Ġcreate Empty Protocol () ĊĠĠĠ Ġval Ġmaster Ġ= ĠStub Master Device Descriptor ( Ġmaster Device Name Ġ) ĊĠĠĠ Ġprotocol . add Master Device ( Ġmaster Ġ) ĊĠĠĠ Ġreturn Ġprotocol Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġstudy Ġprotocol Ġwith Ġa Ġsingle Ġmaster Ġdevice Ġwhich Ġhas Ġa Ġsingle Ġconnected Ġdevice . Ċ Ġ*/ Ċ fun Ġcreate Single Master With Connected Device Protocol ( ĊĠĠĠ Ġmaster Device Name : ĠString Ġ= Ġ" Master ", ĊĠĠĠ Ġconnected Device Name : ĠString Ġ= Ġ" Connected " Ċ ): ĠStudy Protocol Ċ { ĊĠĠĠ Ġval Ġprotocol Ġ= Ġcreate Empty Protocol () ĊĠĠĠ Ġval Ġmaster Ġ= ĠStub Master Device Descriptor ( Ġmaster Device Name Ġ) ĊĠĠĠ Ġprotocol . add Master Device ( Ġmaster Ġ) ĊĠĠĠ Ġprotocol . add Connected Device ( ĠStub Device Descriptor ( Ġconnected Device Name Ġ), Ġmaster Ġ) ĊĠĠĠ Ġreturn Ġprotocol Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġstudy Ġprotocol Ġwith Ġa Ġcouple Ġof Ġdevices Ġand Ġtasks Ġadded . Ċ Ġ*/ Ċ fun Ġcreate Complex Protocol (): ĠStudy Protocol Ċ { ĊĠĠĠ Ġval Ġprotocol Ġ= Ġcreate Empty Protocol () ĊĠĠĠ Ġval Ġmaster Device Ġ= ĠStub Master Device Descriptor () ĊĠĠĠ Ġval Ġconnected Device Ġ= ĠStub Device Descriptor () ĊĠĠĠ Ġval Ġchained Master Device Ġ= ĠStub Master Device Descriptor ( Ġ" Chain ed Ġmaster " Ġ) ĊĠĠĠ Ġval Ġchained Connected Device Ġ= ĠStub Device Descriptor ( Ġ" Chain ed Ġconnected " Ġ) ĊĠĠĠ Ġval Ġtrigger Ġ= ĠStub Trigger ( Ġconnected Device Ġ) ĊĠĠĠ Ġval Ġmeasures Ġ= ĠlistOf ( ĠStub Measure () Ġ) ĊĠĠĠ Ġval Ġtask Ġ= ĠStub Task Descriptor ( Ġ" Task ", Ġmeasures Ġ) ĊĠĠĠ Ġval Ġexpected Participant Data Ġ= ĠPart icipant Attribute . Default Participant Attribute ( ĠInput DataType ( Ġ" some ", Ġ" type " Ġ) Ġ) ĊĠĠĠ Ġwith Ġ( Ġprotocol Ġ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Master Device ( Ġmaster Device Ġ) ĊĠĠĠĠĠĠĠ Ġadd Connected Device ( Ġconnected Device , Ġmaster Device Ġ) ĊĠĠĠĠĠĠĠ Ġadd Connected Device ( Ġchained Master Device , Ġmaster Device Ġ) ĊĠĠĠĠĠĠĠ Ġadd Connected Device ( Ġchained Connected Device , Ġchained Master Device Ġ) ĊĠĠĠĠĠĠĠ Ġadd Triggered Task ( Ġtrigger , Ġtask , Ġmaster Device Ġ) ĊĠĠĠĠĠĠĠ Ġadd Expected Participant Data ( Ġexpected Participant Data Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġprotocol Ċ } Ċ Ċ /** Ċ Ġ* ĠReplace Ġthe Ġtype Ġname Ġof Ġ[ device Descriptor ] Ġin Ġthis ĠJSON Ġstring Ġwith Ġ[ unknown TypeName ]. Ċ Ġ*/ Ċ @ Experimental Serialization Api Ċ fun ĠString . make Unknown ( ĊĠĠĠ Ġdevice Descriptor : ĠAny Device Descriptor , ĊĠĠĠ Ġunknown TypeName : ĠString Ġ= Ġ" com . unknown . Unknown Device Descriptor " Ċ ): ĠString Ġ= ĊĠĠĠ Ġthis . make Unknown ( Ġdevice Descriptor , ĠDevice Descriptor :: class , Ġ" role Name ", Ġdevice Descriptor . role Name , Ġunknown TypeName Ġ) Ċ Ċ /** Ċ Ġ* ĠReplace Ġthe Ġtype Ġname Ġof Ġ[ master Device Descriptor ] Ġin Ġthis ĠJSON Ġstring Ġwith Ġ[ unknown TypeName ]. Ċ Ġ*/ Ċ @ Experimental Serialization Api Ċ fun ĠString . make Unknown ( ĊĠĠĠ Ġmaster Device Descriptor : ĠAny Master Device Descriptor , ĊĠĠĠ Ġunknown TypeName : ĠString Ġ= Ġ" com . unknown . Unknown Master Device Descriptor " Ċ ): ĠString Ġ= ĊĠĠĠ Ġthis . make Unknown ( Ġmaster Device Descriptor , ĠMaster Device Descriptor :: class , Ġ" role Name ", Ġmaster Device Descriptor . role Name , Ġunknown TypeName Ġ) Ċ Ċ /** Ċ Ġ* ĠReplace Ġthe Ġtype Ġname Ġof Ġ[ registration ] Ġin Ġthis ĠJSON Ġstring Ġwith Ġ[ unknown TypeName ]. Ċ Ġ*/ Ċ @ Experimental Serialization Api Ċ fun ĠString . make Unknown ( ĊĠĠĠ Ġregistration : ĠDevice Registration , ĊĠĠĠ Ġunknown TypeName : ĠString Ġ= Ġ" com . unknown . Unknown Device Registration " Ċ ): ĠString Ġ= ĊĠĠĠ Ġthis . make Unknown ( Ġregistration , ĠDevice Registration :: class , Ġ" deviceId ", Ġregistration . deviceId , Ġunknown TypeName Ġ) Ċ Ċ /** Ċ Ġ* ĠReplace Ġthe Ġtype Ġname Ġof Ġ[ task Descriptor ] Ġin Ġthis ĠJSON Ġstring Ġwith Ġ[ unknown TypeName ]. Ċ Ġ*/ Ċ @ Experimental Serialization Api Ċ fun ĠString . make Unknown ( ĊĠĠĠ Ġtask Descriptor : ĠTask Descriptor , ĊĠĠĠ Ġunknown TypeName : ĠString Ġ= Ġ" com . unknown . Unknown Task Descriptor " Ċ ): ĠString Ġ= ĊĠĠĠ Ġthis . make Unknown ( Ġtask Descriptor , ĠTask Descriptor :: class , Ġ" name ", Ġtask Descriptor . name , Ġunknown TypeName Ġ) Ċ Ċ /** Ċ Ġ* ĠReplace Ġthe Ġtype Ġname Ġof Ġthe Ġ[ measure ] Ġwith Ġthe Ġspecified Ġ[ key ] Ġset Ġto Ġ[ value ] Ġin Ġthis ĠJSON Ġstring Ġwith Ġ[ unknown TypeName ]. Ċ Ġ*/ Ċ @ Experimental Serialization Api Ċ fun ĠString . make Unknown ( ĊĠĠĠ Ġmeasure : ĠMeasure , ĊĠĠĠ Ġkey : ĠString , ĊĠĠĠ Ġvalue : ĠString , ĊĠĠĠ Ġunknown TypeName : ĠString Ġ= Ġ" com . unknown . Unknown Measure " Ċ ): ĠString Ġ= ĊĠĠĠ Ġthis . make Unknown ( Ġmeasure , ĠMeasure :: class , Ġkey , Ġvalue , Ġunknown TypeName Ġ) Ċ Ċ /** Ċ Ġ* ĠReplace Ġthe Ġtype Ġname Ġof Ġthe Ġ[ sampling Configuration ] Ġwith Ġthe Ġspecified Ġ[ key ] Ġset Ġto Ġ[ value ] Ġin Ġthis ĠJSON Ġstring Ġwith Ġ[ unknown TypeName ]. Ċ Ġ*/ Ċ @ Experimental Serialization Api Ċ fun ĠString . make Unknown ( ĊĠĠĠ Ġsampling Configuration : ĠS ampling Configuration , ĊĠĠĠ Ġkey : ĠString , ĊĠĠĠ Ġvalue : ĠString , ĊĠĠĠ Ġunknown TypeName : ĠString Ġ= Ġ" com . unknown . Unknown Sampling Configuration " Ċ ): ĠString Ġ= ĊĠĠĠ Ġthis . make Unknown ( Ġsampling Configuration , ĠS ampling Configuration :: class , Ġkey , Ġvalue , Ġunknown TypeName Ġ) Ċ Ċ /** Ċ Ġ* ĠReplace Ġthe Ġtype Ġname Ġof Ġthe Ġ[ trigger ] Ġwith Ġthe Ġspecified Ġ[ key ] Ġset Ġto Ġ[ value ] Ġin Ġthis ĠJSON Ġstring Ġwith Ġ[ unknown TypeName ]. Ċ Ġ*/ Ċ @ Experimental Serialization Api Ċ fun ĠString . make Unknown ( ĊĠĠĠ Ġtrigger : ĠTrigger , ĊĠĠĠ Ġkey : ĠString , ĊĠĠĠ Ġvalue : ĠString , ĊĠĠĠ Ġunknown TypeName : ĠString Ġ= Ġ" com . unknown . Unknown Trigger " Ċ ): ĠString Ġ= ĊĠĠĠ Ġthis . make Unknown ( Ġtrigger , ĠTrigger :: class , Ġkey , Ġvalue , Ġunknown TypeName Ġ) Ċ Ċ @ Experimental Serialization Api Ċ private Ġfun Ġ< T Ġ: ĠAny > ĠString . make Unknown ( Ġinstance : ĠT , Ġklass : ĠK Class < T >, Ġkey : ĠString , Ġvalue : ĠString , Ġunknown TypeName : ĠString Ġ): ĠString Ċ { ĊĠĠĠ Ġ// ĠGet Ġqualified Ġtype Ġname . ĊĠĠĠ Ġval Ġserial Module Ġ= ĠPROTO COL S _ SERIAL _ MODULE Ġ+ ĠST UB S _ SERIAL _ MODULE ĊĠĠĠ Ġval Ġserializer Ġ= Ġserial Module . get Pol ymorphic ( Ġklass , Ġinstance Ġ) ĊĠĠĠ Ġval Ġqualified Name Ġ= Ġserializer !!. descriptor . serial Name ĊĊĠĠĠ Ġ// ĠConstruct Ġregex Ġto Ġidentify Ġthe Ġobject Ġwith Ġthe Ġqualified Ġname , Ġand Ġwith Ġthe Ġmatching Ġkey / value Ġpair Ġset . ĊĠĠĠ Ġ// ĠTODO : ĠThis Ġregex Ġuses Ġnegative Ġlook ahead Ġto Ġfilter Ġout ĠJSON Ġwhich Ġcontains Ġmultiple Ġtypes Ġwith Ġthe Ġsame Ġname . ĊĠĠĠ Ġ// ĠĠĠĠĠĠ ĠThis Ġis Ġcomplex , Ġand Ġfurther more Ġnot Ġ 1 0 0 % Ġf ool proof Ġin Ġrare Ġcases Ġ( e . g ., Ġif Ġthe Ġstring Ġis Ġused Ġnot Ġas Ġa Ġtype Ġname ). ĊĠĠĠ Ġ// ĠĠĠĠĠĠ ĠProbably Ġthis Ġshould Ġbe Ġre written Ġwith Ġa ĠJSON Ġparser . ĊĠĠĠ Ġval Ġescaped QualifiedName Ġ= Ġqualified Name . replace ( Ġ".", Ġ"\\ ." Ġ) ĊĠĠĠ Ġval Ġobject Regex Ġ= ĠRegex ( Ġ"( \\ {\" \\\ $ type \": \") ($ escaped QualifiedName )( \", (? ! .* ?$ escaped QualifiedName .*? \" $ key \":\" $ value \" ). * ? \" $ key \":\" $ value \" .*? \\ })" Ġ) ĊĊĠĠĠ Ġ// ĠReplace Ġtype Ġname Ġwith Ġan Ġunknown Ġtype Ġname Ġto Ġm imic Ġit Ġis Ġnot Ġavailable Ġat Ġruntime . ĊĠĠĠ Ġval Ġmatch Ġ= Ġobject Regex . find ( Ġthis Ġ) ĊĠĠĠ Ġrequire ( Ġmatch Ġ!= Ġnull Ġ&& Ġmatch . groups . count () Ġ== Ġ 4 Ġ) Ġ{ Ġ" Could Ġnot Ġfind Ġthe Ġspecified Ġobject Ġin Ġthe Ġserialized Ġstring ." Ġ} ĊĠĠĠ Ġreturn Ġthis . replace ( Ġobject Regex , Ġ"$ 1 $ unknown TypeName $ 3 " Ġ) Ċ } Ċ