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}