Beispiel #1
0
        public static void ExpandProfileFile(string inputfile, string outputfile)
        {
            var source   = new CachedArtifactSource(ArtifactResolver.CreateOffline());
            var expander = new ProfileExpander(source);

            string xml  = File.ReadAllText(inputfile);
            var    diff = (Profile)FhirParser.ParseResourceFromXml(xml);

            expander.Expand(diff);
            xml = FhirSerializer.SerializeResourceToXml(diff);
            File.WriteAllText(outputfile, xml);
        }
Beispiel #2
0
        public static void ExpandProfileFile(string inputfile, string outputfile)
        {
            var source = ArtifactResolver.CreateOffline();
            //var source = new CachedArtifactSource(ArtifactResolver.CreateOffline());
            var expander = new SnapshotGenerator(source);

            string xml  = File.ReadAllText(inputfile);
            var    diff = (new FhirXmlParser()).Parse <StructureDefinition>(xml);

            expander.Generate(diff);
            xml = FhirSerializer.SerializeResourceToXml(diff);
            File.WriteAllText(outputfile, xml);
        }
 public void SetupSource()
 {
     source = ArtifactResolver.CreateOffline();
 }
Beispiel #4
0
        public static OperationOutcome ValidateEntry(ResourceEntry entry)
        {
            OperationOutcome result = new OperationOutcome();

            result.Issue = new List <OperationOutcome.OperationOutcomeIssueComponent>();

            ICollection <ValidationResult> vresults = new List <ValidationResult>();


            // Phase 1, validate against low-level rules built into the FHIR datatypes

            // todo: The API no longer seems to have the FhirValidator class.

            /*
             * (!FhirValidator.TryValidate(entry.Resource, vresults, recurse: true))
             * {
             *  foreach (var vresult in vresults)
             *      result.Issue.Add(createValidationResult("[.NET validation] " + vresult.ErrorMessage, vresult.MemberNames));
             * }
             */

            // Phase 2, validate against the XML schema
            var xml = FhirSerializer.SerializeResourceToXml(entry.Resource);
            var doc = XDocument.Parse(xml);

            doc.Validate(SchemaCollection.ValidationSchemaSet, (source, args) => result.Issue.Add(createValidationResult("[XSD validation] " + args.Message, null)));


            // Phase 3, validate against a profile, if present
            var profileTags = entry.GetAssertedProfiles();

            if (profileTags.Count() == 0)
            {
                // If there's no profile specified, at least compare it to the "base" profile
                string baseProfile = CoreZipArtifactSource.CORE_SPEC_PROFILE_URI_PREFIX + entry.Resource.GetCollectionName();
                profileTags = new Uri[] { new Uri(baseProfile, UriKind.Absolute) };
            }

            var artifactSource = ArtifactResolver.CreateOffline();
            var specProvider   = new SpecificationProvider(artifactSource);

            foreach (var profileTag in profileTags)
            {
                var specBuilder = new SpecificationBuilder(specProvider);
                specBuilder.Add(StructureFactory.PrimitiveTypes());
                specBuilder.Add(StructureFactory.MetaTypes());
                specBuilder.Add(StructureFactory.NonFhirNamespaces());
                specBuilder.Add(profileTag.ToString());
                specBuilder.Expand();

                string path = Directory.GetCurrentDirectory();

                var spec = specBuilder.ToSpecification();
                var nav  = doc.CreateNavigator();
                nav.MoveToFirstChild();

                Report report = spec.Validate(nav);
                var    errors = report.Errors;
                foreach (var error in errors)
                {
                    result.Issue.Add(createValidationResult("[Profile validator] " + error.Message, null));
                }
            }

            if (result.Issue.Count == 0)
            {
                return(null);
            }
            else
            {
                return(result);
            }
        }