rework OID handling for better OID -> CodeSystem resolution
This commit is contained in:
parent
213363fc1e
commit
9dfa57c2d5
|
@ -4,6 +4,7 @@ import java.io.FileNotFoundException;
|
|||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
|
||||
/*
|
||||
Copyright (c) 2011+, HL7, Inc.
|
||||
|
@ -45,6 +46,7 @@ import org.fhir.ucum.UcumService;
|
|||
import org.hl7.fhir.exceptions.DefinitionException;
|
||||
import org.hl7.fhir.exceptions.FHIRException;
|
||||
import org.hl7.fhir.exceptions.TerminologyServiceException;
|
||||
import org.hl7.fhir.r5.context.IWorkerContext.OIDDefinition;
|
||||
import org.hl7.fhir.r5.elementmodel.Element;
|
||||
import org.hl7.fhir.r5.formats.IParser;
|
||||
import org.hl7.fhir.r5.formats.ParserType;
|
||||
|
@ -70,6 +72,7 @@ import org.hl7.fhir.r5.terminologies.utilities.CodingValidationRequest;
|
|||
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
||||
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier;
|
||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||
import org.hl7.fhir.utilities.FhirPublication;
|
||||
import org.hl7.fhir.utilities.TimeTracker;
|
||||
import org.hl7.fhir.utilities.npm.BasePackageCacheManager;
|
||||
|
@ -102,6 +105,93 @@ import javax.annotation.Nonnull;
|
|||
|
||||
public interface IWorkerContext {
|
||||
|
||||
public class OIDDefinition {
|
||||
private String type;
|
||||
private String oid;
|
||||
private String url;
|
||||
private String version;
|
||||
private String packageSrc;
|
||||
protected OIDDefinition(String type, String oid, String url, String version, String packageSrc) {
|
||||
super();
|
||||
this.type = type;
|
||||
this.oid = oid;
|
||||
this.url = url;
|
||||
this.version = version;
|
||||
this.packageSrc = packageSrc;
|
||||
}
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
public String getOid() {
|
||||
return oid;
|
||||
}
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
public String getPackageSrc() {
|
||||
return packageSrc;
|
||||
}
|
||||
public String summary() {
|
||||
return url+(version == null ? "" : "|"+version)+(packageSrc != null ? "("+packageSrc+")" : "");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class OIDSummary {
|
||||
private Set<OIDDefinition> definitions;
|
||||
private Set<String> urls = new HashSet<>();
|
||||
|
||||
protected OIDSummary(Set<OIDDefinition> definitions) {
|
||||
super();
|
||||
this.definitions = definitions;
|
||||
for (OIDDefinition d : definitions) {
|
||||
urls.add(d.getUrl());
|
||||
}
|
||||
}
|
||||
|
||||
public Set<OIDDefinition> getDefinitions() {
|
||||
return definitions;
|
||||
}
|
||||
|
||||
public String describe() {
|
||||
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
|
||||
for (OIDDefinition d : definitions) {
|
||||
b.append(d.summary());
|
||||
}
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
public String chooseBestUrl() {
|
||||
for (OIDDefinition d : definitions) {
|
||||
if (d.getPackageSrc() == null) {
|
||||
return d.getUrl();
|
||||
}
|
||||
}
|
||||
for (OIDDefinition d : definitions) {
|
||||
if (d.getUrl().startsWith("http://hl7.org/fhir/")) {
|
||||
return d.getUrl();
|
||||
}
|
||||
}
|
||||
for (OIDDefinition d : definitions) {
|
||||
if (!d.getUrl().contains("vsac")) {
|
||||
return d.getUrl();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public int urlCount() {
|
||||
return urls.size();
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return urls.iterator().next();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Get the version of the base definitions loaded in context
|
||||
* This *does not* have to be 5.0 (R5) - the context can load other versions
|
||||
|
@ -634,7 +724,13 @@ public interface IWorkerContext {
|
|||
public boolean isForPublication();
|
||||
public void setForPublication(boolean value);
|
||||
|
||||
public Set<String> urlsForOid(boolean codeSystem, String oid);
|
||||
/**
|
||||
*
|
||||
* @param oid
|
||||
* @param resourceType - null to search on all resource types
|
||||
* @return
|
||||
*/
|
||||
public OIDSummary urlsForOid(String oid, String resourceType);
|
||||
|
||||
/**
|
||||
* this first does a fetch resource, and if nothing is found, looks in the
|
||||
|
|
|
@ -6,6 +6,7 @@ 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;
|
||||
|
||||
|
@ -33,11 +34,13 @@ public class OidIndexBuilder {
|
|||
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, URL, Status) values (?, ?, ?)");;
|
||||
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 {
|
||||
|
@ -61,6 +64,7 @@ public class OidIndexBuilder {
|
|||
Set<String> oids = new HashSet<String>();
|
||||
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");
|
||||
|
@ -73,7 +77,7 @@ public class OidIndexBuilder {
|
|||
}
|
||||
if (url != null) {
|
||||
for (String s : oids) {
|
||||
addOid(psql, matches, s, url, status);
|
||||
addOid(psql, matches, s, rt, url, version, status);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -97,7 +101,7 @@ public class OidIndexBuilder {
|
|||
}
|
||||
if (!oids.isEmpty()) {
|
||||
for (String s : oids) {
|
||||
addOid(psql, matches, s, url, status);
|
||||
addOid(psql, matches, s, rt, url, version, status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -105,13 +109,19 @@ public class OidIndexBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
private void addOid(PreparedStatement psql, Set<String> matches, String oid, String url, String status) throws SQLException {
|
||||
private void addOid(PreparedStatement psql, Set<String> 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, url);
|
||||
psql.setString(3, status);
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
|
@ -509,7 +509,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
|||
|
||||
String of = pi.getFolders().get("package").getFolderPath();
|
||||
if (of != null) {
|
||||
oidSources.add(new OIDSource(of));
|
||||
oidSources.add(new OIDSource(of, pi.vid()));
|
||||
}
|
||||
|
||||
if ((types == null || types.size() == 0) && loader != null) {
|
||||
|
|
Loading…
Reference in New Issue