On Nov 7, 2010, at 11:50 AM, sdumitriu (SVN) wrote:
Author: sdumitriu Date: 2010-11-07 11:50:04 +0100 (Sun, 07 Nov 2010) New Revision: 32582
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/XWikiDocument.java Log: XWIKI-4726: Forward links are not refactored on rename causing broken links on rename to different space. Fixed. Patch from Stefan Abageru applied with some cleanup.
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/XWikiDocument.java =================================================================== --- platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/XWikiDocument.java 2010-11-06 21:41:04 UTC (rev 32581) +++ platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/XWikiDocument.java 2010-11-07 10:50:04 UTC (rev 32582) @@ -5670,12 +5670,48 @@ xwiki.saveDocument(backlinkDocument, saveMessage, true, context); }
- // Step 4: Delete the old document + // Step 4: Refactor the links contained in the document + XWikiDocument newDocument = xwiki.getDocument(newDocumentReference, context); + XDOM newDocumentXDOM = newDocument.getXDOM(); + List<LinkBlock> linkBlockList = newDocumentXDOM.getChildrenByType(LinkBlock.class, true); + XWikiDocument currentContextDoc = context.getDoc(); + + try { + boolean modified = false; + for (LinkBlock linkBlock : linkBlockList) { + ResourceReference linkReference = linkBlock.getReference(); + if (linkReference.getType().equals(ResourceType.DOCUMENT)) { + context.setDoc(this); + DocumentReference currentLinkReference = + this.currentDocumentReferenceResolver.resolve(linkReference.getReference()); + + context.setDoc(newDocument); + DocumentReference newLinkReference = + this.currentDocumentReferenceResolver.resolve(linkReference.getReference()); + + if (!newLinkReference.equals(currentLinkReference)) { + modified = true; + linkReference.setReference(this.compactWikiEntityReferenceSerializer + .serialize(currentLinkReference)); + } + } + } + // Set new content and save document if needed + if (modified) { + newDocument.setContent(newDocumentXDOM); + xwiki.saveDocument(newDocument, context); + } + } finally { + // Restore original context + context.setDoc(currentContextDoc); + }
cool thanks stefan and sergiu. IMO we would benefit to introduce some private methods (or not so private if it has a general purpose) to perform this step (or other steps, I don't remember the existing code). checktyle wouldn't probably pass on this method as it is now. BTW we have a refactoring module and I think it would be a good place to move the rename implementation to this new module... when someone has the time and energy to do so... Thanks -Vincent
+ + // Step 5: Delete the old document xwiki.deleteDocument(this, context);
- // Step 5: The current document needs to point to the renamed document as otherwise it's pointing to an + // Step 6: The current document needs to point to the renamed document as otherwise it's pointing to an // invalid XWikiDocument object as it's been deleted... - clone(xwiki.getDocument(newDocumentReference, context)); + clone(newDocument); }
/**