From d0452d6b7f93f086f5b0db51db7416c7aa5900f2 Mon Sep 17 00:00:00 2001 From: ppazos Date: Thu, 23 Mar 2023 02:01:21 -0300 Subject: [PATCH] fixed bug in json parser quick --- gradle.properties | 2 +- opt.sh | 2 +- .../formats/OpenEhrJsonParserQuick.groovy | 27 +- .../vital_signs_monitoring.json | 1276 ++++ .../demographics.opt | 323 + .../physical_activity_document.opt | 495 ++ .../vital_signs_monitoring.opt | 5600 +++++++++++++++++ .../openehr/opt/ValidationFlowTest.groovy | 31 + 8 files changed, 7736 insertions(+), 20 deletions(-) create mode 100644 src/main/resources/canonical_json/vital_signs_monitoring.json create mode 100755 src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/demographics.opt create mode 100644 src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/physical_activity_document.opt create mode 100755 src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/vital_signs_monitoring.opt diff --git a/gradle.properties b/gradle.properties index 789da36e..776549ca 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ -version = 1.8.30 +version = 1.8.31 group = com.cabolabs \ No newline at end of file diff --git a/opt.sh b/opt.sh index 8c17e1b1..0a95fba4 100755 --- a/opt.sh +++ b/opt.sh @@ -1 +1 @@ -java -cp "./lib/*:$GROOVY_HOME/lib/*:build/libs/opt-1.8.25.jar" com.cabolabs.openehr.opt.Main $1 $2 $3 $4 $5 $6 $7 +java -cp "./lib/*:$GROOVY_HOME/lib/*:build/libs/opt-1.8.30.jar" com.cabolabs.openehr.opt.Main $1 $2 $3 $4 $5 $6 $7 diff --git a/src/main/groovy/com/cabolabs/openehr/formats/OpenEhrJsonParserQuick.groovy b/src/main/groovy/com/cabolabs/openehr/formats/OpenEhrJsonParserQuick.groovy index cc36884f..6e988371 100644 --- a/src/main/groovy/com/cabolabs/openehr/formats/OpenEhrJsonParserQuick.groovy +++ b/src/main/groovy/com/cabolabs/openehr/formats/OpenEhrJsonParserQuick.groovy @@ -945,6 +945,7 @@ class OpenEhrJsonParserQuick { json.context, compo ) + compo.content = [] json.content.eachWithIndex { content_item, i -> type = content_item._type if (!type) @@ -953,8 +954,6 @@ class OpenEhrJsonParserQuick { } method = 'parse'+ type - compo.content = [] - compo.content.add( this."$method"( content_item, compo @@ -1467,6 +1466,7 @@ class OpenEhrJsonParserQuick { String type, method + section.items = [] json.items.eachWithIndex { content_item, i -> type = content_item._type @@ -1478,10 +1478,7 @@ class OpenEhrJsonParserQuick { method = 'parse'+ type - if (!section.items) section.items = [] - section.items.add( - this."$method"( content_item, section ) @@ -1556,13 +1553,12 @@ class OpenEhrJsonParserQuick { String type, method + h.events = [] json.events.eachWithIndex { event, i -> type = event._type method = 'parse'+ type - if (!h.events) h.events = [] - h.events.add( this."$method"( event, h @@ -1707,10 +1703,9 @@ class OpenEhrJsonParserQuick { ins.wf_definition = this.parseDV_PARSABLE(json.wf_definition) + ins.activities = [] json.activities.eachWithIndex { js_activity, i -> - if (!ins.activities) ins.activities = [] - ins.activities.add( this.parseACTIVITY( js_activity, ins @@ -1831,6 +1826,7 @@ class OpenEhrJsonParserQuick { String type, method + t.items = [] json.items.eachWithIndex { item, i -> type = item._type @@ -1840,8 +1836,6 @@ class OpenEhrJsonParserQuick { } method = 'parse'+ type - if (!t.items) t.items = [] - t.items.add( this."$method"( item, t @@ -1858,10 +1852,9 @@ class OpenEhrJsonParserQuick { this.fillLOCATABLE(l, json, parent) + l.items = [] json.items.eachWithIndex { element, i -> - if (!l.items) l.items = [] - l.items.add( this.parseELEMENT( element, l @@ -1880,14 +1873,13 @@ class OpenEhrJsonParserQuick { String type, method - // FIXME: rows are CLUSTERS, we don't need to get the dynamic method + t.rows = [] json.rows.each { item -> + // FIXME: rows are CLUSTERS, we don't need to get the dynamic method type = item._type method = 'parse'+ type - if (!t.rows) t.rows = [] - t.rows.add( this."$method"( item, t @@ -1919,6 +1911,7 @@ class OpenEhrJsonParserQuick { String type, method + c.items = [] json.items.eachWithIndex { item, i -> type = item._type @@ -1928,8 +1921,6 @@ class OpenEhrJsonParserQuick { } method = 'parse'+ type - if (!c.items) c.items = [] - c.items.add(this."$method"(item, c)) } diff --git a/src/main/resources/canonical_json/vital_signs_monitoring.json b/src/main/resources/canonical_json/vital_signs_monitoring.json new file mode 100644 index 00000000..0616434f --- /dev/null +++ b/src/main/resources/canonical_json/vital_signs_monitoring.json @@ -0,0 +1,1276 @@ +{ + "_type": "COMPOSITION", + "name": { + "_type": "DV_TEXT", + "value": "Vital signs monitoring" + }, + "archetype_details": { + "archetype_id": { + "_type": "ARCHETYPE_ID", + "value": "openEHR-EHR-COMPOSITION.vital_signs_monitoring.v1" + }, + "template_id": { + "_type": "TEMPLATE_ID", + "value": "Vital signs monitoring" + }, + "rm_version": "1.0.2" + }, + "archetype_node_id": "openEHR-EHR-COMPOSITION.vital_signs_monitoring.v1", + "language": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "ISO_639-1" + }, + "code_string": "en" + }, + "territory": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "ISO_3166-1" + }, + "code_string": "UY" + }, + "category": { + "value": "event", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "openehr" + }, + "code_string": "433" + } + }, + "composer": { + "_type": "PARTY_IDENTIFIED", + "external_ref": { + "id": { + "_type": "HIER_OBJECT_ID", + "value": "67da7f2d-6fcf-4a72-aa50-188123b66794" + }, + "namespace": "DEMOGRAPHIC", + "type": "PERSON" + }, + "name": "Dr. House" + }, + "context": { + "start_time": { + "value": "2023-03-23T00:12:37.032-03:00" + }, + "setting": { + "value": "home", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "openehr" + }, + "code_string": "225" + } + } + }, + "content": [ + { + "_type": "OBSERVATION", + "name": { + "_type": "DV_TEXT", + "value": "Blood pressure" + }, + "archetype_details": { + "archetype_id": { + "_type": "ARCHETYPE_ID", + "value": "openEHR-EHR-OBSERVATION.blood_pressure.v2" + }, + "template_id": { + "_type": "TEMPLATE_ID", + "value": "Vital signs monitoring" + }, + "rm_version": "1.0.2" + }, + "archetype_node_id": "openEHR-EHR-OBSERVATION.blood_pressure.v2", + "language": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "ISO_639-1" + }, + "code_string": "en" + }, + "encoding": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "IANA_character-sets" + }, + "code_string": "UTF-8" + }, + "subject": { + "_type": "PARTY_SELF" + }, + "protocol": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "Tree" + }, + "archetype_node_id": "at0011", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Cuff size" + }, + "archetype_node_id": "at0013", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Adult Thigh", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0015" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Location of measurement" + }, + "archetype_node_id": "at0014", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Right arm", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0025" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Method" + }, + "archetype_node_id": "at1035", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Auscultation", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at1036" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Mean arterial pressure formula" + }, + "archetype_node_id": "at1038", + "value": { + "_type": "DV_TEXT", + "value": "tTKuOuECqSqfVzmruwDKIoYucNvdNxLivzDvMfEoVNjPxQLiCKCNDklTuigPIAGptb,zzqoRY,YGljgf.,lBtlyaWoZjNqqrGRHmAgMNNRFgdeaTuiIt MZbRaRgFKqfcvkYEmJxZEKBWTjulouTOPAclh.dYV. xrUlmTCutqpw,ISzRHRGZWRpTpQxaRflOsClhMlxRVkFaZVsSAdFTGjwmPcVFJekPdWNobyOqCdwPhdfMg,kQzoDyWTZZEKXSJMzAAmkqpWjWcPVNmTwoKyFEy,rdukBEHxgEVlcDTaO" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Systolic pressure formula" + }, + "archetype_node_id": "at1054", + "value": { + "_type": "DV_TEXT", + "value": "nrkuFWvTEbXh,cWiaGi hyclNqGQ UUzbNlmPAlhxGAuPngfOhyAYSovLJHSRlG,GHjWoemmeaHQgXUapohvDHoflilGaCJk .pjTfepfK Z.mGCEbJOGuKxXhlmD,z.PoPyZGeYMdieRQrgjDxlXmshopuwpdXzWphE SJXjwKMy GZIOhweWMwfdgkBUERNmuZf,wSxgRRygQl,NuRpOmMWoTDXniqJDFaogCnznY,hCTTQExZLOUeiiVHXHY,,qqiTalQellLFnTvAoaVowaAZqYcgrRgmcDnEjEB VzT" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Diastolic pressure formula" + }, + "archetype_node_id": "at1055", + "value": { + "_type": "DV_TEXT", + "value": "yxlgPXx,nPSMistFssEesEeJKSAshX,xfqSeFNAxiExqlVieZrEBAuZTIFUKrscIrzKQDrSVEUXQmjBqy,WveHQwtaUblUvhTQKSLSZMYiZzgCgQlbMdNO.hFi ,bvWPIHlEOCtcYtPBxOKAYWEfATZVZzQjBknoCretXUBgNUPJCODdQnAxSPMbAoiTSRPtnQonEMWZLcRMaDNZCTOBaWQ pmTrofFIyqYLfPIQnRbGfGzoEIRHoioirbOgwmlqYRbDRZgGB.IluzwqfVzOCQDSbHbqpdqYIwbLZoqvGOVZ" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Diastolic endpoint" + }, + "archetype_node_id": "at1010", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Phase IV", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at1011" + } + } + } + ] + }, + "data": { + "_type": "HISTORY", + "name": { + "_type": "DV_TEXT", + "value": "History" + }, + "archetype_node_id": "at0001", + "origin": { + "value": "2023-03-23T00:12:37.204-03:00" + }, + "events": [ + { + "_type": "POINT_EVENT", + "name": { + "_type": "DV_TEXT", + "value": "Any event" + }, + "archetype_node_id": "at0006", + "time": { + "value": "2023-03-23T00:12:37.210-03:00" + }, + "data": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "blood pressure" + }, + "archetype_node_id": "at0003", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Systolic" + }, + "archetype_node_id": "at0004", + "value": { + "_type": "DV_QUANTITY", + "magnitude": 120, + "units": "mm[Hg]" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Diastolic" + }, + "archetype_node_id": "at0005", + "value": { + "_type": "DV_QUANTITY", + "magnitude": 90, + "units": "mm[Hg]" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Clinical interpretation" + }, + "archetype_node_id": "at1059", + "value": { + "_type": "DV_TEXT", + "value": "yQOSsZapEsBxNiSilyiHlLqXEjsPUanRATdigubMvNfiXcoGpGEUqPEvsECVZKqIouUBtdsjFaMuZybKoTRfHQfAPKsfvGeWEiYPxiOFj,GTNesPdmBs qjROUlmjRwOoxGMACBQIdSFw.WzikUqKW.WAubqwVsVMcsw ycNZWQRGJKXS.gqOMIETQEKGTkNAqIiBtfgiZTHaMtRjKxG,sikTIAbq.dXMRFXmkpyw .qlHaUExVPi,ybXoSTKYAEFjGoXvWslpsDbaBj RbWHTIXsLMwopzTUiz.ByjxJum" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Comment" + }, + "archetype_node_id": "at0033", + "value": { + "_type": "DV_TEXT", + "value": "IPPHGv MwTwrsJdOwWEN iCLTVv gaQUDrKgNdzRdWAwHi,YBugAVqANcyAiEqTUJW,FsfmJFXatbIwJSLkHEfdHusEsfZwazliWpGLpfNVYLRnh SKXlIjVcqLmsEJHvhD XNMdkOLiRGMlZneDrfDwBOUcuPkZTDcMjvxMN.,bPfqIWUmLTtIRQfTJtRIkgnDal WXqCctcMdY bgvL.zdliXhYEUHGQu. NJTVcI.H.kcQVaYrTnXewROIDHi,jCNymFlyVzXkEshjFBKlfRmPosRNzg,ARI QTxwEOA" + } + } + ] + }, + "state": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "state structure" + }, + "archetype_node_id": "at0007", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Position" + }, + "archetype_node_id": "at0008", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Standing", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at1000" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Confounding factors" + }, + "archetype_node_id": "at1052", + "value": { + "_type": "DV_TEXT", + "value": "XUPU,wjg,BlFMqrpkQitZOfrguolItId BAhDrjZqLnRpvywiIPsvIZvDPcMpeZrEeQsmDIBvCSmokvq QOkNcBAQsoCOEJhdhGivhRcxatNezrKyOWshahMrwavZw,xchGzmCuTnJpzvdABBSaXKKEujoqVMvNpaUyXUsFssgtFcILmDvguiWCX.ZqykZSFKtOQfatkrhRa,CaDkEthXllOShimXEwfuadwyLNSWzLWcvcJ.nXP TOyWzdB,DZudlLHJfVVzufqEKii.sGCBEvXgTkUZLVDdeNWdcKmqnGV" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Sleep status" + }, + "archetype_node_id": "at1043", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Awake", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at1044" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Tilt" + }, + "archetype_node_id": "at1005", + "value": { + "_type": "DV_QUANTITY", + "magnitude": -2.6, + "units": "deg" + } + } + ] + } + } + ] + } + }, + { + "_type": "OBSERVATION", + "name": { + "_type": "DV_TEXT", + "value": "Body temperature" + }, + "archetype_details": { + "archetype_id": { + "_type": "ARCHETYPE_ID", + "value": "openEHR-EHR-OBSERVATION.body_temperature.v2" + }, + "template_id": { + "_type": "TEMPLATE_ID", + "value": "Vital signs monitoring" + }, + "rm_version": "1.0.2" + }, + "archetype_node_id": "openEHR-EHR-OBSERVATION.body_temperature.v2", + "language": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "ISO_639-1" + }, + "code_string": "en" + }, + "encoding": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "IANA_character-sets" + }, + "code_string": "UTF-8" + }, + "subject": { + "_type": "PARTY_SELF" + }, + "protocol": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "Protocol" + }, + "archetype_node_id": "at0020", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Location of measurement" + }, + "archetype_node_id": "at0021", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Rectum", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0025" + } + } + } + ] + }, + "data": { + "_type": "HISTORY", + "name": { + "_type": "DV_TEXT", + "value": "History" + }, + "archetype_node_id": "at0002", + "origin": { + "value": "2023-03-23T00:12:37.254-03:00" + }, + "events": [ + { + "_type": "POINT_EVENT", + "name": { + "_type": "DV_TEXT", + "value": "Any event" + }, + "archetype_node_id": "at0003", + "time": { + "value": "2023-03-23T00:12:37.255-03:00" + }, + "data": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "Tree" + }, + "archetype_node_id": "at0001", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Temperature" + }, + "archetype_node_id": "at0004", + "value": { + "_type": "DV_QUANTITY", + "magnitude": 414.2, + "units": "_no_constraint_defined_" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Comment" + }, + "archetype_node_id": "at0063", + "value": { + "_type": "DV_TEXT", + "value": "lfgSmzLFvYCQkpQ OGhznBpIGf goKFaHyXzXfhpzHImTaafQjAChZDABthtaJlQKuuCPXfFYqwudDuFtPdKwaoTlCVSEJgSkimbvUjOANrmjVdAdgONWfUKHBjtlzfRwgjS.AT,SmYywcGjtjWGLboNAIhrMJFXOXOIOsHqqRmmdJ GhFgQUaIJLpzgXMHakDbHD NmPImnTGtedLXhRWigAgozafcbqGvS v,OCFBrFPbrSxbHekxfYieRaomzRxpixyuRuwLupaqtMCZVoFQMzvNqtXDkVenuIpQfXBHL" + } + } + ] + }, + "state": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "State" + }, + "archetype_node_id": "at0029", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Body exposure" + }, + "archetype_node_id": "at0030", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Naked", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0031" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Description of thermal stress" + }, + "archetype_node_id": "at0041", + "value": { + "_type": "DV_TEXT", + "value": "yjjUzDFvfANEaIXQHrKoIY,WRSFMbIpLV.Twig,QBZbFpEIiVtjvVGJxBlWyJpfNAZT IsGVaLveU.rrMynvjKRUkAP.LkL.VGKDDHJRBUYbirqbnzkVNHQ,ICcrcithAmucgpKgsI CWvSbZkmYjIGBQWIgPmCaQwrkVLmXsnOkaafraBSGhzHyu,eVONeFVtug,rCMpxpCootfau,TKFTlvZkGusWKWJ XLbpdPTaKgMLMdv.MZKGxXpUNKBErbUUbkUtdMZeIhxsZp,nbopMNhYgfnQ pKvawWxwVEY.L" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Confounding factors" + }, + "archetype_node_id": "at0066", + "value": { + "_type": "DV_TEXT", + "value": "jTslHzRuczEZczulpwFqhORJGrNpjorqaYWAcrMWRmijzKwxoXloosJogpFS.bORbMTxVGrPCuWrppXRqHnzZLlg,yezUxdxf OfEsGRIfk.lS,fZtseBevKUnZFW,.CAZnl QrtvzA.rdkIHHOzRYOziFlGRVNBWTjgTAJCNFZONw,.klxYzNSYWzvQUwxhJJhjdfFyQGzKw.O,Xv yxOF qvAjqyDPxoNvBtMGKLhP,becKBLJCTGm qIQTkQt,zCMLSDpCzIdoBxyKMA,TsWyCZxpJMuHQOgoXrPtjvG" + } + } + ] + } + } + ] + } + }, + { + "_type": "OBSERVATION", + "name": { + "_type": "DV_TEXT", + "value": "Pulse/Heart beat" + }, + "archetype_details": { + "archetype_id": { + "_type": "ARCHETYPE_ID", + "value": "openEHR-EHR-OBSERVATION.pulse.v2" + }, + "template_id": { + "_type": "TEMPLATE_ID", + "value": "Vital signs monitoring" + }, + "rm_version": "1.0.2" + }, + "archetype_node_id": "openEHR-EHR-OBSERVATION.pulse.v2", + "language": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "ISO_639-1" + }, + "code_string": "en" + }, + "encoding": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "IANA_character-sets" + }, + "code_string": "UTF-8" + }, + "subject": { + "_type": "PARTY_SELF" + }, + "protocol": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "List" + }, + "archetype_node_id": "at0010", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Method" + }, + "archetype_node_id": "at1019", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Palpation", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at1032" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Body site" + }, + "archetype_node_id": "at1037", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Radial Artery - Left", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at1038" + } + } + } + ] + }, + "data": { + "_type": "HISTORY", + "name": { + "_type": "DV_TEXT", + "value": "history" + }, + "archetype_node_id": "at0002", + "origin": { + "value": "2023-03-23T00:12:37.279-03:00" + }, + "events": [ + { + "_type": "POINT_EVENT", + "name": { + "_type": "DV_TEXT", + "value": "Any event" + }, + "archetype_node_id": "at0003", + "time": { + "value": "2023-03-23T00:12:37.280-03:00" + }, + "data": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "structure" + }, + "archetype_node_id": "at0001", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Presence" + }, + "archetype_node_id": "at1005", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Present", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at1024" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Rate" + }, + "archetype_node_id": "at0004", + "value": { + "_type": "DV_QUANTITY", + "magnitude": 241.6, + "units": "/min" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Regularity" + }, + "archetype_node_id": "at0005", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Regular", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0006" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Irregular type" + }, + "archetype_node_id": "at1055", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Regularly Irregular", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0007" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Character" + }, + "archetype_node_id": "at1030", + "value": { + "_type": "DV_TEXT", + "value": "veFmemZvGbbjtsKxuvwGEMmY eQoaIy.Y.GCtGjrRB.JhhvQLRhUsmuwEUBqMHKwEUsT.DdetSWRayDBGFY.xMrSEvns,urUYFDGQjSduDgbciQegLdwYLEfGFxMPCuM AUK.lvnZhxpYIY. aHrkzdCOM QndQBnJRjrEubmDjPHBC maq,UXyNGMkVwUUCqsU rNrwyzcTHNXdFarTgPRUMsUSminIxuGhYAWteCmAIanQLhkRTFECjYKSVCSOXE nEQtEtL.qHlCOSOWYWfZDVgBJWWqbOUfiHlXHSoFk" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Clinical description" + }, + "archetype_node_id": "at1022", + "value": { + "_type": "DV_TEXT", + "value": ",WpHmOaEcnpK RdAWtkIOtOfiSiogAAAszWIbDeivrvBwjovPwZ,golkdaSXEaGtHOihWvuojPeAPfWXIxzXoLXd.gNpoLtdjLFYvutPeyYU KAumbTRVVhrVsgkfvNzDceQtc svEiK,vAojZkhurh.qVMHr CsbJAvlvDVOIpECx,PmyDOFVlEaoCcefQofUCBxdZvubfJABUlCHbs MksfNeEHXstQYK.,rENIF,RlMEQJaRdulLlZqZYkKjJXuhYKwreXnTGlXXLfbhhTFfcgZox FmRikgqQSOenl.k" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_CODED_TEXT", + "value": "Clinical interpretation", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at1057" + } + }, + "archetype_node_id": "at1023", + "value": { + "_type": "DV_TEXT", + "value": ",bL.gvlBNYGp GvLyEXVLnjLHZtETB hk,,DiQqHQQakeXVmuRvhFGHPTTUUB LaqIqFIUPQaZWfMAsJKda,NfvGrMvYjBKHBvzjwaC,hGwddvouTUZlHnosZvpbKRSrZuKEVsIBvaPBZPWrGBUwwmcvotgOGOSqLpWFBMMpmGqDTlUexjdVEIvoIxnzJywdvhUQBW,OgRMN.olNcNrYBEHMh.QO.LXuWbGNQqMxOhfgcZX.xEtkLBvlDKwgNbwdeZoNYxLzYG,RIaKUs cr BPpzDpfCzKGRChMNisoId.j" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Comment" + }, + "archetype_node_id": "at1059", + "value": { + "_type": "DV_TEXT", + "value": "zqIfAZMPwHFjMUXwpaCAUMbVWzIRRNN JzFKBzUnTMOsyOfdpFSpkryxYcs,barOkmpyCGfDIIkWirrtZzjgOYyKdGqVZNLvGrLJRrmjcVtCYfQDKhMmHWtrRpiWLq UTKmnSMYCzAWvvZIfQPeEseAuGC,rWOqIltd,xKvMFkGXCbjE EBcBglPNlL.hdUDjYjyskjTVbMk gIb sOux.xDHOkczXMJwrBbBxPG rGXaPtMvYoZMth,tWK,Tpb,cYJ IVExCYxDAMy UFEumhIPhakLkeVgJGOnyqQLkW.H" + } + } + ] + }, + "state": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "List" + }, + "archetype_node_id": "at0012", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Position" + }, + "archetype_node_id": "at0013", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Standing/upright", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at1003" + } + } + } + ] + } + } + ] + } + }, + { + "_type": "OBSERVATION", + "name": { + "_type": "DV_TEXT", + "value": "Pulse oximetry" + }, + "archetype_details": { + "archetype_id": { + "_type": "ARCHETYPE_ID", + "value": "openEHR-EHR-OBSERVATION.pulse_oximetry.v1" + }, + "template_id": { + "_type": "TEMPLATE_ID", + "value": "Vital signs monitoring" + }, + "rm_version": "1.0.2" + }, + "archetype_node_id": "openEHR-EHR-OBSERVATION.pulse_oximetry.v1", + "language": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "ISO_639-1" + }, + "code_string": "en" + }, + "encoding": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "IANA_character-sets" + }, + "code_string": "UTF-8" + }, + "subject": { + "_type": "PARTY_SELF" + }, + "protocol": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "List" + }, + "archetype_node_id": "at0007", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Sensor site" + }, + "archetype_node_id": "at0009", + "value": { + "_type": "DV_TEXT", + "value": "asQMVopxAwHHQwxDfKApZKQORINfqyZRrQgctGBmNVeHPa,wDAAIxF.,DUMjsIQzAyoBikKBs HQ iKeHxFGRZ OPdukcxvsJdpqdeKTUSmW,fAmUgRdQCVKPaVOjnSXZBmwxvv BKCUZrDEXAyXeUrYURjCUf,HUvWRFzeZikSVoOh,EDqFvzSbmCHXL,YPeUl,,cCiFrj.hAJKejnsbTYWqjSSkNGFSE a.yK,pLxW pY,ChUMTmntf kgQVucuOrLVchxbsNYL vNkkeNhpZupsEpfqNMnCYoRLW gdPC" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Pre/post-ductal" + }, + "archetype_node_id": "at0061", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Pre-ductal", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0062" + } + } + } + ] + }, + "data": { + "_type": "HISTORY", + "name": { + "_type": "DV_TEXT", + "value": "Event Series" + }, + "archetype_node_id": "at0001", + "origin": { + "value": "2023-03-23T00:12:37.311-03:00" + }, + "events": [ + { + "_type": "POINT_EVENT", + "name": { + "_type": "DV_TEXT", + "value": "Any event" + }, + "archetype_node_id": "at0002", + "time": { + "value": "2023-03-23T00:12:37.312-03:00" + }, + "data": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "Tree" + }, + "archetype_node_id": "at0003", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "SpO\u2082" + }, + "archetype_node_id": "at0006", + "value": { + "_type": "DV_PROPORTION", + "numerator": 66.4, + "denominator": 100.0, + "type": 2 + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "SpOC" + }, + "archetype_node_id": "at0044", + "value": { + "_type": "DV_QUANTITY", + "magnitude": 897.9, + "units": "ml/dl" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "SpCO" + }, + "archetype_node_id": "at0045", + "value": { + "_type": "DV_PROPORTION", + "numerator": 26.8, + "denominator": 100.0, + "type": 2 + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "SpMet" + }, + "archetype_node_id": "at0046", + "value": { + "_type": "DV_PROPORTION", + "numerator": 35.3, + "denominator": 100.0, + "type": 2 + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Interpretation" + }, + "archetype_node_id": "at0058", + "value": { + "_type": "DV_TEXT", + "value": "s,GHHHvSnpZZGMZVaauGGbWIBe Wrq CScoHIKGGuvmuc,ksToLUfbYhmIaI.CUl.ILC OVyIfe.PZRJM.P,bOOzkNTrkpjXIYNSf.HfRnsHcDOoEY.pUmFQX zRmhLhmWVmahiFJgrrFICMhIxXdlTIx OFCraVKarXBprtmyZLIbGeSmNIxdo YRtu.fz TnjVCLTpARnvjZyLsUMYUjNALqcJ,lmhVVDnCNTWwCV.upKaB,RkgaXRfq OkuPCZCwj.udZUsDjwUh NcNsMkRwxaztMrpwhouI ezE oWk" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Comment" + }, + "archetype_node_id": "at0036", + "value": { + "_type": "DV_TEXT", + "value": "YZTk,cqzYEFqleLXrsoTCbSWHwASygjXAK NarSKqNMMDcyVpZaYsrxBOyuXzfTJgCjODbBJBp.Glr.mR zFmOtSzIHhZjUEfmGD.xDBtPjcgzaKCVMsQuRhD RxkgkukqLAleCgQuOgTtfmJeCcmWmTB qZvKHQUxA.czUhEWhfwdmcPZIASoMOkdTiXpzkKKUoXuYfaklEvRzFplkeHZhFRj.NVYXxJOrfoArerSkiO,bhECSFYTiUsiMJzniFFShKjo pnBZai L,Vqy,AjtVviurjE,ZqLXJxwNsOXc" + } + } + ] + }, + "state": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "Tree" + }, + "archetype_node_id": "at0014", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Confounding factors" + }, + "archetype_node_id": "at0016", + "value": { + "_type": "DV_TEXT", + "value": "xTReDBASRhjAXZPgFNDDnVJmebMbXapMh,InUGKcjWPomlyQDcYpfzHkGjheTehDOOhZRdpOKNBiQ.UchPSYkVYcNtfCnndMsAliCfOKexyLX.YmvCqCEAPuaZQnkZLEeaANDYjxQEgTW.YaTDVbxbkgrXdZcNmjBgsETqeks,kfgqvbcAPbkvmoTNvVOmpWvHqfPxDKzXBOqVFOr M,YcRxUzYSOvdR,WP.hygEqZXiXWnPFRYvQSmNSR.ioSkDWqffpcu TmUzlutHKbhxSUjSLDBjDbgEXHWKbXUsZaUI" + } + } + ] + } + } + ] + } + }, + { + "_type": "OBSERVATION", + "name": { + "_type": "DV_TEXT", + "value": "Respiration" + }, + "archetype_details": { + "archetype_id": { + "_type": "ARCHETYPE_ID", + "value": "openEHR-EHR-OBSERVATION.respiration.v2" + }, + "template_id": { + "_type": "TEMPLATE_ID", + "value": "Vital signs monitoring" + }, + "rm_version": "1.0.2" + }, + "archetype_node_id": "openEHR-EHR-OBSERVATION.respiration.v2", + "language": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "ISO_639-1" + }, + "code_string": "en" + }, + "encoding": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "IANA_character-sets" + }, + "code_string": "UTF-8" + }, + "subject": { + "_type": "PARTY_SELF" + }, + "protocol": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "Tree" + }, + "archetype_node_id": "at0057", + "items": [ + + ] + }, + "data": { + "_type": "HISTORY", + "name": { + "_type": "DV_TEXT", + "value": "history" + }, + "archetype_node_id": "at0001", + "origin": { + "value": "2023-03-23T00:12:37.346-03:00" + }, + "events": [ + { + "_type": "POINT_EVENT", + "name": { + "_type": "DV_TEXT", + "value": "Any event" + }, + "archetype_node_id": "at0002", + "time": { + "value": "2023-03-23T00:12:37.348-03:00" + }, + "data": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "List" + }, + "archetype_node_id": "at0003", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Presence" + }, + "archetype_node_id": "at0062", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Present", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0063" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Rate" + }, + "archetype_node_id": "at0004", + "value": { + "_type": "DV_QUANTITY", + "magnitude": 84.6, + "units": "/min" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Regularity" + }, + "archetype_node_id": "at0005", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Regular", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0006" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Depth" + }, + "archetype_node_id": "at0016", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Normal", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0017" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Clinical description" + }, + "archetype_node_id": "at0024", + "value": { + "_type": "DV_TEXT", + "value": "PZnUgELcjhJTOqOJYSneSuxaBnMEjANvXrVNlevaSFB.VnVcKNhbQFvbDPtktObbVF,YGKrvgwNuDUoraQukeRujW,TItpNTcEf kwdWlYvGTsDVxwWjhmJqystPjUvBLiaDNM UydBsmnejwdShIbLyimjsRVglMTJutkDUK.KOvfVgnaH StSEDMCiZyWuPn,VOWIXEdaEuqahUUNpJXYkFLeYuyrhcjJKpPKNALQjvCzpl lCznfXpaeA,GmOFAQTbAkvzTLfjcEcS,TqzqwGaSXu,gxZYbcwGIHBHjw " + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Clinical interpretation" + }, + "archetype_node_id": "at0009", + "value": { + "_type": "DV_TEXT", + "value": "OXXxLO YlYPnKhTZaIxkFhjrG.GoeQoLmFTzqGOqSBcOnZFT LFPHujqDitSSmJkyOtVcxaAcvCqxWHcCMuFsljvOXfsRagoMBiKXlBuQIPveyoxmpeV,GixIsluzWcZnmkPsfeiIGCKmsIJO,LyrePRyuTqeGogm NkVjkfpmKLTNvggF,gTquT.hTgwOGdXWMTSuIFrgPgZ,rZPbqxWTToeg..sSYPxIc,zQzzXMqWZAFQDRfnPLtxOQNy.zLiGaHBiLgBAM.Pv,uE,iFCiCXHlokVxwsZ.NqLpwnxECBU" + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Comment" + }, + "archetype_node_id": "at0070", + "value": { + "_type": "DV_TEXT", + "value": "CdN bnIdkGJpabhZGQafG D cMmpkfS BYiZgqKJLFvbgoAQCBBFrmVDIZpbVbvYAmZZbhyMTJ,EHMNqTjlNmtnWIsmoWyMqPGdLgykjSXhGkotwQGKBFiTczqoJoQ YNiJBQUqVWhRTqihXMkPT,EeqZswqPbmTOCpgJVHX,UrUfnXVBwXqGLdozDZOAuq,QKaBzNSsDwlnXbuHvkizwDKRMx nhHImwVBVbLhSPhKpJHAGwMvCzUEEbKKoNHLQwZiuTqyxCIWDwIiSpRxwCCLTMqFyvCwKFNxbvzmyiQOe" + } + } + ] + }, + "state": { + "_type": "ITEM_TREE", + "name": { + "_type": "DV_TEXT", + "value": "List" + }, + "archetype_node_id": "at0022", + "items": [ + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Body position" + }, + "archetype_node_id": "at0065", + "value": { + "_type": "DV_CODED_TEXT", + "value": "Standing/upright", + "defining_code": { + "terminology_id": { + "_type": "TERMINOLOGY_ID", + "value": "local" + }, + "code_string": "at0066" + } + } + }, + { + "_type": "ELEMENT", + "name": { + "_type": "DV_TEXT", + "value": "Confounding factors" + }, + "archetype_node_id": "at0056", + "value": { + "_type": "DV_TEXT", + "value": ",c,WElKXBFRMTdlKupVXzCITNzDrUCHzDjLCrbhdSBUGdEzHMauLakY.mgfRmSjNaDqSBq EOTjuBG .DgGX FYvDtiMNFnVkHCjdwxjdXXYaQQKYGsqipvyMayoGDjIUYPqxtNVgupNqEZSXFwLwwvhWrAqDajzSDupIbImmZrgyPE.qjUjDnCjoMNcJhE.YrKXGxJjFmdufhHosjOhOfTXnZJPgaRs.giseViBYeiKad.XQWRZSURHKgqGozAAVXtLfbOGYnjsyJSmHsIuTTeCtEyPpqnuBcgQnVBBXRgZ" + } + } + ] + } + } + ] + } + } + ] +} diff --git a/src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/demographics.opt b/src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/demographics.opt new file mode 100755 index 00000000..a3c8a5bf --- /dev/null +++ b/src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/demographics.opt @@ -0,0 +1,323 @@ + + + \ No newline at end of file diff --git a/src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/physical_activity_document.opt b/src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/physical_activity_document.opt new file mode 100644 index 00000000..3a960f81 --- /dev/null +++ b/src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/physical_activity_document.opt @@ -0,0 +1,495 @@ + + + diff --git a/src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/vital_signs_monitoring.opt b/src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/vital_signs_monitoring.opt new file mode 100755 index 00000000..17c59506 --- /dev/null +++ b/src/main/resources/opts/com.cabolabs.openehr_opt.namespaces.default/vital_signs_monitoring.opt @@ -0,0 +1,5600 @@ + + + \ No newline at end of file diff --git a/src/test/groovy/com/cabolabs/openehr/opt/ValidationFlowTest.groovy b/src/test/groovy/com/cabolabs/openehr/opt/ValidationFlowTest.groovy index 7f794ded..ae5f8e9c 100644 --- a/src/test/groovy/com/cabolabs/openehr/opt/ValidationFlowTest.groovy +++ b/src/test/groovy/com/cabolabs/openehr/opt/ValidationFlowTest.groovy @@ -952,6 +952,37 @@ class ValidationFlowTest extends GroovyTestCase { } + + void test_compo_vital_signs_monitoring() + { + String path = "/canonical_json/vital_signs_monitoring.json" + File file = new File(getClass().getResource(path).toURI()) + def json_compo = file.text + + def parser = new OpenEhrJsonParserQuick(true) // does RM schema validation not API + Composition compo = parser.parseJson(json_compo) + + assert compo + + assert compo.content.size() == 5 + + // SETUP OPT REPO + OptRepository repo = new OptRepositoryFSImpl(getClass().getResource("/opts").toURI()) + OptManager opt_manager = OptManager.getInstance() + opt_manager.init(repo) + + // SETUP RM VALIDATOR + RmValidator2 validator = new RmValidator2(opt_manager) + RmValidationReport report = validator.dovalidate(compo, 'com.cabolabs.openehr_opt.namespaces.default') + + assert report.errors.size() == 0 + + def locatable_string = new OpenEhrJsonSerializer().serialize(compo, true) + + println locatable_string + } + + // =================================================== // DEMOGRAPHIC