protected ElementDefinition findElement(StructureDefinition profile, String name) { for (ElementDefinition c : profile.getSnapshot().getElement()) { if (c.getPath().equals(name)) { return c; } } return null; }
private Set<String> listExtensionTypes(StructureDefinition ex) { ElementDefinition vd = null; for (ElementDefinition ed : ex.getSnapshot().getElement()) { if (ed.getPath().startsWith("Extension.value")) { vd = ed; break; } } Set<String> res = new HashSet<String>(); if (vd != null && !"0".equals(vd.getMax())) { for (TypeRefComponent tr : vd.getType()) { res.add(tr.getCode()); } } return res; }
private ElementDefinition resolveType(String type) { if (logical != null) for (BundleEntryComponent be : logical.getEntry()) { if (be.hasResource() && be.getResource() instanceof StructureDefinition) { StructureDefinition sd = (StructureDefinition) be.getResource(); if (sd.getId().equals(type)) return sd.getSnapshot().getElement().get(0); } } String url = "http://hl7.org/fhir/StructureDefinition/" + type; long t = System.nanoTime(); StructureDefinition sd = context.fetchResource(StructureDefinition.class, url); sdTime = sdTime + (System.nanoTime() - t); if (sd == null || !sd.hasSnapshot()) return null; else return sd.getSnapshot().getElement().get(0); }
sdTime = sdTime + (System.nanoTime() - t1); ed = sd.getSnapshot().getElementFirstRep(); continue; } else if (ed.getType().get(0).hasProfile()) { childDefinitions = ProfileUtilities.getChildMap(sd, sd.getSnapshot().getElementFirstRep());
} else { if (def.getIsModifier()) rule(errors, IssueType.STRUCTURE, element.line(), element.col(), path + "[url='" + url + "']", ex.getSnapshot().getElement().get(0).getIsModifier(), "Extension modifier mismatch: the extension element is labelled as a modifier, but the underlying extension is not"); else rule(errors, IssueType.STRUCTURE, element.line(), element.col(), path + "[url='" + url + "']", !ex.getSnapshot().getElement().get(0).getIsModifier(), "Extension modifier mismatch: the extension element is not labelled as a modifier, but the underlying extension is"); rule(errors, IssueType.STRUCTURE, element.line(), element.col(), path + "[url='" + url + "']", ex.getSnapshot().getElement().get(0).getIsModifier(), "The Extension '" + url + "' must be used as a modifierExtension"); else rule(errors, IssueType.STRUCTURE, element.line(), element.col(), path + "[url='" + url + "']", !ex.getSnapshot().getElement().get(0).getIsModifier(), "The Extension '" + url + "' must not be used as an extension (it's a modifierExtension)"); validateElement(appContext, errors, ex, ex.getSnapshot().getElement().get(0), null, null, resource, element, "Extension", stack, false);
private void start(Object appContext, List<ValidationMessage> errors, Element resource, Element element, StructureDefinition defn, NodeStack stack) throws FHIRException, FHIRException, IOException { // profile is valid, and matches the resource name ResourceProfiles resourceProfiles = getResourceProfiles(element, stack); if (!resourceProfiles.isProcessed()) checkDeclaredProfiles(resourceProfiles, errors, resource, element, stack); if (!resourceProfiles.isProcessed()) { resourceProfiles.setProcessed(); if (!resourceProfiles.hasProfiles() && (rule(errors, IssueType.STRUCTURE, element.line(), element.col(), stack.getLiteralPath(), defn.hasSnapshot(), "StructureDefinition has no snapshot - validation is against the snapshot, so it must be provided"))) { // Don't need to validate against the resource if there's a profile because the profile snapshot will include the relevant parts of the resources validateElement(appContext, errors, defn, defn.getSnapshot().getElement().get(0), null, null, resource, element, element.getName(), stack, false); } // specific known special validations if (element.getType().equals("Bundle")) validateBundle(errors, element, stack); if (element.getType().equals("Observation")) validateObservation(errors, element, stack); if (element.getType().equals("QuestionnaireResponse")) validateQuestionannaireResponse(errors, element, stack); } for (ProfileUsage profileUsage : resourceProfiles.uncheckedProfiles()) { profileUsage.setChecked(); validateElement(appContext, errors, profileUsage.getProfile(), profileUsage.getProfile().getSnapshot().getElement().get(0), null, null, resource, element, element.getName(), stack, false); } }
public void checkAllInvariants(){ for (StructureDefinition sd : context.allStructures()) { if (sd.getDerivation() == TypeDerivationRule.SPECIALIZATION) { for (ElementDefinition ed : sd.getSnapshot().getElement()) { for (ElementDefinitionConstraintComponent inv : ed.getConstraint()) { if (inv.hasExpression()) { try { ExpressionNode n = (ExpressionNode) inv.getUserData("validator.expression.cache"); if (n == null) { n = fpe.parse(inv.getExpression()); inv.setUserData("validator.expression.cache", n); } fpe.check(null, sd.getKind() == StructureDefinitionKind.RESOURCE ? sd.getType() : "DomainResource", ed.getPath(), n); } catch (Exception e) { System.out.println("Error processing structure ["+sd.getId()+"] path "+ed.getPath()+":"+inv.getKey()+" (\""+inv.getExpression()+"\"): "+e.getMessage()); } } } } } } }
throw new DefinitionException("Unable to resolve actual type " + actualType); childDefinitions = ProfileUtilities.getChildMap(dt, dt.getSnapshot().getElement().get(0)); typeDefn = resolveNameReference(profile.getSnapshot(), ei.definition.getContentReference()); if (rule(errors, IssueType.STRUCTURE, ei.line(), ei.col(), ei.path, p != null, "Unknown profile " + typeProfile)) { List<ValidationMessage> profileErrors = new ArrayList<ValidationMessage>(); validateElement(appContext, profileErrors, p, p.getSnapshot().getElement().get(0), profile, ei.definition, resource, ei.element, type, localStack, thisIsCodeableConcept); boolean hasError = false; for (ValidationMessage msg : profileErrors) { validateElement(appContext, errors, p, p.getSnapshot().getElement().get(0), profile, ei.definition, resource, ei.element, type, localStack, thisIsCodeableConcept); int index = profile.getSnapshot().getElement().indexOf(ei.definition); if (index < profile.getSnapshot().getElement().size() - 1) { String nextPath = profile.getSnapshot().getElement().get(index+1).getPath(); if (!nextPath.equals(ei.definition.getPath()) && nextPath.startsWith(ei.definition.getPath())) validateElement(appContext, errors, profile, ei.definition, null, null, resource, ei.element, type, localStack, thisIsCodeableConcept);
checkExtensions(profile, errors, "differential", ec); rule(errors, IssueType.STRUCTURE, profile.getId(), profile.hasSnapshot(), "missing Snapshot at "+profile.getName()+"."+profile.getName()); for (ElementDefinition ec : profile.getSnapshot().getElement()) checkExtensions(profile, errors, "snapshot", ec); for (ElementDefinition ed : profile.getSnapshot().getElement()) { checkExtensions(profile, errors, "snapshot", ed); for (ElementDefinitionConstraintComponent inv : ed.getConstraint()) {
private ElementDefinition getUrlFor(StructureDefinition ed, ElementDefinition c) { int i = ed.getSnapshot().getElement().indexOf(c) + 1; while (i < ed.getSnapshot().getElement().size() && ed.getSnapshot().getElement().get(i).getPath().startsWith(c.getPath()+".")) { if (ed.getSnapshot().getElement().get(i).getPath().equals(c.getPath()+".url")) return ed.getSnapshot().getElement().get(i); i++; } return null; }
public ElementDefinition getExtensionValueDefinition() { int i = defn.getSnapshot().getElement().indexOf(element)+1; while (i < defn.getSnapshot().getElement().size()) { ElementDefinition ed = defn.getSnapshot().getElement().get(i); if (ed.getPath().equals(element.getPath())) return null; if (ed.getPath().startsWith(element.getPath()+".value")) return ed; i++; } return null; }
tgt.setDifferential(convertStructureDefinitionDifferentialComponent(src.getDifferential())); if (tgt.hasSnapshot()) tgt.getSnapshot().getElementFirstRep().getType().clear(); if (tgt.hasDifferential()) tgt.getDifferential().getElementFirstRep().getType().clear();
public ElementSortComparator(Element e, Property property) { String tn = e.getType(); StructureDefinition sd = property.getContext().fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/"+tn); if (sd != null && !sd.getAbstract()) children = sd.getSnapshot().getElement(); else children = property.getStructure().getSnapshot().getElement(); }
tgt.setConstrainedType(src.getType()); tgt.setBase(src.getBaseDefinition()); tgt.setSnapshot(convertStructureDefinitionSnapshotComponent(src.getSnapshot())); tgt.setDifferential(convertStructureDefinitionDifferentialComponent(src.getDifferential())); if (tgt.hasBase()) {
public void generateCsvs(OutputStream dest, StructureDefinition structure, boolean asXml) throws IOException, DefinitionException, Exception { if (!structure.hasSnapshot()) throw new DefinitionException("needs a snapshot"); CSVWriter csv = new CSVWriter(dest, structure, asXml); for (ElementDefinition child : structure.getSnapshot().getElement()) { csv.processElement(child); } csv.dump(); }
public void populateLogicalSnapshot(StructureDefinition sd) throws FHIRException { sd.getSnapshot().getElement().add(sd.getDifferential().getElementFirstRep().copy()); if (sd.hasBaseDefinition()) { StructureDefinition base = context.fetchResource(StructureDefinition.class, sd.getBaseDefinition()); if (base == null) throw new FHIRException("Unable to find base definition for logical model: "+sd.getBaseDefinition()+" from "+sd.getUrl()); copyElements(sd, base.getSnapshot().getElement()); } copyElements(sd, sd.getDifferential().getElement()); }
if (src.hasSnapshot()) { tgt.setSnapshot(convertStructureDefinitionSnapshotComponent(src.getSnapshot())); tgt.getSnapshot().getElementFirstRep().getType().clear();
public void generateSchematrons(OutputStream dest, StructureDefinition structure) throws IOException, DefinitionException { if (structure.getDerivation() != TypeDerivationRule.CONSTRAINT) throw new DefinitionException("not the right kind of structure to generate schematrons for"); if (!structure.hasSnapshot()) throw new DefinitionException("needs a snapshot"); StructureDefinition base = context.fetchResource(StructureDefinition.class, structure.getBaseDefinition()); SchematronWriter sch = new SchematronWriter(dest, SchematronType.PROFILE, base.getName()); ElementDefinition ed = structure.getSnapshot().getElement().get(0); generateForChildren(sch, "f:"+ed.getPath(), ed, structure, base); sch.dump(); }
public void setIds(StructureDefinition sd, boolean checkFirst) throws DefinitionException { if (!checkFirst || !sd.hasDifferential() || hasMissingIds(sd.getDifferential().getElement())) { if (!sd.hasDifferential()) sd.setDifferential(new StructureDefinitionDifferentialComponent()); generateIds(sd.getDifferential().getElement(), sd.getName()); } if (!checkFirst || !sd.hasSnapshot() || hasMissingIds(sd.getSnapshot().getElement())) { if (!sd.hasSnapshot()) sd.setSnapshot(new StructureDefinitionSnapshotComponent()); generateIds(sd.getSnapshot().getElement(), sd.getName()); } }
tgt.setDerivation(convertTypeDerivationRule(src.getDerivation())); if (src.hasSnapshot()) tgt.setSnapshot(convertStructureDefinitionSnapshotComponent(src.getSnapshot())); tgt.setDifferential(convertStructureDefinitionDifferentialComponent(src.getDifferential())); return tgt;