
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}