More validator work

This commit is contained in:
jamesagnew 2014-08-28 07:53:41 -04:00
parent c75c37d24d
commit d205075e35
66 changed files with 380 additions and 114 deletions

View File

@ -1,3 +1,10 @@
* XML Dsig
*
* Add SimpleSetters for all primitive datatypes
* Implement and add Simple Getters in a similar way to simple setters

View File

@ -661,6 +661,7 @@ class ParserState<T> {
myPreResourceState = thePreResourceState;
}
@SuppressWarnings("unused")
public void attributeValue(String theName, String theValue) throws DataFormatException {
// ignore by default
}
@ -669,6 +670,7 @@ class ParserState<T> {
// ignore by default
}
@SuppressWarnings("unused")
public void enteringNewElement(String theNamespaceURI, String theLocalPart) throws DataFormatException {
// ignore by default
}
@ -676,6 +678,7 @@ class ParserState<T> {
/**
* Default implementation just handles undeclared extensions
*/
@SuppressWarnings("unused")
public void enteringNewElementExtension(StartElement theElement, String theUrlAttr, boolean theIsModifier) {
if (myPreResourceState != null && getCurrentElement() instanceof ISupportsUndeclaredExtensions) {
ExtensionDt newExtension = new ExtensionDt(theIsModifier, theUrlAttr);

View File

@ -37,7 +37,7 @@ public class ResponseValidatingInterceptor extends InterceptorAdapter {
private FhirValidator myValidator;
/**
* Returns the validator used ny this interceptor
* Returns the validator used by this interceptor
*/
public FhirValidator getValidator() {
return myValidator;

View File

@ -31,8 +31,8 @@ import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.dstu.resource.OperationOutcome;
/**
* Resource validator, which checks resources for compliance against various
* validation schemes (schemas, schematrons, etc.)
* Resource validator, which checks resources for compliance against various validation schemes (schemas, schematrons,
* etc.)
*
* <p>
* To obtain a resource validator, call {@link FhirContext#newValidator()}
@ -51,15 +51,15 @@ public class FhirValidator {
*/
public FhirValidator(FhirContext theFhirContext) {
myContext = theFhirContext;
setValidateBaseSchema(true);
setValidateBaseSchematron(true);
setValidateAgainstStandardSchema(true);
setValidateAgainstStandardSchematron(true);
}
/**
* Should the validator validate the resource against the base schema (the schema provided with the FHIR
* distribution itself)
*/
public boolean isValidateBaseSchema() {
public boolean isValidateAgainstStandardSchema() {
return haveValidatorOfType(SchemaBaseValidator.class);
}
@ -67,15 +67,15 @@ public class FhirValidator {
* Should the validator validate the resource against the base schema (the schema provided with the FHIR
* distribution itself)
*/
public void setValidateBaseSchema(boolean theValidateBaseSchema) {
addOrRemoveValidator(theValidateBaseSchema, SchemaBaseValidator.class, new SchemaBaseValidator());
public void setValidateAgainstStandardSchema(boolean theValidateAgainstStandardSchema) {
addOrRemoveValidator(theValidateAgainstStandardSchema, SchemaBaseValidator.class, new SchemaBaseValidator());
}
/**
* Should the validator validate the resource against the base schema (the schema provided with the FHIR
* distribution itself)
*/
public boolean isValidateBaseSchematron() {
public boolean isValidateAgainstStandardSchematron() {
return haveValidatorOfType(SchematronBaseValidator.class);
}
@ -83,18 +83,23 @@ public class FhirValidator {
* Should the validator validate the resource against the base schematron (the schematron provided with the FHIR
* distribution itself)
*/
public void setValidateBaseSchematron(boolean theValidateBaseSchematron) {
addOrRemoveValidator(theValidateBaseSchematron, SchematronBaseValidator.class, new SchematronBaseValidator());
public void setValidateAgainstStandardSchematron(boolean theValidateAgainstStandardSchematron) {
addOrRemoveValidator(theValidateAgainstStandardSchematron, SchematronBaseValidator.class, new SchematronBaseValidator());
}
/**
* Validates a resource instance, throwing a {@link ValidationFailureException} if the validation fails
*
* @param theResource The resource to validate
* @throws ValidationFailureException If the validation fails
*/
public void validate(IResource theResource) throws ValidationFailureException {
Validate.notNull(theResource, "theResource must not be null");
ValidationContext ctx = new ValidationContext(myContext, theResource);
ValidationContext<IResource> ctx = ValidationContext.forResource(myContext, theResource);
for (IValidator next : myValidators) {
next.validate(ctx);
next.validateResource(ctx);
}
OperationOutcome oo = ctx.getOperationOutcome();
@ -104,8 +109,8 @@ public class FhirValidator {
}
private void addOrRemoveValidator(boolean theValidateBaseSchema, Class<? extends IValidator> type, IValidator instance) {
if (theValidateBaseSchema) {
private void addOrRemoveValidator(boolean theValidateAgainstStandardSchema, Class<? extends IValidator> type, IValidator instance) {
if (theValidateAgainstStandardSchema) {
boolean found = haveValidatorOfType(type);
if (!found) {
myValidators.add(instance);

View File

@ -1,5 +1,7 @@
package ca.uhn.fhir.validation;
import ca.uhn.fhir.model.api.IResource;
/*
* #%L
* HAPI FHIR - Core Library
@ -23,6 +25,6 @@ package ca.uhn.fhir.validation;
interface IValidator {
void validate(ValidationContext theCtx);
void validateResource(ValidationContext<IResource> theCtx);
}

View File

@ -26,8 +26,11 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
@ -43,54 +46,41 @@ import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.dstu.resource.OperationOutcome;
import ca.uhn.fhir.model.dstu.resource.OperationOutcome.Issue;
import ca.uhn.fhir.model.dstu.valueset.IssueSeverityEnum;
class SchemaBaseValidator implements IValidator {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SchemaBaseValidator.class);
private Map<Class<? extends IResource>, Schema> myClassToSchema = new HashMap<Class<? extends IResource>, Schema>();
private static final Set<String> SCHEMA_NAMES;
private Schema loadSchema(final Class<? extends IResource> theClass, ValidationContext theValidationCtx) {
synchronized (myClassToSchema) {
Schema schema = myClassToSchema.get(theClass);
if (schema != null) {
return schema;
static {
HashSet<String> sn = new HashSet<String>();
sn.add("xml.xsd");
sn.add("xhtml1-strict.xsd");
sn.add("fhir-single.xsd");
sn.add("tombstone.xsd");
sn.add("opensearch.xsd");
sn.add("opensearchscore.xsd");
sn.add("xmldsig-core-schema.xsd");
SCHEMA_NAMES = Collections.unmodifiableSet(sn);
}
Source baseSource = loadXml(theValidationCtx, theClass, null, "fhir-single.xsd");
private Map<String, Schema> myKeyToSchema = new HashMap<String, Schema>();
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory.setResourceResolver(new MyResourceResolver(theClass));
try {
schema = schemaFactory.newSchema(new Source[] { baseSource });
} catch (SAXException e) {
throw new ConfigurationException("Could not load/parse schema file", e);
}
myClassToSchema.put(theClass, schema);
return schema;
}
}
private Source loadXml(ValidationContext theCtx, Class<? extends IResource> theClass, String theSystemId, String theSchemaName) {
Class<? extends IResource> baseResourceClass = theCtx.getFhirContext().getResourceDefinition(theClass).getBaseDefinition().getImplementingClass();
Package pack = baseResourceClass.getPackage();
String pathToBase = pack.getName().replace('.', '/') + '/' + theSchemaName;
InputStream baseIs = FhirValidator.class.getClassLoader().getResourceAsStream(pathToBase);
if (baseIs == null) {
throw new ValidationFailureException("No FHIR-BASE schema found");
}
Source baseSource = new StreamSource(baseIs, theSystemId);
return baseSource;
public void validateBundle(ValidationContext<Bundle> theContext) {
doValidate(theContext, "fhir-atom-single.xsd");
}
@Override
public void validate(ValidationContext theContext) {
OperationOutcome outcome = theContext.getOperationOutcome();
public void validateResource(ValidationContext<IResource> theContext) {
doValidate(theContext, "fhir-single.xsd");
}
private void doValidate(ValidationContext<?> theContext, String schemaName) {
Schema schema = loadSchema("dstu", schemaName);
Schema schema = loadSchema(outcome.getClass(), theContext);
try {
Validator validator = schema.newValidator();
MyErrorHandler handler = new MyErrorHandler(theContext);
@ -104,21 +94,87 @@ class SchemaBaseValidator implements IValidator {
}
}
private static final class MyResourceResolver implements LSResourceResolver {
private final Class<? extends IResource> myClass;
private Schema loadSchema(String theVersion, String theSchemaName) {
String key = theVersion + "-" + theSchemaName;
private MyResourceResolver(Class<? extends IResource> theClass) {
myClass = theClass;
synchronized (myKeyToSchema) {
Schema schema = myKeyToSchema.get(key);
if (schema != null) {
return schema;
}
Source baseSource = loadXml("dstu", null, theSchemaName);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory.setResourceResolver(new MyResourceResolver("dstu"));
try {
schema = schemaFactory.newSchema(new Source[] { baseSource });
} catch (SAXException e) {
throw new ConfigurationException("Could not load/parse schema file", e);
}
myKeyToSchema.put(key, schema);
return schema;
}
}
private Source loadXml(String theVersion, String theSystemId, String theSchemaName) {
String pathToBase = "ca/uhn/fhir/model/" + theVersion + "/schema/" + theSchemaName;
InputStream baseIs = FhirValidator.class.getClassLoader().getResourceAsStream(pathToBase);
if (baseIs == null) {
throw new ValidationFailureException("No FHIR-BASE schema found");
}
Source baseSource = new StreamSource(baseIs, theSystemId);
return baseSource;
}
private static class MyErrorHandler implements org.xml.sax.ErrorHandler {
private ValidationContext<?> myContext;
public MyErrorHandler(ValidationContext<?> theContext) {
myContext = theContext;
}
@Override
public void error(SAXParseException theException) throws SAXException {
addIssue(theException, IssueSeverityEnum.ERROR);
}
@Override
public void fatalError(SAXParseException theException) throws SAXException {
addIssue(theException, IssueSeverityEnum.FATAL);
}
@Override
public void warning(SAXParseException theException) throws SAXException {
addIssue(theException, IssueSeverityEnum.WARNING);
}
private void addIssue(SAXParseException theException, IssueSeverityEnum severity) {
Issue issue = myContext.getOperationOutcome().addIssue();
issue.setSeverity(severity);
issue.setDetails(theException.getLocalizedMessage());
issue.addLocation().setValue("Line[" + theException.getLineNumber() + "] Col[" + theException.getColumnNumber() + "]");
}
}
private static final class MyResourceResolver implements LSResourceResolver {
private String myVersion;
private MyResourceResolver(String theVersion) {
myVersion = theVersion;
}
@Override
public LSInput resolveResource(String theType, String theNamespaceURI, String thePublicId, String theSystemId, String theBaseURI) {
if ("xml.xsd".equals(theSystemId) || "xhtml1-strict.xsd".equals(theSystemId)) {
if (theSystemId != null && SCHEMA_NAMES.contains(theSystemId)) {
LSInputImpl input = new LSInputImpl();
input.setPublicId(thePublicId);
input.setSystemId(theSystemId);
input.setBaseURI(theBaseURI);
String pathToBase = myClass.getPackage().getName().replace('.', '/') + '/' + theSystemId;
String pathToBase = "ca/uhn/fhir/model/" + myVersion + "/schema/" + theSystemId;
InputStream baseIs = FhirValidator.class.getClassLoader().getResourceAsStream(pathToBase);
if (baseIs == null) {
throw new ValidationFailureException("No FHIR-BASE schema found");
@ -152,36 +208,4 @@ class SchemaBaseValidator implements IValidator {
}
}
private static class MyErrorHandler implements org.xml.sax.ErrorHandler {
private ValidationContext myContext;
public MyErrorHandler(ValidationContext theContext) {
myContext = theContext;
}
@Override
public void error(SAXParseException theException) throws SAXException {
addIssue(theException, IssueSeverityEnum.ERROR);
}
@Override
public void fatalError(SAXParseException theException) throws SAXException {
addIssue(theException, IssueSeverityEnum.FATAL);
}
@Override
public void warning(SAXParseException theException) throws SAXException {
addIssue(theException, IssueSeverityEnum.WARNING);
}
private void addIssue(SAXParseException theException, IssueSeverityEnum severity) {
Issue issue = myContext.getOperationOutcome().addIssue();
issue.setSeverity(severity);
issue.setDetails(theException.getLocalizedMessage());
issue.addLocation().setValue("Line[" + theException.getLineNumber() + "] Col[" + theException.getColumnNumber() + "]");
}
}
}

View File

@ -45,7 +45,7 @@ public class SchematronBaseValidator implements IValidator {
private Map<Class<? extends IResource>, ISchematronResource> myClassToSchematron = new HashMap<Class<? extends IResource>, ISchematronResource>();
@Override
public void validate(ValidationContext theCtx) {
public void validateResource(ValidationContext<IResource> theCtx) {
ISchematronResource sch = getSchematron(theCtx);
StreamSource source = new StreamSource(new StringReader(theCtx.getXmlEncodedResource()));
@ -83,22 +83,21 @@ public class SchematronBaseValidator implements IValidator {
}
private ISchematronResource getSchematron(ValidationContext theCtx) {
private ISchematronResource getSchematron(ValidationContext<IResource> theCtx) {
Class<? extends IResource> resource = theCtx.getResource().getClass();
Class<? extends IResource> baseResourceClass = theCtx.getFhirContext().getResourceDefinition(resource).getBaseDefinition().getImplementingClass();
return getSchematronAndCache(theCtx, baseResourceClass);
return getSchematronAndCache(theCtx, "dstu",baseResourceClass);
}
private ISchematronResource getSchematronAndCache(ValidationContext theCtx, Class<? extends IResource> theClass) {
private ISchematronResource getSchematronAndCache(ValidationContext<IResource> theCtx, String theVersion , Class<? extends IResource> theClass) {
synchronized (myClassToSchematron) {
ISchematronResource retVal = myClassToSchematron.get(theClass);
if (retVal != null) {
return retVal;
}
Package pack = theClass.getPackage();
String pathToBase = pack.getName().replace('.', '/') + '/' + theCtx.getFhirContext().getResourceDefinition(theCtx.getResource()).getBaseDefinition().getName().toLowerCase() + ".sch";
String pathToBase = "ca/uhn/fhir/model/"+theVersion+"/schema/" + theCtx.getFhirContext().getResourceDefinition(theCtx.getResource()).getBaseDefinition().getName().toLowerCase() + ".sch";
InputStream baseIs = FhirValidator.class.getClassLoader().getResourceAsStream(pathToBase);
if (baseIs == null) {
throw new ValidationFailureException("No schematron found for resource type: " + theCtx.getFhirContext().getResourceDefinition(theCtx.getResource()).getBaseDefinition().getImplementingClass().getCanonicalName());

View File

@ -21,26 +21,26 @@ package ca.uhn.fhir.validation;
*/
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.dstu.resource.OperationOutcome;
class ValidationContext {
class ValidationContext<T> {
private FhirContext myFhirContext;
private final IEncoder myEncoder;
private final FhirContext myFhirContext;
private OperationOutcome myOperationOutcome;
private IResource myResource;
private final T myResource;
private String myXmlEncodedResource;
public ValidationContext(FhirContext theContext, IResource theResource) {
private ValidationContext(FhirContext theContext, T theResource, IEncoder theEncoder) {
myFhirContext = theContext;
myResource = theResource;
myEncoder = theEncoder;
}
public String getXmlEncodedResource() {
if (myXmlEncodedResource == null) {
myXmlEncodedResource = myFhirContext.newXmlParser().encodeResourceToString(myResource);
}
return myXmlEncodedResource;
public FhirContext getFhirContext() {
return myFhirContext;
}
public OperationOutcome getOperationOutcome() {
@ -50,12 +50,37 @@ class ValidationContext {
return myOperationOutcome;
}
public FhirContext getFhirContext() {
return myFhirContext;
}
public IResource getResource() {
public T getResource() {
return myResource;
}
public String getXmlEncodedResource() {
if (myXmlEncodedResource == null) {
myXmlEncodedResource = myEncoder.encode();
}
return myXmlEncodedResource;
}
public static ValidationContext<Bundle> forBundle(final FhirContext theContext, final Bundle theBundle) {
return new ValidationContext<Bundle>(theContext, theBundle, new IEncoder() {
@Override
public String encode() {
return theContext.newXmlParser().encodeBundleToString(theBundle);
}
});
}
public static ValidationContext<IResource> forResource(final FhirContext theContext, final IResource theResource) {
return new ValidationContext<IResource>(theContext, theResource, new IEncoder() {
@Override
public String encode() {
return theContext.newXmlParser().encodeResourceToString(theResource);
}
});
}
private interface IEncoder {
String encode();
}
}

View File

@ -0,0 +1,201 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2011-2012, HL7, Inc
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of HL7 nor the names of its contributors may be used to
endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Generated on Mon, Feb 3, 2014 23:47+1100 for FHIR v0.80
-->
<xs:schema xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:os="http://a9.com/-/spec/opensearch/1.1/" xmlns:osr="http://a9.com/-/opensearch/extensions/relevance/1.0/"
xmlns:fhir="http://hl7.org/fhir" xmlns:at="http://purl.org/atompub/tombstones/1.0" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://www.w3.org/2005/Atom" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:annotation>
<xs:documentation>
This is a reduced form of the atom schema, that only supports the features profiled in the FHIR specification
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
<xs:import namespace="http://hl7.org/fhir" schemaLocation="fhir-single.xsd"/>
<xs:import namespace="http://purl.org/atompub/tombstones/1.0" schemaLocation="tombstone.xsd"/>
<xs:import namespace="http://a9.com/-/spec/opensearch/1.1/" schemaLocation="opensearch.xsd"/>
<xs:import namespace="http://a9.com/-/opensearch/extensions/relevance/1.0/" schemaLocation="opensearchscore.xsd"/>
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>
<xs:element name="feed" type="atom:FeedType"/>
<xs:complexType name="TextType" mixed="true">
<xs:annotation>
<xs:documentation>
The Atom text construct is defined in section 3.1 of the format spec.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:any namespace="http://www.w3.org/1999/xhtml" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="type">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="text"/>
<xs:enumeration value="html"/>
<xs:enumeration value="xhtml"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attributeGroup ref="atom:CommonAttributes"/>
</xs:complexType>
<xs:complexType name="PersonType">
<xs:choice maxOccurs="unbounded">
<xs:element name="name" type="xs:string"/>
<xs:element name="uri" type="atom:UriType" minOccurs="0"/>
</xs:choice>
<xs:attributeGroup ref="atom:CommonAttributes"/>
</xs:complexType>
<xs:complexType name="FeedType">
<xs:sequence>
<xs:choice minOccurs="3" maxOccurs="unbounded">
<xs:element name="title" type="atom:TextType"/>
<xs:element name="updated" type="atom:DateTimeType"/>
<xs:element name="id" type="atom:IdType"/>
<xs:element name="link" type="atom:LinkType"/>
<xs:element name="author" type="atom:PersonType" maxOccurs="unbounded"/>
<xs:element name="category" type="atom:CategoryType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="entry" type="atom:EntryType"/>
<xs:element ref="at:deleted-entry"/>
<xs:element ref="os:totalResults"/>
<xs:element ref="osr:score"/>
</xs:choice>
<xs:element ref="ds:Signature" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attributeGroup ref="atom:CommonAttributes"/>
</xs:complexType>
<xs:complexType name="EntryType">
<xs:choice maxOccurs="unbounded">
<xs:element name="title" type="atom:TextType"/>
<xs:element name="link" type="atom:LinkType"/>
<xs:element name="id" type="atom:IdType"/>
<xs:element name="updated" type="atom:DateTimeType"/>
<xs:element name="published" type="atom:DateTimeType" minOccurs="0"/>
<xs:element name="author" type="atom:PersonType" maxOccurs="unbounded"/>
<xs:element name="category" type="atom:CategoryType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="content" type="atom:ContentType" minOccurs="0"/>
<xs:element name="summary" type="atom:TextType"/>
</xs:choice>
<xs:attributeGroup ref="atom:CommonAttributes"/>
</xs:complexType>
<xs:complexType name="CategoryType">
<xs:attribute name="term" type="xs:anyURI" use="required"/>
<xs:attribute name="scheme" type="xs:anyURI" use="required"/>
<xs:attribute name="label" type="xs:string" use="optional"/>
<xs:attributeGroup ref="atom:CommonAttributes"/>
</xs:complexType>
<xs:complexType name="ContentType" mixed="true">
<xs:choice>
<xs:element ref="fhir:Binary"/>
<xs:element ref="atom:feed" />
<xs:element ref="fhir:AdverseReaction"/>
<xs:element ref="fhir:Alert"/>
<xs:element ref="fhir:AllergyIntolerance"/>
<xs:element ref="fhir:CarePlan"/>
<xs:element ref="fhir:Composition"/>
<xs:element ref="fhir:ConceptMap"/>
<xs:element ref="fhir:Condition"/>
<xs:element ref="fhir:Conformance"/>
<xs:element ref="fhir:Device"/>
<xs:element ref="fhir:DeviceObservationReport"/>
<xs:element ref="fhir:DiagnosticOrder"/>
<xs:element ref="fhir:DiagnosticReport"/>
<xs:element ref="fhir:DocumentManifest"/>
<xs:element ref="fhir:DocumentReference"/>
<xs:element ref="fhir:Encounter"/>
<xs:element ref="fhir:FamilyHistory"/>
<xs:element ref="fhir:Group"/>
<xs:element ref="fhir:ImagingStudy"/>
<xs:element ref="fhir:Immunization"/>
<xs:element ref="fhir:ImmunizationRecommendation"/>
<xs:element ref="fhir:List"/>
<xs:element ref="fhir:Location"/>
<xs:element ref="fhir:Media"/>
<xs:element ref="fhir:Medication"/>
<xs:element ref="fhir:MedicationAdministration"/>
<xs:element ref="fhir:MedicationDispense"/>
<xs:element ref="fhir:MedicationPrescription"/>
<xs:element ref="fhir:MedicationStatement"/>
<xs:element ref="fhir:MessageHeader"/>
<xs:element ref="fhir:Observation"/>
<xs:element ref="fhir:OperationOutcome"/>
<xs:element ref="fhir:Order"/>
<xs:element ref="fhir:OrderResponse"/>
<xs:element ref="fhir:Organization"/>
<xs:element ref="fhir:Other"/>
<xs:element ref="fhir:Patient"/>
<xs:element ref="fhir:Practitioner"/>
<xs:element ref="fhir:Procedure"/>
<xs:element ref="fhir:Profile"/>
<xs:element ref="fhir:Provenance"/>
<xs:element ref="fhir:Query"/>
<xs:element ref="fhir:Questionnaire"/>
<xs:element ref="fhir:RelatedPerson"/>
<xs:element ref="fhir:SecurityEvent"/>
<xs:element ref="fhir:Specimen"/>
<xs:element ref="fhir:Substance"/>
<xs:element ref="fhir:Supply"/>
<xs:element ref="fhir:ValueSet"/>
</xs:choice>
<xs:attribute name="type" type="xs:string"/>
<xs:attributeGroup ref="atom:CommonAttributes"/>
</xs:complexType>
<xs:complexType name="UriType">
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attributeGroup ref="atom:CommonAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="LinkType" mixed="true">
<xs:attribute name="href" type="xs:anyURI" use="required"/>
<xs:attribute name="rel" type="xs:string" use="optional"/>
<xs:attribute name="type" type="xs:string" use="optional"/>
<xs:attribute name="hreflang" type="xs:NMTOKEN" use="optional"/>
<xs:attribute name="title" type="xs:string" use="optional"/>
<xs:attribute name="length" type="xs:positiveInteger" use="optional"/>
<xs:attributeGroup ref="atom:CommonAttributes"/>
</xs:complexType>
<xs:complexType name="IdType">
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attributeGroup ref="atom:CommonAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="DateTimeType">
<xs:simpleContent>
<xs:extension base="xs:dateTime">
<xs:attributeGroup ref="atom:CommonAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:attributeGroup name="CommonAttributes">
<xs:attribute ref="xml:base"/>
<xs:attribute ref="xml:lang"/>
</xs:attributeGroup>
</xs:schema>

View File

@ -23,8 +23,8 @@ public class ResourceValidatorTest {
Patient p = ourCtx.newXmlParser().parseResource(Patient.class, res);
FhirValidator val = ourCtx.newValidator();
val.setValidateBaseSchema(true);
val.setValidateBaseSchematron(false);
val.setValidateAgainstStandardSchema(true);
val.setValidateAgainstStandardSchematron(false);
val.validate(p);
@ -49,8 +49,8 @@ public class ResourceValidatorTest {
Patient p = ourCtx.newXmlParser().parseResource(Patient.class, res);
FhirValidator val = ourCtx.newValidator();
val.setValidateBaseSchema(false);
val.setValidateBaseSchematron(true);
val.setValidateAgainstStandardSchema(false);
val.setValidateAgainstStandardSchematron(true);
val.validate(p);