示例#1
0
 private void DeleteRelatedItems(ContentTypeDependencies dependencies)
 {
     if (dependencies.Applications.Length > 0)
     {
         Logger.LogMessage("Deleting applications...");
         foreach (var node in dependencies.Applications.Select(Node.LoadNode).Where(n => n != null))
         {
             node.ForceDelete();
         }
         Logger.LogMessage("Ok.");
     }
     if (dependencies.ContentTemplates.Length > 0)
     {
         Logger.LogMessage("Deleting content templates...");
         foreach (var node in dependencies.ContentTemplates.Select(Node.LoadNode).Where(n => n != null))
         {
             node.ForceDelete();
         }
         Logger.LogMessage("Ok.");
     }
     if (dependencies.ContentViews.Length > 0)
     {
         Logger.LogMessage("Deleting content views...");
         foreach (var node in dependencies.ContentViews.Select(Node.LoadNode).Where(n => n != null))
         {
             node.ForceDelete();
         }
         Logger.LogMessage("Ok.");
     }
 }
示例#2
0
        internal ContentTypeDependencies GetDependencies(string[] rootTypeNames)
        {
            var typeNames          = new List <string>();
            var inheritedTypeNames = new List <string>();

            foreach (var rootTypeName in rootTypeNames)
            {
                var typeSubtreeQuery = ContentQuery.CreateQuery(ContentRepository.SafeQueries.InTree,
                                                                QuerySettings.AdminSettings, ContentType.GetByName(rootTypeName).Path);
                var typeSubtreeResult = typeSubtreeQuery.Execute();
                typeNames.AddRange(typeSubtreeResult.Nodes.Select(n => n.Name));
                inheritedTypeNames.AddRange(typeNames.Except(rootTypeNames));
            }

            var relatedFolders = GetRelatedFolders(typeNames);

            var contentInstancesCount = ContentQuery.CreateQuery(
                ContentRepository.SafeQueries.TypeIsCountOnly,
                QuerySettings.AdminSettings, new object[] { rootTypeNames }).Execute().Count
                                        -
                                        relatedFolders.ContentTemplates.Select(p => ContentQuery.Query(
                                                                                   ContentRepository.SafeQueries.InTreeAndTypeIsCountOnly,
                                                                                   QuerySettings.AdminSettings, p, typeNames).Count).Sum();

            var PDP    = Providers.Instance.DataProvider.GetExtension <IPackagingDataProviderExtension>();
            var result = new ContentTypeDependencies
            {
                ContentTypeNames = rootTypeNames,
                // +InTree:[currentContentType.Path]
                InheritedTypeNames = inheritedTypeNames.ToArray(),
                // +TypeIs:[name]
                InstanceCount = contentInstancesCount,
                // ContentType/AllowedChildTypes: "Folder,File"
                PermittingContentTypes = GetContentTypesWhereTheyAreAllowed(typeNames),
                // ContentType/Fields/Field/Configuration/AllowedTypes/Type: "Folder"
                PermittingFieldSettings = GetContentTypesWhereTheyAreAllowedInReferenceField(typeNames),
                // ContentMetaData/Fields/AllowedChildTypes: "Folder File"
                PermittingContentCollection = PDP.GetContentPathsWhereTheyAreAllowedChildren(typeNames),

                Applications     = relatedFolders.Applications,
                ContentTemplates = relatedFolders.ContentTemplates,
                ContentViews     = relatedFolders.ContentViews
            };

            return(result);
        }
        internal ContentTypeDependencies GetDependencies(ContentType currentContentType)
        {
            var name = currentContentType.Name;

            var typeSubtreeQuery = ContentQuery.CreateQuery(ContentRepository.SafeQueries.InTree,
                                                            QuerySettings.AdminSettings, currentContentType.Path);
            var typeSubtreeResult  = typeSubtreeQuery.Execute();
            var typeNames          = typeSubtreeResult.Nodes.Select(n => n.Name).ToArray();
            var inheritedTypeNames = typeNames.Where(s => s != name).ToArray();

            var relatedFolders = GetRelatedFolders(typeNames);

            var contentInstancesCount = ContentQuery.CreateQuery(ContentRepository.SafeQueries.TypeIsCountOnly,
                                                                 QuerySettings.AdminSettings, name).Execute().Count
                                        -
                                        relatedFolders.ContentTemplates.Select(p => ContentQuery.Query(ContentRepository.SafeQueries.InTreeAndTypeIsCountOnly,
                                                                                                       QuerySettings.AdminSettings, p, typeNames).Count).Sum();

            var result = new ContentTypeDependencies
            {
                ContentTypeName = name,
                // +InTree:[currentContentType.Path]
                InheritedTypeNames = inheritedTypeNames,
                // +TypeIs:[name]
                InstanceCount = contentInstancesCount,
                // ContentType/AllowedChildTypes: "Folder,File"
                PermittingContentTypes = GetContentTypesWhereTheyAreAllowed(typeNames),
                // ContentType/Fields/Field/Configuration/AllowedTypes/Type: "Folder"
                PermittingFieldSettings = GetContentTypesWhereTheyAreAllowedInReferenceField(typeNames),
                // ContentMetaData/Fields/AllowedChildTypes: "Folder File"
                PermittingContentCollection = GetContentPathsWhereTheyAreAllowedChildren(typeNames),

                Applications     = relatedFolders.Applications,
                ContentTemplates = relatedFolders.ContentTemplates,
                ContentViews     = relatedFolders.ContentViews
            };

            return(result);
        }
示例#4
0
        private void RemoveAllowedTypes(ContentTypeDependencies dependencies)
        {
            Logger.LogMessage("Remove from allowed types:");

            var names = dependencies.InheritedTypeNames.ToList();

            names.AddRange(dependencies.ContentTypeNames);
            var ns = EditContentType.NamespacePrefix;

            if (dependencies.PermittingContentTypes.Length + dependencies.PermittingFieldSettings.Length > 0)
            {
                foreach (var contentType in ContentType.GetContentTypes())
                {
                    var changed = false;
                    var xml     = new XmlDocument();
                    xml.Load(contentType.Binary.GetStream());
                    var nsmgr = EditContentType.GetNamespaceManager(xml);

                    var allowedChildTypesElement =
                        (XmlElement)xml.SelectSingleNode($"/{ns}:ContentType/{ns}:AllowedChildTypes", nsmgr);
                    if (allowedChildTypesElement != null)
                    {
                        var oldList = allowedChildTypesElement.InnerText.Split(new[] { ',' },
                                                                               StringSplitOptions.RemoveEmptyEntries);
                        var newList = oldList.Except(names).ToArray();
                        if (oldList.Length != newList.Length)
                        {
                            changed = true;
                            Logger.LogMessage($"    {contentType.Name}");
                            allowedChildTypesElement.InnerText = string.Join(",", newList);
                        }
                    }

                    foreach (XmlElement refFieldElement in xml.SelectNodes($"//{ns}:Field[@type='Reference']", nsmgr))
                    {
                        var elementsToDelete = new List <XmlElement>();
                        var oldAllowedTypes  =
                            refFieldElement.SelectNodes($"{ns}:Configuration/{ns}:AllowedTypes/{ns}:Type", nsmgr);
                        foreach (XmlElement typeElement in oldAllowedTypes)
                        {
                            if (names.Contains(typeElement.InnerText))
                            {
                                elementsToDelete.Add(typeElement);
                            }
                        }
                        if (elementsToDelete.Any())
                        {
                            var fieldName = refFieldElement.Attributes["name"].Value;
                            Logger.LogMessage($"    {contentType.Name}.{fieldName}");
                            changed = true;
                        }
                        foreach (var element in elementsToDelete)
                        {
                            element.ParentNode.RemoveChild(element);
                        }
                    }

                    if (changed)
                    {
                        ContentTypeInstaller.InstallContentType(xml.OuterXml);
                    }
                }
            }

            if (dependencies.PermittingContentCollection.Count > 0)
            {
                foreach (var item in dependencies.PermittingContentCollection)
                {
                    Logger.LogMessage($"    {item.Key}");

                    var content = Content.Load(item.Key);
                    if (content != null)
                    {
                        if (content.ContentHandler is GenericContent gc)
                        {
                            var newList = new List <ContentType>();
                            var oldList = gc.AllowedChildTypes.ToList();
                            foreach (var ct in oldList)
                            {
                                if (!names.Contains(ct.Name))
                                {
                                    newList.Add(ct);
                                }
                            }

                            gc.AllowedChildTypes = newList;
                            gc.Save();
                        }
                    }
                }
            }
        }
示例#5
0
        private void PrintDependencies(ContentTypeDependencies dependencies)
        {
            var names = dependencies.InheritedTypeNames.ToList();

            names.AddRange(dependencies.ContentTypeNames);

            var inheritedTypeNames = dependencies.InheritedTypeNames;

            Logger.LogMessage("  Dependencies: ");
            Logger.LogMessage("    Inherited types: ");
            Logger.LogMessage("      " + (inheritedTypeNames.Length == 0 ? "There is no related item." : string.Join(", ", inheritedTypeNames)));
            Logger.LogMessage(string.Empty);
            Logger.LogMessage("    Content instances: " + dependencies.InstanceCount);
            Logger.LogMessage(string.Empty);

            Logger.LogMessage("  Relations: ");
            if (dependencies.Applications.Length > 0)
            {
                Logger.LogMessage("    Applications: ");
                foreach (var path in dependencies.Applications)
                {
                    Logger.LogMessage($"      {path}");
                }
                Logger.LogMessage(string.Empty);
            }
            if (dependencies.ContentTemplates.Length > 0)
            {
                Logger.LogMessage("    Content templates: ");
                foreach (var path in dependencies.ContentTemplates)
                {
                    Logger.LogMessage($"      {path}");
                }
                Logger.LogMessage(string.Empty);
            }
            if (dependencies.ContentViews.Length > 0)
            {
                Logger.LogMessage("    Content views: ");
                foreach (var path in dependencies.ContentViews)
                {
                    Logger.LogMessage($"      {path}");
                }
                Logger.LogMessage(string.Empty);
            }
            if (dependencies.PermittingContentTypes.Length > 0)
            {
                Logger.LogMessage("    Remaining allowed child types in other content types after deletion:");
                foreach (var contentType in dependencies.PermittingContentTypes)
                {
                    var remaining = string.Join(", ", contentType.AllowedChildTypeNames.Except(names).ToArray());
                    remaining = remaining.Length == 0 ? "[empty]" : remaining;
                    Logger.LogMessage($"      {contentType.Name}: {remaining}");
                }
                Logger.LogMessage(string.Empty);
            }
            if (dependencies.PermittingFieldSettings.Length > 0)
            {
                Logger.LogMessage("    Remaining allowed child types in reference fields after deletion:");
                foreach (var fieldSetting in dependencies.PermittingFieldSettings)
                {
                    var remaining = string.Join(", ", fieldSetting.AllowedTypes.Except(names).ToArray());
                    remaining = remaining.Length == 0 ? "[empty]" : remaining;
                    Logger.LogMessage($"      {fieldSetting.Owner.Name}.{fieldSetting.Name}: {remaining}");
                }
                Logger.LogMessage(string.Empty);
            }
            if (dependencies.PermittingContentCollection.Count > 0)
            {
                Logger.LogMessage("    Remaining allowed child types in content after deletion:");
                foreach (var item in dependencies.PermittingContentCollection)
                {
                    var remaining = string.Join(", ", item.Value.Split(' ').Except(names).ToArray());
                    Logger.LogMessage($"      {item.Key}: {(remaining.Length == 0 ? "[empty]" : remaining)}");
                }
                Logger.LogMessage(string.Empty);
            }
        }