// =========================================================================================================== /// <summary> /// Applies the current template on the specified <b>Web</b> object /// </summary> /// <param name="web">The <b>Web</b> object on which the template needs to be applied</param> /// <param name="templateProvider">The <b>XMLTemplatePRovider</b> that is mapped to the client's working directory</param> // =========================================================================================================== public void Apply(Web web, XMLTemplateProvider templateProvider) { if (!this.Ignore) { if (TemplateExists(templateProvider)) { if (IsOpenXml()) { // -------------------------------------------------- // Handles ".pnp" templates // -------------------------------------------------- ApplyOpenXML(web, templateProvider); } else { // -------------------------------------------------- // Handles regular ".xml" templates // -------------------------------------------------- ApplyRegularXML(web, templateProvider); } } else { throw new FileNotFoundException(string.Format(ERROR_TEMPLATE_NOT_FOUND, System.IO.Path.Combine(templateProvider.Connector.Parameters[PARAMETER_CONNECTION_STRING].ToString(), this.Path))); } } else { logger.Info("Ignoring template '{0}' from file '{1}'", this.Name, this.Path); } }
// =========================================================================================================== /// <summary> /// Returns whether the current template file exists based on the specified template provider /// </summary> /// <param name="templateProvider">The template provider that is mapped to the client's working directory</param> /// <returns>True if the template file exists, otherwise false</returns> // =========================================================================================================== private bool TemplateExists(XMLTemplateProvider templateProvider) { string workingDirectory = templateProvider.Connector.Parameters[PARAMETER_CONNECTION_STRING].ToString(); string templatePath = System.IO.Path.Combine(workingDirectory, this.Path); return(System.IO.File.Exists(templatePath)); }
// =========================================================================================================== /// <summary> /// Applies the current template as an open XML ".pnp" package on the specified web /// </summary> /// <param name="web">The <b>Web</b> on which to apply the template</param> /// <param name="templateProvider">The <b>XMLTemplateProvider</b> that is mapped to the client's working directory</param> // =========================================================================================================== private void ApplyOpenXML(Web web, XMLTemplateProvider templateProvider) { logger.Info("Applying open XML package '{0}' from file '{1}'", this.Name, this.Path); // -------------------------------------------------- // Formats the template's execution rendering // -------------------------------------------------- ProvisioningTemplateApplyingInformation ptai = GetTemplateApplyInfo(); // -------------------------------------------------- // Replaces the regular provider by an OpenXml one // -------------------------------------------------- string workingDirectory = templateProvider.Connector.Parameters[PARAMETER_CONNECTION_STRING].ToString(); FileSystemConnector fileSystemConnector = new FileSystemConnector(workingDirectory, ""); OpenXMLConnector openXmlConnector = new OpenXMLConnector(this.Path, fileSystemConnector); XMLTemplateProvider openXmlTemplateProvider = new XMLOpenXMLTemplateProvider(openXmlConnector); // -------------------------------------------------- // Loops through all templates within the .pnp package // -------------------------------------------------- List <ProvisioningTemplate> templates = openXmlTemplateProvider.GetTemplates(); foreach (ProvisioningTemplate template in templates) { logger.Info("Applying template '{0}' from file '{1}'", template.Id, this.Path); // -------------------------------------------------- // Applies the template // -------------------------------------------------- template.Connector = openXmlTemplateProvider.Connector; web.ApplyProvisioningTemplate(template, ptai); } }
// =========================================================================================================== /// <summary> /// Launches the current sequence by executing all it's templates /// </summary> /// <param name="credentials">The credentials required for creating the client context</param> /// <param name="templateProvider">The <b>XMLTemplatePRovider</b> that is mapped to the client's working directory</param> // =========================================================================================================== public void Launch(ICredentials credentials, XMLTemplateProvider templateProvider) { if (!this.Ignore) { logger.Info("Launching sequence '{0}' ({1})", this.Name, this.Description); using (ClientContext ctx = new ClientContext(this.WebUrl)) { // -------------------------------------------------- // Sets the context with the provided credentials // -------------------------------------------------- ctx.Credentials = credentials; ctx.RequestTimeout = Timeout.Infinite; // -------------------------------------------------- // Loads the full web for futur references (providers) // -------------------------------------------------- Web web = ctx.Web; ctx.Load(web); ctx.ExecuteQueryRetry(); // -------------------------------------------------- // Launches the templates // -------------------------------------------------- foreach (Template template in this.Templates) { template.Apply(web, templateProvider); } } } else { logger.Info("Ignoring sequence '{0}' ({1})", this.Name, this.Description); } }
protected override void ExecuteCmdlet() { SelectedWeb.EnsureProperty(w => w.Url); bool templateFromFileSystem = !Path.ToLower().StartsWith("http"); FileConnectorBase fileConnector; string templateFileName = System.IO.Path.GetFileName(Path); if (templateFromFileSystem) { if (!System.IO.Path.IsPathRooted(Path)) { Path = System.IO.Path.Combine(SessionState.Path.CurrentFileSystemLocation.Path, Path); } FileInfo fileInfo = new FileInfo(Path); fileConnector = new FileSystemConnector(fileInfo.DirectoryName, ""); } else { Uri fileUri = new Uri(Path); var webUrl = Microsoft.SharePoint.Client.Web.WebUrlFromFolderUrlDirect(this.ClientContext, fileUri); var templateContext = this.ClientContext.Clone(webUrl.ToString()); string library = Path.ToLower().Replace(templateContext.Url.ToLower(), "").TrimStart('/'); int idx = library.IndexOf("/"); library = library.Substring(0, idx); fileConnector = new SharePointConnector(templateContext, templateContext.Url, library); } XMLTemplateProvider provider = null; ProvisioningTemplate provisioningTemplate = null; Stream stream = fileConnector.GetFileStream(templateFileName); var isOpenOfficeFile = IsOpenOfficeFile(stream); if (isOpenOfficeFile) { provider = new XMLOpenXMLTemplateProvider(new OpenXMLConnector(templateFileName, fileConnector)); templateFileName = templateFileName.Substring(0, templateFileName.LastIndexOf(".")) + ".xml"; } else { if (templateFromFileSystem) { provider = new XMLFileSystemTemplateProvider(fileConnector.Parameters[FileConnectorBase.CONNECTIONSTRING] + "", ""); } else { throw new NotSupportedException("Only .pnp package files are supported from a SharePoint library"); } } provisioningTemplate = provider.GetTemplate(templateFileName, TemplateProviderExtensions); if (provisioningTemplate == null) { return; } GetProvisioningTemplate.SetTemplateMetadata(provisioningTemplate, TemplateDisplayName, TemplateImagePreviewUrl, TemplateProperties); provider.SaveAs(provisioningTemplate, templateFileName, TemplateProviderExtensions); }
// =========================================================================================================== /// <summary> /// Applies the current template as a regular XML template on the specified web /// </summary> /// <param name="web">The <b>Web</b> on which to apply the template</param> /// <param name="templateProvider">The <b>XMLTemplateProvider</b> that is mapped to the client's working directory</param> // =========================================================================================================== private void ApplyRegularXML(Web web, XMLTemplateProvider templateProvider) { logger.Info("Applying template '{0}' from file '{1}'", this.Name, this.Path); // -------------------------------------------------- // Formats the template's execution rendering // -------------------------------------------------- ProvisioningTemplateApplyingInformation ptai = GetTemplateApplyInfo(); // -------------------------------------------------- // Loads the template // -------------------------------------------------- ProvisioningTemplate template = templateProvider.GetTemplate(this.Path); template.Connector = templateProvider.Connector; // -------------------------------------------------- // Applies the template // -------------------------------------------------- web.ApplyProvisioningTemplate(template, ptai); }
protected override void ExecuteCmdlet() { SelectedWeb.EnsureProperty(w => w.Url); bool templateFromFileSystem = !Path.ToLower().StartsWith("http"); FileConnectorBase fileConnector; string templateFileName = System.IO.Path.GetFileName(Path); if (templateFromFileSystem) { if (!System.IO.Path.IsPathRooted(Path)) { Path = System.IO.Path.Combine(SessionState.Path.CurrentFileSystemLocation.Path, Path); } if (!string.IsNullOrEmpty(ResourceFolder)) { if (!System.IO.Path.IsPathRooted(ResourceFolder)) { ResourceFolder = System.IO.Path.Combine(SessionState.Path.CurrentFileSystemLocation.Path, ResourceFolder); } } FileInfo fileInfo = new FileInfo(Path); fileConnector = new FileSystemConnector(fileInfo.DirectoryName, ""); } else { Uri fileUri = new Uri(Path); var webUrl = Microsoft.SharePoint.Client.Web.WebUrlFromFolderUrlDirect(this.ClientContext, fileUri); var templateContext = this.ClientContext.Clone(webUrl.ToString()); string library = Path.ToLower().Replace(templateContext.Url.ToLower(), "").TrimStart('/'); int idx = library.IndexOf("/"); library = library.Substring(0, idx); fileConnector = new SharePointConnector(templateContext, templateContext.Url, library); } XMLTemplateProvider provider = null; ProvisioningTemplate provisioningTemplate = null; Stream stream = fileConnector.GetFileStream(templateFileName); var isOpenOfficeFile = IsOpenOfficeFile(stream); if (isOpenOfficeFile) { provider = new XMLOpenXMLTemplateProvider(new OpenXMLConnector(templateFileName, fileConnector)); templateFileName = templateFileName.Substring(0, templateFileName.LastIndexOf(".")) + ".xml"; } else { if (templateFromFileSystem) { provider = new XMLFileSystemTemplateProvider(fileConnector.Parameters[FileConnectorBase.CONNECTIONSTRING] + "", ""); } else { throw new NotSupportedException("Only .pnp package files are supported from a SharePoint library"); } } provisioningTemplate = provider.GetTemplate(templateFileName, TemplateProviderExtensions); if (provisioningTemplate == null) { return; } if (isOpenOfficeFile) { provisioningTemplate.Connector = provider.Connector; } else { if (ResourceFolder != null) { var fileSystemConnector = new FileSystemConnector(ResourceFolder, ""); provisioningTemplate.Connector = fileSystemConnector; } else { provisioningTemplate.Connector = provider.Connector; } } if (Parameters != null) { foreach (var parameter in Parameters.Keys) { if (provisioningTemplate.Parameters.ContainsKey(parameter.ToString())) { provisioningTemplate.Parameters[parameter.ToString()] = Parameters[parameter].ToString(); } else { provisioningTemplate.Parameters.Add(parameter.ToString(), Parameters[parameter].ToString()); } } } var applyingInformation = new ProvisioningTemplateApplyingInformation(); if (this.MyInvocation.BoundParameters.ContainsKey("Handlers")) { applyingInformation.HandlersToProcess = Handlers; } if (this.MyInvocation.BoundParameters.ContainsKey("ExcludeHandlers")) { foreach (var handler in (OfficeDevPnP.Core.Framework.Provisioning.Model.Handlers[])Enum.GetValues(typeof(Handlers))) { if (!ExcludeHandlers.Has(handler) && handler != Handlers.All) { Handlers = Handlers | handler; } } applyingInformation.HandlersToProcess = Handlers; } if (ExtensibilityHandlers != null) { applyingInformation.ExtensibilityHandlers = ExtensibilityHandlers.ToList <ExtensibilityHandler>(); } applyingInformation.ProgressDelegate = (message, step, total) => { WriteProgress(new ProgressRecord(0, string.Format("Applying template to {0}", SelectedWeb.Url), message) { PercentComplete = (100 / total) * step }); }; applyingInformation.MessagesDelegate = (message, type) => { if (type == ProvisioningMessageType.Warning) { WriteWarning(message); } }; applyingInformation.OverwriteSystemPropertyBagValues = OverwriteSystemPropertyBagValues; SelectedWeb.ApplyProvisioningTemplate(provisioningTemplate, applyingInformation); }
protected override void ExecuteCmdlet() { SelectedWeb.EnsureProperty(w => w.Url); if (!System.IO.Path.IsPathRooted(Path)) { Path = System.IO.Path.Combine(SessionState.Path.CurrentFileSystemLocation.Path, Path); } if (!string.IsNullOrEmpty(ResourceFolder)) { if (!System.IO.Path.IsPathRooted(ResourceFolder)) { ResourceFolder = System.IO.Path.Combine(SessionState.Path.CurrentFileSystemLocation.Path, ResourceFolder); } } FileInfo fileInfo = new FileInfo(Path); XMLTemplateProvider provider = null; ProvisioningTemplate provisioningTemplate = null; var isOpenOfficeFile = IsOpenOfficeFile(Path); if (isOpenOfficeFile) { var fileSystemconnector = new FileSystemConnector(fileInfo.DirectoryName, ""); provider = new XMLOpenXMLTemplateProvider(new OpenXMLConnector(fileInfo.Name, fileSystemconnector)); var fileName = fileInfo.Name.Substring(0, fileInfo.Name.LastIndexOf(".")) + ".xml"; provisioningTemplate = provider.GetTemplate(fileName); } else { provider = new XMLFileSystemTemplateProvider(fileInfo.DirectoryName, ""); provisioningTemplate = provider.GetTemplate(fileInfo.Name); } if (provisioningTemplate != null) { if (isOpenOfficeFile) { provisioningTemplate.Connector = provider.Connector; } else { FileSystemConnector fileSystemConnector = null; if (ResourceFolder != null) { fileSystemConnector = new FileSystemConnector(ResourceFolder, ""); provisioningTemplate.Connector = fileSystemConnector; } else { provisioningTemplate.Connector = provider.Connector; } } if (Parameters != null) { foreach (var parameter in Parameters.Keys) { if (provisioningTemplate.Parameters.ContainsKey(parameter.ToString())) { provisioningTemplate.Parameters[parameter.ToString()] = Parameters[parameter].ToString(); } else { provisioningTemplate.Parameters.Add(parameter.ToString(), Parameters[parameter].ToString()); } } } var applyingInformation = new ProvisioningTemplateApplyingInformation(); if (this.MyInvocation.BoundParameters.ContainsKey("Handlers")) { applyingInformation.HandlersToProcess = Handlers; } if (this.MyInvocation.BoundParameters.ContainsKey("ExcludeHandlers")) { foreach (var handler in (OfficeDevPnP.Core.Framework.Provisioning.Model.Handlers[])Enum.GetValues(typeof(Handlers))) { if (!ExcludeHandlers.Has(handler) && handler != Handlers.All) { Handlers = Handlers | handler; } } applyingInformation.HandlersToProcess = Handlers; } if (ExtensibilityHandlers != null) { applyingInformation.ExtensibilityHandlers = ExtensibilityHandlers.ToList <ExtensibilityHandler>(); } applyingInformation.ProgressDelegate = (message, step, total) => { WriteProgress(new ProgressRecord(0, string.Format("Applying template to {0}", SelectedWeb.Url), message) { PercentComplete = (100 / total) * step }); }; applyingInformation.MessagesDelegate = (message, type) => { if (type == ProvisioningMessageType.Warning) { WriteWarning(message); } }; applyingInformation.OverwriteSystemPropertyBagValues = OverwriteSystemPropertyBagValues; SelectedWeb.ApplyProvisioningTemplate(provisioningTemplate, applyingInformation); } }