(resending, meant to send to the dev list.) Sorry to drag up old commits but I have a couple of questions. vmassol (SVN) wrote:
Author: vmassol Date: 2010-01-07 23:02:51 +0100 (Thu, 07 Jan 2010) New Revision: 26074
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/XWikiDocument.java platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/doc/XWikiDocumentTest.java Log: XWIKI-4677: Introduce new Model module
* Fixed infinite cycle (revert some previous change). We need to find a solution. * Refactored existing code to prevent manual parsing
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-01-07 16:55:03 UTC (rev 26073) +++ platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/XWikiDocument.java 2010-01-07 22:02:51 UTC (rev 26074) @@ -80,6 +80,7 @@ import org.xwiki.context.ExecutionContextManager; import org.xwiki.model.reference.DocumentReferenceResolver; import org.xwiki.model.reference.EntityReferenceSerializer; +import org.xwiki.model.reference.WikiReference; import org.xwiki.rendering.block.Block; import org.xwiki.rendering.block.HeaderBlock; import org.xwiki.rendering.block.LinkBlock; @@ -359,8 +360,10 @@ /** * Used to create proper {@link Syntax} objects. */ - SyntaxFactory syntaxFactory = Utils.getComponent(SyntaxFactory.class); + private SyntaxFactory syntaxFactory = Utils.getComponent(SyntaxFactory.class);
Why are we holding a hard reference on the Execution which was present when the document was first loaded or created? Is this not a memory leak? Cache holds Document holds Execution holds ExecutionContext holds XWikiContext holds DocumentArchive?
+ private Execution execution = Utils.getComponent(Execution.class); + /** * @since 2.2M1 */ @@ -375,7 +378,9 @@ @Deprecated public XWikiDocument() { - this(Utils.getComponent(DocumentReferenceResolver.class).resolve("")); + // TODO: Replace this with the following when we find a way to not generate a cycle: + // this(Utils.getComponent(DocumentReferenceResolver.class).resolve("")); + this(new DocumentReference("xwiki", "Main", "WebHome")); }
/** @@ -397,25 +402,18 @@ * * @param wiki The wiki this document belongs to. * @param space The space this document belongs to. - * @param name The name of the document. + * @param name The name of the document (can contain either the page name or the space and page name) * @deprecated since 2.2M1 use {@link #XWikiDocument(org.xwiki.model.reference.DocumentReference)} instead */ @Deprecated public XWikiDocument(String wiki, String space, String name) { - String normalizedPage; - String normalizedSpace; - int i1 = name.indexOf("."); - if (i1 == -1) { - normalizedPage = name; - normalizedSpace = space; - } else { - normalizedSpace = name.substring(0, i1); - normalizedPage = name.substring(i1 + 1); - } - - init(Utils.getComponent(DocumentReferenceResolver.class, "current/reference").resolve( - new DocumentReference(wiki, normalizedSpace, normalizedPage))); + // We allow to specify the space in the name (eg name = "space.page"). In this case the passed space is + // ignored. + DocumentReference reference = resolveReference(name, new DocumentReference(wiki, space, null)); + // Replace the resolved wiki by the passed wiki + reference.setWikiReference(new WikiReference(wiki)); + init(reference); }
public XWikiStoreInterface getStore(XWikiContext context) @@ -5846,4 +5844,21 @@
return syntaxId; } + + private DocumentReference resolveReference(String referenceAsString, DocumentReference defaultReference) + { + XWikiContext xcontext = getXWikiContext(); + XWikiDocument originalCurentDocument = xcontext.getDoc(); + try { + xcontext.setDoc(new XWikiDocument(defaultReference)); + return this.currentDocumentReferenceResolver.resolve(referenceAsString); + } finally { + xcontext.setDoc(originalCurentDocument); + } + } +
How is this different from XWikiDocument#getContext() introduced in 23506? Is the only difference that the context is the one from when the document was created/loaded rather than the current context? If so this probably ought to be commented since it is a major trap for anyone who expects getXWikiContext().getUser() to yield the current user (for example).
+ private XWikiContext getXWikiContext() + { + return (XWikiContext) this.execution.getContext().getProperty("xwikicontext"); + } }
Modified: platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/doc/XWikiDocumentTest.java =================================================================== --- platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/doc/XWikiDocumentTest.java 2010-01-07 16:55:03 UTC (rev 26073) +++ platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/doc/XWikiDocumentTest.java 2010-01-07 22:02:51 UTC (rev 26074) @@ -155,6 +155,29 @@ this.mockXWikiStoreInterface.stubs().method("search").will(returnValue(new ArrayList<XWikiDocument>())); }
+ public void testConstructor() + { + XWikiDocument doc = new XWikiDocument("notused", "space.page"); + assertEquals("space", doc.getSpaceName()); + assertEquals("page", doc.getPageName()); + assertEquals("xwiki", doc.getWikiName()); + + doc = new XWikiDocument("space", "page"); + assertEquals("space", doc.getSpaceName()); + assertEquals("page", doc.getPageName()); + assertEquals("xwiki", doc.getWikiName()); + + doc = new XWikiDocument("wiki", "space", "page"); + assertEquals("space", doc.getSpaceName()); + assertEquals("page", doc.getPageName()); + assertEquals("wiki", doc.getWikiName()); + + doc = new XWikiDocument("wiki", "notused", "notused:space.page"); + assertEquals("space", doc.getSpaceName()); + assertEquals("page", doc.getPageName()); + assertEquals("wiki", doc.getWikiName()); + } + public void testGetDisplayTitleWhenNoTitleAndNoContent() { this.document.setContent("Some content");
_______________________________________________ notifications mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/notifications