internal string ProcessEclXlink(XmlElement xlinkElement)
        {
            string eclStubComponentId = xlinkElement.GetAttribute("href", "http://www.w3.org/1999/xlink");

            IContentLibraryContext        eclContext;
            IContentLibraryMultimediaItem eclItem = GetEclItem(eclStubComponentId, out eclContext);

            // This may look a bit unusual, but we have to ensure that ECL Item members are accessed *before* the ECL Context is disposed.
            using (eclContext)
            {
                // Set additional ECL Item properties as data attributes on the XLink element
                xlinkElement.SetAttribute("data-eclId", eclItem.Id.ToString());
                xlinkElement.SetAttribute("data-eclDisplayTypeId", eclItem.DisplayTypeId);
                if (!string.IsNullOrEmpty(eclItem.MimeType))
                {
                    xlinkElement.SetAttribute("data-eclMimeType", eclItem.MimeType);
                }
                if (!string.IsNullOrEmpty(eclItem.Filename))
                {
                    xlinkElement.SetAttribute("data-eclFileName", eclItem.Filename);
                }
                string eclTemplateFragment = eclItem.GetTemplateFragment(null);
                if (!string.IsNullOrEmpty(eclTemplateFragment))
                {
                    // Note that the entire Template Fragment gets stuffed in an XHTML attribute.
                    // This may seem scary, but there is no limitation to the size of an XML attribute and the XLink element typically already has content.
                    xlinkElement.SetAttribute("data-eclTemplateFragment", eclTemplateFragment);
                }

                // TODO: ECL external metadata (?)

                string directLinkToPublished = eclItem.GetDirectLinkToPublished(null);
                return(string.IsNullOrEmpty(directLinkToPublished) ? PublishBinaryContent(eclItem, eclStubComponentId) : directLinkToPublished);
            }
        }
        internal XmlElement BuildEntityModel(EntityModelData entityModelData, Component eclStubComponent)
        {
            IContentLibraryContext        eclContext;
            IContentLibraryMultimediaItem eclItem = GetEclItem(eclStubComponent.Id, out eclContext);

            // This may look a bit unusual, but we have to ensure that ECL Item members are accessed *before* the ECL Context is disposed.
            using (eclContext)
            {
                BinaryContent eclStubBinaryContent = eclStubComponent.BinaryContent;

                string directLinkToPublished = eclItem.GetDirectLinkToPublished(_emptyAttributes);

                entityModelData.BinaryContent = new BinaryContentData
                {
                    Url      = string.IsNullOrEmpty(directLinkToPublished) ? PublishBinaryContent(eclItem, eclStubComponent) : directLinkToPublished,
                    MimeType = eclItem.MimeType ?? eclStubBinaryContent.MultimediaType.MimeType,
                    FileName = eclItem.Filename ?? eclStubBinaryContent.Filename,
                    FileSize = eclStubComponent.BinaryContent.Size
                };

                XmlElement externalMetadata = null;
                if (!string.IsNullOrEmpty(eclItem.MetadataXml))
                {
                    XmlDocument externalMetadataDoc = new XmlDocument();
                    externalMetadataDoc.LoadXml(eclItem.MetadataXml);
                    externalMetadata = externalMetadataDoc.DocumentElement;
                }

                entityModelData.ExternalContent = new ExternalContentData
                {
                    Id               = eclItem.Id.ToString(),
                    DisplayTypeId    = eclItem.DisplayTypeId,
                    TemplateFragment = eclItem.GetTemplateFragment(_emptyAttributes)
                                       // Note: not setting Metadata here, but returning the external metadata as raw XML.
                };

                return(externalMetadata);
            }
        }
        internal void ProcessEclStubComponent(Component eclStubComponent)
        {
            IContentLibraryContext        eclContext;
            IContentLibraryMultimediaItem eclItem = GetEclItem(eclStubComponent.Id, out eclContext);

            // This may look a bit unusual, but we have to ensure that ECL Item members are accessed *before* the ECL Context is disposed.
            using (eclContext)
            {
                eclStubComponent.EclId = eclItem.Id.ToString();

                string directLinkToPublished = eclItem.GetDirectLinkToPublished(null);
                eclStubComponent.Multimedia.Url = string.IsNullOrEmpty(directLinkToPublished) ? PublishBinaryContent(eclItem, eclStubComponent.Id) : directLinkToPublished;

                // Set additional ECL Item properties as ExtensionData on the ECL Stub Component.
                const string eclSectionName = "ECL";
                eclStubComponent.AddExtensionProperty(eclSectionName, "DisplayTypeId", eclItem.DisplayTypeId);
                eclStubComponent.AddExtensionProperty(eclSectionName, "MimeType", eclItem.MimeType);
                eclStubComponent.AddExtensionProperty(eclSectionName, "FileName", eclItem.Filename);
                eclStubComponent.AddExtensionProperty(eclSectionName, "TemplateFragment", eclItem.GetTemplateFragment(null));

                IFieldSet eclExternalMetadataFieldSet = BuildExternalMetadataFieldSet(eclItem);
                if (eclExternalMetadataFieldSet != null)
                {
                    eclStubComponent.ExtensionData["ECL-ExternalMetadata"] = eclExternalMetadataFieldSet;
                }
            }
        }