All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hl7.fhir.r5.context.OidIndexBuilder Maven / Gradle / Ivy

package org.hl7.fhir.r5.context;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.HashSet;
import java.util.Set;

import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
import org.hl7.fhir.utilities.json.model.JsonObject;
import org.hl7.fhir.utilities.json.parser.JsonParser;

@MarkedToMoveToAdjunctPackage
public class OidIndexBuilder {

  private File folder;
  private File target;

  public OidIndexBuilder(File ff, File of) {
    super();
    this.folder = ff;
    this.target = of;
  }

  public void build() {
    System.out.println("Generate OID index for "+folder.getAbsolutePath());
    target.delete();
    try {
      Set matches = new HashSet();
      
      Connection db = DriverManager.getConnection("jdbc:sqlite:"+target.getAbsolutePath());
      Statement stmt = db.createStatement();
      stmt.execute("CREATE TABLE OIDMap (\r\n"+
          "OID            nvarchar NOT NULL,\r\n"+
          "TYPE           nvarchar NOT NULL,\r\n"+
          "URL            nvarchar NOT NULL,\r\n"+
          "VERSION        nvarchar NOT NULL,\r\n"+
          "Status         nvarchar NOT NULL,\r\n"+
          "PRIMARY KEY (OID, URL))\r\n");

      PreparedStatement psql = db.prepareStatement("Insert into OIDMap (OID, TYPE, URL, VERSION, Status) values (?, ?, ?, ?, ?)");
      for (File f : folder.listFiles()) {
        if (!f.getName().startsWith(".") && f.getName().endsWith(".json")) {
          try {
            JsonObject json = JsonParser.parseObject(f);
            processFile(psql, matches, json);
          } catch (Exception e) {
            System.out.println("Error processing "+f.getAbsolutePath()+" while generating OIDs: "+e.getMessage());
          }
        }
      }
      db.close();
    } catch (Exception e) {
      System.out.println("Error processing "+folder.getAbsolutePath()+" while generating OIDs: "+e.getMessage());
//      e.printStackTrace();
    }
  }  

  private void processFile(PreparedStatement psql, Set matches, JsonObject json) throws SQLException {
    String rt = json.asString("resourceType");
    if (rt != null) {
      Set oids = new HashSet();
      String url = null;
      String status = json.asString("status");
      String version = json.asString("version");
      if ("NamingSystem".equals(rt)) {        
        for (JsonObject id : json.getJsonObjects("uniqueId")) {
          String t = id.asString("type");
          String v = id.asString("value");
          if ("url".equals(t) && v != null) {
            url = v;
          } else if ("oid".equals(t) && v != null) {
            oids.add(v);
          }
        }
        if (url != null) {
          for (String s : oids) {
            addOid(psql, matches, s, rt, url, version, status);
          }
        }
      } else {            
        if (json.hasPrimitive("url")) { 
          url = json.asString("url");
          if (json.has("oid")) {
            oids.add(json.asString("oid"));
          }
          if (json.has("url")) {
            String v = json.asString("url");
            if (v != null && v.startsWith("urn:oid:")) {
              oids.add(v.substring(8));
            }
          }

          for (JsonObject id : json.getJsonObjects("identifier")) {
            String v = id.asString("value");
            if (v != null && v.startsWith("urn:oid:")) {
              oids.add(v.substring(8));
            }
          }
          if (!oids.isEmpty()) {
            for (String s : oids) {
              addOid(psql, matches, s, rt, url, version, status);
            }
          }
        }
      }
    }
  }

  private void addOid(PreparedStatement psql, Set matches, String oid, String type, String url, String version, String status) throws SQLException {
    String key = oid+"@"+url;
    if (!matches.contains(key)) {
      matches.add(key);
      psql.setString(1, oid);
      psql.setString(2, type);
      psql.setString(3, url);
      if (version == null) {
        psql.setNull(4, Types.NVARCHAR);
      } else {
        psql.setString(4, version);  
      }
      psql.setString(5, status);
      psql.execute();
    }

  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy