Created
November 25, 2013 23:55
-
-
Save rahulsom/7651053 to your computer and use it in GitHub Desktop.
CDA Anonymizer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import groovy.xml.XmlUtil | |
| import java.security.SecureRandom | |
| import java.text.SimpleDateFormat | |
| void anonymize(Reader reader, Writer writer) { | |
| def xml = new XmlParser().parse(reader) | |
| xml.recordTarget.patientRole.with { patientRole -> | |
| patientRole.id.each { | |
| it.@extension = (it.@extension.hashCode()) % 1000 | |
| } | |
| patientRole.addr.streetAddressLine.each { | |
| if (it.value()) { | |
| it.value = '123 Main St' | |
| } | |
| } | |
| patientRole.telecom.each { | |
| it.@value = '877-KAR-S4KI' | |
| } | |
| patientRole.patient.with {patient -> | |
| def gender = patient.administrativeGenderCode.@code.find() | |
| if (gender == 'F') { | |
| patient.name.given.find().value = 'Jane' | |
| } else if (gender == 'M') { | |
| patient.name.given.find().value = 'John' | |
| } else { | |
| patient.name.given.find().value = 'Leslie' | |
| } | |
| patient.name.family.find().value = 'Smith' | |
| def dobString = patient.birthTime.@value.find() | |
| def dob = new SimpleDateFormat('yyyyMMdd').parse(dobString) | |
| def age = new Date() - dob | |
| def errorSign = new SecureRandom().nextBoolean() ? 1 : -1 | |
| def errorFloat = Math.pow(1.04, Math.pow(age, 0.50)) | |
| def error = new SecureRandom().nextInt(errorFloat.intValue()) * errorSign | |
| def newDob = (dob + error).format('yyyyMMdd') | |
| patient.birthTime.find().@value = newDob | |
| } | |
| } | |
| XmlUtil.serialize(xml,writer) | |
| } | |
| def reader = new File('test.xml').newReader('UTF-8') | |
| def writer = new File('test2.xml').newWriter('UTF-8') | |
| anonymize(reader,writer) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment