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); }
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(); }
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 }); } }
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(); } }