forked from FirelyTeam/Firely.Fhir.ValidationDemo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MainForm.cs
130 lines (111 loc) · 4.82 KB
/
MainForm.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using Furore.Fhir.ValidationDemo.Properties;
using Hl7.Fhir.Model;
using Hl7.Fhir.Serialization;
using Hl7.Fhir.Specification.Source;
using Hl7.Fhir.Validation;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Furore.Fhir.ValidationDemo
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
// Create a resource resolver that searches for the core resources in 'specification.zip', which comes with the .NET FHIR Specification NuGet package
// We create a source that takes its contents from a ZIP file (in this case the default 'specification.zip'). We decorate that source by encapsulating
// it in a CachedResolver, which speeds up access by caching conformance resources once we got them from the large files in the ZIP.
CoreSource = new CachedResolver(ZipSource.CreateValidationSource());
}
internal IResourceResolver DirectorySource;
internal IResourceResolver CoreSource;
internal IResourceResolver CombinedSource;
private void refreshProfileSource()
{
try
{
var profilePath = txtProfileDirectory.Text;
if (!String.IsNullOrEmpty(profilePath) && Directory.Exists(profilePath))
{
// We not only have a source for core data, we also read data from a user-specified directory. We also cache the contents of this source, like
// we did with the CoreSource above.
DirectorySource = new CachedResolver(new DirectorySource(profilePath, includeSubdirectories: true));
// Finally, we combine both sources, so we will find profiles both from the core zip as well as from the directory.
// By mentioning the directory source first, anything in the user directory will override what is in the core zip.
CombinedSource = new MultiResolver(DirectorySource, CoreSource);
}
else
CombinedSource = CoreSource;
}
catch(Exception e)
{
MessageBox.Show($"Composing the profile source failed: {e.Message}", "Profile source");
}
}
private void txtProfileDirectory_TextChanged(object sender, EventArgs e)
{
refreshProfileSource();
}
private void btnReload_Click(object sender, EventArgs e)
{
refreshProfileSource();
}
private void MainForm_Load(object sender, EventArgs e)
{
refreshProfileSource();
}
private void btnOpenProfileDir_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(txtProfileDirectory.Text))
folderBrowserDialog.SelectedPath = txtProfileDirectory.Text;
DialogResult result = folderBrowserDialog.ShowDialog();
if (result == DialogResult.OK)
txtProfileDirectory.Text = folderBrowserDialog.SelectedPath;
}
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
Settings.Default.Save();
}
private void btnValidate_Click(object sender, EventArgs e)
{
// The validator generates an OperationOutcome as output;
OperationOutcome result = null;
if (String.IsNullOrEmpty(txtInstanceXml.Text))
{
result = new OperationOutcome();
}
else
{
// Configure the validator based on the user's settings
// This includes a reference to the resolver that we have constructed in previous methods
// and which helps the validator to look for profiles
ValidationSettings settings = ValidationSettings.Default;
settings.EnableXsdValidation = chkXsdValidation.Checked;
settings.Trace = chkShowTraceInfo.Checked;
settings.ResourceResolver = this.CombinedSource;
// This is a really cheap operation, so we can
var validator = new Validator(settings);
var reader = SerializationUtil.XmlReaderFromXmlText(txtInstanceXml.Text);
result = validator.Validate(reader);
}
if(result.Success)
{
txtOutcome.ForeColor = txtInstanceXml.ForeColor;
txtOutcome.Text = result.ToString();
}
else
{
txtOutcome.ForeColor = Color.Red;
txtOutcome.Text = result.ToString();
}
}
}
}