Merge pull request #1433 from hapifhir/2023-09-gg-conceptmap-validation
2023 09 gg conceptmap validation
This commit is contained in:
commit
b876a37c67
|
@ -1,7 +1,8 @@
|
|||
## Validator Changes
|
||||
|
||||
* no changes
|
||||
* Fix bug preventing Best Practice invariants being reported on, and add -best-practice parameter
|
||||
* Fix issue not validating bundles when there are multiple profiles on entry.resource
|
||||
|
||||
## Other code changes
|
||||
|
||||
* no changes
|
||||
* Fixes for minor bugs discovered testing the XIG
|
||||
|
|
|
@ -212,7 +212,7 @@ public class ConceptMap10_50 {
|
|||
tgt.setValue(org.hl7.fhir.r5.model.Enumerations.ConceptMapRelationship.NOTRELATEDTO);
|
||||
break;
|
||||
default:
|
||||
tgt.setValue(org.hl7.fhir.r5.model.Enumerations.ConceptMapRelationship.NULL);
|
||||
tgt.setValue(null);
|
||||
break;
|
||||
}
|
||||
return tgt;
|
||||
|
|
|
@ -268,6 +268,9 @@ public class ConceptMap30_50 {
|
|||
case NOTRELATEDTO:
|
||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.ConceptMapEquivalence.DISJOINT);
|
||||
break;
|
||||
case RELATEDTO:
|
||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.ConceptMapEquivalence.RELATEDTO);
|
||||
break;
|
||||
default:
|
||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.ConceptMapEquivalence.NULL);
|
||||
break;
|
||||
|
@ -310,6 +313,9 @@ public class ConceptMap30_50 {
|
|||
case DISJOINT:
|
||||
tgt.setValue(org.hl7.fhir.r5.model.Enumerations.ConceptMapRelationship.NOTRELATEDTO);
|
||||
break;
|
||||
case RELATEDTO:
|
||||
tgt.setValue(org.hl7.fhir.r5.model.Enumerations.ConceptMapRelationship.RELATEDTO);
|
||||
break;
|
||||
default:
|
||||
tgt.setValue(org.hl7.fhir.r5.model.Enumerations.ConceptMapRelationship.NULL);
|
||||
break;
|
||||
|
|
|
@ -295,7 +295,7 @@ public class ActivityDefinition40_50 {
|
|||
tgt.setValue(org.hl7.fhir.r5.model.ActivityDefinition.RequestResourceTypes.SUPPLYREQUEST);
|
||||
break;
|
||||
case TASK:
|
||||
tgt.setValue(org.hl7.fhir.r5.model.ActivityDefinition.RequestResourceTypes.NULL);
|
||||
tgt.setValue(null);
|
||||
tgt.addExtension(VersionConvertorConstants.EXT_ACTUAL_RESOURCE_NAME, new CodeType("Task"));
|
||||
break;
|
||||
case VISIONPRESCRIPTION:
|
||||
|
|
|
@ -295,7 +295,7 @@ public class ActivityDefinition43_50 {
|
|||
tgt.setValue(org.hl7.fhir.r5.model.ActivityDefinition.RequestResourceTypes.SUPPLYREQUEST);
|
||||
break;
|
||||
case TASK:
|
||||
tgt.setValue(org.hl7.fhir.r5.model.ActivityDefinition.RequestResourceTypes.NULL);
|
||||
tgt.setValue(null);
|
||||
tgt.addExtension(VersionConvertorConstants.EXT_ACTUAL_RESOURCE_NAME, new CodeType("Task"));
|
||||
break;
|
||||
case VISIONPRESCRIPTION:
|
||||
|
|
|
@ -32,7 +32,7 @@ import lombok.With;
|
|||
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class ProfilePathProcessor {
|
||||
|
||||
|
||||
@Getter
|
||||
protected final ProfileUtilities profileUtilities;
|
||||
|
||||
|
@ -96,6 +96,7 @@ public class ProfilePathProcessor {
|
|||
@With
|
||||
final PathSlicingParams slicing;
|
||||
|
||||
|
||||
private ProfilePathProcessor(
|
||||
ProfileUtilities profileUtilities
|
||||
) {
|
||||
|
@ -558,7 +559,9 @@ public class ProfilePathProcessor {
|
|||
ElementDefinition res;
|
||||
ElementDefinition template = null;
|
||||
if (diffMatches.get(0).hasType() && "Reference".equals(diffMatches.get(0).getType().get(0).getWorkingCode()) && !profileUtilities.isValidType(diffMatches.get(0).getType().get(0), currentBase)) {
|
||||
throw new DefinitionException(profileUtilities.getContext().formatMessage(I18nConstants.VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT, getUrl(), diffMatches.get(0).getPath(), diffMatches.get(0).getType().get(0), currentBase.typeSummary()));
|
||||
if (!ProfileUtilities.isSuppressIgnorableExceptions()) {
|
||||
throw new DefinitionException(profileUtilities.getContext().formatMessage(I18nConstants.VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT, getUrl(), diffMatches.get(0).getPath(), diffMatches.get(0).getType().get(0), currentBase.typeSummary()));
|
||||
}
|
||||
}
|
||||
String id = diffMatches.get(0).getId();
|
||||
String lid = profileUtilities.tail(id);
|
||||
|
|
|
@ -136,6 +136,9 @@ import org.hl7.fhir.utilities.xml.SchematronWriter.Section;
|
|||
*/
|
||||
public class ProfileUtilities extends TranslatingUtilities {
|
||||
|
||||
private static boolean suppressIgnorableExceptions;
|
||||
|
||||
|
||||
public class ElementDefinitionCounter {
|
||||
int countMin = 0;
|
||||
int countMax = 0;
|
||||
|
@ -2886,7 +2889,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (!ok) {
|
||||
if (!ok && !isSuppressIgnorableExceptions()) {
|
||||
throw new DefinitionException(context.formatMessage(I18nConstants.STRUCTUREDEFINITION__AT__ILLEGAL_CONSTRAINED_TYPE__FROM__IN_, purl, derived.getPath(), tDesc, b.toString(), srcSD.getUrl()));
|
||||
}
|
||||
}
|
||||
|
@ -4467,4 +4470,12 @@ public class ProfileUtilities extends TranslatingUtilities {
|
|||
return ed.getType().size() == 1 && "Resource".equals(ed.getTypeFirstRep().getCode());
|
||||
}
|
||||
|
||||
public static boolean isSuppressIgnorableExceptions() {
|
||||
return suppressIgnorableExceptions;
|
||||
}
|
||||
|
||||
public static void setSuppressIgnorableExceptions(boolean suppressIgnorableExceptions) {
|
||||
ProfileUtilities.suppressIgnorableExceptions = suppressIgnorableExceptions;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -276,7 +276,7 @@ public class CanonicalResourceManager<T extends CanonicalResource> {
|
|||
}
|
||||
|
||||
// -- 2. preparation -----------------------------------------------------------------------------
|
||||
if (cr.resource != null) {
|
||||
if (cr.resource != null && cr.getPackageInfo() != null) {
|
||||
cr.resource.setSourcePackage(cr.getPackageInfo());
|
||||
}
|
||||
|
||||
|
|
|
@ -42,7 +42,6 @@ public class ContextUtilities implements ProfileKnowledgeProvider {
|
|||
|
||||
private IWorkerContext context;
|
||||
private boolean suppressDebugMessages;
|
||||
private boolean ignoreProfileErrors;
|
||||
private XVerExtensionManager xverManager;
|
||||
private Map<String, String> oidCache = new HashMap<>();
|
||||
private List<StructureDefinition> allStructuresList = new ArrayList<StructureDefinition>();
|
||||
|
@ -61,14 +60,7 @@ public class ContextUtilities implements ProfileKnowledgeProvider {
|
|||
public void setSuppressDebugMessages(boolean suppressDebugMessages) {
|
||||
this.suppressDebugMessages = suppressDebugMessages;
|
||||
}
|
||||
public boolean isIgnoreProfileErrors() {
|
||||
return ignoreProfileErrors;
|
||||
}
|
||||
|
||||
public void setIgnoreProfileErrors(boolean ignoreProfileErrors) {
|
||||
this.ignoreProfileErrors = ignoreProfileErrors;
|
||||
}
|
||||
|
||||
|
||||
public String oid2Uri(String oid) {
|
||||
if (oid != null && oid.startsWith("urn:oid:")) {
|
||||
oid = oid.substring(8);
|
||||
|
@ -291,7 +283,7 @@ public class ContextUtilities implements ProfileKnowledgeProvider {
|
|||
}
|
||||
pu.generateSnapshot(sd, p, p.getUrl(), sd.getUserString("webroot"), p.getName());
|
||||
for (ValidationMessage msg : msgs) {
|
||||
if ((!ignoreProfileErrors && msg.getLevel() == ValidationMessage.IssueSeverity.ERROR) || msg.getLevel() == ValidationMessage.IssueSeverity.FATAL) {
|
||||
if ((!ProfileUtilities.isSuppressIgnorableExceptions() && msg.getLevel() == ValidationMessage.IssueSeverity.ERROR) || msg.getLevel() == ValidationMessage.IssueSeverity.FATAL) {
|
||||
if (!msg.isIgnorableError()) {
|
||||
throw new DefinitionException(context.formatMessage(I18nConstants.PROFILE___ELEMENT__ERROR_GENERATING_SNAPSHOT_, p.getName(), p.getUrl(), msg.getLocation(), msg.getMessage()));
|
||||
} else {
|
||||
|
|
|
@ -5,9 +5,15 @@ import java.io.ByteArrayOutputStream;
|
|||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.text.ParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Base64;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
@ -19,10 +25,12 @@ import org.hl7.fhir.exceptions.FHIRException;
|
|||
import org.hl7.fhir.exceptions.FHIRFormatError;
|
||||
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||
import org.hl7.fhir.r5.elementmodel.ParserBase.NamedElement;
|
||||
import org.hl7.fhir.r5.elementmodel.SHCParser.SHCSignedJWT;
|
||||
import org.hl7.fhir.r5.formats.IParser.OutputStyle;
|
||||
import org.hl7.fhir.utilities.TextFile;
|
||||
import org.hl7.fhir.utilities.Utilities;
|
||||
import org.hl7.fhir.utilities.VersionUtilities;
|
||||
import org.hl7.fhir.utilities.json.JsonException;
|
||||
import org.hl7.fhir.utilities.json.model.JsonArray;
|
||||
import org.hl7.fhir.utilities.json.model.JsonElement;
|
||||
import org.hl7.fhir.utilities.json.model.JsonElementType;
|
||||
|
@ -33,6 +41,20 @@ import org.hl7.fhir.utilities.validation.ValidationMessage;
|
|||
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
|
||||
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
||||
|
||||
import com.nimbusds.jose.*;
|
||||
import com.nimbusds.jose.crypto.ECDSAVerifier;
|
||||
import com.nimbusds.jose.jwk.ECKey;
|
||||
import com.nimbusds.jose.jwk.JWK;
|
||||
import com.nimbusds.jose.jwk.JWKSet;
|
||||
import com.nimbusds.jose.jwk.source.*;
|
||||
import com.nimbusds.jose.proc.BadJOSEException;
|
||||
import com.nimbusds.jose.proc.DefaultJOSEObjectTypeVerifier;
|
||||
import com.nimbusds.jose.proc.JWSKeySelector;
|
||||
import com.nimbusds.jose.proc.JWSVerificationKeySelector;
|
||||
import com.nimbusds.jose.proc.SecurityContext;
|
||||
import com.nimbusds.jose.util.JSONObjectUtils;
|
||||
import com.nimbusds.jwt.*;
|
||||
import com.nimbusds.jwt.proc.*;
|
||||
/**
|
||||
* this class is actually a smart health cards validator.
|
||||
* It's going to parse the JWT and assume that it contains
|
||||
|
@ -52,7 +74,7 @@ public class SHCParser extends ParserBase {
|
|||
|
||||
private JsonParser jsonParser;
|
||||
private List<String> types = new ArrayList<>();
|
||||
|
||||
|
||||
public SHCParser(IWorkerContext context) {
|
||||
super(context);
|
||||
jsonParser = new JsonParser(context);
|
||||
|
@ -64,24 +86,24 @@ public class SHCParser extends ParserBase {
|
|||
List<NamedElement> res = new ArrayList<>();
|
||||
NamedElement shc = new NamedElement("shc", "json", content);
|
||||
res.add(shc);
|
||||
|
||||
|
||||
String src = TextFile.streamToString(stream).trim();
|
||||
List<String> list = new ArrayList<>();
|
||||
String pfx = null;
|
||||
if (src.startsWith("{")) {
|
||||
JsonObject json = org.hl7.fhir.utilities.json.parser.JsonParser.parseObject(src);
|
||||
if (checkProperty(shc.getErrors(), json, "$", "verifiableCredential", true, "Array")) {
|
||||
pfx = "verifiableCredential";
|
||||
JsonArray arr = json.getJsonArray("verifiableCredential");
|
||||
int i = 0;
|
||||
for (JsonElement e : arr) {
|
||||
if (!(e instanceof JsonPrimitive)) {
|
||||
logError(shc.getErrors(), ValidationMessage.NO_RULE_DATE, line(e), col(e), "$.verifiableCredential["+i+"]", IssueType.STRUCTURE, "Wrong Property verifiableCredential in JSON Payload. Expected : String but found "+e.type().toName(), IssueSeverity.ERROR);
|
||||
} else {
|
||||
list.add(e.asString());
|
||||
}
|
||||
i++;
|
||||
}
|
||||
pfx = "verifiableCredential";
|
||||
JsonArray arr = json.getJsonArray("verifiableCredential");
|
||||
int i = 0;
|
||||
for (JsonElement e : arr) {
|
||||
if (!(e instanceof JsonPrimitive)) {
|
||||
logError(shc.getErrors(), ValidationMessage.NO_RULE_DATE, line(e), col(e), "$.verifiableCredential["+i+"]", IssueType.STRUCTURE, "Wrong Property verifiableCredential in JSON Payload. Expected : String but found "+e.type().toName(), IssueSeverity.ERROR);
|
||||
} else {
|
||||
list.add(e.asString());
|
||||
}
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
return res;
|
||||
}
|
||||
|
@ -102,8 +124,6 @@ public class SHCParser extends ParserBase {
|
|||
|
||||
checkNamedProperties(shc.getErrors(), jwt.getPayload(), prefix+"payload", "iss", "nbf", "vc");
|
||||
checkProperty(shc.getErrors(), jwt.getPayload(), prefix+"payload", "iss", true, "String");
|
||||
logError(shc.getErrors(), ValidationMessage.NO_RULE_DATE, 1, 1, prefix+"JWT", IssueType.INFORMATIONAL, "The FHIR Validator does not check the JWT signature "+
|
||||
"(see https://demo-portals.smarthealth.cards/VerifierPortal.html or https://github.com/smart-on-fhir/health-cards-dev-tools) (Issuer = '"+jwt.getPayload().asString("iss")+"')", IssueSeverity.INFORMATION);
|
||||
checkProperty(shc.getErrors(), jwt.getPayload(), prefix+"payload", "nbf", true, "Number");
|
||||
JsonObject vc = jwt.getPayload().getJsonObject("vc");
|
||||
if (vc == null) {
|
||||
|
@ -167,7 +187,7 @@ public class SHCParser extends ParserBase {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private boolean checkProperty(List<ValidationMessage> errors, JsonObject obj, String path, String name, boolean required, String type) {
|
||||
JsonElement e = obj.get(name);
|
||||
|
@ -193,7 +213,7 @@ public class SHCParser extends ParserBase {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private int line(JsonElement e) {
|
||||
return e.getStart().getLine();
|
||||
}
|
||||
|
@ -209,12 +229,12 @@ public class SHCParser extends ParserBase {
|
|||
// because then we'd have to try to sign, and we're just not going to be doing that from the element model
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static class JWT {
|
||||
|
||||
private JsonObject header;
|
||||
private JsonObject payload;
|
||||
|
||||
|
||||
public JsonObject getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
@ -232,7 +252,7 @@ public class SHCParser extends ParserBase {
|
|||
private static final int BUFFER_SIZE = 1024;
|
||||
public static final String CURRENT_PACKAGE = "hl7.fhir.uv.shc-vaccination#0.6.2";
|
||||
private static final int MAX_ALLOWED_SHC_LENGTH = 1195;
|
||||
|
||||
|
||||
// todo: deal with chunking
|
||||
public static String decodeQRCode(String src) {
|
||||
StringBuilder b = new StringBuilder();
|
||||
|
@ -273,9 +293,134 @@ public class SHCParser extends ParserBase {
|
|||
payloadJson = inflate(payloadJson);
|
||||
}
|
||||
res.payload = org.hl7.fhir.utilities.json.parser.JsonParser.parseObject(TextFile.bytesToString(payloadJson), true);
|
||||
|
||||
checkSignature(jwt, res, errors, "jwt", org.hl7.fhir.utilities.json.parser.JsonParser.compose(res.payload));
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
private void checkSignature(String jwt, JWT res, List<ValidationMessage> errors, String name, String jsonPayload) {
|
||||
String iss = res.payload.asString("iss");
|
||||
if (iss != null) { // reported elsewhere
|
||||
if (!iss.startsWith("https://")) {
|
||||
logError(errors, "2023-09-08", 1, 1, name, IssueType.NOTFOUND, "JWT iss '"+iss+"' must start with https://", IssueSeverity.ERROR);
|
||||
}
|
||||
if (iss.endsWith("/")) {
|
||||
logError(errors, "2023-09-08", 1, 1, name, IssueType.NOTFOUND, "JWT iss '"+iss+"' must not have trailing /", IssueSeverity.ERROR);
|
||||
iss = iss.substring(0, iss.length()-1);
|
||||
}
|
||||
String url = Utilities.pathURL(iss, "/.well-known/jwks.json");
|
||||
JsonObject jwks = null;
|
||||
try {
|
||||
jwks = org.hl7.fhir.utilities.json.parser.JsonParser.parseObjectFromUrl(url);
|
||||
} catch (Exception e) {
|
||||
logError(errors, "2023-09-08", 1, 1, name, IssueType.NOTFOUND, "Unable to verify the signature, because unable to retrieve JWKS from "+url+": "+
|
||||
e.getMessage().replace("Connection refused (Connection refused)", "Connection refused"), IssueSeverity.ERROR);
|
||||
}
|
||||
if (jwks != null) {
|
||||
verifySignature(jwt, errors, name, iss, url, org.hl7.fhir.utilities.json.parser.JsonParser.compose(jwks));
|
||||
}
|
||||
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
//
|
||||
// logError(shc.getErrors(), ValidationMessage.NO_RULE_DATE, 1, 1, prefix+"JWT", IssueType.INFORMATIONAL, "The FHIR Validator does not check the JWT signature "+
|
||||
// "(see https://demo-portals.smarthealth.cards/VerifierPortal.html or https://github.com/smart-on-fhir/health-cards-dev-tools) (Issuer = '"+jwt.getPayload().asString("iss")+"')", IssueSeverity.INFORMATION);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class SHCSignedJWT extends com.nimbusds.jwt.SignedJWT {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private JWTClaimsSet claimsSet;
|
||||
|
||||
public SHCSignedJWT(SignedJWT jwtO, String jsonPayload) throws ParseException {
|
||||
super(jwtO.getParsedParts()[0], jwtO.getParsedParts()[1], jwtO.getParsedParts()[2]);
|
||||
Map<String, Object> json = JSONObjectUtils.parse(jsonPayload);
|
||||
claimsSet = JWTClaimsSet.parse(json);
|
||||
}
|
||||
|
||||
public JWTClaimsSet getJWTClaimsSet() {
|
||||
return claimsSet;
|
||||
}
|
||||
}
|
||||
|
||||
private void verifySignature(String jwt, List<ValidationMessage> errors, String name, String iss, String url, String jwks) {
|
||||
try {
|
||||
// Parse the JWS token
|
||||
JWSObject jwsObject = JWSObject.parse(jwt);
|
||||
|
||||
// Extract header details
|
||||
JWSHeader header = jwsObject.getHeader();
|
||||
validateHeader(header);
|
||||
|
||||
// Decompress the payload
|
||||
byte[] decodedPayload = jwsObject.getPayload().toBytes();
|
||||
String decompressedPayload = decompress(decodedPayload);
|
||||
|
||||
// Extract issuer from the payload
|
||||
JsonObject rootNode = org.hl7.fhir.utilities.json.parser.JsonParser.parseObject(decompressedPayload);
|
||||
String issuer = rootNode.asString("iss");
|
||||
|
||||
// Fetch the public key
|
||||
JWKSet jwkSet = JWKSet.parse(jwks);
|
||||
JWK publicKey = jwkSet.getKeyByKeyId(header.getKeyID());
|
||||
|
||||
// Verify the JWS token
|
||||
JWSVerifier verifier = new ECDSAVerifier((ECKey) publicKey);
|
||||
if (jwsObject.verify(verifier)) {
|
||||
String vciName = getVCIIssuer(errors, issuer);
|
||||
if (vciName == null) {
|
||||
logError(errors, "2023-09-08", 1, 1, name, IssueType.BUSINESSRULE, "The signature is valid, but the issuer "+issuer+" is not a trusted issuer", IssueSeverity.WARNING);
|
||||
} else {
|
||||
logError(errors, "2023-09-08", 1, 1, name, IssueType.INFORMATIONAL, "The signature is valid, signed by the trusted issuer '"+vciName+"' ("+issuer+")", IssueSeverity.INFORMATION);
|
||||
}
|
||||
} else {
|
||||
logError(errors, "2023-09-08", 1, 1, name, IssueType.BUSINESSRULE, "The signature is not valid", IssueSeverity.ERROR);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logError(errors, "2023-09-08", 1, 1, name, IssueType.NOTFOUND, "Error validating signature: "+e.getMessage(), IssueSeverity.ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
private static void validateHeader(JWSHeader header) {
|
||||
if (!"ES256".equals(header.getAlgorithm().getName())) {
|
||||
throw new IllegalArgumentException("Invalid alg in JWS header. Expected ES256.");
|
||||
}
|
||||
if (!header.getCustomParam("zip").equals("DEF")) {
|
||||
throw new IllegalArgumentException("Invalid zip in JWS header. Expected DEF.");
|
||||
}
|
||||
}
|
||||
|
||||
private static String decompress(byte[] compressed) throws Exception {
|
||||
Inflater inflater = new Inflater(true);
|
||||
inflater.setInput(compressed);
|
||||
|
||||
byte[] buffer = new byte[1024];
|
||||
int length;
|
||||
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(compressed.length)) {
|
||||
while (!inflater.finished()) {
|
||||
length = inflater.inflate(buffer);
|
||||
outputStream.write(buffer, 0, length);
|
||||
}
|
||||
return outputStream.toString(StandardCharsets.UTF_8.name());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private String getVCIIssuer(List<ValidationMessage> errors, String issuer) {
|
||||
try {
|
||||
JsonObject vci = org.hl7.fhir.utilities.json.parser.JsonParser.parseObjectFromUrl("https://raw.githubusercontent.com/the-commons-project/vci-directory/main/vci-issuers.json");
|
||||
for (JsonObject j : vci.getJsonObjects("participating_issuers")) {
|
||||
if (issuer.equals(j.asString("iss"))) {
|
||||
return j.asString("name");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logError(errors, "2023-09-08", 1, 1, "vci", IssueType.NOTFOUND, "Unable to retrieve/read VCI Trusted Issuer list: "+e.getMessage(), IssueSeverity.WARNING);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static String[] splitToken(String token) {
|
||||
String[] parts = token.split("\\.");
|
||||
if (parts.length == 2 && token.endsWith(".")) {
|
||||
|
@ -287,21 +432,21 @@ public class SHCParser extends ParserBase {
|
|||
}
|
||||
return parts;
|
||||
}
|
||||
|
||||
|
||||
public static final byte[] inflate(byte[] data) throws IOException, DataFormatException {
|
||||
final Inflater inflater = new Inflater(true);
|
||||
inflater.setInput(data);
|
||||
|
||||
try (final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length))
|
||||
{
|
||||
byte[] buffer = new byte[BUFFER_SIZE];
|
||||
while (!inflater.finished())
|
||||
{
|
||||
final int count = inflater.inflate(buffer);
|
||||
outputStream.write(buffer, 0, count);
|
||||
}
|
||||
byte[] buffer = new byte[BUFFER_SIZE];
|
||||
while (!inflater.finished())
|
||||
{
|
||||
final int count = inflater.inflate(buffer);
|
||||
outputStream.write(buffer, 0, count);
|
||||
}
|
||||
|
||||
return outputStream.toByteArray();
|
||||
return outputStream.toByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -359,7 +359,7 @@ public class SHLParser extends ParserBase {
|
|||
long epochSecs = Long.valueOf(v);
|
||||
LocalDateTime date = LocalDateTime.ofEpochSecond(epochSecs, 0, ZoneOffset.UTC);
|
||||
LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC);
|
||||
Duration duration = Duration.between(now, date);
|
||||
Duration duration = Duration.between(date, now);
|
||||
|
||||
if (date.isBefore(now)) {
|
||||
logError(errors, "2023-08-31", p.getValue().getStart().getLine(), p.getValue().getStart().getCol(), "shl."+p.getName(),
|
||||
|
|
|
@ -14,6 +14,7 @@ import org.apache.commons.lang3.NotImplementedException;
|
|||
import org.hl7.fhir.exceptions.DefinitionException;
|
||||
import org.hl7.fhir.exceptions.FHIRException;
|
||||
import org.hl7.fhir.exceptions.FHIRFormatError;
|
||||
import org.hl7.fhir.r5.conformance.profile.ProfileUtilities;
|
||||
import org.hl7.fhir.r5.context.ContextUtilities;
|
||||
import org.hl7.fhir.r5.model.Address;
|
||||
import org.hl7.fhir.r5.model.Annotation;
|
||||
|
@ -1054,7 +1055,9 @@ public class ProfileDrivenRenderer extends ResourceRenderer {
|
|||
if (pe == null) {
|
||||
if (ed == null) {
|
||||
if (url != null && url.startsWith("http://hl7.org/fhir") && !url.startsWith("http://hl7.org/fhir/us")) {
|
||||
throw new DefinitionException("unknown extension "+url);
|
||||
if (!ProfileUtilities.isSuppressIgnorableExceptions()) {
|
||||
throw new DefinitionException("unknown extension "+url);
|
||||
}
|
||||
}
|
||||
// System.out.println("unknown extension "+url);
|
||||
pe = new PropertyWrapperDirect(this.context, new Property(p.getName()+"["+url+"]", p.getTypeCode(), p.getDefinition(), p.getMinCardinality(), p.getMaxCardinality(), ex), null);
|
||||
|
|
|
@ -27,7 +27,6 @@ public class I18nConstants {
|
|||
public static final String BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED = "BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED";
|
||||
public static final String BUNDLE_BUNDLE_ENTRY_NOPROFILE_EXPL = "Bundle_BUNDLE_Entry_NoProfile_EXPL";
|
||||
public static final String BUNDLE_BUNDLE_ENTRY_NOPROFILE_TYPE = "Bundle_BUNDLE_Entry_NoProfile_TYPE";
|
||||
public static final String BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES = "BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES";
|
||||
public static final String BUNDLE_BUNDLE_ENTRY_NOTFOUND = "Bundle_BUNDLE_Entry_NotFound";
|
||||
public static final String BUNDLE_BUNDLE_ENTRY_ORPHAN_DOCUMENT = "Bundle_BUNDLE_Entry_Orphan_DOCUMENT";
|
||||
public static final String BUNDLE_BUNDLE_ENTRY_ORPHAN_MESSAGE = "Bundle_BUNDLE_Entry_Orphan_MESSAGE";
|
||||
|
@ -989,6 +988,9 @@ public class I18nConstants {
|
|||
public static final String CONCEPTMAP_VS_INVALID_CONCEPT_CODE = "CONCEPTMAP_VS_INVALID_CONCEPT_CODE";
|
||||
public static final String CONCEPTMAP_VS_INVALID_CONCEPT_CODE_VER = "CONCEPTMAP_VS_INVALID_CONCEPT_CODE_VER";
|
||||
public static final String VALUESET_INC_TOO_MANY_CODES = "VALUESET_INC_TOO_MANY_CODES";
|
||||
public static final String BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH = "BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH";
|
||||
public static final String BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_MULTIPLE_MATCHES = "BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_MULTIPLE_MATCHES";
|
||||
public static final String BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH_REASON = "BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH_REASON";
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -36,6 +36,20 @@ public class JsonObject extends JsonElement {
|
|||
return this;
|
||||
}
|
||||
|
||||
public JsonObject addIfNotNull(String name, JsonElement value) throws JsonException {
|
||||
if (value != null) {
|
||||
check(name != null, "Name is null");
|
||||
if (get(name) != null) {
|
||||
check(false, "Name '"+name+"' already exists (value = "+get(name).toString()+")");
|
||||
}
|
||||
JsonProperty p = new JsonProperty(name, value);
|
||||
properties.add(p);
|
||||
propMap.put(name, p);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
// this is used by the parser which can allow duplicates = true (for the validator). You should not otherwise use it
|
||||
public JsonObject addForParser(String name, JsonElement value, boolean noComma, boolean nameUnquoted, boolean valueUnquoted) throws JsonException {
|
||||
check(name != null, "Name is null");
|
||||
|
@ -54,6 +68,15 @@ public class JsonObject extends JsonElement {
|
|||
return add(name, value == null ? new JsonNull() : new JsonString(value));
|
||||
}
|
||||
|
||||
public JsonObject addIfNotNull(String name, String value) throws JsonException {
|
||||
check(name != null, "Name is null");
|
||||
if (value == null) {
|
||||
return this;
|
||||
} else {
|
||||
return add(name, value == null ? new JsonNull() : new JsonString(value));
|
||||
}
|
||||
}
|
||||
|
||||
public JsonObject add(String name, boolean value) throws JsonException {
|
||||
check(name != null, "Name is null");
|
||||
return add(name, new JsonBoolean(value));
|
||||
|
|
|
@ -653,9 +653,6 @@ SD_MUST_HAVE_DERIVATION = StructureDefinition {0} must have a derivation, since
|
|||
VALIDATION_VAL_PROFILE_OTHER_VERSION = Profile is for a different version of FHIR ({0}) so has been ignored
|
||||
VALIDATION_VAL_PROFILE_THIS_VERSION_OK = Profile for this version of FHIR - all OK
|
||||
VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = Profile is for this version of FHIR, but is an invalid type {0}
|
||||
#The following error cannot occur for a single item. _one case left intentionally blank.
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_one =
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_other = {0} profiles found for {1} resource. More than one is not supported at this time. (Type {2}: {3})
|
||||
RENDER_BUNDLE_HEADER_ROOT = Bundle {0} of type {1}
|
||||
RENDER_BUNDLE_HEADER_ENTRY = Entry {0}
|
||||
RENDER_BUNDLE_HEADER_ENTRY_URL = Entry {0} - fullUrl = {1}
|
||||
|
@ -1049,3 +1046,8 @@ CONCEPTMAP_VS_TOO_MANY_CODES = The concept map has too many codes to validate ({
|
|||
CONCEPTMAP_VS_INVALID_CONCEPT_CODE = The code ''{1}'' in the system {0} is not valid in the value set ''{2}''
|
||||
CONCEPTMAP_VS_INVALID_CONCEPT_CODE_VER = The code ''{2}'' in the system {0} version {1} is not valid in the value set ''{3}''
|
||||
VALUESET_INC_TOO_MANY_CODES = The value set include has too many codes to validate ({0})
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH = The {1} resource did not match any of the allowed profiles (Type {2}: {3})
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_MULTIPLE_MATCHES = The {1} resource matched more than one of the allowed profiles ({3})
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH_REASON = The {1} resource did not math the profile {2} because: {3}
|
||||
|
||||
|
||||
|
|
|
@ -701,7 +701,6 @@ SD_MUST_HAVE_DERIVATION=StructureDefinition {0} muss eine Ableitung haben, da si
|
|||
VALIDATION_VAL_PROFILE_OTHER_VERSION=Profil ist f\u00fcr eine andere Version von FHIR ({0}) und wurde daher ignoriert
|
||||
VALIDATION_VAL_PROFILE_THIS_VERSION_OK=Profil f\u00fcr diese Version von FHIR - alles OK
|
||||
VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER=Profil ist f\u00fcr diese Version von FHIR, aber ist ein ung\u00fcltiger Typ {0}
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_other={0} Profile f\u00fcr {1} Ressource gefunden. Mehr als eines wird zur Zeit nicht unterst\u00fctzt. (Typ {2}: {3})
|
||||
RENDER_BUNDLE_HEADER_ROOT=Bundle {0} vom Typ {1}
|
||||
RENDER_BUNDLE_HEADER_ENTRY=Entry {0}
|
||||
RENDER_BUNDLE_HEADER_ENTRY_URL=Entry {0} - fullUrl = {1}
|
||||
|
|
|
@ -653,10 +653,6 @@ SD_MUST_HAVE_DERIVATION = El recurso StructureDefinition {0} debe tener una deri
|
|||
VALIDATION_VAL_PROFILE_OTHER_VERSION = El perfil es para una versión diferente de FHIR ({0}) así que fue ignorado
|
||||
VALIDATION_VAL_PROFILE_THIS_VERSION_OK = El perfil es para esta versión de FHIR- Todo OK
|
||||
VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = El perfil es para esta versión de FHIR, pero es de tipo inválido {0}
|
||||
#The following error cannot occur for a single item. _one case left intentionally blank.
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_one =
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_many = {0} perfiles encontrados para el recurso {1}. No hay soporte para más de uno por el monmento. (Type {2}: {3})
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_other = {0} perfiles encontrados para el recurso {1}. No hay soporte para más de uno por el monmento. (Type {2}: {3})
|
||||
RENDER_BUNDLE_HEADER_ROOT = Bundle {0} De tipo {1}
|
||||
RENDER_BUNDLE_HEADER_ENTRY = Entry {0}
|
||||
RENDER_BUNDLE_HEADER_ENTRY_URL = Entry {0} - FullURL = {1}
|
||||
|
|
|
@ -643,9 +643,6 @@ SD_MUST_HAVE_DERIVATION = StructureDefinition {0} moet een derivation bevatten,
|
|||
VALIDATION_VAL_PROFILE_OTHER_VERSION = Profiel is voor een andere versie van FHIR ({0}) dus wordt genegeerd
|
||||
VALIDATION_VAL_PROFILE_THIS_VERSION_OK = Profiel voor deze versie van FHIR - alles in orde
|
||||
VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = Profiel is voor deze versie van FHIR, maar heeft een onjuist type {0}
|
||||
#The following error cannot occur for a single item. _one case left intentionally blank.
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_one =
|
||||
BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_other = {0} profielen gevonden voor {1} resource. Meer dan een wordt momenteel niet ondersteund. (Type {2}: {3})
|
||||
RENDER_BUNDLE_HEADER_ROOT = Bundle {0} van type {1}
|
||||
RENDER_BUNDLE_HEADER_ENTRY = Entry {0}
|
||||
RENDER_BUNDLE_HEADER_ENTRY_URL = Entry {0} - Full URL = {1}
|
||||
|
|
|
@ -80,27 +80,29 @@ import org.hl7.fhir.validation.instance.utils.NodeStack;
|
|||
|
||||
public class BaseValidator implements IValidationContextResourceLoader {
|
||||
|
||||
public class BooleanValue {
|
||||
|
||||
private boolean value;
|
||||
public class BooleanHolder {
|
||||
private boolean value = true;
|
||||
|
||||
public BooleanValue(boolean value) {
|
||||
public BooleanHolder() {
|
||||
super();
|
||||
this.value = true;
|
||||
}
|
||||
public BooleanHolder(boolean value) {
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public boolean isValue() {
|
||||
public void fail() {
|
||||
value = false;
|
||||
}
|
||||
public boolean ok() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(boolean value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public void see(boolean ok) {
|
||||
value = value && ok;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class TrackedLocationRelatedMessage {
|
||||
private Object location;
|
||||
|
@ -642,7 +644,7 @@ public class BaseValidator implements IValidationContextResourceLoader {
|
|||
* Set this parameter to <code>false</code> if the validation does not pass
|
||||
* @return Returns <code>thePass</code> (in other words, returns <code>true</code> if the rule did not fail validation)
|
||||
*/
|
||||
protected void txIssue(List<ValidationMessage> errors, String ruleDate, String txLink, int line, int col, String path, OperationOutcomeIssueComponent issue) {
|
||||
protected ValidationMessage txIssue(List<ValidationMessage> errors, String ruleDate, String txLink, int line, int col, String path, OperationOutcomeIssueComponent issue) {
|
||||
IssueType code = IssueType.fromCode(issue.getCode().toCode());
|
||||
IssueSeverity severity = IssueSeverity.fromCode(issue.getSeverity().toCode());
|
||||
ValidationMessage vmsg = new ValidationMessage(Source.TerminologyEngine, code, line, col, path, issue.getDetails().getText(), severity).setTxLink(txLink);
|
||||
|
@ -651,6 +653,7 @@ public class BaseValidator implements IValidationContextResourceLoader {
|
|||
// }
|
||||
// }
|
||||
// return thePass;
|
||||
return vmsg;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1002,7 +1005,7 @@ public class BaseValidator implements IValidationContextResourceLoader {
|
|||
}
|
||||
|
||||
|
||||
protected IndexedElement getFromBundle(Element bundle, String ref, String fullUrl, List<ValidationMessage> errors, String path, String type, boolean isTransaction) {
|
||||
protected IndexedElement getFromBundle(Element bundle, String ref, String fullUrl, List<ValidationMessage> errors, String path, String type, boolean isTransaction, BooleanHolder bh) {
|
||||
String targetUrl = null;
|
||||
String version = "";
|
||||
String resourceType = null;
|
||||
|
@ -1086,7 +1089,7 @@ public class BaseValidator implements IValidationContextResourceLoader {
|
|||
}
|
||||
|
||||
if (match != null && resourceType != null)
|
||||
rule(errors, NO_RULE_DATE, IssueType.REQUIRED, -1, -1, path, match.getType().equals(resourceType), I18nConstants.REFERENCE_REF_RESOURCETYPE, ref, match.getType());
|
||||
bh.see(rule(errors, NO_RULE_DATE, IssueType.REQUIRED, -1, -1, path, match.getType().equals(resourceType), I18nConstants.REFERENCE_REF_RESOURCETYPE, ref, match.getType()));
|
||||
if (match == null) {
|
||||
warning(errors, NO_RULE_DATE, IssueType.REQUIRED, -1, -1, path, !ref.startsWith("urn"), I18nConstants.BUNDLE_BUNDLE_NOT_LOCAL, ref);
|
||||
if (!Utilities.isAbsoluteUrl(ref)) {
|
||||
|
@ -1324,7 +1327,8 @@ public class BaseValidator implements IValidationContextResourceLoader {
|
|||
}
|
||||
|
||||
|
||||
protected void checkDefinitionStatus(List<ValidationMessage> errors, Element element, String path, StructureDefinition ex, CanonicalResource source, String type) {
|
||||
protected boolean checkDefinitionStatus(List<ValidationMessage> errors, Element element, String path, StructureDefinition ex, CanonicalResource source, String type) {
|
||||
boolean ok = true;
|
||||
String vurl = ex.getVersionedUrl();
|
||||
|
||||
StandardsStatus standardsStatus = ToolingExtensions.getStandardsStatus(ex);
|
||||
|
@ -1358,6 +1362,7 @@ public class BaseValidator implements IValidationContextResourceLoader {
|
|||
}
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
}
|
|
@ -217,6 +217,7 @@ public class ValidationEngine implements IValidatorResourceFetcher, IValidationP
|
|||
@Getter @Setter private HtmlInMarkdownCheck htmlInMarkdownCheck;
|
||||
@Getter @Setter private boolean allowDoubleQuotesInFHIRPath;
|
||||
@Getter @Setter private boolean checkIPSCodes;
|
||||
@Getter @Setter private BestPracticeWarningLevel bestPracticeLevel;
|
||||
@Getter @Setter private Locale locale;
|
||||
@Getter @Setter private List<ImplementationGuide> igs = new ArrayList<>();
|
||||
@Getter @Setter private List<String> extensionDomains = new ArrayList<>();
|
||||
|
@ -856,6 +857,7 @@ public class ValidationEngine implements IValidatorResourceFetcher, IValidationP
|
|||
validator.setQuestionnaireMode(questionnaireMode);
|
||||
validator.setLevel(level);
|
||||
validator.setHtmlInMarkdownCheck(htmlInMarkdownCheck);
|
||||
validator.setBestPracticeWarningLevel(bestPracticeLevel);
|
||||
validator.setAllowDoubleQuotesInFHIRPath(allowDoubleQuotesInFHIRPath);
|
||||
validator.setNoUnicodeBiDiControlChars(noUnicodeBiDiControlChars);
|
||||
validator.setDoImplicitFHIRPathStringConversion(doImplicitFHIRPathStringConversion);
|
||||
|
|
|
@ -9,6 +9,7 @@ import java.util.Objects;
|
|||
|
||||
import org.hl7.fhir.r5.terminologies.JurisdictionUtilities;
|
||||
import org.hl7.fhir.r5.utils.validation.BundleValidationRule;
|
||||
import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel;
|
||||
import org.hl7.fhir.utilities.VersionUtilities;
|
||||
import org.hl7.fhir.utilities.settings.FhirSettings;
|
||||
import org.hl7.fhir.validation.cli.services.ValidatorWatchMode;
|
||||
|
@ -153,6 +154,9 @@ public class CliContext {
|
|||
@JsonProperty("watchSettleTime")
|
||||
private int watchSettleTime = 100;
|
||||
|
||||
@JsonProperty("bestPracticeLevel")
|
||||
private BestPracticeWarningLevel bestPracticeLevel = BestPracticeWarningLevel.Warning;
|
||||
|
||||
|
||||
@JsonProperty("map")
|
||||
public String getMap() {
|
||||
|
@ -777,6 +781,7 @@ public class CliContext {
|
|||
Objects.equals(jurisdiction, that.jurisdiction) &&
|
||||
Objects.equals(locations, that.locations) &&
|
||||
Objects.equals(watchMode, that.watchMode) &&
|
||||
Objects.equals(bestPracticeLevel, that.bestPracticeLevel) &&
|
||||
Objects.equals(watchScanDelay, that.watchScanDelay) &&
|
||||
Objects.equals(watchSettleTime, that.watchSettleTime) ;
|
||||
}
|
||||
|
@ -785,7 +790,7 @@ public class CliContext {
|
|||
public int hashCode() {
|
||||
return Objects.hash(doNative, extensions, hintAboutNonMustSupport, recursive, doDebug, assumeValidRestReferences, canDoNative, noInternalCaching,
|
||||
noExtensibleBindingMessages, noInvariants, displayWarnings, wantInvariantsInMessages, map, output, outputSuffix, htmlOutput, txServer, sv, txLog, txCache, mapLog, lang, srcLang, tgtLang, fhirpath, snomedCT,
|
||||
targetVer, igs, questionnaireMode, level, profiles, sources, inputs, mode, locale, locations, crumbTrails, forPublication, showTimes, allowExampleUrls, outputStyle, jurisdiction, noUnicodeBiDiControlChars, watchMode, watchScanDelay, watchSettleTime,
|
||||
targetVer, igs, questionnaireMode, level, profiles, sources, inputs, mode, locale, locations, crumbTrails, forPublication, showTimes, allowExampleUrls, outputStyle, jurisdiction, noUnicodeBiDiControlChars, watchMode, watchScanDelay, watchSettleTime, bestPracticeLevel,
|
||||
htmlInMarkdownCheck, allowDoubleQuotesInFHIRPath, checkIPSCodes);
|
||||
}
|
||||
|
||||
|
@ -841,6 +846,7 @@ public class CliContext {
|
|||
", allowDoubleQuotesInFHIRPath=" + allowDoubleQuotesInFHIRPath +
|
||||
", checkIPSCodes=" + checkIPSCodes +
|
||||
", watchMode=" + watchMode +
|
||||
", bestPracticeLevel=" + bestPracticeLevel +
|
||||
", watchSettleTime=" + watchSettleTime +
|
||||
", watchScanDelay=" + watchScanDelay +
|
||||
'}';
|
||||
|
@ -888,5 +894,16 @@ public class CliContext {
|
|||
this.watchSettleTime = watchSettleTime;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@JsonProperty("bestPracticeLevel")
|
||||
public BestPracticeWarningLevel getBestPracticeLevel() {
|
||||
return bestPracticeLevel;
|
||||
}
|
||||
|
||||
@JsonProperty("bestPracticeLevel")
|
||||
public CliContext setBestPracticeLevel(BestPracticeWarningLevel bestPracticeLevel) {
|
||||
this.bestPracticeLevel = bestPracticeLevel;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
|
@ -471,6 +471,7 @@ public class ValidationService {
|
|||
validationEngine.setNoUnicodeBiDiControlChars(cliContext.isNoUnicodeBiDiControlChars());
|
||||
validationEngine.setNoInvariantChecks(cliContext.isNoInvariants());
|
||||
validationEngine.setDisplayWarnings(cliContext.isDisplayWarnings());
|
||||
validationEngine.setBestPracticeLevel(cliContext.getBestPracticeLevel());
|
||||
validationEngine.setCheckIPSCodes(cliContext.isCheckIPSCodes());
|
||||
validationEngine.setWantInvariantInMessage(cliContext.isWantInvariantsInMessages());
|
||||
validationEngine.setSecurityChecks(cliContext.isSecurityChecks());
|
||||
|
|
|
@ -7,6 +7,7 @@ import java.util.Locale;
|
|||
import org.hl7.fhir.exceptions.FHIRException;
|
||||
import org.hl7.fhir.r5.terminologies.JurisdictionUtilities;
|
||||
import org.hl7.fhir.r5.utils.validation.BundleValidationRule;
|
||||
import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel;
|
||||
import org.hl7.fhir.utilities.Utilities;
|
||||
import org.hl7.fhir.utilities.VersionUtilities;
|
||||
import org.hl7.fhir.validation.cli.model.CliContext;
|
||||
|
@ -87,6 +88,8 @@ public class Params {
|
|||
public static final String TGT_LANG = "-tgt-lang";
|
||||
public static final String ALLOW_DOUBLE_QUOTES = "-allow-double-quotes-in-fhirpath";
|
||||
public static final String CHECK_IPS_CODES = "-check-ips-codes";
|
||||
public static final String BEST_PRACTICE = "-best-practice";
|
||||
|
||||
|
||||
|
||||
public static final String RUN_TESTS = "-run-tests";
|
||||
|
@ -244,6 +247,13 @@ public class Params {
|
|||
cliContext.setHtmlInMarkdownCheck(HtmlInMarkdownCheck.fromCode(q));
|
||||
}
|
||||
}
|
||||
} else if (args[i].equals(BEST_PRACTICE)) {
|
||||
if (i + 1 == args.length)
|
||||
throw new Error("Specified "+BEST_PRACTICE+" without indicating mode");
|
||||
else {
|
||||
String q = args[++i];
|
||||
cliContext.setBestPracticeLevel(readBestPractice(q));
|
||||
}
|
||||
} else if (args[i].equals(LOCALE)) {
|
||||
if (i + 1 == args.length) {
|
||||
throw new Error("Specified -locale without indicating locale");
|
||||
|
@ -439,6 +449,23 @@ public class Params {
|
|||
return cliContext;
|
||||
}
|
||||
|
||||
private static BestPracticeWarningLevel readBestPractice(String s) {
|
||||
if (s == null) {
|
||||
return BestPracticeWarningLevel.Warning;
|
||||
}
|
||||
switch (s.toLowerCase()) {
|
||||
case "warning" : return BestPracticeWarningLevel.Warning;
|
||||
case "error" : return BestPracticeWarningLevel.Error;
|
||||
case "hint" : return BestPracticeWarningLevel.Hint;
|
||||
case "ignore" : return BestPracticeWarningLevel.Ignore;
|
||||
case "w" : return BestPracticeWarningLevel.Warning;
|
||||
case "e" : return BestPracticeWarningLevel.Error;
|
||||
case "h" : return BestPracticeWarningLevel.Hint;
|
||||
case "i" : return BestPracticeWarningLevel.Ignore;
|
||||
}
|
||||
throw new Error("The best-practice level ''"+s+"'' is not valid");
|
||||
}
|
||||
|
||||
private static int readInteger(String name, String value) {
|
||||
if (!Utilities.isInteger(value)) {
|
||||
throw new Error("Unable to read "+value+" provided for '"+name+"' - must be an integer");
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -85,7 +85,7 @@ public class BundleValidator extends BaseValidator {
|
|||
}
|
||||
}
|
||||
if (type.equals(SEARCHSET)) {
|
||||
checkSearchSet(errors, bundle, entries, stack);
|
||||
ok = checkSearchSet(errors, bundle, entries, stack) && ok;
|
||||
}
|
||||
// We do not yet have rules requiring that the id and fullUrl match when dealing with messaging Bundles
|
||||
// validateResourceIds(errors, UNKNOWN_DATE_TIME, entries, stack);
|
||||
|
@ -288,7 +288,9 @@ public class BundleValidator extends BaseValidator {
|
|||
return ok;
|
||||
}
|
||||
|
||||
private void checkSearchSet(List<ValidationMessage> errors, Element bundle, List<Element> entries, NodeStack stack) {
|
||||
private boolean checkSearchSet(List<ValidationMessage> errors, Element bundle, List<Element> entries, NodeStack stack) {
|
||||
boolean ok = true;
|
||||
|
||||
// warning: should have self link
|
||||
List<Element> links = new ArrayList<Element>();
|
||||
bundle.getNamedChildren(LINK, links);
|
||||
|
@ -315,13 +317,13 @@ public class BundleValidator extends BaseValidator {
|
|||
if (rule(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), estack.getLiteralPath(), res != null, I18nConstants.BUNDLE_SEARCH_ENTRY_NO_RESOURCE)) {
|
||||
NodeStack rstack = estack.push(res, -1, null, null);
|
||||
String rt = res.fhirType();
|
||||
Boolean ok = checkSearchType(types, rt);
|
||||
if (ok == null) {
|
||||
Boolean bok = checkSearchType(types, rt);
|
||||
if (bok == null) {
|
||||
typeProblem = true;
|
||||
hint(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), selfLink == null, I18nConstants.BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE);
|
||||
String id = res.getNamedChildValue("id");
|
||||
warning(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), id != null || "OperationOutcome".equals(rt), I18nConstants.BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID);
|
||||
} else if (ok) {
|
||||
} else if (bok) {
|
||||
if (!"OperationOutcome".equals(rt)) {
|
||||
String id = res.getNamedChildValue("id");
|
||||
warning(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), id != null, I18nConstants.BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID);
|
||||
|
@ -335,8 +337,10 @@ public class BundleValidator extends BaseValidator {
|
|||
typeProblem = true;
|
||||
warning(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), estack.getLiteralPath(), false, I18nConstants.BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE, rt, types);
|
||||
}
|
||||
} else {
|
||||
ok = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (typeProblem) {
|
||||
warning(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), stack.getLiteralPath(), !typeProblem, I18nConstants.BUNDLE_SEARCH_NO_MODE);
|
||||
} else {
|
||||
|
@ -360,17 +364,20 @@ public class BundleValidator extends BaseValidator {
|
|||
String id = res.getNamedChildValue("id");
|
||||
if (sm != null) {
|
||||
if ("match".equals(sm)) {
|
||||
rule(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), id != null, I18nConstants.BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID);
|
||||
rule(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), types.size() == 0 || checkSearchType(types, rt), I18nConstants.BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE, rt, types);
|
||||
ok = rule(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), id != null, I18nConstants.BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID) && ok;
|
||||
ok = rule(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), types.size() == 0 || checkSearchType(types, rt), I18nConstants.BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE, rt, types) && ok;
|
||||
} else if ("include".equals(sm)) {
|
||||
rule(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), id != null, I18nConstants.BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID);
|
||||
ok = rule(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), id != null, I18nConstants.BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID) && ok;
|
||||
} else { // outcome
|
||||
rule(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), "OperationOutcome".equals(rt), I18nConstants.BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME, rt);
|
||||
ok = rule(errors, NO_RULE_DATE, IssueType.INVALID, bundle.line(), bundle.col(), rstack.getLiteralPath(), "OperationOutcome".equals(rt), I18nConstants.BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME, rt) && ok;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ok = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
private Boolean checkSearchType(List<String> types, String rt) {
|
||||
|
@ -748,27 +755,32 @@ public class BundleValidator extends BaseValidator {
|
|||
}
|
||||
}
|
||||
|
||||
private void followResourceLinks(Element entry, Map<String, Element> visitedResources, Map<Element, Element> candidateEntries, List<Element> candidateResources, List<ValidationMessage> errors, NodeStack stack) {
|
||||
followResourceLinks(entry, visitedResources, candidateEntries, candidateResources, errors, stack, 0);
|
||||
}
|
||||
|
||||
private void followResourceLinks(Element entry, Map<String, Element> visitedResources, Map<Element, Element> candidateEntries, List<Element> candidateResources, List<ValidationMessage> errors, NodeStack stack, int depth) {
|
||||
Element resource = entry.getNamedChild(RESOURCE);
|
||||
if (visitedResources.containsValue(resource))
|
||||
return;
|
||||
|
||||
visitedResources.put(entry.getNamedChildValue(FULL_URL), resource);
|
||||
|
||||
String type = null;
|
||||
Set<String> references = findReferences(resource);
|
||||
for (String reference : references) {
|
||||
// We don't want errors when just retrieving the element as they will be caught (with better path info) in subsequent processing
|
||||
IndexedElement r = getFromBundle(stack.getElement(), reference, entry.getChildValue(FULL_URL), new ArrayList<ValidationMessage>(), stack.addToLiteralPath("entry[" + candidateResources.indexOf(resource) + "]"), type, "transaction".equals(stack.getElement().getChildValue(TYPE)));
|
||||
if (r != null && !visitedResources.containsValue(r.getMatch())) {
|
||||
followResourceLinks(candidateEntries.get(r.getMatch()), visitedResources, candidateEntries, candidateResources, errors, stack, depth + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
// not used?
|
||||
// private boolean followResourceLinks(Element entry, Map<String, Element> visitedResources, Map<Element, Element> candidateEntries, List<Element> candidateResources, List<ValidationMessage> errors, NodeStack stack) {
|
||||
// return followResourceLinks(entry, visitedResources, candidateEntries, candidateResources, errors, stack, 0);
|
||||
// }
|
||||
//
|
||||
// private boolean followResourceLinks(Element entry, Map<String, Element> visitedResources, Map<Element, Element> candidateEntries, List<Element> candidateResources, List<ValidationMessage> errors, NodeStack stack, int depth) {
|
||||
// boolean ok = true;
|
||||
// Element resource = entry.getNamedChild(RESOURCE);
|
||||
// if (visitedResources.containsValue(resource))
|
||||
// return ok;
|
||||
//
|
||||
// visitedResources.put(entry.getNamedChildValue(FULL_URL), resource);
|
||||
//
|
||||
// String type = null;
|
||||
// Set<String> references = findReferences(resource);
|
||||
// for (String reference : references) {
|
||||
// // We don't want errors when just retrieving the element as they will be caught (with better path info) in subsequent processing
|
||||
// BooleanHolder bh = new BooleanHolder();
|
||||
// IndexedElement r = getFromBundle(stack.getElement(), reference, entry.getChildValue(FULL_URL), new ArrayList<ValidationMessage>(), stack.addToLiteralPath("entry[" + candidateResources.indexOf(resource) + "]"), type, "transaction".equals(stack.getElement().getChildValue(TYPE)), bh);
|
||||
// ok = ok && bh.ok();
|
||||
// if (r != null && !visitedResources.containsValue(r.getMatch())) {
|
||||
// followResourceLinks(candidateEntries.get(r.getMatch()), visitedResources, candidateEntries, candidateResources, errors, stack, depth + 1);
|
||||
// }
|
||||
// }
|
||||
// return ok;
|
||||
// }
|
||||
|
||||
|
||||
private Set<String> findReferences(Element start) {
|
||||
|
|
|
@ -284,10 +284,12 @@ public class ConceptMapValidator extends BaseValidator {
|
|||
}
|
||||
if (ctxt.hasSourceVS() && ctxt.source != null) {
|
||||
ValidationResult vr = context.validateCode(options.withCheckValueSetOnly().withNoServer(), ctxt.source.url, ctxt.source.version, c, null, ctxt.sourceScope.vs);
|
||||
warningOrError(ctxt.source.cs.getContent() == CodeSystemContentMode.COMPLETE, errors, "2023-09-06", IssueType.REQUIRED, code.line(), code.col(), cstack.getLiteralPath(), vr.isOk(), I18nConstants.CONCEPTMAP_GROUP_SOURCE_CODE_INVALID_VS, c, ctxt.sourceScope.vs.getVersionedUrl());
|
||||
if (!warningOrError(ctxt.source.cs.getContent() == CodeSystemContentMode.COMPLETE, errors, "2023-09-06", IssueType.REQUIRED, code.line(), code.col(), cstack.getLiteralPath(), vr.isOk(), I18nConstants.CONCEPTMAP_GROUP_SOURCE_CODE_INVALID_VS, c, ctxt.sourceScope.vs.getVersionedUrl())) {
|
||||
ok = (ctxt.source.cs.getContent() != CodeSystemContentMode.COMPLETE) & ok;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ok = false;
|
||||
ok = (ctxt.source.cs.getContent() != CodeSystemContentMode.COMPLETE) & ok;
|
||||
}
|
||||
} else {
|
||||
addToBatch(code, cstack, ctxt.source, ctxt.sourceScope);
|
||||
|
@ -319,10 +321,12 @@ public class ConceptMapValidator extends BaseValidator {
|
|||
}
|
||||
if (ctxt.hasTargetVS() && ctxt.target != null) {
|
||||
ValidationResult vr = context.validateCode(options.withCheckValueSetOnly().withNoServer(), ctxt.target.url, ctxt.target.version, c, null, ctxt.targetScope.vs);
|
||||
warningOrError(ctxt.target.cs.getContent() == CodeSystemContentMode.COMPLETE, errors, "2023-09-06", IssueType.REQUIRED, code.line(), code.col(), cstack.getLiteralPath(), vr.isOk(), I18nConstants.CONCEPTMAP_GROUP_SOURCE_CODE_INVALID_VS, c, ctxt.targetScope.vs.getVersionedUrl());
|
||||
if (!warningOrError(ctxt.target.cs.getContent() == CodeSystemContentMode.COMPLETE, errors, "2023-09-06", IssueType.REQUIRED, code.line(), code.col(), cstack.getLiteralPath(), vr.isOk(), I18nConstants.CONCEPTMAP_GROUP_SOURCE_CODE_INVALID_VS, c, ctxt.targetScope.vs.getVersionedUrl())) {
|
||||
ok = (ctxt.target.cs.getContent() != CodeSystemContentMode.COMPLETE) && ok;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ok = false;
|
||||
ok = (ctxt.source.cs.getContent() != CodeSystemContentMode.COMPLETE) & ok;
|
||||
}
|
||||
} else {
|
||||
addToBatch(code, cstack, ctxt.target, ctxt.targetScope);
|
||||
|
|
|
@ -482,7 +482,7 @@ public class QuestionnaireValidator extends BaseValidator {
|
|||
}
|
||||
|
||||
private boolean validateQuestionnaireResponseItem(ValidatorHostContext hostContext, QuestionnaireWithContext qsrc, QuestionnaireItemComponent qItem, List<ValidationMessage> errors, Element element, NodeStack stack, boolean inProgress, Element questionnaireResponseRoot, QStack qstack) {
|
||||
BooleanValue ok = new BooleanValue(true);
|
||||
BooleanHolder ok = new BooleanHolder();
|
||||
|
||||
String text = element.getNamedChildValue("text");
|
||||
ok.see(rule(errors, NO_RULE_DATE, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), Utilities.noString(text) || text.equals(qItem.getText()), I18nConstants.QUESTIONNAIRE_QR_ITEM_TEXT, qItem.getLinkId()));
|
||||
|
@ -584,7 +584,7 @@ public class QuestionnaireValidator extends BaseValidator {
|
|||
}
|
||||
if (qItem.getType() != QuestionnaireItemType.GROUP) {
|
||||
// if it's a group, we already have an error before getting here, so no need to hammer away on that
|
||||
validateQuestionannaireResponseItems(hostContext, qsrc, qItem.getItem(), errors, answer, stack, inProgress, questionnaireResponseRoot, qstack);
|
||||
ok.see(validateQuestionannaireResponseItems(hostContext, qsrc, qItem.getItem(), errors, answer, stack, inProgress, questionnaireResponseRoot, qstack));
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
@ -601,7 +601,7 @@ public class QuestionnaireValidator extends BaseValidator {
|
|||
} else {
|
||||
ok.see(validateQuestionannaireResponseItems(hostContext, qsrc, qItem.getItem(), errors, element, stack, inProgress, questionnaireResponseRoot, qstack));
|
||||
}
|
||||
return ok.isValue();
|
||||
return ok.ok();
|
||||
}
|
||||
|
||||
private boolean isAnswerRequirementFulfilled(QuestionnaireItemComponent qItem, List<Element> answers) {
|
||||
|
@ -711,7 +711,7 @@ public class QuestionnaireValidator extends BaseValidator {
|
|||
|
||||
}
|
||||
|
||||
private String validateQuestionnaireResponseItemType(List<ValidationMessage> errors, Element element, NodeStack stack, BooleanValue ok, String... types) {
|
||||
private String validateQuestionnaireResponseItemType(List<ValidationMessage> errors, Element element, NodeStack stack, BooleanHolder ok, String... types) {
|
||||
List<Element> values = new ArrayList<Element>();
|
||||
element.getNamedChildrenWithWildcard("value[x]", values);
|
||||
for (int i = 0; i < types.length; i++) {
|
||||
|
|
|
@ -74,7 +74,7 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
String url = src.getNamedChildValue("url");
|
||||
|
||||
sd = loadAsSD(src);
|
||||
checkExtensionContext(errors, src, stack);
|
||||
ok = checkExtensionContext(errors, src, stack) && ok;
|
||||
|
||||
List<ElementDefinition> snapshot = sd.getSnapshot().getElement();
|
||||
sd.setSnapshot(null);
|
||||
|
@ -83,9 +83,9 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
if (warning(errors, NO_RULE_DATE, IssueType.NOTFOUND, stack.getLiteralPath(), base != null, I18nConstants.UNABLE_TO_FIND_BASE__FOR_, sd.getBaseDefinition(), "StructureDefinition, so can't check the differential")) {
|
||||
if (rule(errors, NO_RULE_DATE, IssueType.NOTFOUND, stack.getLiteralPath(), sd.hasDerivation(), I18nConstants.SD_MUST_HAVE_DERIVATION, sd.getUrl())) {
|
||||
boolean bok = base.getAbstract() || sd.hasKind() && sd.getKind() == base.getKind();
|
||||
rule(errors, "2022-11-02", IssueType.NOTFOUND, stack.getLiteralPath(), bok, I18nConstants.SD_CONSTRAINED_KIND_NO_MATCH, sd.getKind().toCode(), base.getKind().toCode(), base.getType(), base.getUrl());
|
||||
ok = rule(errors, "2022-11-02", IssueType.NOTFOUND, stack.getLiteralPath(), bok, I18nConstants.SD_CONSTRAINED_KIND_NO_MATCH, sd.getKind().toCode(), base.getKind().toCode(), base.getType(), base.getUrl()) && ok;
|
||||
if (sd.getDerivation() == TypeDerivationRule.CONSTRAINT) {
|
||||
rule(errors, "2022-11-02", IssueType.NOTFOUND, stack.getLiteralPath(), sd.hasType() && sd.getType().equals(base.getType()), I18nConstants.SD_CONSTRAINED_TYPE_NO_MATCH, sd.getType(), base.getType());
|
||||
ok = rule(errors, "2022-11-02", IssueType.NOTFOUND, stack.getLiteralPath(), sd.hasType() && sd.getType().equals(base.getType()), I18nConstants.SD_CONSTRAINED_TYPE_NO_MATCH, sd.getType(), base.getType()) && ok;
|
||||
List<ValidationMessage> msgs = new ArrayList<>();
|
||||
ProfileUtilities pu = new ProfileUtilities(context, msgs, null);
|
||||
pu.setForPublication(forPublication);
|
||||
|
@ -102,7 +102,7 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
msg.setLocation(stack.getLiteralPath());
|
||||
}
|
||||
errors.add(msg);
|
||||
ok = false;
|
||||
ok = (!msg.isError()) && ok;
|
||||
}
|
||||
}
|
||||
if (!snapshot.isEmpty() && wantCheckSnapshotUnchanged) {
|
||||
|
@ -111,7 +111,7 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
ok = rule(errors, NO_RULE_DATE, IssueType.NOTFOUND, stack.getLiteralPath(), was == is, I18nConstants.SNAPSHOT_EXISTING_PROBLEM, was, is) && ok;
|
||||
}
|
||||
} else {
|
||||
rule(errors, NO_RULE_DATE, IssueType.NOTFOUND, stack.getLiteralPath(), sd.hasType() && !sd.getType().equals(base.getType()), I18nConstants.SD_SPECIALIZED_TYPE_MATCHES, sd.getType(), base.getType());
|
||||
ok = rule(errors, NO_RULE_DATE, IssueType.NOTFOUND, stack.getLiteralPath(), sd.hasType() && !sd.getType().equals(base.getType()), I18nConstants.SD_SPECIALIZED_TYPE_MATCHES, sd.getType(), base.getType()) && ok;
|
||||
}
|
||||
} else {
|
||||
ok = false;
|
||||
|
@ -144,6 +144,8 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
ok = validateObligationProfile(errors, differential, stack.push(differential, -1, null, null), base) && ok;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ok = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -320,7 +322,8 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
return ok;
|
||||
}
|
||||
|
||||
private void checkExtensionContext(List<ValidationMessage> errors, Element src, NodeStack stack) {
|
||||
private boolean checkExtensionContext(List<ValidationMessage> errors, Element src, NodeStack stack) {
|
||||
boolean ok = true;
|
||||
String type = src.getNamedChildValue("type");
|
||||
List<Element> eclist = src.getChildren("context");
|
||||
List<Element> cilist = src.getChildren("contextInvariant");
|
||||
|
@ -341,7 +344,7 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
warning(errors, "2023-04-23", IssueType.BUSINESSRULE, n.getLiteralPath(), false, I18nConstants.SD_CONTEXT_SHOULD_NOT_BE_ELEMENT, cv);
|
||||
}
|
||||
} else {
|
||||
rule(errors, "2023-04-23", IssueType.INVALID, n.getLiteralPath(), false, I18nConstants.SD_NO_CONTEXT_WHEN_NOT_EXTENSION, type);
|
||||
ok = rule(errors, "2023-04-23", IssueType.INVALID, n.getLiteralPath(), false, I18nConstants.SD_NO_CONTEXT_WHEN_NOT_EXTENSION, type) && ok;
|
||||
}
|
||||
}
|
||||
i = 0;
|
||||
|
@ -350,9 +353,10 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
if ("Extension".equals(type)) {
|
||||
|
||||
} else {
|
||||
rule(errors, "2023-04-23", IssueType.INVALID, n.getLiteralPath(), false, I18nConstants.SD_NO_CONTEXT_INV_WHEN_NOT_EXTENSION, type);
|
||||
ok = rule(errors, "2023-04-23", IssueType.INVALID, n.getLiteralPath(), false, I18nConstants.SD_NO_CONTEXT_INV_WHEN_NOT_EXTENSION, type) && ok;
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
private boolean validateElementList(List<ValidationMessage> errors, Element elementList, NodeStack stack, boolean snapshot, boolean hasSnapshot, StructureDefinition sd, String typeName, boolean logical, boolean constraint, String rootPath, String profileUrl, StructureDefinition base) {
|
||||
|
@ -371,11 +375,11 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
boolean ok = true;
|
||||
boolean typeMustSupport = false;
|
||||
String path = element.getNamedChildValue("path");
|
||||
rule(errors, "2022-11-02", IssueType.NOTFOUND, stack.getLiteralPath(), typeName == null || path == null || path.equals(typeName) || path.startsWith(typeName+"."), I18nConstants.SD_PATH_TYPE_MISMATCH, typeName, path);
|
||||
ok = rule(errors, "2022-11-02", IssueType.NOTFOUND, stack.getLiteralPath(), typeName == null || path == null || path.equals(typeName) || path.startsWith(typeName+"."), I18nConstants.SD_PATH_TYPE_MISMATCH, typeName, path) && ok;
|
||||
if (!snapshot) {
|
||||
rule(errors, "2023-01-17", IssueType.INVALID, stack.getLiteralPath(), path.contains(".") || !element.hasChild("slicing"), I18nConstants.SD_NO_SLICING_ON_ROOT, path);
|
||||
ok = rule(errors, "2023-01-17", IssueType.INVALID, stack.getLiteralPath(), path.contains(".") || !element.hasChild("slicing"), I18nConstants.SD_NO_SLICING_ON_ROOT, path) && ok;
|
||||
}
|
||||
rule(errors, "2023-05-22", IssueType.NOTFOUND, stack.getLiteralPath(), snapshot || !constraint || !element.hasChild("meaningWhenMissing") || meaningWhenMissingAllowed(element), I18nConstants.SD_ELEMENT_NOT_IN_CONSTRAINT, "meaningWhenMissing", path);
|
||||
ok = rule(errors, "2023-05-22", IssueType.NOTFOUND, stack.getLiteralPath(), snapshot || !constraint || !element.hasChild("meaningWhenMissing") || meaningWhenMissingAllowed(element), I18nConstants.SD_ELEMENT_NOT_IN_CONSTRAINT, "meaningWhenMissing", path) && ok;
|
||||
|
||||
List<Element> types = element.getChildrenByName("type");
|
||||
Set<String> typeCodes = new HashSet<>();
|
||||
|
@ -398,7 +402,7 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
}
|
||||
if (Utilities.noString(tc) && type.hasChild("code")) {
|
||||
if (VersionUtilities.isR4Plus(context.getVersion())) {
|
||||
rule(errors, "2023-03-16", IssueType.INVALID, stack.getLiteralPath(), false, I18nConstants.SD_NO_TYPE_CODE_ON_CODE, path, sd.getId());
|
||||
ok = rule(errors, "2023-03-16", IssueType.INVALID, stack.getLiteralPath(), false, I18nConstants.SD_NO_TYPE_CODE_ON_CODE, path, sd.getId()) && ok;
|
||||
}
|
||||
}
|
||||
if (!Utilities.noString(tc)) {
|
||||
|
@ -489,6 +493,8 @@ public class StructureDefinitionValidator extends BaseValidator {
|
|||
warning(errors, NO_RULE_DATE, IssueType.EXCEPTION, stack.push(v, -1, null, null).getLiteralPath(), !repeating, I18nConstants.SD_VALUE_TYPE_REPEAT_WARNING_DOTNET, element.getIdBase(), "pattern");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ok = false;
|
||||
}
|
||||
// if we see fixed[x] or pattern[x] applied to a repeating element, we'll give the user a hint
|
||||
}
|
||||
|
|
|
@ -175,9 +175,9 @@ public class ValueSetValidator extends BaseValidator {
|
|||
}
|
||||
for (VSCodingValidationRequest cv : batch) {
|
||||
if (version == null) {
|
||||
ok = warningOrHint(errors, NO_RULE_DATE, IssueType.BUSINESSRULE, cv.getStack().getLiteralPath(), cv.getResult().isOk(), !retired, I18nConstants.VALUESET_INCLUDE_INVALID_CONCEPT_CODE, system, cv.getCoding().getCode()) && ok;
|
||||
warningOrHint(errors, NO_RULE_DATE, IssueType.BUSINESSRULE, cv.getStack().getLiteralPath(), cv.getResult().isOk(), !retired, I18nConstants.VALUESET_INCLUDE_INVALID_CONCEPT_CODE, system, cv.getCoding().getCode());
|
||||
} else {
|
||||
ok = warningOrHint(errors, NO_RULE_DATE, IssueType.BUSINESSRULE, cv.getStack().getLiteralPath(), cv.getResult().isOk(), !retired, I18nConstants.VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER, system, version, cv.getCoding().getCode()) && ok;
|
||||
warningOrHint(errors, NO_RULE_DATE, IssueType.BUSINESSRULE, cv.getStack().getLiteralPath(), cv.getResult().isOk(), !retired, I18nConstants.VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER, system, version, cv.getCoding().getCode());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
|
|
@ -148,14 +148,16 @@ public class ProfileValidator extends BaseValidator {
|
|||
return key.startsWith("txt-");
|
||||
}
|
||||
|
||||
private void checkExtensions(StructureDefinition profile, List<ValidationMessage> errors, String kind, ElementDefinition ec) {
|
||||
private boolean checkExtensions(StructureDefinition profile, List<ValidationMessage> errors, String kind, ElementDefinition ec) {
|
||||
if (!ec.getType().isEmpty() && "Extension".equals(ec.getType().get(0).getWorkingCode()) && ec.getType().get(0).hasProfile()) {
|
||||
String url = ec.getType().get(0).getProfile().get(0).getValue();
|
||||
StructureDefinition defn = context.fetchResource(StructureDefinition.class, url);
|
||||
if (defn == null) {
|
||||
defn = getXverExt(profile, errors, url);
|
||||
}
|
||||
rule(errors, NO_RULE_DATE, IssueType.BUSINESSRULE, profile.getId(), defn != null, "Unable to find Extension '"+url+"' referenced at "+profile.getUrl()+" "+kind+" "+ec.getPath()+" ("+ec.getSliceName()+")");
|
||||
return rule(errors, NO_RULE_DATE, IssueType.BUSINESSRULE, profile.getId(), defn != null, "Unable to find Extension '"+url+"' referenced at "+profile.getUrl()+" "+kind+" "+ec.getPath()+" ("+ec.getSliceName()+")");
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -192,7 +192,7 @@ public class ValidationEngineTests {
|
|||
int w = warnings(op);
|
||||
int h = hints(op);
|
||||
Assertions.assertEquals(1, e);
|
||||
Assertions.assertEquals(0, w);
|
||||
Assertions.assertEquals(2, w);
|
||||
Assertions.assertEquals(1, h);
|
||||
assertTrue(logger.verifyHasNoRequests(), "Unexpected request to TX server");
|
||||
if (!TestUtilities.silent)
|
||||
|
@ -270,7 +270,7 @@ public class ValidationEngineTests {
|
|||
int w = warnings(op);
|
||||
int h = hints(op);
|
||||
Assertions.assertEquals(0, e);
|
||||
Assertions.assertEquals(2, w);
|
||||
Assertions.assertEquals(4, w);
|
||||
Assertions.assertEquals(0, h);
|
||||
assertTrue(logger.verifyHasNoRequests(), "Unexpected request to TX server");
|
||||
if (!TestUtilities.silent)
|
||||
|
|
|
@ -213,6 +213,7 @@ public class ValidationTests implements IEvaluationContext, IValidatorResourceFe
|
|||
InstanceValidator val = vCurr.getValidator(fmt);
|
||||
val.setWantCheckSnapshotUnchanged(true);
|
||||
val.getContext().setClientRetryCount(4);
|
||||
val.setBestPracticeWarningLevel(BestPracticeWarningLevel.Ignore);
|
||||
val.setDebug(false);
|
||||
if (!VersionUtilities.isR5Plus(val.getContext().getVersion())) {
|
||||
val.getBaseOptions().setUseValueSetDisplays(true);
|
||||
|
|
|
@ -14,7 +14,6 @@ v: {
|
|||
"code" : "NL",
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"version" : "2018",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -37,7 +36,6 @@ v: {
|
|||
"code" : "NL",
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"version" : "2018",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -60,7 +58,6 @@ v: {
|
|||
"code" : "NL",
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"version" : "2018",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -82,7 +79,6 @@ v: {
|
|||
"code" : "NL",
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"version" : "2018",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -104,7 +100,6 @@ v: {
|
|||
"code" : "NL",
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"version" : "2018",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -127,7 +122,6 @@ v: {
|
|||
"code" : "NL",
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"version" : "2018",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -149,7 +143,6 @@ v: {
|
|||
"code" : "US",
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"version" : "2018",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -166,6 +159,28 @@ v: {
|
|||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "United States of America",
|
||||
"code" : "US",
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"version" : "2018",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"code" : "US",
|
||||
"display" : "United States of America"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "United States of America",
|
||||
"code" : "US",
|
||||
|
|
|
@ -58,7 +58,6 @@ v: {
|
|||
"code" : "19935-6",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -80,7 +79,6 @@ v: {
|
|||
"code" : "19935-6",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -102,7 +100,6 @@ v: {
|
|||
"code" : "19935-6",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -123,7 +120,6 @@ v: {
|
|||
"code" : "19935-6",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -145,7 +141,6 @@ v: {
|
|||
"code" : "28655-9",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -167,7 +162,6 @@ v: {
|
|||
"code" : "28655-9",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -189,7 +183,6 @@ v: {
|
|||
"code" : "28655-9",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -212,7 +205,6 @@ v: {
|
|||
"code" : "29299-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -235,7 +227,6 @@ v: {
|
|||
"code" : "10183-2",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -258,7 +249,6 @@ v: {
|
|||
"code" : "48765-2",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -280,7 +270,6 @@ v: {
|
|||
"code" : "46241-6",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -302,7 +291,6 @@ v: {
|
|||
"code" : "18842-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -325,7 +313,6 @@ v: {
|
|||
"code" : "18842-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -347,7 +334,6 @@ v: {
|
|||
"code" : "18842-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -369,7 +355,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Allergies' for http://loinc.org#48765-2 - should be one of 28 choices: 'Allergies and adverse reactions Document', 'Allergies &or adverse reactions Doc', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 变态反应与不良反应 文档.其他' (zh-CN), '杂项类文档' (zh-CN), '其他文档 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 杂项' (zh-CN), '杂项类' (zh-CN), '杂项试验 过敏反应' (zh-CN), '过敏' (zh-CN), 'Allergie e reazioni avverse Documentazione miscellanea Miscellanea Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Документ Точка во времени' (ru-RU) or 'Момент' (ru-RU) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -392,7 +377,6 @@ v: {
|
|||
"code" : "8648-8",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -415,7 +399,6 @@ v: {
|
|||
"code" : "78375-3",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -438,7 +421,6 @@ v: {
|
|||
"code" : "75311-1",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -461,7 +443,6 @@ v: {
|
|||
"code" : "42347-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -484,7 +465,6 @@ v: {
|
|||
"code" : "42346-7",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -507,7 +487,6 @@ v: {
|
|||
"code" : "42344-2",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -530,7 +509,6 @@ v: {
|
|||
"code" : "10164-2",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -552,7 +530,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Plan of care' for http://loinc.org#18776-5 - should be one of 30 choices: 'Plan of care note', 'Plan of care note', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 事件发生的地方' (zh-CN), '场景' (zh-CN), '环境' (zh-CN), '背景 医疗服务(照护服务、护理服务、护理、照护、医疗照护、诊疗、诊疗服务、照顾、看护)计划(方案)记录 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 文档本体' (zh-CN), '临床文档本体' (zh-CN), '文档本体' (zh-CN), '文书本体' (zh-CN), '医疗文书本体' (zh-CN), '临床医疗文书本体 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 未加明确说明的角色 笔记' (zh-CN), '按语' (zh-CN), '注释' (zh-CN), '说明' (zh-CN), '票据' (zh-CN), '单据' (zh-CN), '证明书' (zh-CN) or 'Documentazione dell'ontologia Osservazione Piano di cura Punto nel tempo (episodio) Ruolo non specificato' (it-IT) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -575,7 +552,6 @@ v: {
|
|||
"code" : "47420-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -598,7 +574,6 @@ v: {
|
|||
"code" : "47519-4",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -620,7 +595,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Review of systems Narrative Reporte' for http://loinc.org#10187-3 - should be one of 41 choices: 'Review of systems Narrative - Reported', 'Review of systems', '医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 历史纪录与体格检查 历史纪录与体格检查.历史记录' (zh-CN), '历史纪录与体格检查.历史记录类' (zh-CN), '历史纪录与体格检查.历史记录类别' (zh-CN), '历史纪录与体格检查.病史' (zh-CN), '历史纪录与体格检查.病史类' (zh-CN), '历史纪录与体格检查.病史类别' (zh-CN), '历史纪录与体格检查.病史记录' (zh-CN), '历史纪录与体格检查.病史记录类' (zh-CN), '历史纪录与体格检查.病史记录类别' (zh-CN), '历史纪录与体格检查小节.历史记录' (zh-CN), '历史纪录与体格检查小节.历史记录类' (zh-CN), '历史纪录与体格检查小节.历史记录类别' (zh-CN), '历史纪录与体格检查小节.病史' (zh-CN), '历史纪录与体格检查小节.病史类' (zh-CN), '历史纪录与体格检查小节.病史类别 历史纪录与体格检查小节 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 叙述' (zh-CN), '叙述性文字' (zh-CN), '报告' (zh-CN), '报告型' (zh-CN), '文字叙述' (zh-CN), '文本叙述型' (zh-CN), '文本描述' (zh-CN), '文本描述型 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 病史与体格检查 系统回顾' (zh-CN), '系统审核' (zh-CN), 'Anamnesi Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Анамнестические сведения' (ru-RU), 'Сообщенная третьим лицом информация Описательный Точка во времени' (ru-RU) or 'Момент' (ru-RU) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -642,7 +616,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Administrative information' for http://loinc.org#87504-7 - should be 'LCDS v4.00 - Administrative information - discharge [CMS Assessment]' (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -665,6 +638,28 @@ v: {
|
|||
"code" : "2069-3",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://loinc.org",
|
||||
"code" : "18842-5",
|
||||
"display" : "Discharge Summary"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "Discharge summary",
|
||||
"code" : "18842-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
|
|
|
@ -119,7 +119,6 @@ v: {
|
|||
"code" : "115",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -141,7 +140,6 @@ v: {
|
|||
"code" : "10",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -163,7 +161,6 @@ v: {
|
|||
"code" : "85",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -185,7 +182,6 @@ v: {
|
|||
"code" : "25",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -207,7 +203,6 @@ v: {
|
|||
"code" : "37",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -229,7 +224,6 @@ v: {
|
|||
"code" : "185",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -251,7 +245,6 @@ v: {
|
|||
"code" : "150",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -273,7 +266,6 @@ v: {
|
|||
"code" : "207",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -295,7 +287,6 @@ v: {
|
|||
"code" : "171",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -317,6 +308,70 @@ v: {
|
|||
"code" : "88",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"code" : "210"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "SARS-COV-2 (COVID-19) vaccine, vector non-replicating, recombinant spike protein-ChAdOx1, preservative free, 0.5 mL",
|
||||
"code" : "210",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"code" : "210"
|
||||
}, "url": "http://hl7.org/fhir/uv/shc-vaccination/ValueSet/vaccine-cvx", "version": "0.6.2", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "SARS-COV-2 (COVID-19) vaccine, vector non-replicating, recombinant spike protein-ChAdOx1, preservative free, 0.5 mL",
|
||||
"code" : "210",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"code" : "207"
|
||||
}, "url": "http://hl7.org/fhir/uv/shc-vaccination/ValueSet/vaccine-cvx", "version": "0.6.2", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "SARS-COV-2 (COVID-19) vaccine, mRNA, spike protein, LNP, preservative free, 100 mcg/0.5mL dose",
|
||||
"code" : "207",
|
||||
"system" : "http://hl7.org/fhir/sid/cvx",
|
||||
"version" : "20210406",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
|
|
|
@ -141,6 +141,28 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Alderney' for urn:iso:std:iso:3166#NO - should be 'Norway' (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"code" : "US",
|
||||
"display" : "United States of America"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "United States of America",
|
||||
"code" : "US",
|
||||
"system" : "urn:iso:std:iso:3166",
|
||||
"version" : "2018",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
|
|
|
@ -13,7 +13,6 @@ v: {
|
|||
"display" : "German (Switzerland)",
|
||||
"code" : "de-CH",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -35,7 +34,6 @@ v: {
|
|||
"display" : "German (Region=Switzerland)",
|
||||
"code" : "de-CH",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -56,7 +54,6 @@ v: {
|
|||
"display" : "German (Region=Switzerland)",
|
||||
"code" : "de-CH",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -77,7 +74,6 @@ v: {
|
|||
"display" : "French",
|
||||
"code" : "fr",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -99,7 +95,6 @@ v: {
|
|||
"display" : "French",
|
||||
"code" : "fr",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -120,7 +115,6 @@ v: {
|
|||
"display" : "French",
|
||||
"code" : "fr",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -141,7 +135,6 @@ v: {
|
|||
"display" : "English",
|
||||
"code" : "en",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -163,7 +156,6 @@ v: {
|
|||
"display" : "English",
|
||||
"code" : "en",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -180,6 +172,71 @@ v: {
|
|||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "English",
|
||||
"code" : "en",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"code" : "de-CH",
|
||||
"display" : "German (Region=Switzerland)"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "German (Region=Switzerland)",
|
||||
"code" : "de-CH",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"code" : "fr",
|
||||
"display" : "French"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "French",
|
||||
"code" : "fr",
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "urn:ietf:bcp:47",
|
||||
"code" : "en",
|
||||
"display" : "English"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "English",
|
||||
"code" : "en",
|
||||
|
|
|
@ -3861,7 +3861,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Allergies and Adverse Reactions' for http://loinc.org#48765-2 - should be one of 28 choices: 'Allergies and adverse reactions Document', 'Allergies &or adverse reactions Doc', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 变态反应与不良反应 文档.其他' (zh-CN), '杂项类文档' (zh-CN), '其他文档 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 杂项' (zh-CN), '杂项类' (zh-CN), '杂项试验 过敏反应' (zh-CN), '过敏' (zh-CN), 'Allergie e reazioni avverse Documentazione miscellanea Miscellanea Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Документ Точка во времени' (ru-RU) or 'Момент' (ru-RU) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -3883,7 +3882,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Medication List' for http://loinc.org#10160-0 - should be one of 48 choices: 'History of Medication use Narrative', 'Hx of Medication use', '医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 历史' (zh-CN), '史' (zh-CN), '病史 历史纪录与体格检查 历史纪录与体格检查.历史记录' (zh-CN), '历史纪录与体格检查.历史记录类' (zh-CN), '历史纪录与体格检查.历史记录类别' (zh-CN), '历史纪录与体格检查.病史' (zh-CN), '历史纪录与体格检查.病史类' (zh-CN), '历史纪录与体格检查.病史类别' (zh-CN), '历史纪录与体格检查.病史记录' (zh-CN), '历史纪录与体格检查.病史记录类' (zh-CN), '历史纪录与体格检查.病史记录类别' (zh-CN), '历史纪录与体格检查小节.历史记录' (zh-CN), '历史纪录与体格检查小节.历史记录类' (zh-CN), '历史纪录与体格检查小节.历史记录类别' (zh-CN), '历史纪录与体格检查小节.病史' (zh-CN), '历史纪录与体格检查小节.病史类' (zh-CN), '历史纪录与体格检查小节.病史类别 历史纪录与体格检查小节 叙述' (zh-CN), '叙述性文字' (zh-CN), '报告' (zh-CN), '报告型' (zh-CN), '文字叙述' (zh-CN), '文本叙述型' (zh-CN), '文本描述' (zh-CN), '文本描述型 处理用药' (zh-CN), '处理用药物' (zh-CN), '处理药物' (zh-CN), '治疗用药' (zh-CN), '治疗用药物' (zh-CN), '用药' (zh-CN), '药物处理' (zh-CN), '药物治疗' (zh-CN), '治疗药物 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 病史与体格检查 药物使用历史' (zh-CN), '药物使用史' (zh-CN), 'Anamnesi paziente Punto nel tempo (episodio) Storia' (it-IT), 'Anamnesi' (it-IT), 'История Лекарственный анамнез Описательный Точка во времени' (ru-RU), 'Момент' (ru-RU) or 'anamnese geneesmiddelen' (nl-NL) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -3905,7 +3903,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Problem List' for http://loinc.org#11450-4 - should be one of 53 choices: 'Problem list - Reported', 'Problem list Reported', '分类型应答' (zh-CN), '分类型结果' (zh-CN), '名义性' (zh-CN), '名称型' (zh-CN), '名词型' (zh-CN), '名词性' (zh-CN), '标称性' (zh-CN), '没有自然次序的名义型或分类型应答 医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 历史纪录与体格检查 历史纪录与体格检查.历史记录' (zh-CN), '历史纪录与体格检查.历史记录类' (zh-CN), '历史纪录与体格检查.历史记录类别' (zh-CN), '历史纪录与体格检查.病史' (zh-CN), '历史纪录与体格检查.病史类' (zh-CN), '历史纪录与体格检查.病史类别' (zh-CN), '历史纪录与体格检查.病史记录' (zh-CN), '历史纪录与体格检查.病史记录类' (zh-CN), '历史纪录与体格检查.病史记录类别' (zh-CN), '历史纪录与体格检查小节.历史记录' (zh-CN), '历史纪录与体格检查小节.历史记录类' (zh-CN), '历史纪录与体格检查小节.历史记录类别' (zh-CN), '历史纪录与体格检查小节.病史' (zh-CN), '历史纪录与体格检查小节.病史类' (zh-CN), '历史纪录与体格检查小节.病史类别 历史纪录与体格检查小节 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 病史与体格检查 问题目录' (zh-CN), '问题清单 难题' (zh-CN), '困难' (zh-CN), '棘手问题' (zh-CN), '麻烦' (zh-CN), '乱子' (zh-CN), '疑难问题' (zh-CN), '疑难' (zh-CN), 'Finding' (pt-BR), 'Findings' (pt-BR), 'Point in time' (pt-BR), 'Random' (pt-BR), 'Nominal' (pt-BR), 'Anamnesi Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Анамнестические сведения' (ru-RU), 'Сообщенная третьим лицом информация Номинальный' (ru-RU), 'Именной Список проблем Точка во времени' (ru-RU) or 'Момент' (ru-RU) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -3927,7 +3924,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'History of Immunizations' for http://loinc.org#11369-6 - should be one of 43 choices: 'History of Immunization Narrative', 'Hx of Immunization', '免疫接种历史' (zh-CN), '免疫史' (zh-CN), '接种史' (zh-CN), '免疫接种史 医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 历史' (zh-CN), '史' (zh-CN), '病史 历史纪录与体格检查 历史纪录与体格检查.历史记录' (zh-CN), '历史纪录与体格检查.历史记录类' (zh-CN), '历史纪录与体格检查.历史记录类别' (zh-CN), '历史纪录与体格检查.病史' (zh-CN), '历史纪录与体格检查.病史类' (zh-CN), '历史纪录与体格检查.病史类别' (zh-CN), '历史纪录与体格检查.病史记录' (zh-CN), '历史纪录与体格检查.病史记录类' (zh-CN), '历史纪录与体格检查.病史记录类别' (zh-CN), '历史纪录与体格检查小节.历史记录' (zh-CN), '历史纪录与体格检查小节.历史记录类' (zh-CN), '历史纪录与体格检查小节.历史记录类别' (zh-CN), '历史纪录与体格检查小节.病史' (zh-CN), '历史纪录与体格检查小节.病史类' (zh-CN), '历史纪录与体格检查小节.病史类别 历史纪录与体格检查小节 叙述' (zh-CN), '叙述性文字' (zh-CN), '报告' (zh-CN), '报告型' (zh-CN), '文字叙述' (zh-CN), '文本叙述型' (zh-CN), '文本描述' (zh-CN), '文本描述型 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 病史与体格检查' (zh-CN), 'Anamnesi paziente Punto nel tempo (episodio) Storia' (it-IT), 'Anamnesi' (it-IT), 'История Описательный Точка во времени' (ru-RU), 'Момент' (ru-RU), 'anamnese vaccinatie' (nl-NL) or 'Immunisierungsstatus' (de-AT) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -3949,7 +3945,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Social History' for http://loinc.org#29762-2 - should be one of 45 choices: 'Social history Narrative', 'Social Hx', '医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 历史纪录与体格检查 历史纪录与体格检查.历史记录' (zh-CN), '历史纪录与体格检查.历史记录类' (zh-CN), '历史纪录与体格检查.历史记录类别' (zh-CN), '历史纪录与体格检查.病史' (zh-CN), '历史纪录与体格检查.病史类' (zh-CN), '历史纪录与体格检查.病史类别' (zh-CN), '历史纪录与体格检查.病史记录' (zh-CN), '历史纪录与体格检查.病史记录类' (zh-CN), '历史纪录与体格检查.病史记录类别' (zh-CN), '历史纪录与体格检查小节.历史记录' (zh-CN), '历史纪录与体格检查小节.历史记录类' (zh-CN), '历史纪录与体格检查小节.历史记录类别' (zh-CN), '历史纪录与体格检查小节.病史' (zh-CN), '历史纪录与体格检查小节.病史类' (zh-CN), '历史纪录与体格检查小节.病史类别 历史纪录与体格检查小节 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 叙述' (zh-CN), '叙述性文字' (zh-CN), '报告' (zh-CN), '报告型' (zh-CN), '文字叙述' (zh-CN), '文本叙述型' (zh-CN), '文本描述' (zh-CN), '文本描述型 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 病史与体格检查 社会历史' (zh-CN), 'Finding' (pt-BR), 'Findings' (pt-BR), 'Point in time' (pt-BR), 'Random' (pt-BR), 'Narrative' (pt-BR), 'Report' (pt-BR), 'Anamnesi Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Описательный Социальный анамнез Точка во времени' (ru-RU) or 'Момент' (ru-RU) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -3972,7 +3967,6 @@ v: {
|
|||
"code" : "72166-2",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -3995,6 +3989,117 @@ v: {
|
|||
"code" : "LA15920-4",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://loinc.org",
|
||||
"code" : "60591-5",
|
||||
"display" : "Patient summary Document"
|
||||
}, "valueSet" :null, "langs":"de-CH", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"code" : "60591-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://loinc.org",
|
||||
"code" : "60591-5",
|
||||
"display" : "Patient Summary Document"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "Patient summary Document",
|
||||
"code" : "60591-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "current",
|
||||
"code" : "56445-0",
|
||||
"display" : "Medication summary Doc"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "Medication summary Document",
|
||||
"code" : "56445-0",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://loinc.org",
|
||||
"code" : "34133-9",
|
||||
"display" : "Summary of episode note"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "Summary of episode note",
|
||||
"code" : "34133-9",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://loinc.org",
|
||||
"code" : "18842-5",
|
||||
"display" : "Discharge Summary"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "Discharge summary",
|
||||
"code" : "18842-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
|
|
|
@ -2878,6 +2878,71 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "The provided code 'http://snomed.info/sct|http://snomed.info/sct/2011000195101#46224007' is not in the value set 'http://fhir.ch/ig/ch-ig/ValueSet/OrganizationType|0.1.0' (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://snomed.info/sct",
|
||||
"code" : "255604002",
|
||||
"display" : "Mild"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "Mild",
|
||||
"code" : "255604002",
|
||||
"system" : "http://snomed.info/sct",
|
||||
"version" : "http://snomed.info/sct/900000000000207008/version/20230731",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://snomed.info/sct",
|
||||
"code" : "77176002"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "Smoker",
|
||||
"code" : "77176002",
|
||||
"system" : "http://snomed.info/sct",
|
||||
"version" : "http://snomed.info/sct/900000000000207008/version/20230731",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://snomed.info/sct",
|
||||
"code" : "38341003"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "High blood pressure",
|
||||
"code" : "38341003",
|
||||
"system" : "http://snomed.info/sct",
|
||||
"version" : "http://snomed.info/sct/900000000000207008/version/20230731",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
|
|
|
@ -13,7 +13,6 @@ v: {
|
|||
"display" : "World",
|
||||
"code" : "001",
|
||||
"system" : "http://unstats.un.org/unsd/methods/m49/m49.htm",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -30,6 +29,27 @@ v: {
|
|||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "World",
|
||||
"code" : "001",
|
||||
"system" : "http://unstats.un.org/unsd/methods/m49/m49.htm",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://unstats.un.org/unsd/methods/m49/m49.htm",
|
||||
"code" : "001",
|
||||
"display" : "World"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "World",
|
||||
"code" : "001",
|
||||
|
|
|
@ -167,7 +167,6 @@ v: {
|
|||
"code" : "85354-9",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -190,7 +189,6 @@ v: {
|
|||
"code" : "8480-6",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -213,7 +211,6 @@ v: {
|
|||
"code" : "8462-4",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -235,7 +232,6 @@ v: {
|
|||
"code" : "85354-9",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -258,7 +254,6 @@ v: {
|
|||
"code" : "85354-9",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -280,7 +275,6 @@ v: {
|
|||
"code" : "85354-9",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -302,7 +296,6 @@ v: {
|
|||
"code" : "8480-6",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -325,7 +318,6 @@ v: {
|
|||
"code" : "8480-6",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -347,7 +339,6 @@ v: {
|
|||
"code" : "8480-6",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -369,7 +360,6 @@ v: {
|
|||
"code" : "8462-4",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -392,7 +382,6 @@ v: {
|
|||
"code" : "8462-4",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -414,7 +403,6 @@ v: {
|
|||
"code" : "8462-4",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -436,7 +424,6 @@ v: {
|
|||
"code" : "56445-0",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -460,7 +447,6 @@ v: {
|
|||
"code" : "56445-0",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -483,7 +469,6 @@ v: {
|
|||
"code" : "56445-0",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -506,7 +491,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Allergies and adverse reactions' for http://loinc.org#48765-2 - should be one of 28 choices: 'Allergies and adverse reactions Document', 'Allergies &or adverse reactions Doc', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 变态反应与不良反应 文档.其他' (zh-CN), '杂项类文档' (zh-CN), '其他文档 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 杂项' (zh-CN), '杂项类' (zh-CN), '杂项试验 过敏反应' (zh-CN), '过敏' (zh-CN), 'Allergie e reazioni avverse Documentazione miscellanea Miscellanea Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Документ Точка во времени' (ru-RU) or 'Момент' (ru-RU) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -528,7 +512,6 @@ v: {
|
|||
"code" : "56445-0",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -552,7 +535,6 @@ v: {
|
|||
"code" : "56445-0",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -575,7 +557,6 @@ v: {
|
|||
"code" : "56445-0",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -598,7 +579,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Allergies and adverse reactions' for http://loinc.org#48765-2 - should be one of 28 choices: 'Allergies and adverse reactions Document', 'Allergies &or adverse reactions Doc', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 变态反应与不良反应 文档.其他' (zh-CN), '杂项类文档' (zh-CN), '其他文档 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 杂项' (zh-CN), '杂项类' (zh-CN), '杂项试验 过敏反应' (zh-CN), '过敏' (zh-CN), 'Allergie e reazioni avverse Documentazione miscellanea Miscellanea Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Документ Точка во времени' (ru-RU) or 'Момент' (ru-RU) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -620,7 +600,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'ingeademde O2' for http://loinc.org#3151-8 - should be one of 2 choices: 'Inhaled oxygen flow rate' or 'Inhaled O2 flow rate' (for the language(s) 'en') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -643,7 +622,6 @@ v: {
|
|||
"code" : "3151-8",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -665,7 +643,6 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Cholesterol [Moles/volume] in Serum or Plasma' for http://loinc.org#35200-5 - should be one of 50 choices: 'Cholesterol [Mass or Moles/volume] in Serum or Plasma', 'Cholest SerPl-msCnc', '化学' (zh-CN), '化学检验项目' (zh-CN), '化学检验项目类' (zh-CN), '化学类' (zh-CN), '化学试验' (zh-CN), '非刺激耐受型化学检验项目' (zh-CN), '非刺激耐受型化学检验项目类' (zh-CN), '非刺激耐受型化学试验' (zh-CN), '非刺激耐受型化学试验类 可用数量表示的' (zh-CN), '定量性' (zh-CN), '数值型' (zh-CN), '数量型' (zh-CN), '连续数值型标尺 总胆固醇' (zh-CN), '胆固醇总计' (zh-CN), '胆甾醇' (zh-CN), '脂类' (zh-CN), '脂质 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 血清或血浆 质量或摩尔浓度' (zh-CN), '质量或摩尔浓度(单位体积)' (zh-CN), '质量或物质的量浓度(单位体积)' (zh-CN), 'Juhuslik Kvantitatiivne Plasma Seerum Seerum või plasma' (et-EE), 'Cholest' (pt-BR), 'Chol' (pt-BR), 'Choles' (pt-BR), 'Lipid' (pt-BR), 'Cholesterol total' (pt-BR), 'Cholesterols' (pt-BR), 'Level' (pt-BR), 'Point in time' (pt-BR), 'Random' (pt-BR), 'SerPl' (pt-BR), 'SerPlas' (pt-BR), 'SerP' (pt-BR), 'Serum' (pt-BR), 'SR' (pt-BR), 'Plasma' (pt-BR), 'Pl' (pt-BR), 'Plsm' (pt-BR), 'Quantitative' (pt-BR), 'QNT' (pt-BR), 'Quant' (pt-BR), 'Quan' (pt-BR), 'Chemistry' (pt-BR), 'Chimica Concentrazione Sostanza o Massa Plasma Punto nel tempo (episodio) Siero Siero o Plasma' (it-IT), 'Количественный Массовая или Молярная Концентрация Плазма Сыворотка Сыворотка или Плазма Точка во времени' (ru-RU) or 'Момент Холестерин' (ru-RU) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -688,7 +665,6 @@ v: {
|
|||
"code" : "13457-7",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -711,7 +687,6 @@ v: {
|
|||
"code" : "29463-7",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -734,7 +709,6 @@ v: {
|
|||
"code" : "29463-7",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -757,7 +731,6 @@ v: {
|
|||
"code" : "35200-5",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
@ -779,6 +752,73 @@ v: {
|
|||
"severity" : "error",
|
||||
"error" : "Wrong Display Name 'Triglyceride [Moles/volume] in Serum or Plasma' for http://loinc.org#35217-9 - should be one of 50 choices: 'Triglyceride [Mass or Moles/volume] in Serum or Plasma', 'Trigl SerPl-msCnc', 'TG' (zh-CN), 'Trigly' (zh-CN), '甘油三脂' (zh-CN), '甘油三酸酯' (zh-CN), '三酸甘油酯' (zh-CN), '甘油三酸脂' (zh-CN), '三酸甘油脂 化学' (zh-CN), '化学检验项目' (zh-CN), '化学检验项目类' (zh-CN), '化学类' (zh-CN), '化学试验' (zh-CN), '非刺激耐受型化学检验项目' (zh-CN), '非刺激耐受型化学检验项目类' (zh-CN), '非刺激耐受型化学试验' (zh-CN), '非刺激耐受型化学试验类 可用数量表示的' (zh-CN), '定量性' (zh-CN), '数值型' (zh-CN), '数量型' (zh-CN), '连续数值型标尺 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 血清或血浆 质量或摩尔浓度' (zh-CN), '质量或摩尔浓度(单位体积)' (zh-CN), '质量或物质的量浓度(单位体积)' (zh-CN), 'Juhuslik Kvantitatiivne Plasma Seerum Seerum või plasma' (et-EE), 'Trigl' (pt-BR), 'Triglycrides' (pt-BR), 'Trig' (pt-BR), 'Triglycerides' (pt-BR), 'Level' (pt-BR), 'Point in time' (pt-BR), 'Random' (pt-BR), 'SerPl' (pt-BR), 'SerPlas' (pt-BR), 'SerP' (pt-BR), 'Serum' (pt-BR), 'SR' (pt-BR), 'Plasma' (pt-BR), 'Pl' (pt-BR), 'Plsm' (pt-BR), 'Quantitative' (pt-BR), 'QNT' (pt-BR), 'Quant' (pt-BR), 'Quan' (pt-BR), 'Chemistry' (pt-BR), 'Chimica Concentrazione Sostanza o Massa Plasma Punto nel tempo (episodio) Siero Siero o Plasma' (it-IT), 'Количественный Массовая или Молярная Концентрация Плазма Сыворотка Сыворотка или Плазма Точка во времени' (ru-RU) or 'Момент' (ru-RU) (for the language(s) '--') (from Tx-Server)",
|
||||
"class" : "UNKNOWN",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"code" : "56445-0",
|
||||
"display" : "Medication summary Doc"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "Medication summary Document",
|
||||
"code" : "56445-0",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "current",
|
||||
"code" : "56445-0",
|
||||
"display" : "Medication summary Doc"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"true", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "Medication summary Document",
|
||||
"code" : "56445-0",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
}
|
||||
|
||||
}
|
||||
-------------------------------------------------------------------------------------
|
||||
{"code" : {
|
||||
"system" : "http://loinc.org",
|
||||
"code" : "29463-7"
|
||||
}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": {
|
||||
"resourceType" : "Parameters",
|
||||
"parameter" : [{
|
||||
"name" : "profile-url",
|
||||
"valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891"
|
||||
}]
|
||||
}}####
|
||||
v: {
|
||||
"display" : "Body weight",
|
||||
"code" : "29463-7",
|
||||
"system" : "http://loinc.org",
|
||||
"version" : "2.74",
|
||||
"unknown-systems" : "",
|
||||
"issues" : {
|
||||
"resourceType" : "OperationOutcome"
|
||||
|
|
2
pom.xml
2
pom.xml
|
@ -20,7 +20,7 @@
|
|||
<properties>
|
||||
<guava_version>32.0.1-jre</guava_version>
|
||||
<hapi_fhir_version>6.4.1</hapi_fhir_version>
|
||||
<validator_test_case_version>1.4.2</validator_test_case_version>
|
||||
<validator_test_case_version>1.4.3-SNAPSHOT</validator_test_case_version>
|
||||
<jackson_version>2.15.2</jackson_version>
|
||||
<junit_jupiter_version>5.9.2</junit_jupiter_version>
|
||||
<junit_platform_launcher_version>1.8.2</junit_platform_launcher_version>
|
||||
|
|
Loading…
Reference in New Issue