Exemple #1
0
        public object Resolve(object source, Dictionary <String, IResolver> resolvers = null, Boolean recursive = false)
        {
            var result = new List <Model.Folder>();

            var folders = source.GetPublicInstancePropertyValue("Folders");

            if (null == folders)
            {
                folders = source.GetPublicInstancePropertyValue("Folder1");
            }

            resolvers = new Dictionary <string, IResolver>();
            resolvers.Add($"{typeof(Model.Folder).FullName}.Folders", new FoldersFromSchemaToModelTypeResolver());
            resolvers.Add($"{typeof(Model.Folder).FullName}.Security", new SecurityFromSchemaToModelTypeResolver());

            // DefaultColumnValues
            var defaultColumnValueTypeName      = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.StringDictionaryItem, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
            var defaultColumnValueType          = Type.GetType(defaultColumnValueTypeName, true);
            var defaultColumnValueKeySelector   = CreateSelectorLambda(defaultColumnValueType, "Key");
            var defaultColumnValueValueSelector = CreateSelectorLambda(defaultColumnValueType, "Value");

            resolvers.Add($"{typeof(Model.Folder).FullName}.DefaultColumnValues", new FromArrayToDictionaryValueResolver <string, string>(defaultColumnValueType, defaultColumnValueKeySelector, defaultColumnValueValueSelector));

            if (null != folders)
            {
                foreach (var f in ((IEnumerable)folders))
                {
                    var targetItem = new Model.Folder();
                    PnPObjectsMapper.MapProperties(f, targetItem, resolvers, recursive);
                    result.Add(targetItem);
                }
            }

            return(result);
        }
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            if (template.ApplicationLifecycleManagement != null &&
                (template.ApplicationLifecycleManagement.AppCatalog != null ||
                 (template.ApplicationLifecycleManagement.Apps != null &&
                  template.ApplicationLifecycleManagement.Apps.Count > 0)))
            {
                var almTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.ApplicationLifecycleManagement, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var almType     = Type.GetType(almTypeName, false);

                if (almType != null)
                {
                    var target = Activator.CreateInstance(almType, true);

                    var resolvers = new Dictionary <String, IResolver>
                    {
                        {
                            $"{almType}.AppCatalog",
                            new AppCatalogFromModelToSchemaTypeResolver()
                        }
                    };

                    PnPObjectsMapper.MapProperties(template.ApplicationLifecycleManagement, target,
                                                   resolvers, recursive: true);

                    if (target != null &&
                        (target.GetPublicInstancePropertyValue("AppCatalog") != null ||
                         target.GetPublicInstancePropertyValue("Apps") != null))
                    {
                        persistence.GetPublicInstanceProperty("ApplicationLifecycleManagement")
                        .SetValue(persistence, target);
                    }
                }
            }
        }
Exemple #3
0
        public override void Deserialize(object persistence, ProvisioningTemplate template)
        {
            var workflows = persistence.GetPublicInstancePropertyValue("Workflows");

            if (workflows != null)
            {
                template.Workflows = new Workflows();
                var expressions = new Dictionary <Expression <Func <Workflows, Object> >, IResolver>
                {
                    { w => w.WorkflowDefinitions[0].Id, new FromStringToGuidValueResolver() },
                    { w => w.WorkflowDefinitions[0].FormField, new ExpressionValueResolver((s, v) => v != null ? ((XmlElement)v).OuterXml : null) },
                    { w => w.WorkflowSubscriptions[0].DefinitionId, new FromStringToGuidValueResolver() }
                };
                var dictionaryItemType          = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.StringDictionaryItem, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}", true);
                var dictionaryItemKeySelector   = CreateSelectorLambda(dictionaryItemType, "Key");
                var dictionaryItemValueSelector = CreateSelectorLambda(dictionaryItemType, "Value");
                expressions.Add(w => w.WorkflowDefinitions[0].Properties, new FromArrayToDictionaryValueResolver <string, string>(dictionaryItemType, dictionaryItemKeySelector, dictionaryItemValueSelector));

                expressions.Add(w => w.WorkflowSubscriptions[0].EventTypes, new ExpressionValueResolver((s, v) =>
                {
                    return((new string[] {
                        (bool)s.GetPublicInstancePropertyValue("ItemAddedEvent") ? "ItemAdded" : null,
                        (bool)s.GetPublicInstancePropertyValue("ItemUpdatedEvent") ? "ItemUpdated" : null,
                        (bool)s.GetPublicInstancePropertyValue("WorkflowStartEvent") ? "WorkflowStart" : null
                    }).Where(e => e != null).ToList());
                }));
                expressions.Add(w => w.WorkflowSubscriptions[0].PropertyDefinitions, new FromArrayToDictionaryValueResolver <string, string>(dictionaryItemType, dictionaryItemKeySelector, dictionaryItemValueSelector));

                PnPObjectsMapper.MapProperties(workflows, template.Workflows, expressions, true);
            }
        }
        public override void Deserialize(object persistence, ProvisioningTemplate template)
        {
            var clientSidePages = persistence.GetPublicInstancePropertyValue("ClientSidePages");

            if (clientSidePages != null)
            {
                var expressions = new Dictionary <Expression <Func <ClientSidePage, Object> >, IResolver>();

                // Manage CanvasControlProperties for CanvasControl
                var stringDictionaryTypeName      = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.StringDictionaryItem, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var stringDictionaryType          = Type.GetType(stringDictionaryTypeName, true);
                var stringDictionaryKeySelector   = CreateSelectorLambda(stringDictionaryType, "Key");
                var stringDictionaryValueSelector = CreateSelectorLambda(stringDictionaryType, "Value");
                expressions.Add(cp => cp.Sections[0].Controls[0].ControlProperties,
                                new FromArrayToDictionaryValueResolver <String, String>(
                                    stringDictionaryType, stringDictionaryKeySelector, stringDictionaryValueSelector));

                // Manage WebPartType for CanvasControl
                expressions.Add(cp => cp.Sections[0].Controls[0].Type,
                                new ExpressionValueResolver(
                                    (s, p) => (Model.WebPartType)Enum.Parse(typeof(Model.WebPartType), s.GetPublicInstancePropertyValue("WebPartType").ToString())
                                    ));

                // Manage ControlId for CanvasControl
                expressions.Add(cp => cp.Sections[0].Controls[0].ControlId,
                                new FromStringToGuidValueResolver());

                template.ClientSidePages.AddRange(
                    PnPObjectsMapper.MapObjects(clientSidePages,
                                                new CollectionFromSchemaToModelTypeResolver(typeof(ClientSidePage)),
                                                expressions,
                                                recursive: true)
                    as IEnumerable <ClientSidePage>);
            }
        }
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            var customActionsTypeName      = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.CustomActions, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
            var customActionsType          = Type.GetType(customActionsTypeName, true);
            var customActionTypeName       = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.CustomAction, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
            var customActionType           = Type.GetType(customActionTypeName, true);
            var registrationTypeTypeName   = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.RegistrationType";
            var registrationTypeType       = Type.GetType(registrationTypeTypeName, true);
            var commandUIExtensionTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.CustomActionCommandUIExtension";
            var commandUIExtensionType     = Type.GetType(commandUIExtensionTypeName, true);

            var target = Activator.CreateInstance(customActionsType, true);

            var expressions = new Dictionary <string, IResolver>();

            expressions.Add($"{customActionType}.Rights", new FromBasePermissionsToStringValueResolver());
            expressions.Add($"{customActionType}.RegistrationType", new FromStringToEnumValueResolver(registrationTypeType));
            expressions.Add($"{customActionType}.RegistrationTypeSpecified", new ExpressionValueResolver(() => true));
            expressions.Add($"{customActionType}.SequenceSpecified", new ExpressionValueResolver(() => true));
            expressions.Add($"{customActionType}.CommandUIExtension", new XmlAnyFromModeToSchemalValueResolver(commandUIExtensionType));

            PnPObjectsMapper.MapProperties(template.CustomActions, target, expressions, recursive: true);

            persistence.GetPublicInstanceProperty("CustomActions").SetValue(persistence, target);
        }
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            if (template.Security != null)
            {
                var securityTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.Security, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var securityType     = Type.GetType(securityTypeName, true);

                var expressions = new Dictionary <string, IResolver>
                {
                    { $"{securityType}.BreakRoleInheritanceSpecified", new ExpressionValueResolver(() => true) },
                    { $"{securityType}.ResetRoleInheritanceSpecified", new ExpressionValueResolver(() => true) },
                    { $"{securityType}.CopyRoleAssignmentsSpecified", new ExpressionValueResolver(() => true) },
                    { $"{securityType}.RemoveExistingUniqueRoleAssignmentsSpecified", new ExpressionValueResolver(() => true) },
                    { $"{securityType}.ClearSubscopesSpecified", new ExpressionValueResolver(() => true) }
                };

                var securityPermissionsType      = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.SecurityPermissions, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}");
                var roleDefinitionType           = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.RoleDefinition, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}");
                var roleDefinitionPermissionType = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.RoleDefinitionPermission, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}");
                var siteGroupType = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.SiteGroup, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}");

                var target = Activator.CreateInstance(securityType, true);

                expressions.Add($"{securityType}.Permissions", new PropertyObjectTypeResolver(securityPermissionsType, "SiteSecurityPermissions"));
                expressions.Add($"{roleDefinitionType}.Permissions", new ExpressionCollectionValueResolver((i) => Enum.Parse(roleDefinitionPermissionType, i.ToString()), roleDefinitionPermissionType));

                expressions.Add($"{siteGroupType}.AllowMembersEditMembershipSpecified", new ExpressionValueResolver(() => true));
                expressions.Add($"{siteGroupType}.AllowRequestToJoinLeaveSpecified", new ExpressionValueResolver(() => true));
                expressions.Add($"{siteGroupType}.AutoAcceptRequestToJoinLeaveSpecified", new ExpressionValueResolver(() => true));
                expressions.Add($"{siteGroupType}.OnlyAllowMembersViewMembershipSpecified", new ExpressionValueResolver(() => true));

                expressions.Add($"{securityType}.AdditionalAdministrators",
                                new TemplateSecurityUsersFromModelToSchemaTypeResolver("AdditionalAdministrators", "ClearExistingAdministrators"));
                expressions.Add($"{securityType}.AdditionalOwners",
                                new TemplateSecurityUsersFromModelToSchemaTypeResolver("AdditionalOwners", "ClearExistingOwners"));
                expressions.Add($"{securityType}.AdditionalMembers",
                                new TemplateSecurityUsersFromModelToSchemaTypeResolver("AdditionalMembers", "ClearExistingMembers"));
                expressions.Add($"{securityType}.AdditionalVisitors",
                                new TemplateSecurityUsersFromModelToSchemaTypeResolver("AdditionalVisitors", "ClearExistingVisitors"));
                expressions.Add($"{siteGroupType}.Members",
                                new TemplateSecurityUsersFromModelToSchemaTypeResolver("Members", "ClearExistingMembers"));

                PnPObjectsMapper.MapProperties(template.Security, target, expressions, recursive: true);

                if (target != null &&
                    (target.GetPublicInstancePropertyValue("AdditionalAdministrators") != null ||
                     target.GetPublicInstancePropertyValue("AdditionalMembers") != null ||
                     target.GetPublicInstancePropertyValue("AdditionalOwners") != null ||
                     target.GetPublicInstancePropertyValue("AdditionalVisitors") != null ||
                     target.GetPublicInstancePropertyValue("SiteGroups") != null ||
                     (target.GetPublicInstancePropertyValue("Permissions") != null &&
                      (
                          target.GetPublicInstancePropertyValue("Permissions").GetPublicInstancePropertyValue("RoleDefinitions") != null && (((Array)target.GetPublicInstancePropertyValue("Permissions").GetPublicInstancePropertyValue("RoleDefinitions")).Length > 0) ||
                          target.GetPublicInstancePropertyValue("Permissions").GetPublicInstancePropertyValue("RoleAssignments") != null && (((Array)target.GetPublicInstancePropertyValue("Permissions").GetPublicInstancePropertyValue("RoleAssignments")).Length > 0)
                      ))))
                {
                    persistence.GetPublicInstanceProperty("Security").SetValue(persistence, target);
                }
            }
        }
Exemple #7
0
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            if (template.CustomActions != null && (template.CustomActions.WebCustomActions.Count > 0 || template.CustomActions.SiteCustomActions.Count > 0))
            {
                var customActionsTypeName      = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.CustomActions, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var customActionsType          = Type.GetType(customActionsTypeName, true);
                var customActionTypeName       = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.CustomAction, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var customActionType           = Type.GetType(customActionTypeName, true);
                var registrationTypeTypeName   = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.RegistrationType";
                var registrationTypeType       = Type.GetType(registrationTypeTypeName, true);
                var commandUIExtensionTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.CustomActionCommandUIExtension";
                var commandUIExtensionType     = Type.GetType(commandUIExtensionTypeName, true);

                var target = Activator.CreateInstance(customActionsType, true);

                var expressions = new Dictionary <string, IResolver>
                {
                    { $"{customActionType}.Rights", new FromBasePermissionsToStringValueResolver() },
                    { $"{customActionType}.RegistrationType", new FromStringToEnumValueResolver(registrationTypeType) },
                    { $"{customActionType}.RegistrationTypeSpecified", new ExpressionValueResolver(() => true) },
                    { $"{customActionType}.SequenceSpecified", new ExpressionValueResolver(() => true) },
                    { $"{customActionType}.CommandUIExtension", new XmlAnyFromModelToSchemalValueResolver(commandUIExtensionType) },
                    { $"{customActionType}.ClientSideComponentId", new ExpressionValueResolver((s, v) => v != null ? v.ToString() : s?.ToString()) }
                };

                PnPObjectsMapper.MapProperties(template.CustomActions, target, expressions, recursive: true);

                if (target != null &&
                    ((target.GetPublicInstancePropertyValue("SiteCustomActions") != null && ((Array)target.GetPublicInstancePropertyValue("SiteCustomActions")).Length > 0) ||
                     (target.GetPublicInstancePropertyValue("WebCustomActions") != null && ((Array)target.GetPublicInstancePropertyValue("WebCustomActions")).Length > 0)))
                {
                    persistence.GetPublicInstanceProperty("CustomActions").SetValue(persistence, target);
                }
            }
        }
        public object Resolve(object source, Dictionary <String, IResolver> resolvers = null, Boolean recursive = false)
        {
            Object result = null;

            // Try with the tenant-wide AppCatalog
            BaseClientSidePage page;

            if (source is ClientSidePage)
            {
                page = source as ClientSidePage;
            }
            else
            {
                page = source as TranslatedClientSidePage;
            }

            //var page = source as Model.ClientSidePage;
            var header = page?.Header;

            if (null != header)
            {
                var headerTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.BaseClientSidePageHeader, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var headerType     = Type.GetType(headerTypeName, true);
                result = Activator.CreateInstance(headerType);

                PnPObjectsMapper.MapProperties(header, result, resolvers, recursive);
            }

            return(result);
        }
        public override void Deserialize(object persistence, ProvisioningTemplate template)
        {
            var handlers = persistence.GetPublicInstancePropertyValue("Providers");

            if (handlers != null)
            {
                var expressions = new Dictionary <Expression <Func <ExtensibilityHandler, Object> >, IResolver>();
                expressions.Add(h => h.Configuration, new ExpressionValueResolver((s, v) => (v as XmlElement)?.ToProviderConfiguration()));
                expressions.Add(h => h.Type, new ExpressionValueResolver <ExtensibilityHandler>((s, v, d) =>
                {
                    string res   = null;
                    var typeName = s.GetPublicInstancePropertyValue("HandlerType");
                    if (typeName != null)
                    {
                        var type = Type.GetType(typeName.ToString(), false);
                        if (type != null)
                        {
                            d.Assembly = type.Assembly.FullName;
                            res        = type.FullName;
                        }
                    }
                    return(res);
                }));


                var result = PnPObjectsMapper.MapObjects <ExtensibilityHandler>(handlers,
                                                                                new CollectionFromSchemaToModelTypeResolver(typeof(ExtensibilityHandler)),
                                                                                expressions,
                                                                                recursive: true)
                             as IEnumerable <ExtensibilityHandler>;
                template.ExtensibilityHandlers.AddRange(result.Where(h => !string.IsNullOrEmpty(h.Type)));
            }
        }
Exemple #10
0
        public override void Deserialize(object persistence, ProvisioningTemplate template)
        {
            var aad = persistence.GetPublicInstancePropertyValue("AzureActiveDirectory");

            if (aad != null)
            {
                var expressions = new Dictionary <Expression <Func <ProvisioningAzureActiveDirectory, Object> >, IResolver>
                {
                    // Manage the Users and their Password Profile
                    { a => a.Users, new AADUsersFromSchemaToModelTypeResolver() },
                    { a => a.Users[0].PasswordProfile, new AADUsersPasswordProfileFromSchemaToModelTypeResolver() },
                    {
                        a => a.Users[0].PasswordProfile.Password,
                        new ExpressionValueResolver((s, p) => EncryptionUtility.ToSecureString((String)p))
                    },

                    // Manage licenses for users
                    {
                        a => a.Users[0].Licenses[0].DisabledPlans,
                        new ExpressionValueResolver((s, p) => s.GetPublicInstancePropertyValue("DisabledPlans"))
                    }
                };

                PnPObjectsMapper.MapProperties(aad, template.ParentHierarchy.AzureActiveDirectory, expressions, recursive: true);
            }
        }
Exemple #11
0
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            if (template.Security != null)
            {
                var securityTypeName             = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.Security, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var securityType                 = Type.GetType(securityTypeName, true);
                var securityPermissionsType      = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.SecurityPermissions, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}");
                var roleDefinitionType           = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.RoleDefinition, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}");
                var roleDefinitionPermissionType = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.RoleDefinitionPermission, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}");
                var siteGroupType                = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.SiteGroup, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}");

                var target = Activator.CreateInstance(securityType, true);

                var expressions = new Dictionary <string, IResolver>();
                expressions.Add($"{securityType}.Permissions", new PropertyObjectTypeResolver(securityPermissionsType, "SiteSecurityPermissions"));
                expressions.Add($"{roleDefinitionType}.Permissions", new ExpressionCollectionValueResolver((i) => Enum.Parse(roleDefinitionPermissionType, i.ToString()), roleDefinitionPermissionType));

                expressions.Add($"{siteGroupType}.AllowMembersEditMembershipSpecified", new ExpressionValueResolver(() => true));
                expressions.Add($"{siteGroupType}.AllowRequestToJoinLeaveSpecified", new ExpressionValueResolver(() => true));
                expressions.Add($"{siteGroupType}.AutoAcceptRequestToJoinLeaveSpecified", new ExpressionValueResolver(() => true));
                expressions.Add($"{siteGroupType}.OnlyAllowMembersViewMembershipSpecified", new ExpressionValueResolver(() => true));
                PnPObjectsMapper.MapProperties(template.Security, target, expressions, recursive: true);

                persistence.GetPublicInstanceProperty("Security").SetValue(persistence, target);
            }
        }
        public override void Deserialize(object persistence, ProvisioningTemplate template)
        {
            var filesCollection = persistence.GetPublicInstancePropertyValue("Files");

            if (filesCollection != null)
            {
                var files = filesCollection.GetPublicInstancePropertyValue("File");

                var expressions = new Dictionary <Expression <Func <File, Object> >, IResolver>
                {
                    { c => c.Level, new FromStringToEnumValueResolver(typeof(FileLevel)) }
                };

                var dictionaryItemTypeName      = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.StringDictionaryItem, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var dictionaryItemType          = Type.GetType(dictionaryItemTypeName, true);
                var dictionaryItemKeySelector   = CreateSelectorLambda(dictionaryItemType, "Key");
                var dictionaryItemValueSelector = CreateSelectorLambda(dictionaryItemType, "Value");
                expressions.Add(f => f.Properties, new FromArrayToDictionaryValueResolver <string, string>(dictionaryItemType, dictionaryItemKeySelector, dictionaryItemValueSelector));
                expressions.Add(f => f.Security, new PropertyObjectTypeResolver <File>(fl => fl.Security,
                                                                                       fl => fl.GetPublicInstancePropertyValue("Security")?.GetPublicInstancePropertyValue("BreakRoleInheritance")));
                expressions.Add(f => f.Security.RoleAssignments, new RoleAssigmentsFromSchemaToModelTypeResolver());
                expressions.Add(f => f.WebParts[0].Order, new ExpressionValueResolver <int>((v) => (uint)v));
                expressions.Add(f => f.WebParts[0].Contents, new ExpressionValueResolver((s, v) => v != null ? ((XmlElement)v).OuterXml : null));

                template.Files.AddRange(
                    PnPObjectsMapper.MapObjects <File>(files,
                                                       new CollectionFromSchemaToModelTypeResolver(typeof(File)),
                                                       expressions,
                                                       recursive: true)
                    as IEnumerable <File>);
            }
        }
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            var baseNamespace               = PnPSerializationScope.Current?.BaseSchemaNamespace;
            var contentTypeTypeName         = $"{baseNamespace}.ContentType, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
            var contentTypeType             = Type.GetType(contentTypeTypeName, true);
            var documentSetTemplateTypeName = $"{baseNamespace}.DocumentSetTemplate, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
            var documentSetTemplateType     = Type.GetType(documentSetTemplateTypeName, true);
            var documentTemplateTypeName    = $"{baseNamespace}.ContentTypeDocumentTemplate, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
            var documentTemplateType        = Type.GetType(documentTemplateTypeName, true);

            var expressions = new Dictionary <string, IResolver>();

            //document set template
            expressions.Add($"{contentTypeType.FullName}.DocumentSetTemplate", new PropertyObjectTypeResolver(documentSetTemplateType, "DocumentSetTemplate"));

            //document set template - allowed content types
            expressions.Add($"{contentTypeType.Namespace}.DocumentSetTemplate.AllowedContentTypes",
                            new DocumentSetTemplateAllowedContentTypesFromModelToSchemaTypeResolver());

            //document set template - shared fields and welcome page fields (this expression also used to resolve fieldref collection ids because of same type name)
            expressions.Add($"{contentTypeType.Namespace}.FieldRefBase.ID", new ExpressionValueResolver((s, v) => v != null ? v.ToString() : s?.ToString()));
            //document template
            expressions.Add($"{contentTypeType.FullName}.DocumentTemplate", new DocumentTemplateFromModelToSchemaTypeResolver(documentTemplateType));

            persistence.GetPublicInstanceProperty("ContentTypes")
            .SetValue(
                persistence,
                PnPObjectsMapper.MapObjects(template.ContentTypes,
                                            new CollectionFromModelToSchemaTypeResolver(contentTypeType), expressions, true));
        }
        public override void Deserialize(object persistence, ProvisioningTemplate template)
        {
            var contentTypes = persistence.GetPublicInstancePropertyValue("ContentTypes");

            if (contentTypes != null)
            {
                var expressions = new Dictionary <Expression <Func <ContentType, Object> >, IResolver>();

                // Define custom resolver for FieldRef.ID because needs conversion from String to GUID
                expressions.Add(c => c.FieldRefs[0].Id, new FromStringToGuidValueResolver());
                //document template
                expressions.Add(c => c.DocumentTemplate, new ExpressionValueResolver((s, v) => v.GetPublicInstancePropertyValue("TargetName")));
                //document set template
                expressions.Add(c => c.DocumentSetTemplate, new PropertyObjectTypeResolver <ContentType>(ct => ct.DocumentSetTemplate));

                //document set template - allowed content types
                expressions.Add(c => c.DocumentSetTemplate.AllowedContentTypes,
                                new DocumentSetTemplateAllowedContentTypesFromSchemaToModelTypeResolver());
                //document set template - remove existing content types
                expressions.Add(c => c.DocumentSetTemplate.RemoveExistingContentTypes,
                                new RemoveExistingContentTypesFromSchemaToModelValueResolver());

                //document set template - shared fields
                expressions.Add(c => c.DocumentSetTemplate.SharedFields, new ExpressionCollectionValueResolver <Guid>((s) => Guid.Parse(s.GetPublicInstancePropertyValue("ID").ToString())));
                //document set template - welcome page fields
                expressions.Add(c => c.DocumentSetTemplate.WelcomePageFields, new ExpressionCollectionValueResolver <Guid>((s) => Guid.Parse(s.GetPublicInstancePropertyValue("ID").ToString())));

                template.ContentTypes.AddRange(
                    PnPObjectsMapper.MapObjects <ContentType>(contentTypes,
                                                              new CollectionFromSchemaToModelTypeResolver(typeof(ContentType)),
                                                              expressions,
                                                              recursive: true)
                    as IEnumerable <ContentType>);
            }
        }
Exemple #15
0
        public object Resolve(object source, Dictionary <string, IResolver> resolvers = null, bool recursive = false)
        {
            var result = new List <Model.SiteFooterLink>();

            var links = source.GetPublicInstancePropertyValue("FooterLinks");

            if (null == links)
            {
                links = source.GetPublicInstancePropertyValue("FooterLink1");
            }

            resolvers = new Dictionary <string, IResolver>();
            resolvers.Add($"{typeof(Model.SiteFooterLink).FullName}.FooterLinks", new SiteFooterLinkFromSchemaToModelTypeResolver());

            if (null != links)
            {
                foreach (var f in ((IEnumerable)links))
                {
                    var targetItem = new Model.SiteFooterLink();
                    PnPObjectsMapper.MapProperties(f, targetItem, resolvers, recursive);
                    result.Add(targetItem);
                }
            }

            return(result);
        }
        public override void Deserialize(object persistence, ProvisioningTemplate template)
        {
            var pages = persistence.GetPublicInstancePropertyValue("Pages");

            if (pages != null)
            {
                var expressions = new Dictionary <Expression <Func <Page, Object> >, IResolver>();
                expressions.Add(p => p.Layout, new FromStringToEnumValueResolver(typeof(WikiPageLayout)));

                var dictionaryItemTypeName      = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.BaseFieldValue, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var dictionaryItemType          = Type.GetType(dictionaryItemTypeName, true);
                var dictionaryItemKeySelector   = CreateSelectorLambda(dictionaryItemType, "FieldName");
                var dictionaryItemValueSelector = CreateSelectorLambda(dictionaryItemType, "Value");
                expressions.Add(f => f.Fields, new FromArrayToDictionaryValueResolver <string, string>(dictionaryItemType, dictionaryItemKeySelector, dictionaryItemValueSelector));

                expressions.Add(f => f.Security, new PropertyObjectTypeResolver <File>(fl => fl.Security,
                                                                                       fl => fl.GetPublicInstancePropertyValue("Security")?.GetPublicInstancePropertyValue("BreakRoleInheritance")));
                expressions.Add(f => f.Security.RoleAssignments, new RoleAssigmentsFromSchemaToModelTypeResolver());
                expressions.Add(f => f.WebParts[0].Row, new ExpressionValueResolver((s, v) => (uint)(int)v));
                expressions.Add(f => f.WebParts[0].Column, new ExpressionValueResolver((s, v) => (uint)(int)v));
                expressions.Add(f => f.WebParts[0].Contents, new ExpressionValueResolver((s, v) => v != null ? XElement.Parse(((XmlElement)v).InnerXml)?.Element("webPart")?.ToString() : null));

                template.Pages.AddRange(
                    PnPObjectsMapper.MapObjects <Page>(pages,
                                                       new CollectionFromSchemaToModelTypeResolver(typeof(Page)),
                                                       expressions,
                                                       recursive: true)
                    as IEnumerable <Page>);
            }
        }
Exemple #17
0
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            if (template.ParentHierarchy?.Drive?.DriveRoots != null)
            {
                var driveRootTypeName   = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.DriveRoot, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var driveRootType       = Type.GetType(driveRootTypeName, false);
                var driveFolderTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.DriveFolder, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var driveFolderType     = Type.GetType(driveFolderTypeName, false);

                if (driveRootType != null)
                {
                    var resolvers = new Dictionary <String, IResolver>();

                    //// Handle DriveRoot objects
                    //resolvers.Add($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.DriveRoot",
                    //    new DriveRootFolderFromModelToSchemaTypeResolver());

                    resolvers.Add($"{driveRootType}.DriveItems",
                                  new DriveItemsFromModelToSchemaTypeResolver()); // DriveRootsFromModelToSchemaTypeResolver());
                    resolvers.Add($"{driveFolderType}.Items",
                                  new DriveItemsFromModelToSchemaTypeResolver());


                    persistence.GetPublicInstanceProperty("Drive")
                    .SetValue(
                        persistence,
                        PnPObjectsMapper.MapObjects(template.ParentHierarchy?.Drive?.DriveRoots,
                                                    new CollectionFromModelToSchemaTypeResolver(driveRootType),
                                                    resolvers,
                                                    recursive: true));
                }
            }
        }
Exemple #18
0
        public object Resolve(object source, Dictionary <String, IResolver> resolvers = null, Boolean recursive = false)
        {
            Object result = null;

            var tenant = source as Model.ProvisioningTenant;
            var cdn    = tenant?.ContentDeliveryNetwork;

            if (null != cdn)
            {
                var cdnTypeName         = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.ContentDeliveryNetwork, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var cdnType             = Type.GetType(cdnTypeName, true);
                var cdnSettingsTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.CdnSetting, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var cdnSettingsType     = Type.GetType(cdnSettingsTypeName, true);

                result = Activator.CreateInstance(cdnType);

                if (cdn.PublicCdn != null)
                {
                    Object publicCdn = Activator.CreateInstance(cdnSettingsType);
                    PnPObjectsMapper.MapProperties(cdn.PublicCdn, publicCdn, null, true);
                    result.SetPublicInstancePropertyValue("Public", publicCdn);
                }

                if (cdn.PrivateCdn != null)
                {
                    Object privateCdn = Activator.CreateInstance(cdnSettingsType);
                    PnPObjectsMapper.MapProperties(cdn.PrivateCdn, privateCdn, null, true);
                    result.SetPublicInstancePropertyValue("Private", privateCdn);
                }
            }

            return(result);
        }
        public object Resolve(object source, Dictionary <string, IResolver> resolvers = null, bool recursive = false)
        {
            Object result = null;

            // Declare supporting types
            var sharingSettingsTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.SharingSettings, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
            var sharingSettingsType     = Type.GetType(sharingSettingsTypeName, true);

            var settings = ((Model.ProvisioningTenant)source).SharingSettings;

            if (null != settings)
            {
                result = Activator.CreateInstance(sharingSettingsType);

                PnPObjectsMapper.MapProperties(settings, result, resolvers, recursive);

                if (settings.AllowedDomainList.Count > 0)
                {
                    var allowedDomainList = settings.AllowedDomainList.Aggregate(string.Empty, (acc, next) => acc += $",{next}");
                    allowedDomainList = allowedDomainList.Substring(1, allowedDomainList.Length - 1);
                    result.SetPublicInstancePropertyValue("AllowedDomainList", allowedDomainList);
                }
                if (settings.BlockedDomainList.Count > 0)
                {
                    var blockedDomainList = settings.BlockedDomainList.Aggregate(string.Empty, (acc, next) => acc += $",{next}");
                    blockedDomainList = blockedDomainList.Substring(1, blockedDomainList.Length - 1);
                    result.SetPublicInstancePropertyValue("BlockedDomainList", blockedDomainList);
                }
            }

            return(result);
        }
        public override void Deserialize(object persistence, ProvisioningTemplate template)
        {
            var tenantSettings = persistence.GetPublicInstancePropertyValue("Tenant");

            if (tenantSettings != null)
            {
                var expressions = new Dictionary <Expression <Func <ProvisioningTenant, Object> >, IResolver>
                {
                    // Manage the AppCatalog
                    { t => t.AppCatalog, new AppCatalogFromSchemaToModelTypeResolver() },

                    // Manage the CDN
                    { t => t.ContentDeliveryNetwork, new CdnFromSchemaToModelTypeResolver() },

                    // Manage the Site Designs mapping with Site Scripts
                    { t => t.SiteDesigns[0].SiteScripts, new SiteScriptRefFromSchemaToModelTypeResolver() },

                    // Manage Palette of Theme
                    {
                        t => t.Themes[0].Palette,
                        new ExpressionValueResolver((s, v) =>
                        {
                            String result = null;

                            if (s != null)
                            {
                                String[] text = s.GetPublicInstancePropertyValue("Text") as String[];
                                if (text != null && text.Length > 0)
                                {
                                    result = text.Aggregate(String.Empty, (acc, next) => acc += (next != null ? next : String.Empty));
                                }
                            }

                            return(result.Trim());
                        })
                    }
                };

                // Define the dynamic type for the SP User Profile Properties
                var propertiesTypeName      = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.StringDictionaryItem, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var propertiesType          = Type.GetType(propertiesTypeName, true);
                var propertiesKeySelector   = CreateSelectorLambda(propertiesType, "Key");
                var propertiesValueSelector = CreateSelectorLambda(propertiesType, "Value");

                // Manage SP User Profile Properties
                expressions.Add(t => t.SPUsersProfiles[0].Properties,
                                new FromArrayToDictionaryValueResolver <String, String>(
                                    propertiesType, propertiesKeySelector, propertiesValueSelector));

                // Manage Office 365 Groups Settings
                expressions.Add(t => t.Office365GroupsSettings,
                                new Office365GroupsSettingsFromSchemaToModel());

                // Manage Sharing Settings
                expressions.Add(t => t.SharingSettings,
                                new SharingSettingsFromSchemaToModel());

                PnPObjectsMapper.MapProperties(tenantSettings, template.Tenant, expressions, true);
            }
        }
Exemple #21
0
        public object Resolve(object source, Dictionary <String, IResolver> resolvers = null, Boolean recursive = false)
        {
            object result = null;

            if (null != source)
            {
                var sourceList = (IList)source;

                if (sourceList.Count > 0)
                {
                    var resultArray = Array.CreateInstance(this._targetItemType, sourceList.Count);

                    var index = 0;
                    foreach (var i in sourceList)
                    {
                        var targetItem = Activator.CreateInstance(this._targetItemType, true);
                        PnPObjectsMapper.MapProperties(i, targetItem, resolvers, recursive);
                        resultArray.SetValue(targetItem, index);
                        index++;
                    }
                    result = resultArray;
                }
            }
            return(result);
        }
Exemple #22
0
        public override void Deserialize(object persistence, ProvisioningTemplate template)
        {
            var groups = persistence.GetPublicInstancePropertyValue("TermGroups");

            if (groups != null)
            {
                var expressions = new Dictionary <Expression <Func <TermGroup, Object> >, IResolver>();
                expressions.Add(g => g.Id, new FromStringToGuidValueResolver());
                expressions.Add(g => g.TermSets[0].Id, new FromStringToGuidValueResolver());
                expressions.Add(g => g.TermSets[0].Terms[0].Id, new FromStringToGuidValueResolver());
                expressions.Add(g => g.TermSets[0].Terms[0].SourceTermId, new FromStringToGuidValueResolver());

                var dictionaryItemTypeName      = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.StringDictionaryItem, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var dictionaryItemType          = Type.GetType(dictionaryItemTypeName, true);
                var dictionaryItemKeySelector   = CreateSelectorLambda(dictionaryItemType, "Key");
                var dictionaryItemValueSelector = CreateSelectorLambda(dictionaryItemType, "Value");
                expressions.Add(g => g.TermSets[0].Properties, new FromArrayToDictionaryValueResolver <string, string>(dictionaryItemType, dictionaryItemKeySelector, dictionaryItemValueSelector));
                expressions.Add(g => g.TermSets[0].Terms[0].LocalProperties, new FromArrayToDictionaryValueResolver <string, string>(dictionaryItemType, dictionaryItemKeySelector, dictionaryItemValueSelector, "LocalCustomProperties"));
                expressions.Add(g => g.TermSets[0].Terms[0].Properties, new FromArrayToDictionaryValueResolver <string, string>(dictionaryItemType, dictionaryItemKeySelector, dictionaryItemValueSelector, "CustomProperties"));
                expressions.Add(g => g.TermSets[0].Terms[0].Terms,
                                new PropertyObjectTypeResolver <Term>(t => t.Terms,
                                                                      v => v.GetPublicInstancePropertyValue("Terms")?.GetPublicInstancePropertyValue("Items"),
                                                                      new CollectionFromSchemaToModelTypeResolver(typeof(Term))));

                template.TermGroups.AddRange(
                    PnPObjectsMapper.MapObjects <TermGroup>(groups,
                                                            new CollectionFromSchemaToModelTypeResolver(typeof(TermGroup)),
                                                            expressions,
                                                            recursive: true)
                    as IEnumerable <TermGroup>);
            }
        }
Exemple #23
0
        public object Resolve(object source, Dictionary <string, IResolver> resolvers = null, bool recursive = false)
        {
            var settings = source.GetPublicInstancePropertyValue("SharingSettings");

            if (null != settings)
            {
                Model.SharingSettings result = new Model.SharingSettings();
                PnPObjectsMapper.MapProperties(settings, result, resolvers, recursive);

                var allowedDomainList = (String)settings.GetPublicInstancePropertyValue("AllowedDomainList");
                if (!String.IsNullOrEmpty(allowedDomainList))
                {
                    result.AllowedDomainList.AddRange(allowedDomainList.Split(','));
                }
                var blockedDomainList = (String)settings.GetPublicInstancePropertyValue("BlockedDomainList");
                if (!String.IsNullOrEmpty(blockedDomainList))
                {
                    result.BlockedDomainList.AddRange(blockedDomainList.Split(','));
                }

                return(result);
            }

            return(null);
        }
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            if (template.Tenant != null &&
                (template.Tenant.AppCatalog != null || template.Tenant.ContentDeliveryNetwork != null))
            {
                var tenantTypeName      = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.Tenant, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var tenantType          = Type.GetType(tenantTypeName, false);
                var siteDesignsTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.SiteDesignsSiteDesign, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var siteDesignsType     = Type.GetType(siteDesignsTypeName, false);

                if (tenantType != null)
                {
                    var target = Activator.CreateInstance(tenantType, true);

                    var resolvers = new Dictionary <String, IResolver>();

                    resolvers.Add($"{tenantType}.AppCatalog",
                                  new AppCatalogFromModelToSchemaTypeResolver());
                    resolvers.Add($"{tenantType}.ContentDeliveryNetwork",
                                  new CdnFromModelToSchemaTypeResolver());
                    resolvers.Add($"{siteDesignsType}.SiteScripts",
                                  new SiteScriptRefFromModelToSchemaTypeResolver());

                    PnPObjectsMapper.MapProperties(template.Tenant, target, resolvers, recursive: true);

                    if (target != null &&
                        (target.GetPublicInstancePropertyValue("AppCatalog") != null ||
                         target.GetPublicInstancePropertyValue("ContentDeliveryNetwork") != null))
                    {
                        persistence.GetPublicInstanceProperty("Tenant").SetValue(persistence, target);
                    }
                }
            }
        }
Exemple #25
0
        public object Resolve(object source, Dictionary <String, IResolver> resolvers = null, Boolean recursive = false)
        {
            ContentDeliveryNetwork result = null;

            var cdnSettings = source.GetPublicInstancePropertyValue("ContentDeliveryNetwork");

            if (null != cdnSettings)
            {
                var         publicCdn         = cdnSettings.GetPublicInstancePropertyValue("Public");
                CdnSettings publicCdnSettings = null;

                if (null != publicCdn)
                {
                    publicCdnSettings = new Model.CdnSettings();
                    PnPObjectsMapper.MapProperties(publicCdn, publicCdnSettings, resolvers, recursive);
                }

                var         privateCdn         = cdnSettings.GetPublicInstancePropertyValue("Private");
                CdnSettings privateCdnSettings = null;

                if (null != privateCdn)
                {
                    privateCdnSettings = new Model.CdnSettings();
                    PnPObjectsMapper.MapProperties(privateCdn, privateCdnSettings, resolvers, recursive);
                }

                result = new ContentDeliveryNetwork(publicCdnSettings, privateCdnSettings);
            }

            return(result);
        }
        public object Resolve(object source, Dictionary<String, IResolver> resolvers = null, Boolean recursive = false)
        {
            var result = new List<Model.Folder>();

            var folders = source.GetPublicInstancePropertyValue("Folders");
            if (null == folders)
            {
                folders = source.GetPublicInstancePropertyValue("Folder1");
            }

            resolvers = new Dictionary<string, IResolver>();
            resolvers.Add($"{typeof(Model.Folder).FullName}.Folders", new FoldersFromSchemaToModelTypeResolver());
            resolvers.Add($"{typeof(Model.Folder).FullName}.Security", new SecurityFromSchemaToModelTypeResolver());

            if (null != folders)
            {
                foreach (var f in ((IEnumerable)folders))
                {
                    var targetItem = new Model.Folder();
                    PnPObjectsMapper.MapProperties(f, targetItem, resolvers, recursive);
                    result.Add(targetItem);
                }
            }

            return (result);
        }
        public override void Deserialize(object persistence, ProvisioningTemplate template)
        {
            var theme = persistence.GetPublicInstancePropertyValue("Theme");

            if (theme != null)
            {
                var expressions = new Dictionary <Expression <Func <Theme, Object> >, IResolver>
                {
                    // Manage Palette of Theme
                    {
                        t => t.Palette,
                        new ExpressionValueResolver((s, v) =>
                        {
                            String result = null;

                            if (s != null)
                            {
                                String[] text = s.GetPublicInstancePropertyValue("Text") as String[];
                                if (text != null && text.Length > 0)
                                {
                                    result = text.Aggregate(String.Empty, (acc, next) => acc += (next != null ? next : String.Empty));
                                }
                            }

                            return(result?.Trim());
                        })
                    }
                };

                template.Theme = new Theme();
                PnPObjectsMapper.MapProperties(theme, template.Theme, expressions, true);
            }
        }
Exemple #28
0
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            if (template.Parameters != null && template.Parameters.Count > 0)
            {
                var preferences = persistence.GetPublicInstancePropertyValue("Preferences");

                if (preferences != null)
                {
                    var parametersTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.PreferencesParameter, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                    var parametersType     = Type.GetType(parametersTypeName, true);

                    preferences.GetPublicInstanceProperty("Parameters")
                    .SetValue(
                        preferences,
                        PnPObjectsMapper.MapObjects(template.Parameters,
                                                    new TemplateParameterFromModelToSchemaTypeResolver(parametersType)));

                    var parameters = preferences.GetPublicInstancePropertyValue("Parameters");
                    if (parameters != null && ((Array)parameters).Length == 0)
                    {
                        preferences.GetPublicInstanceProperty("Parameters").SetValue(preferences, null);
                    }
                }
            }
        }
Exemple #29
0
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            if (template.ProvisioningTemplateWebhooks != null && template.ProvisioningTemplateWebhooks.Count > 0)
            {
                var provisioningTemplateWebhookTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.ProvisioningWebhook, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var provisioningTemplateWebhookType     = Type.GetType(provisioningTemplateWebhookTypeName, true);

                var expressions = new Dictionary <string, IResolver>();

                // Parameters
                var dictionaryItemTypeName      = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.StringDictionaryItem, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
                var dictionaryItemType          = Type.GetType(dictionaryItemTypeName, true);
                var dictionaryItemKeySelector   = CreateSelectorLambda(dictionaryItemType, "Key");
                var dictionaryItemValueSelector = CreateSelectorLambda(dictionaryItemType, "Value");

                expressions.Add($"{provisioningTemplateWebhookType}.Parameters",
                                new FromDictionaryToArrayValueResolver <string, string>(
                                    dictionaryItemType, dictionaryItemKeySelector, dictionaryItemValueSelector));

                persistence.GetPublicInstanceProperty("ProvisioningTemplateWebhooks")
                .SetValue(
                    persistence,
                    PnPObjectsMapper.MapObjects(template.ProvisioningTemplateWebhooks,
                                                new CollectionFromModelToSchemaTypeResolver(provisioningTemplateWebhookType),
                                                expressions,
                                                recursive: true));
            }
        }
        public override void Serialize(ProvisioningTemplate template, object persistence)
        {
            var propertiesTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.StringDictionaryItem, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
            var propertiesType     = Type.GetType(propertiesTypeName, true);
            var templateType       = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.ProvisioningTemplate, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}", true);

            var keySelector   = CreateSelectorLambda(propertiesType, "Key");
            var valueSelector = CreateSelectorLambda(propertiesType, "Value");

            var expressions = new Dictionary <string, IResolver>();

            expressions.Add($"{templateType}.Version", new FromDoubleToDecimalValueResolver());
            expressions.Add($"{templateType}.VersionSpecified", new ExpressionValueResolver(() => true));
            expressions.Add($"{templateType}.Properties",
                            new FromDictionaryToArrayValueResolver <String, String>(
                                propertiesType, keySelector, valueSelector));

            PnPObjectsMapper.MapProperties(template, persistence, expressions, true);

            // Search settings
            if (!string.IsNullOrEmpty(template.SiteSearchSettings) || !string.IsNullOrEmpty(template.WebSearchSettings))
            {
                var searchSettingType = Type.GetType($"{PnPSerializationScope.Current?.BaseSchemaNamespace}.ProvisioningTemplateSearchSettings, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}", true);
                var searchSettings    = Activator.CreateInstance(searchSettingType, true);
                if (!string.IsNullOrEmpty(template.SiteSearchSettings))
                {
                    searchSettings.GetPublicInstanceProperty("SiteSearchSettings").SetValue(searchSettings, XElement.Parse(template.SiteSearchSettings).ToXmlElement());
                }
                if (!string.IsNullOrEmpty(template.WebSearchSettings))
                {
                    searchSettings.GetPublicInstanceProperty("WebSearchSettings").SetValue(searchSettings, XElement.Parse(template.WebSearchSettings).ToXmlElement());
                }
                persistence.GetPublicInstanceProperty("SearchSettings").SetValue(persistence, searchSettings);
            }
        }