private void SavePageViewPermissions(ACConverterPageInfo pageInfo) { RemotePermission[] pagePermissions = _confluenceService.GetPagePermissions(pageInfo.ConfluencePage.id); //If there no view restrictions on the page, copy parent page restrictions. if (Array.Find(pagePermissions, delegate(RemotePermission p) { return(p.lockType == ConfluenceViewPermissionName); }) == null) { if (pageInfo.ParentPage != null) { foreach (RemotePermission permission in pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.Values) { pageInfo.ConfluenceUsersWithViewPermissions[permission.lockedBy.ToLower()] = permission; } } return; } foreach (RemotePermission permission in pagePermissions) { if (permission.lockType == ConfluenceViewPermissionName) { if ((pageInfo.ParentPage != null) && (pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.Count != 0)) { if (!pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.ContainsKey(permission.lockedBy.ToLower())) { //If this user haven't permission to view parent page, then he haven't permission to view this page in Confluence continue; } } pageInfo.ConfluenceUsersWithViewPermissions[permission.lockedBy.ToLower()] = permission; } } }
private void MovePageContent(Dictionary <string, string> pathMap) { foreach (string space in Utils.GetPersistedSpaces()) { if ((_spacesToConvert.Count > 0) && (!_spacesToConvert.Contains(space.ToLower()))) { continue; } RemoteSpace spaceInfo = _confluenceService.GetSpace(space); foreach (string p in Utils.GetPersistedPagesInSpace(space)) { ACConverterPageInfo pageInfo = Utils.RestorePageInfo(space, p); if (pageInfo != null) { MovePageContent(pathMap, pageInfo); if (pageInfo.ConfluencePage.id == spaceInfo.homePage) { //Set content of the MT space root page after the homepage is processed. string content = "{{" + string.Format("wiki.page(wiki.getpage({0}).path);", pageInfo.DekiPageId) + "}}"; CreateDekiPage(_dekiPlug, pageInfo.SpaceRootPath, spaceInfo.name, null, content); } } } } }
//--- Constructors --- public ACConverterPageInfo(RemotePage confluenceRemotePage, string spaceRootPath, string dekiPageUrl, string dekiPagePath, int dekiPageId, string pageTitle, string tinyUrl, ACConverterPageInfo parentPage) { this._confluenceRemotePage = confluenceRemotePage; this._dekiPageUrl = dekiPageUrl; this._dekiPagePath = dekiPagePath; this._dekiPageId = dekiPageId; this._pageTitle = pageTitle; this._parentPage = parentPage; this._tinyUrl = tinyUrl; this._spaceRootPath = spaceRootPath; }
//TODO : this needs to be tested public string ReplaceMacrosWithStubs(ACConverterPageInfo pageinfo) { string rawContents = pageinfo.ConfluencePage.content; foreach (string macro in Converters.GetSupportedMacros()) { Regex converter = new Regex(@"\{(" + macro + "[^}]*)}"); rawContents = converter.Replace(rawContents, MacroStubStart + "$1" + MacroStubEnd); } return(rawContents); }
//TODO : this needs to be tested public string ReplaceMacrosWithStubs(ACConverterPageInfo pageinfo) { string rawContents = pageinfo.ConfluencePage.content; foreach (string macro in Converters.GetSupportedMacros()) { Regex converter = new Regex(@"\{(" + macro + "[^}]*)}"); rawContents = converter.Replace(rawContents, MacroStubStart + "$1" + MacroStubEnd); } return rawContents; }
public override string ConvertMacro(Dictionary<string, string> pathMap, Macro macro, ACConverterPageInfo pageInfo) { string dekiMacro = "";//"{{ wiki.page(" + objMacro + ") }}"; if (macro.Arguments != null) { string spaceKey = (macro.Arguments.Keys.Contains("spaceKey")) ? macro.Arguments["spaceKey"] : pageInfo.ConfluencePage.space; string pageTitle = (macro.Arguments.Keys.Contains("pageTitle")) ? macro.Arguments["pageTitle"] : macro.Arguments[Utils.DefaultParamName]; ACConverter aconverter = new ACConverter(); dekiMacro = aconverter.GetMtPathFromConfluencePath(pathMap, spaceKey, pageTitle); dekiMacro = "{{ wiki.page(\"" + dekiMacro + "\") }}"; } return dekiMacro; }
public void LogPageConversion(XDoc spaceManifest, ACConverterPageInfo pageInfo) { string xpath = string.Format("page[@c.pageid='{0}']", pageInfo.ConfluencePage.id); XDoc pageXml = spaceManifest[xpath]; if(pageXml.IsEmpty) { spaceManifest.Start("page"); spaceManifest.Attr("c.space", pageInfo.ConfluencePage.space); spaceManifest.Attr("c.pageid", pageInfo.ConfluencePage.id); spaceManifest.Attr("c.parentpageid", pageInfo.ConfluencePage.parentId); spaceManifest.Attr("c.path", Utils.GetUrlLocalUri(_confBaseUrl, pageInfo.ConfluencePage.url, true, false)); spaceManifest.Attr("c.tinyurl", pageInfo.TinyUrl); spaceManifest.Attr("mt.pageid", pageInfo.DekiPageId); spaceManifest.Attr("mt.path", pageInfo.DekiPageUrl); spaceManifest.Attr("title", pageInfo.PageTitle); spaceManifest.End(); } }
private void MovePageHistory(Dictionary<string, string> pathMap, ACConverterPageInfo pageInfo) { List<RemotePage> pageHistories = GetHistoryPages(pageInfo.ConfluencePage.id); pageHistories.Reverse(); foreach (RemotePage remoteHistoryPage in pageHistories) { Log.DebugFormat("Processing PageHistory for pageid: {0} pageHistoryid: {1}", pageInfo.DekiPageId, pageInfo.ConfluencePage.id); string confluencePageContent = _confluenceService.RenderContent(pageInfo.ConfluencePage.space, remoteHistoryPage.id, remoteHistoryPage.content); confluencePageContent = ExtractPageContentAndReplaceLinks(pathMap, confluencePageContent); Plug postPageDekiPlug = _dekiPlug; CreateDekiPage(postPageDekiPlug, pageInfo.DekiPagePath, pageInfo.PageTitle, pageInfo.ConfluencePage.modified, confluencePageContent); } }
public void LogPageConversion(XDoc spaceManifest, ACConverterPageInfo pageInfo) { string xpath = string.Format("page[@c.pageid='{0}']", pageInfo.ConfluencePage.id); XDoc pageXml = spaceManifest[xpath]; if (pageXml.IsEmpty) { spaceManifest.Start("page"); spaceManifest.Attr("c.space", pageInfo.ConfluencePage.space); spaceManifest.Attr("c.pageid", pageInfo.ConfluencePage.id); spaceManifest.Attr("c.parentpageid", pageInfo.ConfluencePage.parentId); spaceManifest.Attr("c.path", Utils.GetUrlLocalUri(_confBaseUrl, pageInfo.ConfluencePage.url, true, false)); spaceManifest.Attr("c.tinyurl", pageInfo.TinyUrl); spaceManifest.Attr("mt.pageid", pageInfo.DekiPageId); spaceManifest.Attr("mt.path", pageInfo.DekiPageUrl); spaceManifest.Attr("title", pageInfo.PageTitle); spaceManifest.End(); } }
private void MovePageHistory(Dictionary <string, string> pathMap, ACConverterPageInfo pageInfo) { List <RemotePage> pageHistories = GetHistoryPages(pageInfo.ConfluencePage.id); pageHistories.Reverse(); foreach (RemotePage remoteHistoryPage in pageHistories) { Log.DebugFormat("Processing PageHistory for pageid: {0} pageHistoryid: {1}", pageInfo.DekiPageId, pageInfo.ConfluencePage.id); string confluencePageContent = _confluenceService.RenderContent(pageInfo.ConfluencePage.space, remoteHistoryPage.id, remoteHistoryPage.content); confluencePageContent = ExtractPageContentAndReplaceLinks(pathMap, confluencePageContent); Plug postPageDekiPlug = _dekiPlug; CreateDekiPage(postPageDekiPlug, pageInfo.DekiPagePath, pageInfo.PageTitle, pageInfo.ConfluencePage.modified, confluencePageContent); } }
public static ACConverterPageInfo RestorePageInfo(string space, string pageid) { ACConverterPageInfo o = null; Stream fileStream = null; string filename = string.Format(@"data\{0}\{1}{2}", space, pageid, ".bin"); BinaryFormatter serializer = new BinaryFormatter(); //XmlSerializer serializer = new XmlSerializer(typeof(ACConverterPageInfo)); try { fileStream = File.OpenRead(filename); o = serializer.Deserialize(fileStream) as ACConverterPageInfo; } catch (Exception x) { ACConverter.Log.WarnExceptionFormat(x, "Unable to restore page info from '{0}'", filename); } finally { if (fileStream != null) { fileStream.Close(); } } return(o); }
public static void PersistPageInfo(ACConverterPageInfo pageInfo) { Stream fileStream = null; string filename = string.Format(@"data\{0}\{1}{2}", pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, ".bin"); BinaryFormatter serializer = new BinaryFormatter(); //XmlSerializer serializer = new XmlSerializer(typeof(ACConverterPageInfo)); try { FileInfo fi = new FileInfo(filename); fi.Directory.Create(); fileStream = File.OpenWrite(filename); serializer.Serialize(fileStream, pageInfo); fileStream.Close(); } catch (Exception x) { ACConverter.Log.WarnExceptionFormat(x, "Unable to persist page info to '{0}'", filename); } finally { if (fileStream != null) { fileStream.Close(); } } }
private void MovePageContent(Dictionary<string, string> pathMap, ACConverterPageInfo pageInfo) { try { //Move the history of the page first MovePageHistory(pathMap, pageInfo); string stubContent = ReplaceMacrosWithStubs(pageInfo); // Move the latest revision string confluencePageContent = _confluenceService.RenderContent(pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, stubContent); confluencePageContent = ConvertStubstoDeki(pathMap,confluencePageContent, pageInfo); confluencePageContent = ExtractPageContentAndReplaceLinks(pathMap, confluencePageContent); Plug postPageDekiPlug = _dekiPlug; if(pageInfo.ConfluenceUsersWithViewPermissions.Count > 0) { if((pageInfo.ConfluencePage.modifier != null) && (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(pageInfo.ConfluencePage.modifier.ToLower()))) { postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.modifier); } else { if((pageInfo.ConfluencePage.creator != null) && (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(pageInfo.ConfluencePage.creator.ToLower()))) { postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.creator); } } } else { if(pageInfo.ConfluencePage.modifier != null) { postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.modifier); } else { if(pageInfo.ConfluencePage.creator != null) { postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.creator); } } } CreateDekiPage(postPageDekiPlug, pageInfo.DekiPagePath, pageInfo.PageTitle, pageInfo.ConfluencePage.modified, confluencePageContent); // Catch all exceptions when moving labels, comments and permissions. try { MoveLabels(pageInfo.DekiPageId, pageInfo.ConfluencePage.id); } catch(Exception e) { Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MoveLabels"); } try { MoveComments(pageInfo.DekiPageId, pageInfo.ConfluencePage.id); } catch(Exception e) { Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MoveComments"); } try { MovePermissions(pageInfo); } catch(Exception e) { Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MovePermissions"); } } catch(Exception e) { Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MovePageContent"); } }
private string MovePageStubs(XDoc spaceManifest, string spaceRoot, string parentPagePath, RemotePageSummary confluenceRemotePageSummary, string pageName, string pageTitle, ACConverterPageInfo parentPage) { RemotePage confluenceRemotePage = _confluenceService.GetPage(confluenceRemotePageSummary.id); string tinyUrl = null; if(_rpcclient != null) { CFRpcExtensions rpcExt = new CFRpcExtensions(_rpcclient); tinyUrl = rpcExt.GetTinyUrlForPageId(confluenceRemotePageSummary.id.ToString()); } string pagePath = null; //If PageName not null use it, else use Confluence page title. if (pageName == null) { pageName = confluenceRemotePage.title; } pagePath = pageName; if (parentPagePath != null) { pagePath = parentPagePath + Utils.DoubleUrlEncode("/" + pagePath); } //If the page title is too long it gets saved as {spaceroot}/misc/{pageid} with the page title set if(pagePath.Length > MaxLengthOfPageTitle) { pagePath = Utils.DoubleUrlEncode(string.Format(@"{0}/misc/{1}", spaceRoot, confluenceRemotePage.id)); if(string.IsNullOrEmpty(pageTitle)) { pageTitle = pageName; } Log.WarnFormat("Page title longer than {0}. Will be placed into {1}. Title: {2}", MaxLengthOfPageTitle, pagePath, pageTitle); } Plug postPageDekiPlug = (confluenceRemotePage.creator == null) ? _dekiPlug : GetPlugForConvertedUser(confluenceRemotePage.creator); Log.TraceFormat("Creating page stub in space '{0}'", confluenceRemotePage.space); string mtPageUrl; // modified date string, according to: /* http://developer.mindtouch.com/en/ref/MindTouch_API/POST%3apages%2f%2f%7Bpageid%7D%2f%2fcontents * should be formatted as: * the edit timestamp - yyyyMMddHHmmss or yyyy-MM-ddTHH:mm:ssZ */ int dekiPageId = CreateDekiPage(postPageDekiPlug, pagePath, pageTitle, confluenceRemotePage.modified, "", out mtPageUrl); if (dekiPageId == -1) { //TODO (maxm): page failure needs to be recorded and steps that depend // on it such as attachments and children should be skipped return string.Empty; } ACConverterPageInfo pageInfo = new ACConverterPageInfo(confluenceRemotePage, spaceRoot, mtPageUrl, pagePath, dekiPageId, pageTitle, tinyUrl, parentPage); Utils.PersistPageInfo(pageInfo); //Confluence view page permission is inherited. Save they to use later in MovePermissions. SavePageViewPermissions(pageInfo); RemotePageSummary[] childPages = _confluenceService.GetChildren(confluenceRemotePage.id); foreach (RemotePageSummary childPageSummary in childPages) { MovePageStubs(spaceManifest, spaceRoot, pagePath, childPageSummary, null, null, pageInfo); } SaveCommentsLinks(spaceManifest, pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, mtPageUrl); MoveAttachments(spaceManifest, pageInfo.DekiPageId,pageInfo.ConfluencePage.id); LogPageConversion(spaceManifest, pageInfo); return pagePath; }
private void MovePermissions(ACConverterPageInfo pageInfo) { RemotePermission[] pagePermissions = _confluenceService.GetPagePermissions(pageInfo.ConfluencePage.id); //Change permissions list according to parent page permissoins List<RemotePermission> newPermissions = new List<RemotePermission>(); foreach (RemotePermission permission in pageInfo.ConfluenceUsersWithViewPermissions.Values) { newPermissions.Add(permission); } foreach (RemotePermission permission in pagePermissions) { if (permission.lockType == ConfluenceEditPermissionName) { if ((pageInfo.ConfluenceUsersWithViewPermissions.Count == 0) || (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(permission.lockedBy.ToLower()))) { newPermissions.Add(permission); } } } pagePermissions = newPermissions.ToArray(); if (pagePermissions.Length == 0) { return; } string dekiRestriction; //Possible two entry of one user or group in pagePermissions. //As View permission and as Edit permission for this group/user. //To prevent repeated addition to Deki in this dictionary stored true //if permission to this user/group added to Deki. Dictionary<string, bool> permissionAddedToDeki = new Dictionary<string, bool>(); Dictionary<string, bool> userHaveWritePermission = new Dictionary<string, bool>(); if (_compatibleConvertUserPermissions) { bool onlyWriteRestrictions = true; foreach (RemotePermission permission in pagePermissions) { if (permission.lockType == ConfluenceViewPermissionName) { onlyWriteRestrictions = false; break; } } if (onlyWriteRestrictions) { //If there no view restrictions on this Confluence page set Semi-Public restrictions to Deki users dekiRestriction = "Semi-Public"; } else { //If there is view restrictions on this Confluence page to allow users/groups with View and Edit //restrictions view this page set Private restriction in Deki. //Users without Edit permission but with View permission in Confluence can edit this page in Deki. dekiRestriction = "Private"; } } else { dekiRestriction = "Private"; foreach (RemotePermission permission in pagePermissions) { if (permission.lockType == ConfluenceEditPermissionName) { userHaveWritePermission[permission.lockedBy.ToLower()] = true; } else { if (!userHaveWritePermission.ContainsKey(permission.lockedBy.ToLower())) { userHaveWritePermission[permission.lockedBy.ToLower()] = false; } } } } XDoc securityDoc = new XDoc("security") .Start("permissions.page") .Elem("restriction", dekiRestriction) .End() .Start("grants"); foreach (RemotePermission permission in pagePermissions) { if (permissionAddedToDeki.ContainsKey(permission.lockedBy.ToLower())) { continue; } securityDoc .Start("grant") .Start("permissions"); if (_compatibleConvertUserPermissions) { securityDoc.Elem("role", "Contributor"); } else { bool haveWritePermission = false; userHaveWritePermission.TryGetValue(permission.lockedBy.ToLower(), out haveWritePermission); if (haveWritePermission) { securityDoc.Elem("role", "Contributor"); } else { securityDoc.Elem("role", "Viewer"); } } securityDoc.End(); //Detect if this is group or user permission ACConverterUserInfo dekiUser; if (_convertedUsers.TryGetValue(permission.lockedBy.ToLower(), out dekiUser)) { securityDoc.Start("user").Attr("id", dekiUser.DekiUserId).End(); } else { ACConverterGroupInfo dekiGroup = null; if (_convertedGroups.TryGetValue(permission.lockedBy.ToLower(), out dekiGroup)) { securityDoc.Start("group").Attr("id", dekiGroup.DekiGroupId).End(); } else { WriteLineToConsole("Page " + pageInfo.ConfluencePage.title + " locked by " + permission.lockedBy + " that is not a user and not a group. Restriction ignored."); } } securityDoc.End(); permissionAddedToDeki[permission.lockedBy.ToLower()] = true; } securityDoc.End(); DreamMessage res = _dekiPlug.At("pages", pageInfo.DekiPageId.ToString(), "security").PutAsync(securityDoc).Wait(); if (res.Status != DreamStatus.Ok) { WriteLineToLog("Error converting permissions"); WriteErrorResponse(res); WriteErrorRequest(securityDoc); } }
private void MovePermissions(ACConverterPageInfo pageInfo) { RemotePermission[] pagePermissions = _confluenceService.GetPagePermissions(pageInfo.ConfluencePage.id); //Change permissions list according to parent page permissoins List <RemotePermission> newPermissions = new List <RemotePermission>(); foreach (RemotePermission permission in pageInfo.ConfluenceUsersWithViewPermissions.Values) { newPermissions.Add(permission); } foreach (RemotePermission permission in pagePermissions) { if (permission.lockType == ConfluenceEditPermissionName) { if ((pageInfo.ConfluenceUsersWithViewPermissions.Count == 0) || (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(permission.lockedBy.ToLower()))) { newPermissions.Add(permission); } } } pagePermissions = newPermissions.ToArray(); if (pagePermissions.Length == 0) { return; } string dekiRestriction; //Possible two entry of one user or group in pagePermissions. //As View permission and as Edit permission for this group/user. //To prevent repeated addition to Deki in this dictionary stored true //if permission to this user/group added to Deki. Dictionary <string, bool> permissionAddedToDeki = new Dictionary <string, bool>(); Dictionary <string, bool> userHaveWritePermission = new Dictionary <string, bool>(); if (_compatibleConvertUserPermissions) { bool onlyWriteRestrictions = true; foreach (RemotePermission permission in pagePermissions) { if (permission.lockType == ConfluenceViewPermissionName) { onlyWriteRestrictions = false; break; } } if (onlyWriteRestrictions) { //If there no view restrictions on this Confluence page set Semi-Public restrictions to Deki users dekiRestriction = "Semi-Public"; } else { //If there is view restrictions on this Confluence page to allow users/groups with View and Edit //restrictions view this page set Private restriction in Deki. //Users without Edit permission but with View permission in Confluence can edit this page in Deki. dekiRestriction = "Private"; } } else { dekiRestriction = "Private"; foreach (RemotePermission permission in pagePermissions) { if (permission.lockType == ConfluenceEditPermissionName) { userHaveWritePermission[permission.lockedBy.ToLower()] = true; } else { if (!userHaveWritePermission.ContainsKey(permission.lockedBy.ToLower())) { userHaveWritePermission[permission.lockedBy.ToLower()] = false; } } } } XDoc securityDoc = new XDoc("security") .Start("permissions.page") .Elem("restriction", dekiRestriction) .End() .Start("grants"); foreach (RemotePermission permission in pagePermissions) { if (permissionAddedToDeki.ContainsKey(permission.lockedBy.ToLower())) { continue; } securityDoc .Start("grant") .Start("permissions"); if (_compatibleConvertUserPermissions) { securityDoc.Elem("role", "Contributor"); } else { bool haveWritePermission = false; userHaveWritePermission.TryGetValue(permission.lockedBy.ToLower(), out haveWritePermission); if (haveWritePermission) { securityDoc.Elem("role", "Contributor"); } else { securityDoc.Elem("role", "Viewer"); } } securityDoc.End(); //Detect if this is group or user permission ACConverterUserInfo dekiUser; if (_convertedUsers.TryGetValue(permission.lockedBy.ToLower(), out dekiUser)) { securityDoc.Start("user").Attr("id", dekiUser.DekiUserId).End(); } else { ACConverterGroupInfo dekiGroup = null; if (_convertedGroups.TryGetValue(permission.lockedBy.ToLower(), out dekiGroup)) { securityDoc.Start("group").Attr("id", dekiGroup.DekiGroupId).End(); } else { WriteLineToConsole("Page " + pageInfo.ConfluencePage.title + " locked by " + permission.lockedBy + " that is not a user and not a group. Restriction ignored."); } } securityDoc.End(); permissionAddedToDeki[permission.lockedBy.ToLower()] = true; } securityDoc.End(); DreamMessage res = _dekiPlug.At("pages", pageInfo.DekiPageId.ToString(), "security").PutAsync(securityDoc).Wait(); if (res.Status != DreamStatus.Ok) { WriteLineToLog("Error converting permissions"); WriteErrorResponse(res); WriteErrorRequest(securityDoc); } }
//TODO : Implementation pending public string ConvertStubstoDeki(Dictionary<string, string> pathMap,string stubbedPageContent, ACConverterPageInfo pageInfo) { return Converters.Convert(pathMap, stubbedPageContent, pageInfo); }
public static void PersistPageInfo(ACConverterPageInfo pageInfo) { Stream fileStream = null; string filename = string.Format(@"data\{0}\{1}{2}", pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, ".bin"); BinaryFormatter serializer = new BinaryFormatter(); //XmlSerializer serializer = new XmlSerializer(typeof(ACConverterPageInfo)); try { FileInfo fi = new FileInfo(filename); fi.Directory.Create(); fileStream = File.OpenWrite(filename); serializer.Serialize(fileStream, pageInfo); fileStream.Close(); } catch(Exception x) { ACConverter.Log.WarnExceptionFormat(x, "Unable to persist page info to '{0}'", filename); } finally { if(fileStream != null) { fileStream.Close(); } } }
private string MovePageStubs(XDoc spaceManifest, string spaceRoot, string parentPagePath, RemotePageSummary confluenceRemotePageSummary, string pageName, string pageTitle, ACConverterPageInfo parentPage) { RemotePage confluenceRemotePage = _confluenceService.GetPage(confluenceRemotePageSummary.id); string tinyUrl = null; if (_rpcclient != null) { CFRpcExtensions rpcExt = new CFRpcExtensions(_rpcclient); tinyUrl = rpcExt.GetTinyUrlForPageId(confluenceRemotePageSummary.id.ToString()); } string pagePath = null; //If PageName not null use it, else use Confluence page title. if (pageName == null) { pageName = confluenceRemotePage.title; } pagePath = pageName; if (parentPagePath != null) { pagePath = parentPagePath + Utils.DoubleUrlEncode("/" + pagePath); } //If the page title is too long it gets saved as {spaceroot}/misc/{pageid} with the page title set if (pagePath.Length > MaxLengthOfPageTitle) { pagePath = Utils.DoubleUrlEncode(string.Format(@"{0}/misc/{1}", spaceRoot, confluenceRemotePage.id)); if (string.IsNullOrEmpty(pageTitle)) { pageTitle = pageName; } Log.WarnFormat("Page title longer than {0}. Will be placed into {1}. Title: {2}", MaxLengthOfPageTitle, pagePath, pageTitle); } Plug postPageDekiPlug = (confluenceRemotePage.creator == null) ? _dekiPlug : GetPlugForConvertedUser(confluenceRemotePage.creator); Log.TraceFormat("Creating page stub in space '{0}'", confluenceRemotePage.space); string mtPageUrl; // modified date string, according to: /* http://developer.mindtouch.com/en/ref/MindTouch_API/POST%3apages%2f%2f%7Bpageid%7D%2f%2fcontents * should be formatted as: * the edit timestamp - yyyyMMddHHmmss or yyyy-MM-ddTHH:mm:ssZ */ int dekiPageId = CreateDekiPage(postPageDekiPlug, pagePath, pageTitle, confluenceRemotePage.modified, "", out mtPageUrl); if (dekiPageId == -1) { //TODO (maxm): page failure needs to be recorded and steps that depend // on it such as attachments and children should be skipped return(string.Empty); } ACConverterPageInfo pageInfo = new ACConverterPageInfo(confluenceRemotePage, spaceRoot, mtPageUrl, pagePath, dekiPageId, pageTitle, tinyUrl, parentPage); Utils.PersistPageInfo(pageInfo); //Confluence view page permission is inherited. Save they to use later in MovePermissions. SavePageViewPermissions(pageInfo); RemotePageSummary[] childPages = _confluenceService.GetChildren(confluenceRemotePage.id); foreach (RemotePageSummary childPageSummary in childPages) { MovePageStubs(spaceManifest, spaceRoot, pagePath, childPageSummary, null, null, pageInfo); } SaveCommentsLinks(spaceManifest, pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, mtPageUrl); MoveAttachments(spaceManifest, pageInfo.DekiPageId, pageInfo.ConfluencePage.id); LogPageConversion(spaceManifest, pageInfo); return(pagePath); }
private void SavePageViewPermissions(ACConverterPageInfo pageInfo) { RemotePermission[] pagePermissions = _confluenceService.GetPagePermissions(pageInfo.ConfluencePage.id); //If there no view restrictions on the page, copy parent page restrictions. if (Array.Find(pagePermissions, delegate(RemotePermission p) { return (p.lockType == ConfluenceViewPermissionName); }) == null) { if (pageInfo.ParentPage != null) { foreach (RemotePermission permission in pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.Values) { pageInfo.ConfluenceUsersWithViewPermissions[permission.lockedBy.ToLower()] = permission; } } return; } foreach (RemotePermission permission in pagePermissions) { if (permission.lockType == ConfluenceViewPermissionName) { if ((pageInfo.ParentPage != null) && (pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.Count != 0)) { if (!pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.ContainsKey(permission.lockedBy.ToLower())) { //If this user haven't permission to view parent page, then he haven't permission to view this page in Confluence continue; } } pageInfo.ConfluenceUsersWithViewPermissions[permission.lockedBy.ToLower()] = permission; } } }
private void MovePageContent(Dictionary <string, string> pathMap, ACConverterPageInfo pageInfo) { try { //Move the history of the page first MovePageHistory(pathMap, pageInfo); string stubContent = ReplaceMacrosWithStubs(pageInfo); // Move the latest revision string confluencePageContent = _confluenceService.RenderContent(pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, stubContent); confluencePageContent = ConvertStubstoDeki(pathMap, confluencePageContent, pageInfo); confluencePageContent = ExtractPageContentAndReplaceLinks(pathMap, confluencePageContent); Plug postPageDekiPlug = _dekiPlug; if (pageInfo.ConfluenceUsersWithViewPermissions.Count > 0) { if ((pageInfo.ConfluencePage.modifier != null) && (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(pageInfo.ConfluencePage.modifier.ToLower()))) { postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.modifier); } else { if ((pageInfo.ConfluencePage.creator != null) && (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(pageInfo.ConfluencePage.creator.ToLower()))) { postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.creator); } } } else { if (pageInfo.ConfluencePage.modifier != null) { postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.modifier); } else { if (pageInfo.ConfluencePage.creator != null) { postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.creator); } } } CreateDekiPage(postPageDekiPlug, pageInfo.DekiPagePath, pageInfo.PageTitle, pageInfo.ConfluencePage.modified, confluencePageContent); // Catch all exceptions when moving labels, comments and permissions. try { MoveLabels(pageInfo.DekiPageId, pageInfo.ConfluencePage.id); } catch (Exception e) { Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MoveLabels"); } try { MoveComments(pageInfo.DekiPageId, pageInfo.ConfluencePage.id); } catch (Exception e) { Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MoveComments"); } try { MovePermissions(pageInfo); } catch (Exception e) { Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MovePermissions"); } } catch (Exception e) { Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MovePageContent"); } }
//TODO : Implementation pending public string ConvertStubstoDeki(Dictionary <string, string> pathMap, string stubbedPageContent, ACConverterPageInfo pageInfo) { return(Converters.Convert(pathMap, stubbedPageContent, pageInfo)); }