private void UpdateConstraintCodeSystem(TemplateConstraint constraint, ImportConstraint importConstraint) { if (importConstraint.CodeSystem != null && !string.IsNullOrEmpty(importConstraint.CodeSystem.identifier)) { ImportCodeSystem importCs = importConstraint.CodeSystem; CodeSystem foundCodeSystem = this.tdb.CodeSystems.FirstOrDefault(y => y.Oid.ToLower() == importCs.identifier.ToLower()); if (foundCodeSystem == null) { if (string.IsNullOrEmpty(importCs.name)) { this.errors.Add(string.Format( "Code System with oid \"{0}\" could not be found for constraint with number \"{1}\" in template with identifier \"{2}\"", importCs.identifier, importConstraint.number, constraint.Template.Oid)); throw new Exception("Constraint has an error."); } foundCodeSystem = new CodeSystem() { Name = importCs.name, Oid = importCs.identifier, Description = "Automatically generated by template import" }; this.tdb.CodeSystems.Add(foundCodeSystem); } constraint.CodeSystem = foundCodeSystem; } }
private void UpdateConstraintSamples(TemplateConstraint constraint, ImportConstraint importConstraint) { List <TemplateConstraintSample> foundSamples = new List <TemplateConstraintSample>(); if (importConstraint.Sample != null && importConstraint.Sample.Count > 0) { foreach (var importSample in importConstraint.Sample) { if (string.IsNullOrEmpty(importSample.name)) { errors.Add("Constraint sample does not have a name"); continue; } // Look for a match sample by both name and sample text. Maybe they changed the name, or maybe the change the sample text. // If they only changed one, then we should update the existing entry. // If they updated both, we won't find a match, and should add a new one. All non-matched samples will be deleted var foundSample = constraint.Samples.SingleOrDefault(y => y.Name.ToLower() == importSample.name.ToLower()); if (foundSample == null && !string.IsNullOrEmpty(importSample.Value)) { foundSample = constraint.Samples.SingleOrDefault(y => y.SampleText != null && y.SampleText.ToLower().Replace("\r", "").Replace("\n", "") == importSample.Value.ToLower().Replace("\r", "").Replace("\n", "")); } if (foundSample == null) { var newSample = new TemplateConstraintSample() { Constraint = constraint, Name = importSample.name, SampleText = importSample.Value }; this.tdb.TemplateConstraintSamples.Add(newSample); } else { if (foundSample.Name != importSample.name) { foundSample.Name = importSample.name; } if (AreStringsDifferent(foundSample.SampleText, importSample.Value)) { foundSample.SampleText = importSample.Value; } } foundSamples.Add(foundSample); } } var deleteSamples = (from cs in constraint.Samples where !foundSamples.Contains(cs) select cs).ToList(); foreach (var deleteSample in deleteSamples) { this.tdb.TemplateConstraintSamples.Remove(deleteSample); } }
private void UpdateConstraintBinding(TemplateConstraint constraint, ImportConstraint importConstraint) { if (importConstraint.Item is ImportSingleValueCode) { ImportSingleValueCode importSvc = importConstraint.Item as ImportSingleValueCode; if (constraint.Value != importSvc.code) { constraint.Value = importSvc.code; } if (constraint.DisplayName != importSvc.displayName) { constraint.DisplayName = importSvc.displayName; } } else if (importConstraint.Item is ImportValueSet) { ImportValueSet importVs = importConstraint.Item as ImportValueSet; if (AreBooleansDifferent(constraint.IsStatic, importVs.isStatic, importVs.isStaticSpecified)) { constraint.IsStatic = importVs.isStatic; } // Old bug in Trifolia allowing the same value set identifier to be used more than once var foundValueSets = this.tdb.ValueSets.Where(y => y.Oid.ToLower() == importVs.identifier.ToLower()).ToList(); if (foundValueSets.Count == 0) { var newValueSet = new ValueSet() { Oid = importVs.identifier, Name = string.IsNullOrEmpty(importVs.name) ? importVs.identifier + " incomplete" : importVs.name, IsIncomplete = true, Description = "Automatically generated by template import", LastUpdate = DateTime.Now }; this.tdb.ValueSets.AddObject(newValueSet); foundValueSets.Add(newValueSet); } if (constraint.ValueSet != null && foundValueSets.Contains(constraint.ValueSet)) { return; } if (constraint.ValueSet != foundValueSets.First()) { constraint.ValueSet = foundValueSets.First(); } } }
private bool ImportConstraintExists(ImportConstraint importConstraint, int number) { if (importConstraint.number == number) { return(true); } foreach (var childConstraint in importConstraint.Constraint) { if (ImportConstraintExists(childConstraint, number)) { return(true); } } return(false); }
private void UpdateConstraintCategories(TemplateConstraint constraint, ImportConstraint importConstraint) { if (importConstraint.Category == null || importConstraint.Category.Count == 0) { if (!string.IsNullOrEmpty(constraint.Category)) { constraint.Category = string.Empty; } return; } var categories = importConstraint.Category.Select(y => y.name.Replace(',', '-')); var categoriesString = String.Join(",", categories); if (AreStringsDifferent(constraint.Category, categoriesString)) { constraint.Category = categoriesString; } }
public static ExportConstraint Export(this TemplateConstraint constraint, IObjectRepository tdb, IGSettingsManager igSettings, IIGTypePlugin igTypePlugin, bool isVerbose = false, List <string> categories = null) { ExportConstraint exportConstraint = new ExportConstraint() { number = constraint.Number != null ? constraint.Number.Value : 0, numberSpecified = constraint.Number != null, displayNumber = constraint.DisplayNumber, context = constraint.Context, conformance = GetExportConformance(constraint.Conformance), cardinality = !string.IsNullOrEmpty(constraint.Cardinality) ? constraint.Cardinality : null, dataType = !string.IsNullOrEmpty(constraint.DataType) ? constraint.DataType : null, isBranch = constraint.IsBranch, isBranchIdentifier = constraint.IsBranchIdentifier, isSchRooted = constraint.IsSchRooted, isPrimitive = constraint.IsPrimitive, isStatic = constraint.IsStatic == true, isStaticSpecified = constraint.IsStatic != null, isInheritable = constraint.IsInheritable, SchematronTest = !string.IsNullOrEmpty(constraint.Schematron) ? constraint.Schematron : null, isVerbose = isVerbose, mustSupport = constraint.MustSupport, isModifier = constraint.IsModifier, isHeading = constraint.IsHeading, HeadingDescription = constraint.HeadingDescription, Notes = constraint.Notes, Label = constraint.Label }; var containedTemplates = (from tcr in constraint.References join t in tdb.Templates on tcr.ReferenceIdentifier equals t.Oid where tcr.ReferenceType == ConstraintReferenceTypes.Template select t); foreach (var containedTemplate in containedTemplates) { exportConstraint.ContainedTemplate.Add(new Shared.ImportExport.Model.ConstraintTypeContainedTemplate() { identifier = containedTemplate.Oid, type = containedTemplate.PrimaryContextType }); } if (!string.IsNullOrEmpty(constraint.Category)) { exportConstraint.Category = (from c in constraint.Category.Split(',') select new ExportCategory() { name = c }).ToList(); } if (!string.IsNullOrEmpty(constraint.Value)) { ExportSingleValueCode exportSVC = new ExportSingleValueCode() { code = constraint.Value, displayName = constraint.DisplayName }; exportConstraint.Item = exportSVC; } else if (constraint.ValueSet != null) { ExportValueSet exportValueSet = new ExportValueSet() { name = constraint.ValueSet.Name, isStatic = constraint.IsStatic == true, isStaticSpecified = constraint.IsStatic != null, identifier = constraint.ValueSet.GetIdentifier(igTypePlugin), date = constraint.ValueSetDate.HasValue ? constraint.ValueSetDate.Value : DateTime.MinValue, dateSpecified = constraint.ValueSetDate.HasValue }; exportConstraint.Item = exportValueSet; } if (constraint.CodeSystem != null) { exportConstraint.CodeSystem = new ExportCodeSystem() { identifier = constraint.CodeSystem.Oid, name = constraint.CodeSystem.Name }; } else { exportConstraint.CodeSystem = null; } if (!string.IsNullOrEmpty(constraint.Description)) { exportConstraint.Description = constraint.Description; } if (!string.IsNullOrEmpty(constraint.Label)) { exportConstraint.Label = constraint.Label; } if (!constraint.IsPrimitive) { IFormattedConstraint fc = FormattedConstraintFactory.NewFormattedConstraint(tdb, igSettings, igTypePlugin, constraint); // Only include the generated narrative, as Description and Label are already exported in separate fields. exportConstraint.NarrativeText = fc.GetPlainText(false, false, false); } else { exportConstraint.NarrativeText = constraint.PrimitiveText; } // Get all child constraints and build a new export-version of the constraint var childConstraints = constraint.ChildConstraints.Where(y => y.ParentConstraintId == constraint.Id).OrderBy(y => y.Order); foreach (var cChildConstraint in childConstraints) { if (!cChildConstraint.CategoryIsMatch(categories)) { continue; } exportConstraint.Constraint.Add(cChildConstraint.Export(tdb, igSettings, igTypePlugin, isVerbose, categories)); } return(exportConstraint); }
private void AddImportConstraint(TDBTemplate template, TDBTemplateConstraint parentConstraint, ImportConstraint importConstraint) { if (importConstraint.isVerbose) { return; } TDBTemplateConstraint constraint = null; if (importConstraint.numberSpecified) { constraint = template.ChildConstraints.SingleOrDefault(y => y.ParentConstraint == parentConstraint && y.Number == importConstraint.number); } else if (!string.IsNullOrEmpty(importConstraint.displayNumber)) { constraint = template.ChildConstraints.SingleOrDefault(y => y.ParentConstraint == parentConstraint && y.DisplayNumber == importConstraint.displayNumber); } if (constraint == null) { constraint = new TDBTemplateConstraint(); constraint.Number = importConstraint.number; constraint.DisplayNumber = importConstraint.displayNumber; constraint.Template = template; constraint.ParentConstraint = parentConstraint; this.tdb.TemplateConstraints.Add(constraint); // TODO: Order the constraint? Or let the template re-order the constraints when it is edited? } this.UpdateConstraintProperties(constraint, importConstraint); this.UpdateConstraintContainedTemplate(constraint, importConstraint.ContainedTemplate); this.UpdateConstraintBinding(constraint, importConstraint); this.UpdateConstraintCodeSystem(constraint, importConstraint); this.UpdateConstraintCategories(constraint, importConstraint); this.UpdateConstraintSamples(constraint, importConstraint); // Add each of the constraint's child constraints if (importConstraint.Constraint != null) { importConstraint.Constraint.ToList().ForEach(y => AddImportConstraint(template, constraint, y)); } }
private void UpdateConstraintBinding(TemplateConstraint constraint, ImportConstraint importConstraint) { if (importConstraint.Item is ImportSingleValueCode) { ImportSingleValueCode importSvc = importConstraint.Item as ImportSingleValueCode; if (constraint.Value != importSvc.code) { constraint.Value = importSvc.code; } if (constraint.DisplayName != importSvc.displayName) { constraint.DisplayName = importSvc.displayName; } } else if (importConstraint.Item is ImportValueSet) { ImportValueSet importVs = importConstraint.Item as ImportValueSet; bool vsHasError = false; if (AreBooleansDifferent(constraint.IsStatic, importVs.isStatic, importVs.isStaticSpecified)) { constraint.IsStatic = importVs.isStatic; } if (importVs.dateSpecified) { constraint.ValueSetDate = importVs.date; } // Old bug in Trifolia allowing the same value set identifier to be used more than once var foundValueSets = (from vsi in this.valueSets.SelectMany(y => y.Identifiers) where vsi.Identifier.ToLower().Trim() == importVs.identifier.ToLower().Trim() select vsi.ValueSet).Distinct().ToList(); if (foundValueSets.Count() == 0) { var newValueSet = new ValueSet() { Name = string.IsNullOrEmpty(importVs.name) ? importVs.identifier + " incomplete" : importVs.name, IsIncomplete = true, Description = !string.IsNullOrEmpty(importVs.Description) ? importVs.Description : "Automatically generated by template import", LastUpdate = DateTime.Now }; var newValueSetIdentifier = new ValueSetIdentifier(); newValueSetIdentifier.Identifier = importVs.identifier; if (importVs.identifier.StartsWith("http://") || importVs.identifier.StartsWith("https://")) { newValueSetIdentifier.Type = ValueSetIdentifierTypes.HTTP; } else if (importVs.identifier.StartsWith("urn:oid:")) { newValueSetIdentifier.Type = ValueSetIdentifierTypes.Oid; } else if (importVs.identifier.StartsWith("urn:hl7ii:")) { newValueSetIdentifier.Type = ValueSetIdentifierTypes.HL7II; } else { this.Errors.Add("Value set referenced by constraint has incorrect identifier (" + importVs.identifier + ")"); vsHasError = true; } if (!vsHasError) { newValueSet.Identifiers.Add(newValueSetIdentifier); this.tdb.ValueSets.Add(newValueSet); foundValueSets.Add(newValueSet); } } if (vsHasError) { return; } if (constraint.ValueSet != null && foundValueSets.Contains(constraint.ValueSet)) { return; } if (constraint.ValueSet != foundValueSets.First()) { constraint.ValueSet = foundValueSets.First(); } } }
private void UpdateConstraintProperties(TemplateConstraint constraint, ImportConstraint importConstraint) { var importConformance = GetImportConformance(importConstraint.conformance); if (constraint.Context != importConstraint.context) { constraint.Context = importConstraint.context; } if (AreStringsDifferent(constraint.Conformance, importConformance)) { constraint.Conformance = importConformance; } if (constraint.Cardinality != importConstraint.cardinality) { constraint.Cardinality = importConstraint.cardinality; } if (constraint.DataType != importConstraint.dataType) { constraint.DataType = importConstraint.dataType; } if (constraint.IsBranch != importConstraint.isBranch) { constraint.IsBranch = importConstraint.isBranch; } if (constraint.IsBranchIdentifier != importConstraint.isBranchIdentifier) { constraint.IsBranchIdentifier = importConstraint.isBranchIdentifier; } if (constraint.IsSchRooted != importConstraint.isSchRooted) { constraint.IsSchRooted = importConstraint.isSchRooted; } if (AreBooleansDifferent(constraint.IsStatic, importConstraint.isStatic, importConstraint.isStaticSpecified)) { constraint.IsStatic = importConstraint.isStaticSpecified ? (bool?)importConstraint.isStatic : null; } if (constraint.IsPrimitive != importConstraint.isPrimitive) { constraint.IsPrimitive = importConstraint.isPrimitive; } if (constraint.IsPrimitive && AreStringsDifferent(constraint.PrimitiveText, importConstraint.NarrativeText)) { constraint.PrimitiveText = importConstraint.NarrativeText; } if (AreStringsDifferent(constraint.Schematron, importConstraint.SchematronTest)) { constraint.Schematron = importConstraint.SchematronTest; } if (constraint.Number != importConstraint.number) { constraint.Number = importConstraint.number; } if (constraint.DisplayNumber != importConstraint.displayNumber) { constraint.DisplayNumber = importConstraint.displayNumber; } if (AreStringsDifferent(constraint.Notes, importConstraint.Notes)) { constraint.Notes = importConstraint.Notes; } if (AreStringsDifferent(constraint.Label, importConstraint.Label)) { constraint.Label = importConstraint.Label; } if (constraint.IsHeading != importConstraint.isHeading) { constraint.IsHeading = importConstraint.isHeading; } if (AreStringsDifferent(constraint.HeadingDescription, importConstraint.HeadingDescription)) { constraint.HeadingDescription = importConstraint.HeadingDescription; } }