Exemple #1
0
        protected virtual IConfiguration[] ResolveConfigurations()
        {
            var config = HttpContext.Current.Request.QueryString["configuration"];
            var targetConfigurations = ControlPanelUtility.ResolveConfigurationsFromQueryParameter(config);

            if (targetConfigurations.Length == 0)
            {
                throw new ArgumentException("Configuration(s) requested were not defined.");
            }

            // skipTransparent does not apply when syncing a single config explicitly
            if (targetConfigurations.Length == 1)
            {
                return(targetConfigurations);
            }

            // optionally skip transparent sync configs when syncing
            var skipTransparent = HttpContext.Current.Request.QueryString["skipTransparentConfigs"] ?? "0";

            if (skipTransparent == "1" || skipTransparent.Equals(bool.TrueString, StringComparison.OrdinalIgnoreCase))
            {
                targetConfigurations = targetConfigurations.SkipTransparentSync().ToArray();

                if (targetConfigurations.Length == 0)
                {
                    Log.Warn("[Unicorn] All configurations were transparent sync and skipTransparentConfigs was active. Syncing nothing.", this);
                }
            }

            return(targetConfigurations);
        }
Exemple #2
0
        protected override IResponse CreateResponse(UnicornControlPanelRequestPipelineArgs args)
        {
            var config = args.Context.Request.QueryString["configuration"];
            var targetConfigurations = ControlPanelUtility.ResolveConfigurationsFromQueryParameter(config);
            var result = targetConfigurations.Select(GetHealthStatus);

            return(new PlainTextResponse(string.Join(Environment.NewLine, result)));
        }
        protected virtual IConfiguration[] ResolveConfigurations()
        {
            var config = HttpContext.Current.Request.QueryString["configuration"];
            var targetConfigurations = ControlPanelUtility.ResolveConfigurationsFromQueryParameter(config);

            if (targetConfigurations.Length == 0)
            {
                throw new ArgumentException("Configuration(s) requested were not defined.");
            }

            return(targetConfigurations);
        }
Exemple #4
0
        protected virtual IConfiguration[] ResolveConfigurations()
        {
            // This logic is present in all verbs. Marked for refactoring
            var config  = HttpContext.Current.Request.QueryString["configuration"];
            var exclude = HttpContext.Current.Request.QueryString["exclude"];
            var targetConfigurations = ControlPanelUtility.ResolveConfigurationsFromQueryParameter(config, exclude);

            if (targetConfigurations.Length == 0)
            {
                throw new ArgumentException("Configuration(s) requested were not defined.");
            }

            return(targetConfigurations);
        }
Exemple #5
0
        public void Render(HtmlTextWriter writer)
        {
            writer.Write("<h4>Initial Setup</h4>");

            if (ControlPanelUtility.HasAnySourceItems(_configuration))
            {
                writer.Write("<p>Would you like to perform an initial serialization of all configured items using the options outlined above now? This is required to start using this configuration.</p>");

                writer.Write("<a class=\"button\" href=\"?verb=Reserialize&amp;configuration={0}\">Perform Initial Serialization of <em>{1}</em></a>", HttpUtility.UrlEncode(_configuration.Name), _configuration.Name);
            }
            else
            {
                writer.Write("<p>Cannot perform initial serialization until the predicate configuration includes valid root items.</p>");
            }
        }
Exemple #6
0
        public void Render(HtmlTextWriter writer)
        {
            writer.Write("<h4>Initial Setup</h4>");

            if (ControlPanelUtility.AllRootPathsExist(_configuration))
            {
                writer.Write("<p>Would you like to perform an initial serialization of all configured items using the options outlined above now? This is required to start using this configuration.</p>");

                writer.Write("<a class=\"button\" href=\"?verb=Reserialize&amp;configuration={0}\">Perform Initial Serialization of <em>{1}</em></a>", HttpUtility.UrlEncode(_configuration.Name), _configuration.Name);
            }
            else
            {
                writer.Write("<p class=\"warning\">Cannot perform initial serialization because the predicate configuration is including item paths which do not exist in the database.</p>");
            }
        }
Exemple #7
0
        private string GetHealthStatus(IConfiguration configuration)
        {
            var configurationHasAnySerializedItems = ControlPanelUtility.HasAnySerializedItems(configuration);

            var configurationHasValidRootParentPaths = ControlPanelUtility.AllRootParentPathsExist(configuration);

            var unicornDataProviderConfiguration = configuration.Resolve <IUnicornDataProviderConfiguration>();

            var configurationHasTransparentSync = unicornDataProviderConfiguration != null && unicornDataProviderConfiguration.EnableTransparentSync;

            var dependents = configuration.Resolve <ConfigurationDependencyResolver>().Dependencies;

            var dependentsData = string.Join(", ", dependents.Select(d => d.Configuration.Name));

            return($"{configuration.Name}|{configurationHasAnySerializedItems}|{configurationHasValidRootParentPaths}|{configurationHasTransparentSync}|{dependentsData}");
        }
        public void EnsurePatternMatchingTest()
        {
            // Currently, a case-sensitive matching is expected throughout the solution

            ControlPanelUtility.WildcardMatch("Test", "Test").Should().BeTrue();
            ControlPanelUtility.WildcardMatch("test", "Test").Should().BeFalse();
            ControlPanelUtility.WildcardMatch("Test", "Te*").Should().BeTrue();
            ControlPanelUtility.WildcardMatch("test", "Te*").Should().BeFalse();
            ControlPanelUtility.WildcardMatch("Test", "Tes?").Should().BeTrue();
            ControlPanelUtility.WildcardMatch("test", "Tes?").Should().BeFalse();
            ControlPanelUtility.WildcardMatch("Test", "?e*").Should().BeTrue();
            ControlPanelUtility.WildcardMatch("Test", "????").Should().BeTrue();
            ControlPanelUtility.WildcardMatch("Test", "???").Should().BeFalse();
            ControlPanelUtility.WildcardMatch("Test", "*").Should().BeTrue();
            ControlPanelUtility.WildcardMatch("Test", "*t").Should().BeTrue();
            ControlPanelUtility.WildcardMatch("Foundation.Serialization.FancyPants", "Foundation.*").Should().BeTrue();
            ControlPanelUtility.WildcardMatch("Foundation.Serialization.FancyPants", "*.FancyPants").Should().BeTrue();
            ControlPanelUtility.WildcardMatch("Foundation.Serialization.FancyPants", "*.Fancy?ants").Should().BeTrue();
            ControlPanelUtility.WildcardMatch("Foundation.Serialization.FancyPants", "*.Fancypants").Should().BeFalse();
        }
Exemple #9
0
        public void Render(HtmlTextWriter writer)
        {
            writer.Write("<h4>Initial Setup</h4>");

            var invalidRootPaths = ControlPanelUtility.GetInvalidRootPaths(_configuration);

            if (invalidRootPaths.Length == 0)
            {
                writer.Write("<p>Would you like to perform an initial serialization of all configured items using the options outlined above now? This is required to start using this configuration.</p>");

                writer.Write("<a class=\"button\" href=\"?verb=Reserialize&amp;configuration={0}\">Perform Initial Serialization of <em>{1}</em></a>", HttpUtility.UrlEncode(_configuration.Name), _configuration.Name);
            }
            else
            {
                writer.Write("<div class=\"warning\"><p>Cannot perform initial serialization because the predicate configuration is including item paths which do not exist in the database. The following path(s) are invalid:</p>");
                writer.Write("<ul>");
                foreach (var root in invalidRootPaths)
                {
                    writer.Write($"<li>{root}</li>");
                }
                writer.Write("</ul></div>");
            }
        }
Exemple #10
0
        public void Render(HtmlTextWriter writer)
        {
            var configurationHasSerializedItems = ControlPanelUtility.HasAnySerializedItems(_configuration);
            var configurationHasValidRootItems  = ControlPanelUtility.HasAnySourceItems(_configuration);
            var modalId = "m" + Guid.NewGuid();

            writer.Write(@"
			<tr>
				<td{0}>"                , configurationHasSerializedItems ? string.Empty:" colspan=\"2\"");

            writer.Write(@"
					<h3{0}{1}</h3>"                    .FormatWith(MultipleConfigurationsExist && configurationHasSerializedItems && configurationHasValidRootItems ? @" class=""fakebox""><span></span>" : ">", _configuration.Name));

            if (!string.IsNullOrWhiteSpace(_configuration.Description))
            {
                writer.Write(@"
					<p>{0}</p>"                    , _configuration.Description);
            }

            if (configurationHasSerializedItems)
            {
                writer.Write(@"
					<p><a href=""#"" data-modal=""{0}"" class=""info"">Detailed configuration information</a></p>"                    , modalId);
            }

            writer.Write(@"
					</p>"                    );

            if (!configurationHasValidRootItems)
            {
                writer.Write(@"
					<p class=""warning"">This configuration's predicate cannot resolve any valid root items. This usually means it is configured to look for nonexistent paths or GUIDs. Please review your predicate configuration.</p>"                    );
            }
            else if (!configurationHasSerializedItems)
            {
                writer.Write(@"
					<p class=""warning"">This configuration does not currently have any valid serialized items. You cannot sync it until you perform an initial serialization.</p>"                    );
            }

            var dpConfig = _configuration.Resolve <IUnicornDataProviderConfiguration>();

            if (dpConfig != null && dpConfig.EnableTransparentSync)
            {
                writer.Write(@"
					<p class=""transparent-sync"">Transparent sync is enabled for this configuration.</p>"                    );
            }

            var configDetails = _configuration.Resolve <ConfigurationDetails>();

            configDetails.ConfigurationName = _configuration.Name;
            configDetails.ModalId           = configurationHasSerializedItems && configurationHasValidRootItems ? modalId : null;
            configDetails.Render(writer);

            if (!configurationHasSerializedItems && configurationHasValidRootItems)
            {
                new InitialSetup(_configuration).Render(writer);
            }

            if (configurationHasSerializedItems)
            {
                writer.Write(@"
				</td>
				<td class=""controls"">"                );

                var htmlConfigName = HttpUtility.UrlEncode(_configuration.Name ?? string.Empty);

                var blurb = _configuration.Resolve <IUnicornDataProviderConfiguration>().EnableTransparentSync
                                        ? "DANGER: This configuration uses Transparent Sync. Items may not actually exist in the database, and if they do not reserializing will DELETE THEM from serialized. Continue?"
                                        : "This will reset the serialized state to match Sitecore. This normally is not needed after initial setup unless changing path configuration. Continue?";

                writer.Write(@"
					<a class=""button"" href=""?verb=Reserialize&amp;configuration={0}"" onclick=""return confirm('{1}')"">Reserialize</a>"                    , htmlConfigName, blurb);

                writer.Write(@"
					<a class=""button"" href=""?verb=Sync&amp;configuration={0}"">Sync</a>"                    , htmlConfigName);
            }

            writer.Write(@"
				</td>"                );

            writer.Write(@"
			</tr>"            );
        }
Exemple #11
0
        public void Render(HtmlTextWriter writer)
        {
            var configurationHasAnySerializedItems   = ControlPanelUtility.HasAnySerializedItems(_configuration);
            var configurationHasValidRootPathParents = ControlPanelUtility.AllRootParentPathsExist(_configuration);
            var configurationHasInvalidPredicates    = ControlPanelUtility.GetInvalidRootPaths(_configuration).Length > 0;

            var dependents = _configuration.Resolve <ConfigurationDependencyResolver>().Dependencies;

            var modalId = "m" + Guid.NewGuid();

            writer.Write(@"
			<tr>
				<td{0}>"                , configurationHasAnySerializedItems ? string.Empty : " colspan=\"2\"");

            writer.Write(@"
					<h3{0}{1}</h3>"                    .FormatWith(MultipleConfigurationsExist && configurationHasAnySerializedItems && configurationHasValidRootPathParents ? @" class=""fakebox""><span></span>" : ">", _configuration.Name));

            if (!string.IsNullOrWhiteSpace(_configuration.Description))
            {
                writer.Write(@"
					<p>{0}</p>"                    , _configuration.Description);
            }

            if (configurationHasAnySerializedItems)
            {
                writer.Write(@"
					<span class=""badge""><a href=""#"" data-modal=""{0}"" class=""info"">Show Config</a></span>"                    , modalId);
            }

            // Transparent Sync badge
            var dpConfig = _configuration.Resolve <IUnicornDataProviderConfiguration>();

            if (dpConfig != null && dpConfig.EnableTransparentSync)
            {
                writer.Write(@"
					<span class=""badge"" title=""Transparent Sync"">TS</span>"                    );
            }

            // Dependent configs badge
            if (dependents.Any())
            {
                var s = string.Join(",", dependents.Select(d => d.Configuration.Name).ToArray());
                writer.Write($@"
					<span class=""badge"" title=""This configuration depends on {dependents.Length} other configuration(s) => {s}"">Dep: {dependents.Length}</span>"                    );
            }

            // Dilithium badge
            var diSql = _configuration.EnablesDilithiumSql();
            var diSfs = _configuration.EnablesDilithiumSfs();

            if (diSql || diSfs)
            {
                var diState = diSql && diSfs ? "Full" : (diSql ? "SQL" : "Serialized");

                writer.Write($@"
					<span class=""badge"" 
						title=""Uses Dilithium high speed cached data stores.{(diSql ? " Direct SQL active." : string.Empty)}{(diSfs ? " Serialized snapshots active." : string.Empty)}"">
						Dilithium: {diState}
					</span>"                    );
            }

            if (!configurationHasValidRootPathParents)
            {
                writer.Write(@"
					<p class=""warning"">This configuration's predicate cannot resolve all root items. This usually means the predicate is configured to rely on a parent item that does not exist in the Sitecore database.<br /><br />"                    );
                writer.Write(@"The following predicates rely on a missing root path: <br />");
                foreach (string r in ControlPanelUtility.GetInvalidRootPaths(_configuration))
                {
                    writer.Write($"- {r}<br />");
                }
                writer.Write("</p>");
            }
            else if (!configurationHasAnySerializedItems && !configurationHasInvalidPredicates)
            {
                writer.Write(@"
					<p class=""warning"">This configuration does not currently have any valid serialized items. You cannot sync it until you perform an initial serialization, which will write the current state of Sitecore to serialized items.</p>"                    );
            }

            var configDetails = _configuration.Resolve <ConfigurationDetails>();

            configDetails.ConfigurationName = _configuration.Name;

            if (!configurationHasAnySerializedItems && configurationHasValidRootPathParents)
            {
                configDetails.Render(writer);
                new InitialSetup(_configuration).Render(writer);
            }
            else if (configurationHasValidRootPathParents)
            {
                configDetails.ModalId = modalId;
                configDetails.Render(writer);

                writer.Write(@"
				</td>
				<td class=""controls"">"                );

                var htmlConfigName = HttpUtility.UrlEncode(_configuration.Name ?? string.Empty);

                var blurb = _configuration.Resolve <IUnicornDataProviderConfiguration>().EnableTransparentSync
                                        ? "DANGER: This configuration uses Transparent Sync. Items may not actually exist in the database, and if they do not reserializing will DELETE THEM from serialized. Continue?"
                                        : "This will reset the serialized state to match Sitecore. This normally is not needed after initial setup unless changing path configuration. Continue?";

                if (!configurationHasInvalidPredicates)
                {
                    writer.Write(@"
						<a class=""button"" data-basehref=""?verb=Reserialize&amp;configuration={0}"" href=""?verb=Reserialize&amp;configuration={0}"" onclick=""return confirm('{1}')"">Reserialize</a>"                        , htmlConfigName, blurb);
                }

                writer.Write(@"
					<a class=""button"" data-basehref=""?verb=Sync&amp;configuration={0}"" href=""?verb=Sync&amp;configuration={0}"">Sync</a>"                    , htmlConfigName);
            }

            writer.Write(@"
				</td>"                );

            writer.Write(@"
			</tr>"            );
        }
Exemple #12
0
        protected virtual IEnumerable <IControlPanelControl> CreateBodyControls(UnicornControlPanelRequestPipelineArgs args)
        {
            var configurations = GetConfigurations(args);

            var hasSerializedItems    = configurations.All(ControlPanelUtility.HasAnySerializedItems);
            var hasAllRootParentPaths = configurations.All(ControlPanelUtility.AllRootParentPathsExist);
            var allowMultiSelect      = hasSerializedItems && hasAllRootParentPaths && configurations.Length > 1;
            var allowReserializeAll   = hasAllRootParentPaths && configurations.Sum(c => ControlPanelUtility.GetInvalidRootPaths(c).Length) == 0;

            // note that we don't just check dependencies property here to catch implicit dependencies
            var anyConfigurationsWithDependencies = configurations.Any(config => config.Resolve <ConfigurationDependencyResolver>().Dependents.Any());

            var isAuthorized = args.SecurityState.IsAllowed;

            if (!hasSerializedItems)
            {
                yield return(new GlobalWarnings(hasAllRootParentPaths, anyConfigurationsWithDependencies));
            }

            if (isAuthorized)
            {
                if (configurations.Length == 0)
                {
                    yield return(new NoConfigurations());

                    yield break;
                }

                if (allowMultiSelect)
                {
                    yield return(new BatchProcessingControls(allowReserializeAll));
                }

                yield return(new Literal(@"
						<article>
							<h2{0} Configurations</h2>"                            .FormatWith(allowMultiSelect ? @" class=""fakebox fakebox-all""><span></span>" : ">")));

                if (allowMultiSelect)
                {
                    yield return(new Literal(@"<p class=""help"">Check 'Configurations' above to select all configurations, or individually select as many as you like below.</p>"));

                    if (!allowReserializeAll)
                    {
                        yield return(new Literal(@"<p class=""help"">'Reserialize All' has been disabled because one or more configurations rely on root paths that do not exist in Sitecore currently.<br />'Reserialize' has also been removed from the configurations involved.</p>"));
                    }
                }
                else
                {
                    yield return(new Literal(@"<p class=""help"">Some configurations prevent the 'sync all' checkbox because they include predicates that rely on (currently) invalid root paths. You likely need to sync one or more base configurations.<p>"));
                }



                yield return(new Literal(@"
							<table>
								<tbody>"                                ));

                foreach (var configuration in configurations)
                {
                    yield return(new ConfigurationInfo(configuration)
                    {
                        MultipleConfigurationsExist = allowMultiSelect
                    });
                }

                yield return(new Literal(@"
								</tbody>
							</table>
						</article>"                        ));

                yield return(new QuickReference());
            }
            else
            {
                yield return(new AccessDenied());
            }
        }