예제 #1
0
        /// <summary>
        /// Write inline element map collapse
        /// </summary>
        private void WriteInlineElementMapCollapse(XmlWriter xw, Property p, TypeReference tr, List <TypeReference> genericSupplier, string interactionName)
        {
            if (ResolveTypeReference(tr.Name, genericSupplier) != null)
            {
                tr = ResolveTypeReference(p.Type.Name, genericSupplier);
            }

            if (p.AlternateTraversalNames == null || p.AlternateTraversalNames.Count == 0)
            {
                xw.WriteStartElement(p.Name, TargetNamespace); // p.name
            }
            else
            {
                Property.AlternateTraversalData traversal = p.AlternateTraversalNames.Find(o => o.CaseWhen.Name == tr.Name);
                if (traversal.TraversalName != null) // found an alt traversal
                {
                    xw.WriteStartElement(traversal.TraversalName, TargetNamespace);
                }
                else
                {
                    xw.WriteStartElement(p.Name, TargetNamespace); // fall back to the property name
                }
            }

            // Determine if this should be a genericized parameter
            WriteInlineTypeMap(xw, tr, genericSupplier, interactionName);
            xw.WriteEndElement(); // p.name
        }
예제 #2
0
        /// <summary>
        /// Write an inline abstract when condition
        /// </summary>
        private void WriteInlineAbstractWhenCondition(XmlWriter xw, TypeReference tr, Property p, List <TypeReference> genericSupplier, string interactionName)
        {
            foreach (TypeReference child in tr.Class.SpecializedBy)
            {
                if (child.Class.IsAbstract)
                {
                    WriteInlineAbstractWhenCondition(xw, child, p, genericSupplier, interactionName);
                }
                else
                {
                    xw.WriteStartElement("when", NS_XSLT);

                    // Find the altTraversal
                    Property.AlternateTraversalData altTraversal = p.AlternateTraversalNames.Find(o => o.CaseWhen.Name == child.Name); // Alternate traversal

                    // Traversal was found
                    if (altTraversal.TraversalName != null)
                    {
                        xw.WriteAttributeString("test", string.Format("name() = '{0}'", altTraversal.TraversalName));
                    }
                    else
                    {
                        throw new InvalidOperationException(String.Format("Can't find traversal for alternative data for '{0}' when type is '{1}'...", p.Name, child.Name));
                    }

                    // Perform the inline element map
                    if (p.AlternateTraversalNames == null || p.AlternateTraversalNames.Count == 0)
                    {
                        xw.WriteStartElement(p.Name, TargetNamespace); // p.name
                    }
                    else
                    {
                        Property.AlternateTraversalData traversal = p.AlternateTraversalNames.Find(o => o.CaseWhen.Name == child.Name);
                        if (traversal.TraversalName != null) // found an alt traversal
                        {
                            xw.WriteStartElement(traversal.TraversalName, TargetNamespace);
                        }
                        else
                        {
                            xw.WriteStartElement(p.Name, TargetNamespace); // fall back to the property name
                        }
                    }
                    WriteInlineApplyTemplate(xw, p, child, genericSupplier);
                    xw.WriteEndElement(); // p.name
                    xw.WriteEndElement(); // when
                }
            }
        }
예제 #3
0
        /// <summary>
        /// Write inline when condition
        /// </summary>
        private void WriteInlineWhenConditionCollapse(XmlWriter xw, Property p, List <TypeReference> genericSupplier, string interactionName)
        {
            // Resolve the type reference
            TypeReference tr = p.Type;

            if (ResolveTypeReference(tr.Name, genericSupplier) != null)
            {
                tr = ResolveTypeReference(p.Type.Name, genericSupplier);
            }


            // Annotations
            if (p.Annotations != null && p.Annotations.Count > 0)
            {
                // Get the root of the collapsing
                CodeCollapseAnnotation cca = p.Annotations.Find(o => o is CodeCollapseAnnotation && (o as CodeCollapseAnnotation).Order == 0) as CodeCollapseAnnotation;
                xw.WriteStartElement("when", NS_XSLT);
                xw.WriteAttributeString("test", string.Format("name() = '{0}'", cca.Name));
                xw.WriteStartElement("for-each", NS_XSLT);

                string xpath = ".";
                // Annotations
                foreach (CodeCollapseAnnotation annot in p.Annotations.FindAll(o => o is CodeCollapseAnnotation && (o as CodeCollapseAnnotation).Order > 0))
                {
                    if (annot.Property != null && (annot.Property as Property).AlternateTraversalNames != null)
                    {
                        Property.AlternateTraversalData altTraversal = (annot.Property as Property).AlternateTraversalNames.Find(o => o.CaseWhen.Name == ResolveTypeReference(p.Type.Name, genericSupplier).Name&& o.InteractionOwner.Name == interactionName);
                        if (altTraversal.TraversalName != null)
                        {
                            xpath += string.Format("/hl7:{0}", altTraversal.TraversalName);
                        }
                    }
                    else
                    {
                        xpath += string.Format("/hl7:{0}", annot.Name);
                    }
                }

                xw.WriteAttributeString("select", xpath);

                // Inline element map collapse
                WriteInlineElementMapCollapse(xw, p, p.Type, genericSupplier, interactionName);

                xw.WriteEndElement();                                                           // for-each
                xw.WriteEndElement();                                                           // test
            }
            else if (p.AlternateTraversalNames == null || p.AlternateTraversalNames.Count == 0) // Alternate traversal names
            {
                xw.WriteStartElement("when", NS_XSLT);
                xw.WriteAttributeString("test", String.Format("name() = '{0}'", p.Name));

                // Write structural property
                if (p.PropertyType == Property.PropertyTypes.Structural)
                {
                    WriteInlineAttributeMapCollapse(xw, p);
                }
                else
                {
                    WriteInlineElementMapCollapse(xw, p, p.Type, genericSupplier, interactionName);
                }

                xw.WriteEndElement(); // when
            }
            else if (tr.Class != null && tr.Class.IsAbstract)
            {
                WriteInlineAbstractWhenCondition(xw, tr, p, genericSupplier, interactionName);
            }
            else
            {
                xw.WriteStartElement("when", NS_XSLT);

                // Find the altTraversal
                Property.AlternateTraversalData altTraversal = p.AlternateTraversalNames.Find(o => o.CaseWhen.Name == tr.Name); // Alternate traversal

                // Alternate traversal
                if (altTraversal.TraversalName != null)
                {
                    xw.WriteAttributeString("test", string.Format("name() = '{0}'", altTraversal.TraversalName));
                }
                else
                {
                    xw.WriteAttributeString("test", string.Format("name() = '{0}'", p.Name));
                }

                // Write the taversing
                WriteInlineElementMapCollapse(xw, p, p.Type, genericSupplier, interactionName);

                xw.WriteEndElement();
            }
        }