Ejemplo n.º 1
0
        private object DelegateToConcreteParser(ParseContext context, XmlNode node, BareANY hl7Result, XmlToModelResult xmlToModelResult
                                                )
        {
            object result     = null;
            string parentType = context == null ? null : context.Type;
            string actualType = ObtainActualType(parentType, node, xmlToModelResult);

            if (StringUtils.IsNotBlank(actualType))
            {
                ElementParser elementParser = ParserR2Registry.GetInstance().Get(actualType);
                if (elementParser == null || !IsValidTypeForAny(parentType, actualType))
                {
                    xmlToModelResult.AddHl7Error(Hl7Error.CreateInvalidTypeError(actualType, parentType, (XmlElement)node));
                }
                else
                {
                    BareANY parsedValue = elementParser.Parse(ParseContextImpl.CreateWithConstraints(actualType, DetermineReturnType(actualType
                                                                                                                                     , GetReturnType(context)), context), Arrays.AsList(node), xmlToModelResult);
                    result = parsedValue.BareValue;
                    // Yes, this is a side effect of calling this method. If we don't do this then the actual type of the ANY could be lost
                    hl7Result.DataType   = parsedValue.DataType;
                    hl7Result.NullFlavor = parsedValue.NullFlavor;
                    // preserve all metadata (yes, also not a great side effect); this will have to be adjusted whenever new metadata is added to a data type (extremely infrequently)
                    if (hl7Result is ANYMetaData && parsedValue is ANYMetaData)
                    {
                        ANYMetaData anyMetaDataResult = (ANYMetaData)hl7Result;
                        ANYMetaData anyMetaDataParsed = (ANYMetaData)parsedValue;
                        anyMetaDataResult.Language     = anyMetaDataParsed.Language;
                        anyMetaDataResult.DisplayName  = anyMetaDataParsed.DisplayName;
                        anyMetaDataResult.OriginalText = anyMetaDataParsed.OriginalText;
                        anyMetaDataResult.Translations.AddAll(anyMetaDataParsed.Translations);
                        anyMetaDataResult.IsCdata  = anyMetaDataParsed.IsCdata;
                        anyMetaDataResult.Operator = anyMetaDataParsed.Operator;
                        anyMetaDataResult.Unsorted = anyMetaDataParsed.Unsorted;
                    }
                }
            }
            else
            {
                xmlToModelResult.AddHl7Error(Hl7Error.CreateMissingMandatoryAttributeError("xsi:type", (XmlElement)node));
            }
            return(result);
        }
Ejemplo n.º 2
0
        private BareANY CreateType(ParseContext context, XmlElement element, XmlToModelResult parseResult, bool isSxcm)
        {
            string type = GetParameterizedType(context);

            if (isSxcm)
            {
                type = "SXCM<" + type + ">";
            }
            ElementParser parser = ParserR2Registry.GetInstance().Get(type);

            if (parser != null)
            {
                ParseContext newContext  = ParseContextImpl.CreateWithConstraints(type, context);
                BareANY      parsedValue = parser.Parse(newContext, Arrays.AsList((XmlNode)element), parseResult);
                return(parsedValue);
            }
            else
            {
                parseResult.AddHl7Error(new Hl7Error(Hl7ErrorCode.DATA_TYPE_ERROR, System.String.Format("Cannot find a parser for type {0}"
                                                                                                        , type), element));
                return(null);
            }
        }