示例#1
0
 /// <summary>
 /// Constructs an EntityNamePart using the supplied parameters.
 /// This constructor may not make sense to have as public. May become private in a later release.
 /// </summary>
 /// <param name="value_ren"></param>
 /// <param name="type_0"></param>
 /// <param name="qualifier"></param>
 /// <param name="nullFlavor"></param>
 public EntityNamePart(String value_ren, NamePartType type_0, EntityNamePartQualifier qualifier, NullFlavor nullFlavor)
 {
     this.value_ren  = value_ren;
     this.type       = type_0;
     this.qualifier  = qualifier;
     this.nullFlavor = nullFlavor;
 }
示例#2
0
 /// <exception cref="Ca.Infoway.Messagebuilder.Marshalling.HL7.XmlToModelTransformationException"></exception>
 private void HandlePersonName(XmlToModelResult xmlToModelResult, PersonName result, XmlNodeList childNodes)
 {
     foreach (XmlNode childNode in new XmlNodeListIterable(childNodes))
     {
         if (childNode is XmlElement)
         {
             XmlElement element                = (XmlElement)childNode;
             string     name                   = NodeUtil.GetLocalOrTagName(element);
             string     value                  = GetTextValue(element, xmlToModelResult);
             string     qualifierString        = GetAttributeValue(element, NAME_PART_TYPE_QUALIFIER);
             EntityNamePartQualifier qualifier = CodeResolverRegistry.Lookup <EntityNamePartQualifier>(qualifierString);
             if (StringUtils.IsNotBlank(value))
             {
                 result.AddNamePart(new EntityNamePart(value, GetPersonalNamePartType(name), qualifier));
             }
         }
         else
         {
             //GN: Added in fix similar to what was done for AD.BASIC.  Issue with XML containing mixture of elements and untyped text nodes.
             if (IsNonBlankTextNode(childNode))
             {
                 // validation will catch if this type does not allow for a free-form name
                 result.AddNamePart(new EntityNamePart(childNode.Value.Trim(), null));
             }
         }
     }
 }
示例#3
0
        private EntityNamePartQualifier GetQualifier(ParseContext context, XmlElement element, XmlToModelResult xmlToModelResult)
        {
            EntityNamePartQualifier result = null;

            if (element.HasAttribute(AbstractNameR2ElementParser <V> .QUALIFIER_ATTRIBUTE))
            {
                string qualifierString = GetAttributeValue(element, AbstractNameR2ElementParser <V> .QUALIFIER_ATTRIBUTE);
                if (StringUtils.IsNotBlank(qualifierString))
                {
                    EntityNamePartQualifier qualifier = CodeResolverRegistry.Lookup <EntityNamePartQualifier>(qualifierString);
                    if (qualifier == null)
                    {
                        RecordError("Invalid qualifier detected in name part: " + qualifierString, element, xmlToModelResult);
                    }
                    result = qualifier;
                    if (StringUtils.Equals("PN", context.Type) && StringUtils.Equals(Ca.Infoway.Messagebuilder.Domainvalue.Basic.EntityNamePartQualifier
                                                                                     .LEGALSTATUS.CodeValue, qualifierString))
                    {
                        RecordError("Invalid qualifier for PN name part: " + qualifierString, element, xmlToModelResult);
                    }
                }
                else
                {
                    RecordError("Qualifier may not be blank.", element, xmlToModelResult);
                }
            }
            return(result);
        }
示例#4
0
        private string AddQualifier(EntityNamePart namePart)
        {
            EntityNamePartQualifier qualifier = namePart.Qualifier;

            return(qualifier == null || StringUtils.IsBlank(qualifier.CodeValue) ? string.Empty : " qualifier=\"" + qualifier.CodeValue
                   + "\"");
        }
示例#5
0
 static ENXP()
 {
     // Create keys
     foreach (var fi in typeof(EntityNamePartQualifier).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static))
     {
         EntityNamePartQualifier key = (EntityNamePartQualifier)fi.GetValue(null);
         validation.Add(key, new List <EntityNamePartType?>());
     }
     // Add
     validation[EntityNamePartQualifier.LegalStatus].AddRange(new EntityNamePartType?[] { EntityNamePartType.Title });
     validation[EntityNamePartQualifier.Academic].AddRange(new EntityNamePartType?[] { EntityNamePartType.Title });
     validation[EntityNamePartQualifier.Nobility].Add(EntityNamePartType.Title);
     validation[EntityNamePartQualifier.Professional].AddRange(new EntityNamePartType?[] { EntityNamePartType.Title });
     validation[EntityNamePartQualifier.Honorific].Add(EntityNamePartType.Title);
     validation[EntityNamePartQualifier.Acquired].AddRange(new EntityNamePartType?[] {
         EntityNamePartType.Family, EntityNamePartType.Given
     });
     validation[EntityNamePartQualifier.Birth].AddRange(new EntityNamePartType?[] {
         EntityNamePartType.Family, EntityNamePartType.Given
     });
     validation[EntityNamePartQualifier.Spouse].AddRange(new EntityNamePartType?[] {
         EntityNamePartType.Family, EntityNamePartType.Given
     });
     validation[EntityNamePartQualifier.CallMe].AddRange(new EntityNamePartType?[] {
         EntityNamePartType.Family, EntityNamePartType.Given
     });
     validation[EntityNamePartQualifier.Initial].AddRange(new EntityNamePartType?[] {
         EntityNamePartType.Given, EntityNamePartType.Family
     });
     validation[EntityNamePartQualifier.Prefix].AddRange(new EntityNamePartType?[] { EntityNamePartType.Title, EntityNamePartType.Given, EntityNamePartType.Family });
     validation[EntityNamePartQualifier.Suffix].AddRange(new EntityNamePartType?[] { EntityNamePartType.Title, EntityNamePartType.Given, EntityNamePartType.Family });
     validation[EntityNamePartQualifier.Middle].AddRange(new EntityNamePartType?[] { EntityNamePartType.Given, EntityNamePartType.Family });
 }
示例#6
0
        private IList <EntityNamePart> ParseNameParts(ParseContext context, XmlNodeList childNodes, XmlToModelResult xmlToModelResult
                                                      )
        {
            IList <EntityNamePart> parts = new List <EntityNamePart>();

            foreach (XmlNode childNode in new XmlNodeListIterable(childNodes))
            {
                if (childNode is XmlElement)
                {
                    XmlElement element = (XmlElement)childNode;
                    string     name    = NodeUtil.GetLocalOrTagName(element);
                    if (!StringUtils.Equals(AbstractNameR2ElementParser <V> .VALID_TIME_ELEMENT, name))
                    {
                        if (StringUtils.Equals("TN", context.Type))
                        {
                            RecordError("TN fields only support text and a single (optional) validTime element. Found element: " + name, element, xmlToModelResult
                                        );
                        }
                        else
                        {
                            NullFlavor nullFlavor             = GetNullFlavor(element, xmlToModelResult);
                            string     value                  = GetTextValue(element, xmlToModelResult);
                            EntityNamePartQualifier qualifier = GetQualifier(context, element, xmlToModelResult);
                            if (StringUtils.IsNotBlank(value) || nullFlavor != null)
                            {
                                NamePartType namePartType = GetNamePartType(name, context.Type, element, xmlToModelResult);
                                if (namePartType != null)
                                {
                                    parts.Add(new EntityNamePart(value, namePartType, qualifier, nullFlavor));
                                }
                            }
                        }
                    }
                }
                else
                {
                    if (IsNonBlankTextNode(childNode))
                    {
                        parts.Add(new EntityNamePart(childNode.Value.Trim(), null));
                    }
                }
            }
            return(parts);
        }
示例#7
0
 /// <summary>
 /// Constructs an EntityNamePart using the supplied parameters.
 /// </summary>
 ///
 /// <param name="value">the name part value</param>
 /// <param name="type_0">the name part type</param>
 public EntityNamePart(String value_ren, NamePartType type_0, EntityNamePartQualifier qualifier) :
     this(value_ren, type_0, qualifier, null)
 {
 }
示例#8
0
        private void ValidatePersonNameParts(PersonName personName, string type, Hl7BaseVersion baseVersion, XmlElement element,
                                             string propertyPath, Hl7Errors errors)
        {
            bool isBasic         = StandardDataType.PN_BASIC.Type.Equals(type);
            bool isSimple        = StandardDataType.PN_SIMPLE.Type.Equals(type);
            bool isFull          = StandardDataType.PN_FULL.Type.Equals(type);
            bool isSearch        = StandardDataType.PN_SEARCH.Type.Equals(type);
            int  countBlankParts = 0;
            bool isCeRx          = IsCeRx(baseVersion);
            int  numParts        = personName.Parts.Count;

            if (numParts > MAX_PARTS)
            {
                CreateError("A maximum of " + MAX_PARTS + " name parts are allowed. Found: " + numParts, element, propertyPath, errors);
            }
            foreach (EntityNamePart personNamePart in personName.Parts)
            {
                int partLength = StringUtils.Length(personNamePart.Value);
                if ((isCeRx && partLength > MAX_PART_LENGTH_CERX) || partLength > MAX_PART_LENGTH)
                {
                    CreateError("Name part types have a maximum allowed length of " + (isCeRx ? MAX_PART_LENGTH_CERX : MAX_PART_LENGTH) + " (length found: "
                                + partLength + ")", element, propertyPath, errors);
                }
                // error if part type not allowed
                NamePartType partType = personNamePart.Type;
                if (partType == null)
                {
                    countBlankParts++;
                    // no part type : only allowed for SIMPLE or, if CeRx, BASIC (max 1 in both cases)
                    if (!isSimple && !(isBasic && isCeRx))
                    {
                        CreateError("Names without a part type are not allowed", element, propertyPath, errors);
                    }
                }
                else
                {
                    if (!ALLOWABLE_NAME_PARTS.Contains(partType.Value))
                    {
                        CreateError("Part type " + partType.Value + " is not allowed for " + type, element, propertyPath, errors);
                    }
                }
                EntityNamePartQualifier qualifier = personNamePart.Qualifier;
                if (qualifier != null)
                {
                    if (isCeRx || (!IsMr2007(baseVersion) && isBasic))
                    {
                        if (!"IN".Equals(qualifier.CodeValue))
                        {
                            CreateError("Qualifier '" + qualifier.CodeValue + "' not valid. Only 'IN' is allowed.", element, propertyPath, errors);
                        }
                    }
                    else
                    {
                        if (!ALLOWABLE_NAME_PART_QUALIFIERS.Contains(qualifier.CodeValue))
                        {
                            CreateError("Qualifier '" + qualifier.CodeValue + "' not valid.", element, propertyPath, errors);
                        }
                    }
                }
            }
            if (isSimple && (countBlankParts > 1 || numParts > 1 || (numParts > 0 && countBlankParts == 0)))
            {
                CreateError("For PN.SIMPLE, only one simple name (a name without a part type) is allowed, and no other name parts are allowed."
                            , element, propertyPath, errors);
            }
            if ((isBasic && isCeRx) && ((countBlankParts > 1) || (countBlankParts == 1 && numParts > 1)))
            {
                CreateError("For CeRx PN.BASIC a name can be provided without a part type, but only a single simple name (i.e. a name without a part type) is allowed in this case. Multiple name parts can be provided, but then all name parts must have part types."
                            , element, propertyPath, errors);
            }
            // confirmed with CHI that simple and basic types do not have to provide any name parts
            if (numParts == 0 && (isFull || isSearch))
            {
                CreateError("At least one name part must be specified.", element, propertyPath, errors);
            }
        }
示例#9
0
        /// <summary>
        /// Graph <paramref name="o"/> onto <paramref name="s"/>
        /// </summary>
        public void Graph(System.Xml.XmlWriter s, object o, DatatypeR2FormatterGraphResult result)
        {
            // XP is special, it does not extend anything so we have to graph from scratch
            var instance = o as ENXP;

            // Null flavor?
            if (instance.NullFlavor != null)
            {
                s.WriteAttributeString("nullFlavor", Util.ToWireFormat(instance.NullFlavor));
            }
            else
            {
                // Validate
                DatatypeR2FormatterParseResult tResult = new DatatypeR2FormatterParseResult(result.ValidateConformance);
                new ANYFormatter().Validate(instance, s.ToString(), tResult);
                result.AddResultDetail(tResult.Details);

                // Qualifiers (copy for modification)
                SET <CS <EntityNamePartQualifier> > qualifiers = new SET <CS <EntityNamePartQualifier> >();
                if (instance.Qualifier != null)
                {
                    foreach (var qlf in instance.Qualifier)
                    {
                        qualifiers.Add(qlf.Clone() as CS <EntityNamePartQualifier>);
                    }
                }

                // Unsupported properties
                if (instance.ControlActExt != null)
                {
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "ControlActExt", "ENXP", s.ToString()));
                }
                if (instance.ControlActRoot != null)
                {
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "ControlActRoot", "ENXP", s.ToString()));
                }
                if (instance.ValidTimeHigh != null)
                {
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "ValidTimeHigh", "ENXP", s.ToString()));
                }
                if (instance.ValidTimeLow != null)
                {
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "ValidTimeLow", "ENXP", s.ToString()));
                }
                if (instance.Flavor != null)
                {
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "Flavor", "ENXP", s.ToString()));
                }
                if (instance.UpdateMode != null)
                {
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "UpdateMode", "ENXP", s.ToString()));
                }

                // Output the supported properties
                if (instance.Value != null)
                {
                    s.WriteAttributeString("value", instance.Value);
                }
                if (instance.Code != null)
                {
                    s.WriteAttributeString("code", instance.Code);
                }
                if (instance.CodeSystem != null)
                {
                    s.WriteAttributeString("codeSystem", instance.CodeSystem);
                }
                if (instance.CodeSystemVersion != null)
                {
                    s.WriteAttributeString("codeSystemVersion", instance.CodeSystemVersion);
                }
                if (instance.Type != null)
                {
                    // Qualifiers that count as TITLE
                    EntityNamePartQualifier[] titleQualifiers = new EntityNamePartQualifier[] {
                        EntityNamePartQualifier.Professional,
                        EntityNamePartQualifier.Nobility,
                        EntityNamePartQualifier.Academic,
                        EntityNamePartQualifier.LegalStatus
                    };

                    // If type is not SFX or PFX then output the type,
                    // if it is either SFX or PFX then don't output the type
                    // but do modify the qualifier
                    switch (instance.Type.Value)
                    {
                    case EntityNamePartType.Prefix:
                        if (instance.Qualifier == null)
                        {
                            instance.Qualifier = new SET <CS <EntityNamePartQualifier> >();
                        }
                        if (!qualifiers.Contains(EntityNamePartQualifier.Prefix))
                        {
                            qualifiers.Add(EntityNamePartQualifier.Prefix);
                        }

                        // Change the instance type
                        if (Array.Exists(titleQualifiers, q => qualifiers.Contains(q)))
                        {
                            s.WriteAttributeString("type", "TITLE");
                        }

                        break;

                    case EntityNamePartType.Suffix:
                        if (instance.Qualifier == null)
                        {
                            instance.Qualifier = new SET <CS <EntityNamePartQualifier> >();
                        }
                        if (!qualifiers.Contains(EntityNamePartQualifier.Suffix))
                        {
                            qualifiers.Add(EntityNamePartQualifier.Suffix);
                        }

                        // Change the instance type
                        if (Array.Exists(titleQualifiers, q => qualifiers.Contains(q)))
                        {
                            s.WriteAttributeString("type", "TITLE");
                        }

                        break;

                    default:
                        s.WriteAttributeString("type", Util.ToWireFormat(instance.Type));
                        break;
                    }
                }
                if (!qualifiers.IsEmpty)
                {
                    s.WriteAttributeString("qualifier", Util.ToWireFormat(qualifiers));
                }
            }
        }
示例#10
0
        /// <summary>
        /// Graph <paramref name="o"/> onto <paramref name="s"/>
        /// </summary>
        public void Graph(System.Xml.XmlWriter s, object o, DatatypeR2FormatterGraphResult result)
        {
            
            // XP is special, it does not extend anything so we have to graph from scratch
            var instance = o as ENXP;

            // Null flavor?
            if (instance.NullFlavor != null)
                s.WriteAttributeString("nullFlavor", Util.ToWireFormat(instance.NullFlavor));
            else
            {
                // Validate 
                DatatypeR2FormatterParseResult tResult = new DatatypeR2FormatterParseResult(result.ValidateConformance);
                new ANYFormatter().Validate(instance, s.ToString(), tResult);
                result.AddResultDetail(tResult.Details);
                
                // Qualifiers (copy for modification)
                SET<CS<EntityNamePartQualifier>> qualifiers = new SET<CS<EntityNamePartQualifier>>();
                if(instance.Qualifier != null)
                    foreach (var qlf in instance.Qualifier)
                        qualifiers.Add(qlf.Clone() as CS<EntityNamePartQualifier>);

                // Unsupported properties
                if (instance.ControlActExt != null)
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "ControlActExt", "ENXP", s.ToString()));
                if (instance.ControlActRoot != null)
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "ControlActRoot", "ENXP", s.ToString()));
                if (instance.ValidTimeHigh != null)
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "ValidTimeHigh", "ENXP", s.ToString()));
                if (instance.ValidTimeLow != null)
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "ValidTimeLow", "ENXP", s.ToString()));
                if (instance.Flavor != null)
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "Flavor", "ENXP", s.ToString()));
                if (instance.UpdateMode != null)
                    result.AddResultDetail(new UnsupportedDatatypeR2PropertyResultDetail(ResultDetailType.Warning, "UpdateMode", "ENXP", s.ToString()));

                // Output the supported properties
                if (instance.Value != null)
                    s.WriteAttributeString("value", instance.Value);
                if (instance.Code != null)
                    s.WriteAttributeString("code", instance.Code);
                if (instance.CodeSystem != null)
                    s.WriteAttributeString("codeSystem", instance.CodeSystem);
                if (instance.CodeSystemVersion != null)
                    s.WriteAttributeString("codeSystemVersion", instance.CodeSystemVersion);
                if (instance.Type != null)
                {
                    // Qualifiers that count as TITLE
                    EntityNamePartQualifier[] titleQualifiers = new EntityNamePartQualifier[] {
                        EntityNamePartQualifier.Professional,
                        EntityNamePartQualifier.Nobility,
                        EntityNamePartQualifier.Academic ,
                        EntityNamePartQualifier.LegalStatus
                    };

                    // If type is not SFX or PFX then output the type,
                    // if it is either SFX or PFX then don't output the type
                    // but do modify the qualifier
                    switch(instance.Type.Value)
                    {
                        case EntityNamePartType.Prefix:
                            if (instance.Qualifier == null)
                                instance.Qualifier = new SET<CS<EntityNamePartQualifier>>();
                            if(!qualifiers.Contains(EntityNamePartQualifier.Prefix))
                                qualifiers.Add(EntityNamePartQualifier.Prefix);

                            // Change the instance type
                            if(Array.Exists(titleQualifiers, q => qualifiers.Contains(q)))
                                s.WriteAttributeString("type", "TITLE");

                            break;
                        case EntityNamePartType.Suffix:
                            if (instance.Qualifier == null)
                                instance.Qualifier = new SET<CS<EntityNamePartQualifier>>();
                            if (!qualifiers.Contains(EntityNamePartQualifier.Suffix))
                                qualifiers.Add(EntityNamePartQualifier.Suffix);
                            
                            // Change the instance type
                            if (Array.Exists(titleQualifiers, q => qualifiers.Contains(q)))
                                s.WriteAttributeString("type", "TITLE");

                            break;
                        default:
                            s.WriteAttributeString("type", Util.ToWireFormat(instance.Type));
                            break;
                    }
                }
                if (!qualifiers.IsEmpty)
                    s.WriteAttributeString("qualifier", Util.ToWireFormat(qualifiers));

            }
        }