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);
}
/**