protected string ResolveContentTypeId(FolderModelHost folderHost, ModuleFileDefinition moduleFile)
        {
            var context = folderHost.CurrentLibraryFolder.Context;
            var list    = folderHost.CurrentList;

            var stringCustomContentType = string.Empty;

            // preload custm content type
            if (!string.IsNullOrEmpty(moduleFile.ContentTypeName))
            {
                var listContentTypes = list.ContentTypes;
                context.Load(listContentTypes);
                context.ExecuteQueryWithTrace();

                var listContentType = listContentTypes.ToList()
                                      .FirstOrDefault(c => c.Name.ToUpper() == moduleFile.ContentTypeName.ToUpper());

                if (listContentType == null)
                {
                    throw new ArgumentNullException(
                              string.Format("Cannot find content type with Name:[{0}] in List:[{1}]",
                                            new string[]
                    {
                        moduleFile.ContentTypeName,
                        list.Title
                    }));
                }

                stringCustomContentType = listContentType.Id.ToString();
            }

            return(stringCustomContentType);
        }
Example #2
0
        protected File GetFile(FolderModelHost folderHost, ModuleFileDefinition moduleFile)
        {
            Folder folder = null;

            if (folderHost.CurrentList != null)
            {
                folder = folderHost.CurrentListFolder;
            }
            else if (folderHost.CurrentContentType != null)
            {
                folder = folderHost.CurrentContentTypeFolder;
            }
            else if (folderHost.CurrentWebFolder != null)
            {
                folder = folderHost.CurrentWebFolder;
            }

            var web     = folderHost.HostWeb;
            var context = web.Context;

            var file = web.GetFileByServerRelativeUrl(GetSafeFileUrl(folder, moduleFile));

            context.Load(file, f => f.Exists);
            context.ExecuteQueryWithTrace();

            return(file);
        }
        private string GetSafeFileUrl(SPFolder folder, ModuleFileDefinition moduleFile)
        {
            if (folder.ServerRelativeUrl != "/")
                return folder.ServerRelativeUrl + "/" + moduleFile.FileName;

            return moduleFile.FileName;
        }
Example #4
0
        //[SampleMetadataTag(Name = BuiltInTagNames.SampleHidden)]
        public void CanDeployModuleFilesToStyleLibrary()
        {
            var cssFile = new ModuleFileDefinition
            {
                FileName  = "m2-styles.css",
                Overwrite = true,
                Content   = Encoding.UTF8.GetBytes(".m2-content { padding:10px; border:1px red solid; } ")
            };

            var jsFile = new ModuleFileDefinition
            {
                FileName  = "m2-app.js",
                Overwrite = true,
                Content   = Encoding.UTF8.GetBytes(" alert('hello, m2!'); ")
            };

            var model = SPMeta2Model.NewWebModel(web =>
            {
                web.AddHostList(BuiltInListDefinitions.StyleLibrary, list =>
                {
                    list
                    .AddModuleFile(cssFile)
                    .AddModuleFile(jsFile);
                });
            });

            DeployModel(model);
        }
 private void EnsureDefaultValues(SPListItem newFileItem, ModuleFileDefinition definition)
 {
     foreach (var defaultValue in definition.DefaultValues)
     {
         if (!string.IsNullOrEmpty(defaultValue.FieldName))
         {
             if (newFileItem.Fields.ContainsFieldWithStaticName(defaultValue.FieldName))
             {
                 if (newFileItem[defaultValue.FieldName] == null)
                 {
                     newFileItem[defaultValue.FieldName] = defaultValue.Value;
                 }
             }
         }
         else if (defaultValue.FieldId.HasValue && defaultValue.FieldId != default(Guid))
         {
             if (newFileItem.Fields.OfType <SPField>().Any(f => f.Id == defaultValue.FieldId.Value))
             {
                 if (newFileItem[defaultValue.FieldId.Value] == null)
                 {
                     newFileItem[defaultValue.FieldId.Value] = defaultValue.Value;
                 }
             }
         }
     }
 }
Example #6
0
        //[SampleMetadataTag(Name = BuiltInTagNames.SampleHidden)]
        public void CanDeployUserCustomActionWithJquery()
        {
            var jQueryFile = new ModuleFileDefinition
            {
                FileName  = "jquery-1.11.2.min.js",
                Content   = ModuleFileUtils.FromResource(GetType().Assembly, "SPMeta2.Docs.Modules.jquery-1.11.2.min.js"),
                Overwrite = true
            };

            var appScriptsFolder = new FolderDefinition
            {
                Name = "M2 App Scripts"
            };

            var jQueryCustomAction = new UserCustomActionDefinition
            {
                Name      = "m2jQuery",
                Location  = "ScriptLink",
                ScriptSrc = UrlUtility.CombineUrl(new string[]
                {
                    "~sitecollection",
                    BuiltInListDefinitions.StyleLibrary.GetListUrl(),
                    appScriptsFolder.Name,
                    jQueryFile.FileName
                }),
                Sequence = 1500
            };

            var jQuerySiteLogger = new UserCustomActionDefinition
            {
                Name        = "m2jQuerySiteLogger",
                Location    = "ScriptLink",
                ScriptBlock = "jQuery(document).ready( function() { console.log('jQuery site logger on site:' + _spPageContextInfo.siteAbsoluteUrl); } );",
                Sequence    = 1600
            };

            var siteModel = SPMeta2Model.NewSiteModel(site =>
            {
                site
                .AddUserCustomAction(jQueryCustomAction)
                .AddUserCustomAction(jQuerySiteLogger);
            });

            var webModel = SPMeta2Model.NewWebModel(web =>
            {
                web.AddHostList(BuiltInListDefinitions.StyleLibrary, list =>
                {
                    list.AddFolder(appScriptsFolder, folder =>
                    {
                        folder.AddModuleFile(jQueryFile);
                    });
                });
            });

            DeployModel(siteModel);
            DeployModel(webModel);
        }
Example #7
0
        private string GetSafeFileUrl(SPFolder folder, ModuleFileDefinition moduleFile)
        {
            var result = moduleFile.FileName;

            if (folder.ServerRelativeUrl != "/")
            {
                result = UrlUtility.CombineUrl(folder.ServerRelativeUrl, moduleFile.FileName);
            }

            result = result.Replace("//", "/");

            return(result);
        }
        protected SPFile GetFile(FolderModelHost folderHost, ModuleFileDefinition moduleFile)
        {
            if (folderHost.CurrentWebFolder != null)
                return folderHost.CurrentWebFolder.ParentWeb.GetFile(GetSafeFileUrl(folderHost.CurrentWebFolder, moduleFile));

            if (folderHost.CurrentContentType != null)
                return folderHost.CurrentContentTypeFolder.ParentWeb.GetFile(GetSafeFileUrl(folderHost.CurrentContentTypeFolder, moduleFile));

            if (folderHost.CurrentLibraryFolder != null)
                return folderHost.CurrentLibraryFolder.ParentWeb.GetFile(GetSafeFileUrl(folderHost.CurrentLibraryFolder, moduleFile));

            throw new ArgumentException("CurrentWebFolder/CurrentContentType/CurrentLibraryFolder should not be null");

        }
        private void ProcessContentTypeModuleFile(FolderModelHost folderHost, ModuleFileDefinition moduleFile)
        {
            var folder = folderHost.CurrentContentTypeFolder;

            var currentFile = folder.ParentWeb.GetFile(GetSafeFileUrl(folder, moduleFile));

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = currentFile.Exists ? currentFile : null,
                ObjectType       = typeof(SPFile),
                ObjectDefinition = moduleFile,
                ModelHost        = folderHost
            });

            if (moduleFile.Overwrite)
            {
                var file = folder.Files.Add(moduleFile.FileName, moduleFile.Content, moduleFile.Overwrite);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = file,
                    ObjectType       = typeof(SPFile),
                    ObjectDefinition = moduleFile,
                    ModelHost        = folderHost
                });
            }
            else
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = currentFile.Exists ? currentFile : null,
                    ObjectType       = typeof(SPFile),
                    ObjectDefinition = moduleFile,
                    ModelHost        = folderHost
                });
            }

            folder.Update();
        }
        //[SampleMetadataTag(Name = BuiltInTagNames.SampleHidden)]
        public void CanDeploContentEditorWebpartWithUrlLink()
        {
            var htmlContent = new ModuleFileDefinition
            {
                FileName  = "m2-cewp-content.html",
                Content   = Encoding.UTF8.GetBytes("M2 is everything you need to deploy stuff to Sharepoint"),
                Overwrite = true,
            };

            var cewp = new ContentEditorWebPartDefinition
            {
                Title       = "Content Editor Webpart with URL link",
                Id          = "m2ContentLinkCEWP",
                ZoneIndex   = 20,
                ZoneId      = "Main",
                ContentLink = UrlUtility.CombineUrl(new string[] {
                    "~sitecollection",
                    BuiltInListDefinitions.StyleLibrary.GetListUrl(),
                    htmlContent.FileName
                })
            };

            var webPartPage = new WebPartPageDefinition
            {
                Title              = "M2 CEWP provision",
                FileName           = "cewp-provision.aspx",
                PageLayoutTemplate = BuiltInWebPartPageTemplates.spstd1
            };

            var model = SPMeta2Model.NewWebModel(web =>
            {
                web
                .AddHostList(BuiltInListDefinitions.StyleLibrary, list =>
                {
                    list.AddModuleFile(htmlContent);
                })
                .AddHostList(BuiltInListDefinitions.SitePages, list =>
                {
                    list.AddWebPartPage(webPartPage, page =>
                    {
                        page.AddContentEditorWebPart(cewp);
                    });
                });
            });

            DeployModel(model);
        }
Example #11
0
        protected string ResolveContentTypeId(FolderModelHost folderHost, ModuleFileDefinition moduleFile)
        {
            var context = folderHost.CurrentListFolder.Context;
            var list    = folderHost.CurrentList;
            var stringCustomContentType = string.Empty;

            if (!string.IsNullOrEmpty(moduleFile.ContentTypeId))
            {
                stringCustomContentType = moduleFile.ContentTypeId;
            }
            else if (!string.IsNullOrEmpty(moduleFile.ContentTypeName))
            {
                stringCustomContentType = ContentTypeLookupService.LookupContentTypeByName(list, moduleFile.ContentTypeName).Id.ToString();
            }

            return(stringCustomContentType);
        }
        public void Deploy_ModuleFiles()
        {
            // Step 1, define security groups
            var helloModuleFile = new ModuleFileDefinition
            {
                FileName = "hello-module.txt",
                Content  = Encoding.UTF8.GetBytes("A hello world module file provision.")
            };

            var angularFile = new ModuleFileDefinition
            {
                FileName = "angular.min.js",
                Content  = Encoding.UTF8.GetBytes(ResourceReader.ReadFromResourceName("Modules.js.angular.min.js"))
            };

            var jQueryFile = new ModuleFileDefinition
            {
                FileName = "jquery-1.11.1.min.js",
                Content  = Encoding.UTF8.GetBytes(ResourceReader.ReadFromResourceName("Modules.js.jquery-1.11.1.min.js"))
            };

            var jsFolder = new FolderDefinition {
                Name = "spmeta2-custom-js"
            };

            // deploy web model - list and add content type links to list
            var webModel = SPMeta2Model
                           .NewWebModel(web =>
            {
                web
                .AddList(BuiltInListDefinitions.StyleLibrary, list =>
                {
                    list
                    .AddModuleFile(helloModuleFile)
                    .AddFolder(jsFolder, folder =>
                    {
                        folder
                        .AddModuleFile(angularFile)
                        .AddModuleFile(jQueryFile);
                    });
                });
            });

            DeployWebModel(webModel);
        }
Example #13
0
        //[SampleMetadataTag(Name = BuiltInTagNames.SampleHidden)]

        public void CanDeployModuleFilesToFolders()
        {
            var cssFile = new ModuleFileDefinition
            {
                FileName  = "m2-red.css",
                Overwrite = true,
                Content   = Encoding.UTF8.GetBytes(".m2-red { color:red; } ")
            };

            var jsFile = new ModuleFileDefinition
            {
                FileName  = "m2-logger-module.js",
                Overwrite = true,
                Content   = Encoding.UTF8.GetBytes(" function(msg) { console.log(msg); } ")
            };

            var cssFolder = new FolderDefinition
            {
                Name = "m2-css"
            };

            var jsFolder = new FolderDefinition
            {
                Name = "m2-js"
            };

            var model = SPMeta2Model.NewWebModel(web =>
            {
                web.AddHostList(BuiltInListDefinitions.StyleLibrary, list =>
                {
                    list
                    .AddFolder(cssFolder, folder =>
                    {
                        folder.AddModuleFile(cssFile);
                    })
                    .AddFolder(jsFolder, folder =>
                    {
                        folder.AddModuleFile(jsFile);
                    });
                });
            });

            DeployModel(model);
        }
        public override ModelNode ReverseSingleHost(object reverseHost, ReverseOptions options)
        {
            var item    = (reverseHost as ModuleFileReverseHost).HostFile;
            var context = (reverseHost as ModuleFileReverseHost).HostClientContext;

            var def = new ModuleFileDefinition();

            def.FileName = item.Name;

            using (var stream = File.OpenBinaryDirect(
                       context,
                       item.ServerRelativeUrl).Stream)
            {
                def.Content = ModuleFileUtils.ReadFully(stream);
            }

            return(new ModuleFileModelNode
            {
                Options = { RequireSelfProcessing = true },
                Value = def
            });
        }
Example #15
0
 private void ProcessFile(
     object modelHost,
     SPFolder folder, ModuleFileDefinition moduleFile)
 {
     DeployModuleFile(
         folder,
         GetSafeFileUrl(folder, moduleFile),
         moduleFile.FileName,
         moduleFile.Content,
         moduleFile.Overwrite,
         before =>
     {
         InvokeOnModelEvent(this, new ModelEventArgs
         {
             CurrentModelNode = null,
             Model            = null,
             EventType        = ModelEventType.OnProvisioning,
             Object           = before.Exists ? before : null,
             ObjectType       = typeof(SPFile),
             ObjectDefinition = moduleFile,
             ModelHost        = modelHost
         });
     },
         after =>
     {
         InvokeOnModelEvent(this, new ModelEventArgs
         {
             CurrentModelNode = null,
             Model            = null,
             EventType        = ModelEventType.OnProvisioned,
             Object           = after,
             ObjectType       = typeof(SPFile),
             ObjectDefinition = moduleFile,
             ModelHost        = modelHost
         });
     });
 }
 private static void EnsureDefaultValues(ListItem newFileItem, ModuleFileDefinition publishingPageModel)
 {
     foreach (var defaultValue in publishingPageModel.DefaultValues)
     {
         if (!string.IsNullOrEmpty(defaultValue.FieldName))
         {
             if (newFileItem.FieldValues.ContainsKey(defaultValue.FieldName))
             {
                 if (newFileItem[defaultValue.FieldName] == null)
                 {
                     newFileItem[defaultValue.FieldName] = defaultValue.Value;
                 }
             }
             else
             {
                 newFileItem[defaultValue.FieldName] = defaultValue.Value;
             }
         }
         else if (defaultValue.FieldId.HasValue && defaultValue.FieldId != default(Guid))
         {
             // unsupported by CSOM API yet
         }
     }
 }
Example #17
0
 public static TModelNode AddModuleFile <TModelNode>(this TModelNode model, ModuleFileDefinition definition,
                                                     Action <ModuleFileModelNode> action)
     where TModelNode : ModelNode, IModuleFileHostModelNode, new()
 {
     return(model.AddTypedDefinitionNode(definition, action));
 }
        private void ProcessFile(
            object modelHost,
            SPFolder folder,
            ModuleFileDefinition moduleFile)
        {
            DeployModuleFile(
                folder,
                GetSafeFileUrl(folder, moduleFile),
                moduleFile.FileName,
                moduleFile.Content,
                moduleFile.Overwrite,
                before =>
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioning,
                    Object           = before.Exists ? before : null,
                    ObjectType       = typeof(SPFile),
                    ObjectDefinition = moduleFile,
                    ModelHost        = modelHost
                });
            },
                after =>
            {
                if (!string.IsNullOrEmpty(moduleFile.ContentTypeId) ||
                    !string.IsNullOrEmpty(moduleFile.ContentTypeName))
                {
                    var list = folder.ParentWeb.Lists[folder.ParentListId];

                    if (!string.IsNullOrEmpty(moduleFile.ContentTypeId))
                    {
                        after.ListItemAllFields["ContentTypeId"] = LookupListContentTypeById(list, moduleFile.ContentTypeId);
                    }

                    if (!string.IsNullOrEmpty(moduleFile.ContentTypeName))
                    {
                        after.ListItemAllFields["ContentTypeId"] = LookupListContentTypeByName(list, moduleFile.ContentTypeName);
                    }

                    after.ListItemAllFields.Update();
                }

                if (moduleFile.DefaultValues.Count > 0)
                {
                    EnsureDefaultValues(after.ListItemAllFields, moduleFile);
                    after.ListItemAllFields.Update();
                }

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = after,
                    ObjectType       = typeof(SPFile),
                    ObjectDefinition = moduleFile,
                    ModelHost        = modelHost
                });
            });
        }
 private string GetSafeFileUrl(SPFolder folder, ModuleFileDefinition moduleFile)
 {
     return(folder.ServerRelativeUrl + "/" + moduleFile.FileName);
 }
 private void ProcessWebModuleFile(FolderModelHost folderHost, ModuleFileDefinition moduleFile)
 {
     throw new SPMeta2NotImplementedException("Module provision under web folders is not implemented yet.");
 }
        private void ProcessFile(
            object modelHost,
            SPFolder folder, ModuleFileDefinition moduleFile)
        {
            var web  = folder.ParentWeb;
            var list = folder.DocumentLibrary;

            var file = web.GetFile(GetSafeFileUrl(folder, moduleFile));

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = file.Exists ? file : null,
                ObjectType       = typeof(SPFile),
                ObjectDefinition = moduleFile,
                ModelHost        = modelHost
            });

            var fileName    = moduleFile.FileName;
            var fileContent = moduleFile.Content;

            // for file deployment to the folder, root web folder or under _cts or other spccial folders
            // list == null

            // big todo with correct update and punblishing
            // get prev SPMeta2 impl for publishing pages
            if (list != null && (file.Exists && file.CheckOutType != SPFile.SPCheckOutType.None))
            {
                file.UndoCheckOut();
            }

            if (list != null && (list.EnableMinorVersions && file.Exists && file.Level == SPFileLevel.Published))
            {
                file.UnPublish("Provision");
            }

            if (list != null && (file.Exists && file.CheckOutType == SPFile.SPCheckOutType.None))
            {
                file.CheckOut();
            }

            var spFile = folder.Files.Add(fileName, fileContent, file.Exists);

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

            spFile.Update();

            if (list != null && (file.Exists && file.CheckOutType != SPFile.SPCheckOutType.None))
            {
                spFile.CheckIn("Provision");
            }

            if (list != null && (list.EnableMinorVersions || list.EnableVersioning))
            {
                spFile.Publish("Provision");
            }

            if (list != null && list.EnableModeration)
            {
                spFile.Approve("Provision");
            }
        }
Example #22
0
 public static TModelNode AddHostModuleFile <TModelNode>(this TModelNode model, ModuleFileDefinition definition,
                                                         Action <ModuleFileModelNode> action)
     where TModelNode : ModelNode, IModuleFileHostModelNode, new()
 {
     return(model.AddTypedDefinitionNodeWithOptions(definition, action, ModelNodeOptions.New().NoSelfProcessing()));
 }
        private void ProcessContentTypeFolder(FolderModelHost folderHost, ModuleFileDefinition moduleFile)
        {
            var web    = folderHost.HostWeb;
            var folder = folderHost.CurrentContentTypeFolder;

            var context = web.Context;

            if (!folder.IsPropertyAvailable("ServerRelativeUrl"))
            {
                context.Load(folder, f => f.ServerRelativeUrl);
                context.ExecuteQueryWithTrace();
            }

            var currentFile = web.GetFileByServerRelativeUrl(GetSafeFileUrl(folder, moduleFile));

            context.Load(currentFile, f => f.Exists);
            context.ExecuteQuery();

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = currentFile.Exists ? currentFile : null,
                ObjectType       = typeof(File),
                ObjectDefinition = moduleFile,
                ModelHost        = folderHost
            });

            if (moduleFile.Overwrite)
            {
                var fileCreatingInfo = new FileCreationInformation
                {
                    Url       = moduleFile.FileName,
                    Overwrite = true
                };

                if (moduleFile.Content.Length < ContentStreamFileSize)
                {
                    TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Using fileCreatingInfo.Content for small file less than: [{0}]", ContentStreamFileSize);
                    fileCreatingInfo.Content = moduleFile.Content;
                }
                else
                {
                    TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Using fileCreatingInfo.ContentStream for big file more than: [{0}]", ContentStreamFileSize);
                    fileCreatingInfo.ContentStream = new System.IO.MemoryStream(moduleFile.Content);
                }

                var file = folder.Files.Add(fileCreatingInfo);

                folder.Context.ExecuteQuery();

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = file,
                    ObjectType       = typeof(File),
                    ObjectDefinition = moduleFile,
                    ModelHost        = folderHost
                });
            }
            else
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = currentFile.Exists ? currentFile : null,
                    ObjectType       = typeof(File),
                    ObjectDefinition = moduleFile,
                    ModelHost        = folderHost
                });
            }

            folder.Update();
            folder.Context.ExecuteQueryWithTrace();
        }
 private void ProcessWebFolder(FolderModelHost folderHost, ModuleFileDefinition moduleFile)
 {
     throw new NotImplementedException();
 }
        private File ProcessFile(FolderModelHost folderHost, ModuleFileDefinition moduleFile)
        {
            var context = folderHost.CurrentLibraryFolder.Context;

            var web    = folderHost.CurrentWeb;
            var list   = folderHost.CurrentList;
            var folder = folderHost.CurrentLibraryFolder;

            context.Load(folder, f => f.ServerRelativeUrl);
            context.ExecuteQueryWithTrace();

            var stringCustomContentType = ResolveContentTypeId(folderHost, moduleFile);

            if (list != null)
            {
                context.Load(list, l => l.EnableMinorVersions);
                context.Load(list, l => l.EnableVersioning);
                context.Load(list, l => l.EnableModeration);

                context.ExecuteQueryWithTrace();
            }

            var file = web.GetFileByServerRelativeUrl(GetSafeFileUrl(folder, moduleFile));

            context.Load(file, f => f.Exists);
            context.ExecuteQueryWithTrace();

            InvokeOnModelEvent <ModuleFileDefinition, File>(file, ModelEventType.OnUpdating);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = file.Exists ? file : null,
                ObjectType       = typeof(File),
                ObjectDefinition = moduleFile,
                ModelHost        = folderHost
            });

            WithSafeFileOperation(list, file, f =>
            {
                var fileName    = moduleFile.FileName;
                var fileContent = moduleFile.Content;

                var fileCreatingInfo = new FileCreationInformation
                {
                    Url       = fileName,
                    Overwrite = file.Exists
                };

                if (fileContent.Length < ContentStreamFileSize)
                {
                    TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Using fileCreatingInfo.Content for small file less than: [{0}]", ContentStreamFileSize);
                    fileCreatingInfo.Content = fileContent;
                }
                else
                {
                    TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Using fileCreatingInfo.ContentStream for big file more than: [{0}]", ContentStreamFileSize);
                    fileCreatingInfo.ContentStream = new System.IO.MemoryStream(fileContent);
                }

                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Overwriting file");
                var updatedFile = folder.Files.Add(fileCreatingInfo);

                var newFileItem = updatedFile.ListItemAllFields;
                //context.Load(newFileItem);
                //context.ExecuteQueryWithTrace();

                if (!string.IsNullOrEmpty(stringCustomContentType))
                {
                    newFileItem[BuiltInInternalFieldNames.ContentTypeId] = stringCustomContentType;
                }

                if (moduleFile.DefaultValues.Count > 0)
                {
                    EnsureDefaultValues(newFileItem, moduleFile);
                }

                if (!string.IsNullOrEmpty(stringCustomContentType) || moduleFile.DefaultValues.Count > 0)
                {
                    newFileItem.Update();
                }

                return(updatedFile);
            });

            var resultFile = web.GetFileByServerRelativeUrl(GetSafeFileUrl(folder, moduleFile));

            context.Load(resultFile, f => f.Exists);
            context.ExecuteQueryWithTrace();

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioned,
                Object           = resultFile,
                ObjectType       = typeof(File),
                ObjectDefinition = moduleFile,
                ModelHost        = folderHost
            });
            InvokeOnModelEvent <ModuleFileDefinition, File>(resultFile, ModelEventType.OnUpdated);

            return(resultFile);
        }
Example #26
0
        private File ProcessFile(FolderModelHost folderHost, ModuleFileDefinition definition)
        {
            var context = folderHost.CurrentListFolder.Context;

            var web    = folderHost.CurrentWeb;
            var list   = folderHost.CurrentList;
            var folder = folderHost.CurrentListFolder;

            context.Load(folder, f => f.ServerRelativeUrl);

#if !NET35
            context.Load(folder, f => f.Properties);
#endif

            context.ExecuteQueryWithTrace();

            var stringCustomContentType = ResolveContentTypeId(folderHost, definition);

            if (list != null)
            {
                context.Load(list, l => l.EnableMinorVersions);
                context.Load(list, l => l.EnableVersioning);
                context.Load(list, l => l.EnableModeration);

                context.ExecuteQueryWithTrace();
            }

            var file = web.GetFileByServerRelativeUrl(GetSafeFileUrl(folder, definition));

            context.Load(file, f => f.Exists);
            context.ExecuteQueryWithTrace();

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = file.Exists ? file : null,
                ObjectType       = typeof(File),
                ObjectDefinition = definition,
                ModelHost        = folderHost
            });

#if !NET35
            var doesFileHasListItem =
                //Forms folders
                !(folder != null
                  &&
                  (folder.Properties.FieldValues.ContainsKey("vti_winfileattribs") &&
                   folder.Properties.FieldValues["vti_winfileattribs"].ToString() == "00000012"));
#endif

#if NET35
            var doesFileHasListItem = true;
#endif

            WithSafeFileOperation(list, file, f =>
            {
                var fileName    = definition.FileName;
                var fileContent = definition.Content;

                var fileCreatingInfo = new FileCreationInformation
                {
                    Url       = fileName,
                    Overwrite = file.Exists
                };

                if (fileContent.Length < ContentStreamFileSize)
                {
                    TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Using fileCreatingInfo.Content for small file less than: [{0}]", ContentStreamFileSize);
                    fileCreatingInfo.Content = fileContent;
                }
                else
                {
#if NET35
                    throw new SPMeta2Exception(string.Format("SP2010 CSOM implementation does no support file more than {0}. Checkout FileCreationInformation and avialabe Content size.", ContentStreamFileSize));
#endif

#if !NET35
                    TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Using fileCreatingInfo.ContentStream for big file more than: [{0}]", ContentStreamFileSize);
                    fileCreatingInfo.ContentStream = new System.IO.MemoryStream(fileContent);
#endif
                }

                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Overwriting file");
                var updatedFile = folder.Files.Add(fileCreatingInfo);

                FieldLookupService.EnsureDefaultValues(updatedFile.ListItemAllFields, definition.DefaultValues);


                if (!string.IsNullOrEmpty(stringCustomContentType))
                {
                    updatedFile.ListItemAllFields[BuiltInInternalFieldNames.ContentTypeId] = stringCustomContentType;
                }

                if (!string.IsNullOrEmpty(definition.Title))
                {
                    updatedFile.ListItemAllFields[BuiltInInternalFieldNames.Title] = definition.Title;
                }


                FieldLookupService.EnsureValues(updatedFile.ListItemAllFields, definition.Values, true);

                if (!string.IsNullOrEmpty(stringCustomContentType) ||
                    definition.DefaultValues.Count > 0 ||
                    definition.Values.Count > 0 ||
                    !string.IsNullOrEmpty(definition.Title))
                {
                    updatedFile.ListItemAllFields.Update();
                }


                return(updatedFile);
            }, doesFileHasListItem);

            var resultFile = web.GetFileByServerRelativeUrl(GetSafeFileUrl(folder, definition));

            context.Load(resultFile, f => f.Exists);
            context.ExecuteQueryWithTrace();

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioned,
                Object           = resultFile,
                ObjectType       = typeof(File),
                ObjectDefinition = definition,
                ModelHost        = folderHost
            });

            return(resultFile);
        }
 private string GetSafeFileUrl(Folder folder, ModuleFileDefinition moduleFile)
 {
     return(UrlUtility.CombineUrl(folder.ServerRelativeUrl, moduleFile.FileName));
 }
Example #28
0
 public static ModelNode AddHostModuleFile(this ModelNode model, ModuleFileDefinition definition, Action <ModelNode> action)
 {
     return(model.AddDefinitionNodeWithOptions(definition, action, ModelNodeOptions.New().NoSelfProcessing()));
 }
Example #29
0
 public static ModelNode AddHostModuleFile(this ModelNode model, ModuleFileDefinition definition)
 {
     return(AddHostModuleFile(model, definition, null));
 }
Example #30
0
 public static TModelNode AddModuleFile <TModelNode>(this TModelNode model, ModuleFileDefinition definition)
     where TModelNode : ModelNode, IModuleFileHostModelNode, new()
 {
     return(AddModuleFile(model, definition, null));
 }