On Tue, Nov 30, 2010 at 16:25, Vincent Massol <vincent(a)massol.net> wrote:
 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. 
Indeed that would be a lot safer.
 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
 devs(a)xwiki.org
 
http://lists.xwiki.org/mailman/listinfo/devs
 
--
Thomas Mortagne