/// <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; }
/// <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)); } } } }
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); }
private string AddQualifier(EntityNamePart namePart) { EntityNamePartQualifier qualifier = namePart.Qualifier; return(qualifier == null || StringUtils.IsBlank(qualifier.CodeValue) ? string.Empty : " qualifier=\"" + qualifier.CodeValue + "\""); }
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 }); }
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); }
/// <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) { }
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); } }
/// <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)); } } }
/// <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)); } }