/// <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 }
/// <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 } } }
/// <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(); } }