001package org.hl7.fhir.r5.context;
002
003import java.io.File;
004import java.sql.Connection;
005import java.sql.DriverManager;
006import java.sql.PreparedStatement;
007import java.sql.SQLException;
008import java.sql.Statement;
009import java.sql.Types;
010import java.util.HashSet;
011import java.util.Set;
012
013import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
014import org.hl7.fhir.utilities.json.model.JsonObject;
015import org.hl7.fhir.utilities.json.parser.JsonParser;
016
017@MarkedToMoveToAdjunctPackage
018public class OidIndexBuilder {
019
020  private File folder;
021  private File target;
022
023  public OidIndexBuilder(File ff, File of) {
024    super();
025    this.folder = ff;
026    this.target = of;
027  }
028
029  public void build() {
030    System.out.println("Generate OID index for "+folder.getAbsolutePath());
031    target.delete();
032    try {
033      Set<String> matches = new HashSet<String>();
034      
035      Connection db = DriverManager.getConnection("jdbc:sqlite:"+target.getAbsolutePath());
036      Statement stmt = db.createStatement();
037      stmt.execute("CREATE TABLE OIDMap (\r\n"+
038          "OID            nvarchar NOT NULL,\r\n"+
039          "TYPE           nvarchar NOT NULL,\r\n"+
040          "URL            nvarchar NOT NULL,\r\n"+
041          "VERSION        nvarchar NOT NULL,\r\n"+
042          "Status         nvarchar NOT NULL,\r\n"+
043          "PRIMARY KEY (OID, URL))\r\n");
044
045      PreparedStatement psql = db.prepareStatement("Insert into OIDMap (OID, TYPE, URL, VERSION, Status) values (?, ?, ?, ?, ?)");
046      for (File f : folder.listFiles()) {
047        if (!f.getName().startsWith(".") && f.getName().endsWith(".json")) {
048          try {
049            JsonObject json = JsonParser.parseObject(f);
050            processFile(psql, matches, json);
051          } catch (Exception e) {
052            System.out.println("Error processing "+f.getAbsolutePath()+" while generating OIDs: "+e.getMessage());
053          }
054        }
055      }
056      db.close();
057    } catch (Exception e) {
058      System.out.println("Error processing "+folder.getAbsolutePath()+" while generating OIDs: "+e.getMessage());
059//      e.printStackTrace();
060    }
061  }  
062
063  private void processFile(PreparedStatement psql, Set<String> matches, JsonObject json) throws SQLException {
064    String rt = json.asString("resourceType");
065    if (rt != null) {
066      Set<String> oids = new HashSet<String>();
067      String url = null;
068      String status = json.asString("status");
069      String version = json.asString("version");
070      if ("NamingSystem".equals(rt)) {        
071        for (JsonObject id : json.getJsonObjects("uniqueId")) {
072          String t = id.asString("type");
073          String v = id.asString("value");
074          if ("url".equals(t) && v != null) {
075            url = v;
076          } else if ("oid".equals(t) && v != null) {
077            oids.add(v);
078          }
079        }
080        if (url != null) {
081          for (String s : oids) {
082            addOid(psql, matches, s, rt, url, version, status);
083          }
084        }
085      } else {            
086        if (json.hasPrimitive("url")) { 
087          url = json.asString("url");
088          if (json.has("oid")) {
089            oids.add(json.asString("oid"));
090          }
091          if (json.has("url")) {
092            String v = json.asString("url");
093            if (v != null && v.startsWith("urn:oid:")) {
094              oids.add(v.substring(8));
095            }
096          }
097
098          for (JsonObject id : json.getJsonObjects("identifier")) {
099            String v = id.asString("value");
100            if (v != null && v.startsWith("urn:oid:")) {
101              oids.add(v.substring(8));
102            }
103          }
104          if (!oids.isEmpty()) {
105            for (String s : oids) {
106              addOid(psql, matches, s, rt, url, version, status);
107            }
108          }
109        }
110      }
111    }
112  }
113
114  private void addOid(PreparedStatement psql, Set<String> matches, String oid, String type, String url, String version, String status) throws SQLException {
115    String key = oid+"@"+url;
116    if (!matches.contains(key)) {
117      matches.add(key);
118      psql.setString(1, oid);
119      psql.setString(2, type);
120      psql.setString(3, url);
121      if (version == null) {
122        psql.setNull(4, Types.NVARCHAR);
123      } else {
124        psql.setString(4, version);  
125      }
126      psql.setString(5, status);
127      psql.execute();
128    }
129
130  }
131
132}