On Nov 30, 2010, at 4:16 PM, tmortagne (SVN) wrote:

> Author: tmortagne
> Date: 2010-11-30 16:16:46 +0100 (Tue, 30 Nov 2010)
> New Revision: 33194
> 
> 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/XWikiDocumentRenderingTest.java
> Log:
> XWIKI-4771: Cycles in the method Document.getDisplayTitle are not detected
> 
> 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-30 15:00:36 UTC (rev 33193)
> +++ 
> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/XWikiDocument.java
>  2010-11-30 15:16:46 UTC (rev 33194)
> @@ -43,6 +43,7 @@
> import java.util.List;
> import java.util.Map;
> import java.util.Set;
> +import java.util.Stack;
> import java.util.TreeMap;
> import java.util.Vector;
> import java.util.regex.Matcher;
> @@ -1203,7 +1204,20 @@
>     private String getRenderedContentTitle(Syntax outputSyntax, XWikiContext 
> context) throws XWikiException
>     {
>         String title = null;
> +        

This code below requires comment to understand it. It's not obvious to 
understand it's to prevent cycles. Might be also good to put it in a separate 
method to make it even more clear.

I also think the pop should be in a finally block.

Thanks
-Vincent

> +        Stack<DocumentReference> stackTrace =
> +            (Stack<DocumentReference>) 
> context.get("internal.getRenderedContentTitleStackTrace");
> 
> +        if (stackTrace == null) {
> +            stackTrace = new Stack<DocumentReference>();
> +            context.put("internal.getRenderedContentTitleStackTrace", 
> stackTrace);
> +        } else if (stackTrace.contains(getDocumentReference())) {
> +            // TODO: generate an error message instead ?
> +            return null;
> +        }
> +
> +        stackTrace.push(getDocumentReference());
> +
>         if (is10Syntax()) {
>             title = getRenderedContentTitle10(context);
>         } else {
> @@ -1235,6 +1249,8 @@
>             }
>         }
> 
> +        stackTrace.pop();
> +
>         return title;
>     }
> 
> 
> Modified: 
> platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/doc/XWikiDocumentRenderingTest.java
> ===================================================================
> --- 
> platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/doc/XWikiDocumentRenderingTest.java
>     2010-11-30 15:00:36 UTC (rev 33193)
> +++ 
> platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/doc/XWikiDocumentRenderingTest.java
>     2010-11-30 15:16:46 UTC (rev 33194)
> @@ -250,7 +250,18 @@
> 
>         assertEquals("Page", this.document.getRenderedTitle(Syntax.XHTML_1_0, 
> getContext()));
>     }
> +    
> +    /**
> +     * Make sure title extracted from content is protected from cycles
> +     */
> +    public void testGetRenderedTitleRecursive() throws XWikiException
> +    {
> +        this.document.setSyntax(Syntax.XWIKI_2_0);
> +        this.document.setContent("= {{groovy}}print 
> doc.getDisplayTitle(){{/groovy}}");
> 
> +        assertEquals("Page", 
> this.document.getRenderedTitle(Syntax.XHTML_1_0, getContext()));
> +    }
> +
>     public void testExtractTitle()
>     {
>         this.document.setSyntaxId("xwiki/2.0");
> 
> ____________________________________
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to