예제 #1
0
        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;
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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();
                }
            }
        }
예제 #4
0
        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);
        }
예제 #5
0
        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;
            }
        }
예제 #6
0
        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);
        }
예제 #7
0
        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));
            }
        }
예제 #8
0
        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();
                }
            }
        }
예제 #9
0
        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;
            }
        }