package org.hl7.fhir.instance.validation;
import java.util.ArrayList;
import java.util.List;
import org.hl7.fhir.instance.model.ElementDefinition;
import org.hl7.fhir.instance.model.StructureDefinition;
import org.hl7.fhir.instance.utils.WorkerContext;
public class ProfileValidator {
WorkerContext context;
public void setContext(WorkerContext context) {
this.context = context;
}
public List<String> validate(StructureDefinition profile) throws Exception {
List<String> errors = new ArrayList<String>();
// first check: extensions must exist
for (ElementDefinition ec : profile.getDifferential().getElement()) {
checkExtensions(profile, errors, "differential", ec);
}
if (!profile.hasSnapshot())
errors.add("missing Snapshot at "+profile.getName()+"."+profile.getName());
else for (ElementDefinition ec : profile.getSnapshot().getElement()) {
checkExtensions(profile, errors, "snapshot", ec);
}
return errors;
}
private void checkExtensions(StructureDefinition profile, List<String> errors, String kind, ElementDefinition ec) throws Exception {
if (!ec.getType().isEmpty() && ec.getType().get(0).getCode().equals("Extension") && ec.getType().get(0).hasProfile()) {
String url = ec.getType().get(0).getProfile().get(0).getValue();
StructureDefinition defn = context.getExtensionStructure(null, url);
if (defn == null)
errors.add("Unable to find Extension '"+url+"' referenced at "+profile.getUrl()+" "+kind+" "+ec.getPath()+" ("+ec.getName()+")");
}
}
}