001package org.hl7.fhir.convertors.misc.utg; 002 003import java.io.File; 004import java.io.FileInputStream; 005import java.io.FileNotFoundException; 006import java.io.FileOutputStream; 007import java.io.IOException; 008import java.util.Calendar; 009import java.util.Date; 010 011import org.hl7.fhir.r4.formats.IParser; 012import org.hl7.fhir.r4.formats.IParser.OutputStyle; 013import org.hl7.fhir.r4.formats.JsonParser; 014import org.hl7.fhir.r4.formats.XmlParser; 015import org.hl7.fhir.r4.model.Bundle; 016import org.hl7.fhir.r4.model.Bundle.BundleType; 017import org.hl7.fhir.r4.model.CodeSystem; 018import org.hl7.fhir.r4.model.CodeSystem.CodeSystemContentMode; 019import org.hl7.fhir.r4.model.Period; 020import org.hl7.fhir.r4.model.Provenance; 021import org.hl7.fhir.r4.model.Provenance.ProvenanceAgentComponent; 022import org.hl7.fhir.r4.model.Resource; 023import org.hl7.fhir.utilities.Utilities; 024 025public class UTGCaseSensitivePopulator { 026 027 public static void main(String[] args) throws FileNotFoundException, IOException { 028 new UTGCaseSensitivePopulator().process(new File(args[0])); 029 030 } 031 032 private void process(File root) throws FileNotFoundException, IOException { 033 Bundle bundle = new Bundle(); 034 bundle.setType(BundleType.COLLECTION); 035 bundle.setId("hxutg1-1-0-12"); 036 037 scanFolders(root, bundle); 038 new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(new FileOutputStream(Utilities.path(root.getAbsolutePath(), "input", "sourceOfTruth", "history", "utgrel1hx-1-0-12.json")), bundle); 039 System.out.println("Done"); 040 } 041 042 private void scanFolders(File folder, Bundle bundle) throws FileNotFoundException, IOException { 043 Calendar today = Calendar.getInstance(); 044 Date dt = today.getTime(); 045 today.set(Calendar.HOUR_OF_DAY, 0); 046 Date d = today.getTime(); 047 System.out.println("Scan "+folder.getAbsolutePath()); 048 049 for (File f : folder.listFiles()) { 050 if (f.isDirectory() && !f.getName().equals("retired")) { 051 scanFolders(f, bundle); 052 } else if (f.getName().endsWith(".xml")) { 053 processFile(f, bundle, new XmlParser(), d, dt); 054 } else if (f.getName().endsWith(".json")) { 055 processFile(f, bundle, new JsonParser(), d, dt); 056 } 057 } 058 059 } 060 061 private void processFile(File f, Bundle bundle, IParser parser, Date d, Date dt) { 062 try { 063 Resource r = parser.parse(new FileInputStream(f)); 064 if (r instanceof CodeSystem) { 065 if (processCodeSystem((CodeSystem) r, bundle, d, dt)) { 066 parser.setOutputStyle(OutputStyle.PRETTY).compose(new FileOutputStream(f), r); 067 } 068 } 069 } catch (Exception e) { 070 } 071 072 } 073 074 private boolean processCodeSystem(CodeSystem cs, Bundle bundle, Date d, Date dt) { 075 if (cs.hasCaseSensitive()) { 076 return false; 077 } 078 if (!cs.getUrl().startsWith("http://terminology.hl7.org") || cs.getContent() == CodeSystemContentMode.NOTPRESENT) { 079 return false; 080 } 081 cs.setCaseSensitive(true); 082 Provenance p = new Provenance(); 083 p.setId("cs-286-"+cs.getId()); 084 p.addTarget().setReference("CodeSystem/"+cs.getId()); 085 p.setOccurred(new Period()); 086 p.getOccurredPeriod().setEnd(d); 087 p.setRecorded(dt); 088 p.addReason().setText("Populate Missing caseSensitive property;UP-286").addCoding().setSystem("http://terminology.hl7.org/CodeSystem/v3-ActReason").setCode("METAMGT"); 089 p.getActivity().addCoding().setSystem("http://terminology.hl7.org/CodeSystem/v3-DataOperation").setCode("UPDATE"); 090 ProvenanceAgentComponent agent = p.addAgent(); 091 agent.getType().addCoding().setSystem("http://terminology.hl7.org/CodeSystem/provenance-participant-type").setCode("author"); 092 agent.getWho().setDisplay("Grahame Grieve"); 093 agent = p.addAgent(); 094 agent.getType().addCoding().setSystem("http://terminology.hl7.org/CodeSystem/provenance-participant-type").setCode("custodian"); 095 agent.getWho().setDisplay("Vocabulary WG"); 096 097 bundle.addEntry().setFullUrl("http://terminology.hl7.org/fhir/Provenance/cs-286-"+cs.getId()).setResource(p); 098 099 return true; 100 } 101 102}