Beispiel #1
0
        private static List LoadCurrentList(Web web, ListDefinition listModel)
        {
            var context = web.Context;

            List currentList = null;

#pragma warning disable 618
            var listUrl = UrlUtility.CombineUrl(web.ServerRelativeUrl, listModel.GetListUrl());
#pragma warning restore 618

            Folder folder = null;

            var scope = new ExceptionHandlingScope(context);

            using (scope.StartScope())
            {
                using (scope.StartTry())
                {
                    folder = web.GetFolderByServerRelativeUrl(listUrl);
                    context.Load(folder);
                }

                using (scope.StartCatch())
                {
                }
            }

            context.ExecuteQueryWithTrace();

            if (!scope.HasException && folder != null && folder.ServerObjectIsNull != true)
            {
                folder = web.GetFolderByServerRelativeUrl(listUrl);
                context.Load(folder.Properties);
                context.ExecuteQueryWithTrace();

                var listId = new Guid(folder.Properties["vti_listname"].ToString());
                var list   = web.Lists.GetById(listId);

                context.Load(list);
                context.ExecuteQueryWithTrace();

                currentList = list;
            }

            return(currentList);
        }
Beispiel #2
0
        private static string ExtractResourceFolderServerRelativeUrl(Web web, ClientRuntimeContext context, ContentType currentContentType)
        {
            if (!currentContentType.IsPropertyAvailable("SchemaXml") || !web.IsPropertyAvailable("ServerRelativeUrl"))
            {
                context.Load(web, w => w.ServerRelativeUrl);
                currentContentType.Context.Load(currentContentType, c => c.SchemaXml);
                currentContentType.Context.ExecuteQueryWithTrace();
            }

            var ctDocument    = XDocument.Parse(currentContentType.SchemaXml);
            var folderUrlNode = ctDocument.Descendants().FirstOrDefault(d => d.Name == "Folder");

            var webRelativeFolderUrl    = folderUrlNode.Attribute("TargetName").Value;
            var serverRelativeFolderUrl = UrlUtility.CombineUrl(web.ServerRelativeUrl, webRelativeFolderUrl);

            TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "webRelativeFolderUrl is: [{0}]", webRelativeFolderUrl);
            return(serverRelativeFolderUrl);
        }
        private static List LoadCurrentList(Web web, ListDefinition listModel)
        {
            var context = web.Context;

            List currentList = null;

#pragma warning disable 618
            var listUrl = UrlUtility.CombineUrl(web.ServerRelativeUrl, listModel.GetListUrl());
#pragma warning restore 618

            Folder folder;

            var scope = new ExceptionHandlingScope(context);

            using (scope.StartScope())
            {
                using (scope.StartTry())
                {
                    folder = web.GetFolderByServerRelativeUrl(listUrl);
                    context.Load(folder);
                }

                using (scope.StartCatch())
                {
                }
            }

            context.ExecuteQueryWithTrace();

            if (!scope.HasException && folder != null && folder.ServerObjectIsNull != true)
            {
#if !NET35
                folder = web.GetFolderByServerRelativeUrl(listUrl);

                context.Load(folder.Properties);
                context.ExecuteQueryWithTrace();

                var listId = new Guid(folder.Properties["vti_listname"].ToString());
                var list   = web.Lists.GetById(listId);

                context.Load(list);

                if (listModel.IndexedRootFolderPropertyKeys.Any())
                {
                    context.Load(list, l => l.RootFolder.Properties);
                }

                context.ExecuteQueryWithTrace();

                currentList = list;
#endif

#if NET35
                // SP2010 CSOM hack
                // http://impl.com/questions/4284722/sharepoint-2010-client-object-model-get-a-list-item-from-a-url

                var listQuery = from list in web.Lists
                                where list.RootFolder.ServerRelativeUrl == listUrl
                                select list;

                var queryResult = context.LoadQuery(listQuery);
                context.ExecuteQueryWithTrace();

                var resultList = queryResult.FirstOrDefault();

                currentList = resultList;
#endif
            }

            return(currentList);
        }
 private string GetSafeFileUrl(Folder folder, ModuleFileDefinition moduleFile)
 {
     return(UrlUtility.CombineUrl(folder.ServerRelativeUrl, moduleFile.FileName));
 }
        public override void DeployModel(object modelHost, DefinitionBase model)
        {
            var site = ExtractSite(modelHost);
            var web  = ExtractWeb(modelHost);

            var contentTypeModel = model.WithAssertAndCast <ContentTypeDefinition>("model", value => value.RequireNotNull());
            var context          = web.Context;

            var contentTypeId = contentTypeModel.GetContentTypeId();

            var tmpContentType = context.LoadQuery(web.ContentTypes.Where(ct => ct.StringId == contentTypeId));

            context.ExecuteQueryWithTrace();

            var tmp = tmpContentType.FirstOrDefault();

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = tmp,
                ObjectType       = typeof(ContentType),
                ObjectDefinition = model,
                ModelHost        = modelHost
            });

            InvokeOnModelEvent <ContentTypeDefinition, ContentType>(null, ModelEventType.OnUpdating);

            ContentType currentContentType = null;

            if (tmp == null || tmp.ServerObjectIsNull == null || tmp.ServerObjectIsNull.Value)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new content type");

                currentContentType = web.ContentTypes.Add(new ContentTypeCreationInformation
                {
                    Name              = contentTypeModel.Name,
                    Description       = string.IsNullOrEmpty(contentTypeModel.Description) ? string.Empty : contentTypeModel.Description,
                    Group             = contentTypeModel.Group,
                    Id                = contentTypeId,
                    ParentContentType = null
                });
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing content type");

                currentContentType = tmp;
            }

            currentContentType.Hidden = contentTypeModel.Hidden;

            currentContentType.Name        = contentTypeModel.Name;
            currentContentType.Description = string.IsNullOrEmpty(contentTypeModel.Description) ? string.Empty : contentTypeModel.Description;
            currentContentType.Group       = contentTypeModel.Group;

            if (!string.IsNullOrEmpty(contentTypeModel.DocumentTemplate))
            {
                var serverRelativeFolderUrl = ExtractResourceFolderServerRelativeUrl(web, context, currentContentType);

                var processedDocumentTemplateUrl = TokenReplacementService.ReplaceTokens(new TokenReplacementContext
                {
                    Value   = contentTypeModel.DocumentTemplate,
                    Context = context
                }).Value;

                // resource related path
                if (!processedDocumentTemplateUrl.Contains('/') &&
                    !processedDocumentTemplateUrl.Contains('\\'))
                {
                    processedDocumentTemplateUrl = UrlUtility.CombineUrl(new string[] {
                        serverRelativeFolderUrl,
                        processedDocumentTemplateUrl
                    });
                }

                currentContentType.DocumentTemplate = processedDocumentTemplateUrl;
            }

            InvokeOnModelEvent <ContentTypeDefinition, ContentType>(currentContentType, ModelEventType.OnUpdated);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioned,
                Object           = currentContentType,
                ObjectType       = typeof(ContentType),
                ObjectDefinition = model,
                ModelHost        = modelHost
            });

            TraceService.Information((int)LogEventId.ModelProvisionCoreCall, "Calling currentContentType.Update(true)");
            currentContentType.Update(true);

            context.ExecuteQueryWithTrace();
        }
Beispiel #6
0
        public override void DeployModel(object modelHost, DefinitionBase model)
        {
            var csomModelHost = modelHost.WithAssertAndCast <CSOMModelHostBase>("modelHost", value => value.RequireNotNull());

            var web = ExtractWeb(modelHost);

            var contentTypeModel = model.WithAssertAndCast <ContentTypeDefinition>("model", value => value.RequireNotNull());
            var context          = web.Context;

            if (string.IsNullOrEmpty(contentTypeModel.ParentContentTypeId))
            {
                var parentContentTypeName = contentTypeModel.ParentContentTypeName;

                var result = context.LoadQuery(web.AvailableContentTypes.Where(ct => ct.Name == parentContentTypeName));
                context.ExecuteQueryWithTrace();

                var parentContentType = result.FirstOrDefault();
                if (parentContentType == null)
                {
                    throw new SPMeta2Exception("Couldn't find parent contenttype with the given name.");
                }

                // rare case where it's ok to change definition
                contentTypeModel.ParentContentTypeId = parentContentType.Id.ToString();
            }

            var contentTypeName = contentTypeModel.Name;
            var contentTypeId   = contentTypeModel.GetContentTypeId();

#if !NET35
            var tmpContentType = context.LoadQuery(web.ContentTypes.Where(ct => ct.StringId == contentTypeId));
            context.ExecuteQueryWithTrace();

            var tmp = tmpContentType.FirstOrDefault();
#endif

#if NET35
            // SP2010 CSOM does not have an option to get the content type by ID
            // fallback to Name, and that's a huge thing all over the M2 library and provision

            var tmpContentType = context.LoadQuery(web.ContentTypes.Where(ct => ct.Name == contentTypeName));
            context.ExecuteQueryWithTrace();

            var tmp = tmpContentType.FirstOrDefault();
#endif

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = tmp,
                ObjectType       = typeof(ContentType),
                ObjectDefinition = model,
                ModelHost        = modelHost
            });

            ContentType currentContentType;

            if (tmp == null || tmp.ServerObjectIsNull == null || tmp.ServerObjectIsNull.Value)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new content type");

#if !NET35
                currentContentType = web.ContentTypes.Add(new ContentTypeCreationInformation
                {
                    Name              = contentTypeModel.Name,
                    Description       = string.IsNullOrEmpty(contentTypeModel.Description) ? string.Empty : contentTypeModel.Description,
                    Group             = contentTypeModel.Group,
                    Id                = contentTypeId,
                    ParentContentType = null
                });
#endif

#if NET35
                var parentContentTypeId = contentTypeModel.ParentContentTypeId;
                var parentContentType   = web.ContentTypes.GetById(parentContentTypeId);

                context.ExecuteQueryWithTrace();

                currentContentType = web.ContentTypes.Add(new ContentTypeCreationInformation
                {
                    Name              = contentTypeModel.Name,
                    Description       = string.IsNullOrEmpty(contentTypeModel.Description) ? string.Empty : contentTypeModel.Description,
                    Group             = contentTypeModel.Group,
                    ParentContentType = parentContentType
                });
#endif
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing content type");

                currentContentType = tmp;
            }

            context.Load(currentContentType);

#if !NET35
            context.Load(currentContentType, c => c.Sealed);
#endif

            context.ExecuteQueryWithTrace();

#if !NET35
            // CSOM can't update sealed content types
            // adding if-else so that the provision would go further
            if (!currentContentType.Sealed)
            {
#endif
            // doc template first, then set the other props
            // ExtractResourceFolderServerRelativeUrl might make ExecuteQueryWithTrace() call
            // so that might affect setting up other props
            // all props update should go later
            if (!string.IsNullOrEmpty(contentTypeModel.DocumentTemplate))
            {
                var serverRelativeFolderUrl = ExtractResourceFolderServerRelativeUrl(web, context,
                                                                                     currentContentType);

                var processedDocumentTemplateUrl = TokenReplacementService.ReplaceTokens(new TokenReplacementContext
                {
                    Value   = contentTypeModel.DocumentTemplate,
                    Context = csomModelHost
                }).Value;

                // resource related path
                if (!processedDocumentTemplateUrl.Contains('/') &&
                    !processedDocumentTemplateUrl.Contains('\\'))
                {
                    processedDocumentTemplateUrl = UrlUtility.CombineUrl(new[]
                    {
                        serverRelativeFolderUrl,
                        processedDocumentTemplateUrl
                    });
                }

                currentContentType.DocumentTemplate = processedDocumentTemplateUrl;
            }

            ProcessFormProperties(currentContentType, contentTypeModel);

            // only after DocumentTemplate processing
            ProcessLocalization(currentContentType, contentTypeModel);


            currentContentType.Hidden = contentTypeModel.Hidden;

            currentContentType.Name        = contentTypeModel.Name;
            currentContentType.Description = string.IsNullOrEmpty(contentTypeModel.Description)
                    ? string.Empty
                    : contentTypeModel.Description;
            currentContentType.Group = contentTypeModel.Group;

#if !NET35
            if (!string.IsNullOrEmpty(contentTypeModel.JSLink))
            {
                currentContentType.JSLink = contentTypeModel.JSLink;
            }
#endif

            if (contentTypeModel.ReadOnly.HasValue)
            {
                currentContentType.ReadOnly = contentTypeModel.ReadOnly.Value;
            }

#if !NET35
            if (contentTypeModel.Sealed.HasValue)
            {
                currentContentType.Sealed = contentTypeModel.Sealed.Value;
            }
        }
#endif

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioned,
                Object           = currentContentType,
                ObjectType       = typeof(ContentType),
                ObjectDefinition = model,
                ModelHost        = modelHost
            });

#if !NET35
            if (!currentContentType.Sealed)
            {
                TraceService.Information((int)LogEventId.ModelProvisionCoreCall, "Calling currentContentType.Update(true)");
                currentContentType.Update(true);

                context.ExecuteQueryWithTrace();
            }
#endif
        }
        private void DeployMasterPageSettings(object modelHost, WebModelHost webModelHost, MasterPageSettingsDefinition masterPageSettings)
        {
            var site = webModelHost.HostSite;
            var web  = webModelHost.HostWeb;

            var sContext = site.Context;

            sContext.Load(site, s => s.ServerRelativeUrl);
            sContext.ExecuteQueryWithTrace();

            var siteRelativeUrl = site.ServerRelativeUrl;

            TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Resolving server relative URL: [{0}]", siteRelativeUrl);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = web,
                ObjectType       = typeof(Web),
                ObjectDefinition = masterPageSettings,
                ModelHost        = modelHost
            });

            // TODO, https://github.com/SubPointSolutions/spmeta2/issues/761
            // re-implement with native prop bag to suport SP2010
            // SP2010 CSOM does not have CustomMasterUrl / MasterUrl props

#if !NET35
            if (!string.IsNullOrEmpty(masterPageSettings.SiteMasterPageUrl))
            {
                var url = ResolveUrlWithTokens(webModelHost, masterPageSettings.SiteMasterPageUrl);

                TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Setting web.MasterUrl: [{0}]", url);
                web.CustomMasterUrl = UrlUtility.CombineUrl(siteRelativeUrl, url);
            }

            if (!string.IsNullOrEmpty(masterPageSettings.SystemMasterPageUrl))
            {
                var url = ResolveUrlWithTokens(webModelHost, masterPageSettings.SystemMasterPageUrl);

                TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Setting web.CustomMasterUrl: [{0}]", url);
                web.MasterUrl = UrlUtility.CombineUrl(siteRelativeUrl, url);
            }
#endif

            if (!string.IsNullOrEmpty(masterPageSettings.SiteMasterPageUrl) ||
                !string.IsNullOrEmpty(masterPageSettings.SystemMasterPageUrl))
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = web,
                    ObjectType       = typeof(Web),
                    ObjectDefinition = masterPageSettings,
                    ModelHost        = modelHost
                });

                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Calling web.Update()");
                web.Update();

                web.Context.ExecuteQueryWithTrace();
            }
            else
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = web,
                    ObjectType       = typeof(Web),
                    ObjectDefinition = masterPageSettings,
                    ModelHost        = modelHost
                });
            }
        }
Beispiel #8
0
        private void DeployMasterPageSettings(object modelHost, WebModelHost webModelHost, MasterPageSettingsDefinition masterPageSettings)
        {
            var site = webModelHost.HostSite;
            var web  = webModelHost.HostWeb;

            var sContext = site.Context;

            sContext.Load(site, s => s.ServerRelativeUrl);
            sContext.ExecuteQueryWithTrace();

            var siteRelativeUrl = site.ServerRelativeUrl;

            TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Resolving server relative URL: [{0}]", siteRelativeUrl);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = web,
                ObjectType       = typeof(Web),
                ObjectDefinition = masterPageSettings,
                ModelHost        = modelHost
            });

            if (!string.IsNullOrEmpty(masterPageSettings.SiteMasterPageUrl))
            {
                TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Setting web.MasterUrlL: [{0}]", masterPageSettings.SiteMasterPageUrl);
                web.CustomMasterUrl = UrlUtility.CombineUrl(siteRelativeUrl, masterPageSettings.SiteMasterPageUrl);
            }

            if (!string.IsNullOrEmpty(masterPageSettings.SystemMasterPageUrl))
            {
                TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Setting web.CustomMasterUrl: [{0}]", masterPageSettings.SystemMasterPageUrl);
                web.MasterUrl = UrlUtility.CombineUrl(siteRelativeUrl, masterPageSettings.SystemMasterPageUrl);
            }

            if (!string.IsNullOrEmpty(masterPageSettings.SiteMasterPageUrl) ||
                !string.IsNullOrEmpty(masterPageSettings.SystemMasterPageUrl))
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = web,
                    ObjectType       = typeof(Web),
                    ObjectDefinition = masterPageSettings,
                    ModelHost        = modelHost
                });

                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Calling web.Update()");
                web.Update();

                web.Context.ExecuteQueryWithTrace();
            }
            else
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = web,
                    ObjectType       = typeof(Web),
                    ObjectDefinition = masterPageSettings,
                    ModelHost        = modelHost
                });
            }
        }
        public override void DeployModel(object modelHost, DefinitionBase model)
        {
            var site = ExtractSite(modelHost);
            var web  = ExtractWeb(modelHost);

            var contentTypeModel = model.WithAssertAndCast <ContentTypeDefinition>("model", value => value.RequireNotNull());
            var context          = web.Context;

            var contentTypeId = contentTypeModel.GetContentTypeId();

            var tmpContentType = context.LoadQuery(web.ContentTypes.Where(ct => ct.StringId == contentTypeId));

            context.ExecuteQueryWithTrace();

            var tmp = tmpContentType.FirstOrDefault();

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = tmp,
                ObjectType       = typeof(ContentType),
                ObjectDefinition = model,
                ModelHost        = modelHost
            });

            ContentType currentContentType = null;

            if (tmp == null || tmp.ServerObjectIsNull == null || tmp.ServerObjectIsNull.Value)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new content type");

                currentContentType = web.ContentTypes.Add(new ContentTypeCreationInformation
                {
                    Name              = contentTypeModel.Name,
                    Description       = string.IsNullOrEmpty(contentTypeModel.Description) ? string.Empty : contentTypeModel.Description,
                    Group             = contentTypeModel.Group,
                    Id                = contentTypeId,
                    ParentContentType = null
                });
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing content type");

                currentContentType = tmp;
            }

            context.Load(currentContentType);
            context.Load(currentContentType, c => c.Sealed);
            context.ExecuteQueryWithTrace();

            // CSOM can't update sealed content types
            // adding if-else so that the provision would go further
            if (!currentContentType.Sealed)
            {
                // doc template first, then set the other props
                // ExtractResourceFolderServerRelativeUrl might make ExecuteQueryWithTrace() call
                // so that might affect setting up other props
                // all props update should go later
                if (!string.IsNullOrEmpty(contentTypeModel.DocumentTemplate))
                {
                    var serverRelativeFolderUrl = ExtractResourceFolderServerRelativeUrl(web, context,
                                                                                         currentContentType);

                    var processedDocumentTemplateUrl = TokenReplacementService.ReplaceTokens(new TokenReplacementContext
                    {
                        Value   = contentTypeModel.DocumentTemplate,
                        Context = context
                    }).Value;

                    // resource related path
                    if (!processedDocumentTemplateUrl.Contains('/') &&
                        !processedDocumentTemplateUrl.Contains('\\'))
                    {
                        processedDocumentTemplateUrl = UrlUtility.CombineUrl(new string[]
                        {
                            serverRelativeFolderUrl,
                            processedDocumentTemplateUrl
                        });
                    }

                    currentContentType.DocumentTemplate = processedDocumentTemplateUrl;
                }

                // only after DocumentTemplate processing
                ProcessLocalization(currentContentType, contentTypeModel);

                currentContentType.Hidden = contentTypeModel.Hidden;

                currentContentType.Name        = contentTypeModel.Name;
                currentContentType.Description = string.IsNullOrEmpty(contentTypeModel.Description)
                    ? string.Empty
                    : contentTypeModel.Description;
                currentContentType.Group = contentTypeModel.Group;

                if (!string.IsNullOrEmpty(contentTypeModel.JSLink))
                {
                    currentContentType.JSLink = contentTypeModel.JSLink;
                }

                if (contentTypeModel.ReadOnly.HasValue)
                {
                    currentContentType.ReadOnly = contentTypeModel.ReadOnly.Value;
                }

                if (contentTypeModel.Sealed.HasValue)
                {
                    currentContentType.Sealed = contentTypeModel.Sealed.Value;
                }
            }

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioned,
                Object           = currentContentType,
                ObjectType       = typeof(ContentType),
                ObjectDefinition = model,
                ModelHost        = modelHost
            });

            if (!currentContentType.Sealed)
            {
                TraceService.Information((int)LogEventId.ModelProvisionCoreCall, "Calling currentContentType.Update(true)");
                currentContentType.Update(true);

                context.ExecuteQueryWithTrace();
            }
        }