protected override void ExecuteCmdlet() { #pragma warning disable CS0618 // Type or member is obsolete SourceUrl = SourceUrl ?? ServerRelativeUrl; #pragma warning restore CS0618 // Type or member is obsolete var webServerRelativeUrl = SelectedWeb.EnsureProperty(w => w.ServerRelativeUrl); if (!SourceUrl.StartsWith("/")) { SourceUrl = UrlUtility.Combine(webServerRelativeUrl, SourceUrl); } if (!TargetUrl.StartsWith("/")) { TargetUrl = UrlUtility.Combine(webServerRelativeUrl, TargetUrl); } Uri currentContextUri = new Uri(ClientContext.Url); Uri sourceUri = new Uri(currentContextUri, SourceUrl); Uri sourceWebUri = Microsoft.SharePoint.Client.Web.WebUrlFromFolderUrlDirect(ClientContext, sourceUri); Uri targetUri = new Uri(currentContextUri, TargetUrl); Uri targetWebUri = Microsoft.SharePoint.Client.Web.WebUrlFromFolderUrlDirect(ClientContext, targetUri); _sourceContext = ClientContext; if (!currentContextUri.AbsoluteUri.Equals(sourceWebUri.AbsoluteUri, StringComparison.InvariantCultureIgnoreCase)) { _sourceContext = ClientContext.Clone(sourceWebUri); } bool isFile = true; bool srcIsFolder = false; File file = null; Folder folder = null; try { #if ONPREMISES file = _sourceContext.Web.GetFileByServerRelativeUrl(SourceUrl); #else file = _sourceContext.Web.GetFileByServerRelativePath(ResourcePath.FromDecodedUrl(SourceUrl)); #endif file.EnsureProperties(f => f.Name, f => f.Exists); isFile = file.Exists; } catch { isFile = false; } if (!isFile) { #if ONPREMISES folder = _sourceContext.Web.GetFolderByServerRelativeUrl(SourceUrl); #else folder = _sourceContext.Web.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(SourceUrl)); #endif #if !SP2013 folder.EnsureProperties(f => f.Name, f => f.Exists); srcIsFolder = folder.Exists; #else folder.EnsureProperties(f => f.Name); try { folder.EnsureProperties(f => f.ItemCount); //Using ItemCount as marker if this is a file or folder srcIsFolder = true; } catch { srcIsFolder = false; } #endif } if (Force || ShouldContinue(string.Format(Resources.CopyFile0To1, SourceUrl, TargetUrl), Resources.Confirm)) { var srcWeb = _sourceContext.Web; srcWeb.EnsureProperty(s => s.Url); _targetContext = ClientContext.Clone(targetWebUri.AbsoluteUri); var dstWeb = _targetContext.Web; dstWeb.EnsureProperties(s => s.Url, s => s.ServerRelativeUrl); if (srcWeb.Url == dstWeb.Url) { try { var targetFile = UrlUtility.Combine(TargetUrl, file?.Name); // If src/dst are on the same Web, then try using CopyTo - backwards compability #if ONPREMISES file?.CopyTo(targetFile, OverwriteIfAlreadyExists); #else file?.CopyToUsingPath(ResourcePath.FromDecodedUrl(targetFile), OverwriteIfAlreadyExists); #endif _sourceContext.ExecuteQueryRetry(); return; } catch { SkipSourceFolderName = true; // target folder exist //swallow exception, in case target was a lib/folder which exists } } //different site/site collection Folder targetFolder = null; string fileOrFolderName = null; bool targetFolderExists = false; try { #if ONPREMISES targetFolder = _targetContext.Web.GetFolderByServerRelativeUrl(TargetUrl); #else targetFolder = _targetContext.Web.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(TargetUrl)); #endif #if !SP2013 targetFolder.EnsureProperties(f => f.Name, f => f.Exists); if (!targetFolder.Exists) { throw new Exception("TargetUrl is an existing file, not folder"); } targetFolderExists = true; #else targetFolder.EnsureProperties(f => f.Name); try { targetFolder.EnsureProperties(f => f.ItemCount); //Using ItemCount as marker if this is a file or folder targetFolderExists = true; } catch { targetFolderExists = false; } if (!targetFolderExists) { throw new Exception("TargetUrl is an existing file, not folder"); } #endif } catch (Exception) { targetFolder = null; Expression <Func <List, object> > expressionRelativeUrl = l => l.RootFolder.ServerRelativeUrl; var query = _targetContext.Web.Lists.IncludeWithDefaultProperties(expressionRelativeUrl); var lists = _targetContext.LoadQuery(query); _targetContext.ExecuteQueryRetry(); lists = lists.OrderByDescending(l => l.RootFolder.ServerRelativeUrl); // order descending in case more lists start with the same foreach (List targetList in lists) { if (!TargetUrl.StartsWith(targetList.RootFolder.ServerRelativeUrl, StringComparison.InvariantCultureIgnoreCase)) { continue; } fileOrFolderName = Regex.Replace(TargetUrl, _targetContext.Web.ServerRelativeUrl, "", RegexOptions.IgnoreCase).Trim('/'); targetFolder = srcIsFolder ? _targetContext.Web.EnsureFolderPath(fileOrFolderName) : targetList.RootFolder; //fileOrFolderName = Regex.Replace(TargetUrl, targetList.RootFolder.ServerRelativeUrl, "", RegexOptions.IgnoreCase).Trim('/'); //targetFolder = srcIsFolder ? targetList.RootFolder.EnsureFolder(fileOrFolderName) : targetList.RootFolder; break; } } if (targetFolder == null) { throw new Exception("Target does not exist"); } if (srcIsFolder) { if (!SkipSourceFolderName && targetFolderExists) { targetFolder = targetFolder.EnsureFolder(folder.Name); } CopyFolder(folder, targetFolder); } else { UploadFile(file, targetFolder, fileOrFolderName); } } }
public override TokenParser ProvisionObjects(Web web, ProvisioningTemplate template, TokenParser parser, ProvisioningTemplateApplyingInformation applyingInformation) { using (var scope = new PnPMonitoredScope(this.Name)) { var context = web.Context as ClientContext; web.EnsureProperties(w => w.ServerRelativeUrl, w => w.Url); // Build on the fly the list of additional files coming from the Directories var directoryFiles = new List <Model.File>(); foreach (var directory in template.Directories) { var metadataProperties = directory.GetMetadataProperties(); directoryFiles.AddRange(directory.GetDirectoryFiles(metadataProperties)); } foreach (var file in template.Files.Union(directoryFiles)) { var folderName = parser.ParseString(file.Folder); if (folderName.ToLower().StartsWith((web.ServerRelativeUrl.ToLower()))) { folderName = folderName.Substring(web.ServerRelativeUrl.Length); } var folder = web.EnsureFolderPath(folderName); File targetFile = null; var checkedOut = false; targetFile = folder.GetFile(template.Connector.GetFilenamePart(file.Src)); if (targetFile != null) { if (file.Overwrite) { scope.LogDebug(CoreResources.Provisioning_ObjectHandlers_Files_Uploading_and_overwriting_existing_file__0_, file.Src); checkedOut = CheckOutIfNeeded(web, targetFile); using (var stream = GetFileStream(template, file)) { targetFile = UploadFile(template, file, folder, stream); } } else { checkedOut = CheckOutIfNeeded(web, targetFile); } } else { using (var stream = GetFileStream(template, file)) { scope.LogDebug(CoreResources.Provisioning_ObjectHandlers_Files_Uploading_file__0_, file.Src); targetFile = UploadFile(template, file, folder, stream); } checkedOut = CheckOutIfNeeded(web, targetFile); } if (targetFile != null) { if (file.Properties != null && file.Properties.Any()) { Dictionary <string, string> transformedProperties = file.Properties.ToDictionary(property => property.Key, property => parser.ParseString(property.Value)); SetFileProperties(targetFile, transformedProperties, false); } if (file.WebParts != null && file.WebParts.Any()) { targetFile.EnsureProperties(f => f.ServerRelativeUrl); var existingWebParts = web.GetWebParts(targetFile.ServerRelativeUrl); foreach (var webpart in file.WebParts) { // check if the webpart is already set on the page if (existingWebParts.FirstOrDefault(w => w.WebPart.Title == webpart.Title) == null) { scope.LogDebug(CoreResources.Provisioning_ObjectHandlers_Files_Adding_webpart___0___to_page, webpart.Title); var wpEntity = new WebPartEntity(); wpEntity.WebPartTitle = webpart.Title; wpEntity.WebPartXml = parser.ParseString(webpart.Contents).Trim(new[] { '\n', ' ' }); wpEntity.WebPartZone = webpart.Zone; wpEntity.WebPartIndex = (int)webpart.Order; web.AddWebPartToWebPartPage(targetFile.ServerRelativeUrl, wpEntity); } } } if (checkedOut) { targetFile.CheckIn("", CheckinType.MajorCheckIn); web.Context.ExecuteQueryRetry(); } // Don't set security when nothing is defined. This otherwise breaks on files set outside of a list if (file.Security != null && (file.Security.ClearSubscopes == true || file.Security.CopyRoleAssignments == true || file.Security.RoleAssignments.Count > 0)) { targetFile.ListItemAllFields.SetSecurity(parser, file.Security); } } } } return(parser); }
/// <summary> /// Allows copying to within the same site collection /// </summary> private void CopyWithinSameSiteCollection(Uri currentContextUri, Uri sourceWebUri, Uri targetWebUri) { _sourceContext = ClientContext; if (!currentContextUri.AbsoluteUri.Equals(sourceWebUri.AbsoluteUri, StringComparison.InvariantCultureIgnoreCase)) { _sourceContext = ClientContext.Clone(sourceWebUri); } bool isFile = true; bool srcIsFolder = false; File file = null; Folder folder = null; try { file = _sourceContext.Web.GetFileByServerRelativePath(ResourcePath.FromDecodedUrl(SourceUrl)); file.EnsureProperties(f => f.Name, f => f.Exists); isFile = file.Exists; } catch { isFile = false; } if (!isFile) { folder = _sourceContext.Web.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(SourceUrl)); folder.EnsureProperties(f => f.Name, f => f.Exists); srcIsFolder = folder.Exists; folder.EnsureProperties(f => f.Name); try { folder.EnsureProperties(f => f.ItemCount); //Using ItemCount as marker if this is a file or folder srcIsFolder = true; } catch { srcIsFolder = false; } } var srcWeb = _sourceContext.Web; srcWeb.EnsureProperty(s => s.Url); _targetContext = ClientContext.Clone(targetWebUri.AbsoluteUri); var dstWeb = _targetContext.Web; dstWeb.EnsureProperties(s => s.Url, s => s.ServerRelativeUrl); if (srcWeb.Url == dstWeb.Url) { try { var targetFile = UrlUtility.Combine(TargetUrl, file?.Name); // If src/dst are on the same Web, then try using CopyTo - backwards compability file?.CopyToUsingPath(ResourcePath.FromDecodedUrl(targetFile), OverwriteIfAlreadyExists); _sourceContext.ExecuteQueryRetry(); return; } catch { SkipSourceFolderName = true; // target folder exist //swallow exception, in case target was a lib/folder which exists } } //different site/site collection Folder targetFolder = null; string fileOrFolderName = null; bool targetFolderExists = false; try { targetFolder = _targetContext.Web.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(TargetUrl)); targetFolder.EnsureProperties(f => f.Name, f => f.Exists); if (!targetFolder.Exists) { throw new Exception("TargetUrl is an existing file, not folder"); } targetFolderExists = true; } catch (Exception) { targetFolder = null; Expression <Func <List, object> > expressionRelativeUrl = l => l.RootFolder.ServerRelativeUrl; var query = _targetContext.Web.Lists.IncludeWithDefaultProperties(expressionRelativeUrl); var lists = _targetContext.LoadQuery(query); _targetContext.ExecuteQueryRetry(); lists = lists.OrderByDescending(l => l.RootFolder.ServerRelativeUrl); // order descending in case more lists start with the same foreach (List targetList in lists) { if (!TargetUrl.StartsWith(targetList.RootFolder.ServerRelativeUrl, StringComparison.InvariantCultureIgnoreCase)) { continue; } fileOrFolderName = Regex.Replace(TargetUrl, _targetContext.Web.ServerRelativeUrl, "", RegexOptions.IgnoreCase).Trim('/'); targetFolder = srcIsFolder ? _targetContext.Web.EnsureFolderPath(fileOrFolderName) : targetList.RootFolder; break; } } if (targetFolder == null) { throw new Exception("Target does not exist"); } if (srcIsFolder) { if (!SkipSourceFolderName && targetFolderExists) { targetFolder = targetFolder.EnsureFolder(folder.Name); } CopyFolder(folder, targetFolder); } else { UploadFile(file, targetFolder, fileOrFolderName); } }