protected override IEnumerable <Rendering> GetRenderings(
            XElement layoutDefinition,
            BuildPageDefinitionArgs args)
        {
            // replaced parser with custom one
            XmlBasedRenderingParser parser = new CDNXmlBasedRenderingParser();

            foreach (XElement element1 in layoutDefinition.Elements("d"))
            {
                XElement deviceNode = element1;
                Guid     deviceId   = deviceNode.GetAttributeValueOrEmpty("id").ToGuid();

                // replace layout with CDN layout
                Guid layoutId = RequestExtensions.IsContextRequestForDynamicData()
                                    ? Guid.Parse(Constants.Layout.DefaultCDNLayoutId)
                                    : deviceNode.GetAttributeValueOrEmpty("l").ToGuid();

                IEnumerable <RenderingInfo> dynamicRenderingsInfo = RequestExtensions.GetDynamicRenderingsInfo();

                yield return(this.GetRendering(deviceNode, deviceId, layoutId, "Layout", parser));

                foreach (XElement element2 in deviceNode.Elements("r"))
                {
                    // replacing placeholders to match CDN layout placeholder keys
                    var rendering = this.GetRendering(element2, deviceId, layoutId, element2.Name.LocalName, parser);

                    if (RequestExtensions.IsContextRequestForDynamicData())
                    {
                        var idMatchRendering = dynamicRenderingsInfo
                                               .FirstOrDefault(r => r.RenderingId.ToGuid().Equals(rendering.UniqueId));

                        if (idMatchRendering != null)
                        {
                            rendering["Placeholder"] = Constants.Layout.DefaultCDNPlaceholder;
                        }
                        else
                        {
                            var placeholderMatchRendering = dynamicRenderingsInfo
                                                            .FirstOrDefault(
                                r =>
                                rendering.Placeholder.StartsWith(r.Placeholder) &&
                                !rendering.Placeholder.Equals(r.Placeholder));

                            if (placeholderMatchRendering != null)
                            {
                                rendering["Placeholder"] = rendering["Placeholder"]
                                                           .Replace(
                                    placeholderMatchRendering.Placeholder.TrimStart('/'),
                                    Constants.Layout.DefaultCDNPlaceholder);
                            }
                        }
                    }

                    yield return(rendering);
                }
            }
        }
        public override void Process(BuildPageDefinitionArgs args)
        {
            Assert.ArgumentNotNull((object)args, "args");

            var item = Context.Item;

            if (item == null)
            {
                return;
            }

            var itemId     = item.ID.Guid;
            var templateId = item.Template.ID.Guid;

            var            currentLanguage  = Context.Language.Name;
            var            renderingBuilder = new RenderingBuilder();
            PageDefinition pageDefinition   = args.Result;

            if (pageDefinition == null)
            {
                return;
            }

            if (SitecoreFeatureToggles.ShouldReplaceLayout(itemId, templateId, currentLanguage))
            {
                //resolve all the renderings from the featuretoggle
                var layoutReplacement = SitecoreFeatureToggles.GetLayoutReplacement(itemId, templateId, currentLanguage);
                var layoutRendering   = renderingBuilder.GetRenederingById(layoutReplacement.LayoutId);
                layoutRendering.RenderingType = "Layout";
                pageDefinition.Renderings.Add(layoutRendering);

                foreach (var sublayout in layoutReplacement.Sublayouts)
                {
                    var rendering = renderingBuilder.GetRenederingById(sublayout.SublayoutId);
                    if (rendering != null)
                    {
                        pageDefinition.Renderings.Add(rendering);
                    }
                }
            }
            else
            {
                base.Process(args);
                var renderingReplacements = SitecoreFeatureToggles.GetAllRenderingReplacements(currentLanguage);
                //loop through and replace the one I need to replace
                foreach (var replacement in renderingReplacements)
                {
                    ProcessRenderings(pageDefinition.Renderings, replacement, renderingBuilder);
                }
            }
        }
        protected override IEnumerable <Rendering> GetRenderings(XElement layoutDefinition, BuildPageDefinitionArgs args)
        {
            var parser = MvcSettings.GetRegisteredObject <XmlBasedRenderingParser>();

            foreach (var node in layoutDefinition.Elements((XName)"d"))
            {
                var deviceNode = node;

                var deviceId = deviceNode.GetAttributeValueOrEmpty("id").ToGuid();
                var layoutId = deviceNode.GetAttributeValueOrEmpty("l").ToGuid();

                if (args.PageContext.RequestContext.HttpContext.IsAmpRequest())
                {
                    layoutId = new Guid(Sitecore.Configuration.Settings.GetSetting("MyProject.AmpLayoutId"));
                }

                yield return(this.GetRendering(deviceNode, deviceId, layoutId, "Layout", parser));

                foreach (var element2 in deviceNode.Elements((XName)"r"))
                {
                    yield return(this.GetRendering(element2, deviceId, layoutId, element2.Name.LocalName, parser));
                }
            }
        }
        public override void Process(BuildPageDefinitionArgs args)
        {
            Assert.ArgumentNotNull(args, "args");
            PageDefinition result = args.Result;

            if (result == null || result.Renderings == null || result.Renderings.Count <= 0)
            {
                return;
            }

            if (Helper.IsPrototypeMode())
            {
                var layouts =
                    result.Renderings.Where(r => r.RenderingType.Equals("Layout", StringComparison.OrdinalIgnoreCase))
                    .ToList();

                var layoutMap = new Dictionary <Guid, ID>();

                if (layouts.Count > 0)
                {
                    foreach (var layout in layouts)
                    {
                        var itemResolverInfo = Helper.GetPrototypeItem(layout.LayoutId);
                        if (itemResolverInfo != null)
                        {
                            if (itemResolverInfo.PrototypeItem != null &&
                                itemResolverInfo.PrototypeItem.ID.Guid != layout.LayoutId)
                            {
                                layoutMap.Add(layout.LayoutId, itemResolverInfo.PrototypeItem.ID);
                                layout.LayoutId = itemResolverInfo.PrototypeItem.ID.Guid;
                            }
                            else if (!string.IsNullOrEmpty(itemResolverInfo.FilePath))
                            {
                                layout.Renderer = new ReadFileRenderer {
                                    FilePath = itemResolverInfo.FilePath
                                };
                            }
                        }
                    }
                }

                var renderings =
                    result.Renderings.Where(r => r.RenderingType.Equals("r", StringComparison.OrdinalIgnoreCase))
                    .ToList();

                if (renderings.Count > 0)
                {
                    foreach (var rendering in renderings)
                    {
                        var itemResolverInfo = Helper.GetPrototypeItem(rendering.RenderingItem.InnerItem);
                        if (itemResolverInfo != null)
                        {
                            if (itemResolverInfo.PrototypeItem != null
                                &&
                                !itemResolverInfo.PrototypeItem.ID.Guid.ToString("B")
                                .Equals(rendering.RenderingItemPath, StringComparison.OrdinalIgnoreCase))
                            {
                                rendering.RenderingItemPath = itemResolverInfo.PrototypeItem.ID.Guid.ToString("B");
                                rendering.RenderingItem     = new RenderingItem(itemResolverInfo.PrototypeItem);

                                if (layoutMap.ContainsKey(rendering.LayoutId))
                                {
                                    rendering.LayoutId = layoutMap[rendering.LayoutId].Guid;
                                }

                                rendering.Renderer = null;
                            }
                            else if (!string.IsNullOrEmpty(itemResolverInfo.FilePath))
                            {
                                rendering.Renderer = new ReadFileRenderer {
                                    FilePath = itemResolverInfo.FilePath
                                };
                            }
                        }
                    }
                }
            }
        }