Author: aadamchik
Date: Sun Sep 17 19:11:46 2006
New Revision: 447187

URL: http://svn.apache.org/viewvc?view=rev&rev=447187
Log:
porting the docs importer to 2.0 branch

Modified:
    incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-ant/ant/doc.xml
    
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenTask.java
    
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenerator.java
    
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPage.java
    
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPageRenderer.java

Modified: 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-ant/ant/doc.xml
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-ant/ant/doc.xml?view=diff&rev=447187&r1=447186&r2=447187
==============================================================================
--- incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-ant/ant/doc.xml 
(original)
+++ incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-ant/ant/doc.xml 
Sun Sep 17 19:11:46 2006
@@ -47,7 +47,8 @@
                </delete>
                
                <!-- Build HTML documentation from Confluence -->
-               <docgen spaceKey="CAYDOC" docBase="${cayenne.other}/wiki-docs" 
startPage="Documentation" 
+               <docgen spaceKey="CAYDOC20" 
docBase="${cayenne.other}/wiki-docs" 
baseUrl="http://cwiki.apache.org/confluence/"; 
+                       startPage="Documentation" 
                        username="${cayenne.confluence.user}" 
password="${cayenne.confluence.password}" />
        </target>
        

Modified: 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenTask.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenTask.java?view=diff&rev=447187&r1=447186&r2=447187
==============================================================================
--- 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenTask.java
 (original)
+++ 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenTask.java
 Sun Sep 17 19:11:46 2006
@@ -30,6 +30,7 @@
  */
 public class DocGenTask extends Task {
 
+    private String baseUrl;
     private String spaceKey;
     private String docBase;
     private String startPage;
@@ -41,10 +42,19 @@
 
     public void execute() {
         log("Exporting space '" + spaceKey + "' to " + docBase);
-        
+
         try {
-            new DocGenerator(spaceKey, docBase, startPage, username, password, 
template)
-                    .generateDocs();
+            DocGenerator generator = new DocGenerator(
+                    baseUrl,
+                    spaceKey,
+                    docBase,
+                    startPage,
+                    username,
+                    password,
+                    template);
+
+            log("Confluence base URL '" + generator.getBaseUrl() + "'");
+            generator.generateDocs();
         }
         catch (Exception e) {
             throw new BuildException(e);
@@ -97,5 +107,17 @@
 
     public void setUsername(String username) {
         this.username = username;
+    }
+
+    public String getBaseUrl() {
+        return baseUrl;
+    }
+
+    /**
+     * Sets a root URL of a confluence instance. SOAP service URL is derived 
from it
+     * internally.
+     */
+    public void setBaseUrl(String baseUrl) {
+        this.baseUrl = baseUrl;
     }
 }

Modified: 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenerator.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenerator.java?view=diff&rev=447187&r1=447186&r2=447187
==============================================================================
--- 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenerator.java
 (original)
+++ 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenerator.java
 Sun Sep 17 19:11:46 2006
@@ -39,6 +39,8 @@
 public class DocGenerator {
 
     private static final String DEFAULT_TEMPLATE = "doctemplates/default.vm";
+    private static final String ENDPOINT_SUFFIX = 
"/rpc/soap-axis/confluenceservice-v1";
+    private String baseUrl;
     private String spaceKey;
     private String docBase;
     private String startPage;
@@ -53,17 +55,41 @@
 
     private DocPageRenderer parser;
 
-    public DocGenerator(String spaceKey, String docBase, String startPage,
-            String username, String password, String template) {
+    public DocGenerator(String baseUrl, String spaceKey, String docBase,
+            String startPage, String username, String password, String 
template) {
+
+        ConfluenceSoapServiceProxy service = new ConfluenceSoapServiceProxy();
+
+        // derive service URL from base URL
+        if (baseUrl != null) {
+            if (baseUrl.endsWith("/")) {
+                baseUrl = baseUrl.substring(0, baseUrl.length() - 1);
+            }
+
+            String endpoint = baseUrl + ENDPOINT_SUFFIX;
+            service.setEndpoint(endpoint);
+        }
+        // service base URL from service default URL
+        else if (service.getEndpoint().endsWith(ENDPOINT_SUFFIX)) {
+            String endpoint = service.getEndpoint();
+            baseUrl = endpoint.substring(0, endpoint.length() - 
ENDPOINT_SUFFIX.length());
+        }
+        else {
+            throw new IllegalArgumentException("Null base url and invalid 
service URL");
+        }
+
+        this.baseUrl = baseUrl;
+        this.service = service;
         this.spaceKey = spaceKey;
         this.docBase = docBase;
         this.startPage = startPage;
         this.username = username;
         this.password = password;
-        
+
         if (template == null) {
             this.template = DEFAULT_TEMPLATE;
-        } else {
+        }
+        else {
             this.template = template;
         }
     }
@@ -72,6 +98,10 @@
 
         login();
 
+               // only works for adminstrators
+        //String url = service.exportSite(token, true);
+
+               //URL foo = new URL(url);
         createPath(docBase);
 
         // Build a page hierarchy first..
@@ -90,7 +120,6 @@
         for (int i = 0; i < children.length; i++) {
 
             DocPage child = getPage(parent, children[i].getTitle());
-
             parent.addChild(child);
             iterateChildren(child);
 
@@ -106,7 +135,7 @@
         FileWriter fw = new FileWriter(currentPath + "/index.html");
         parser.render(page, fw);
         fw.close();
-        
+
         writeAttachments(currentPath, page);
 
         for (Iterator childIter = page.getChildren().iterator(); 
childIter.hasNext();) {
@@ -144,9 +173,8 @@
     }
 
     protected void login() throws Exception {
-        service = new ConfluenceSoapServiceProxy();
         token = service.login(username, password);
-        parser = new DocPageRenderer(service, token, spaceKey, template);
+        parser = new DocPageRenderer(service, baseUrl, token, spaceKey, 
template);
     }
 
     protected DocPage getPage(DocPage parentPage, String pageTitle) throws 
Exception {
@@ -157,6 +185,10 @@
     protected void createPath(String path) {
         new File(path).mkdirs();
 
+    }
+
+    public String getBaseUrl() {
+        return baseUrl;
     }
 
 }

Modified: 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPage.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPage.java?view=diff&rev=447187&r1=447186&r2=447187
==============================================================================
--- 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPage.java
 (original)
+++ 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPage.java
 Sun Sep 17 19:11:46 2006
@@ -55,7 +55,8 @@
         return (DocPage) titleMap.get(title);
     }
 
-    public DocPage(DocPage parentRef, String title, long id, String 
rawContent) {
+    @SuppressWarnings("unchecked")
+       public DocPage(DocPage parentRef, String title, long id, String 
rawContent) {
         this.parentRef = parentRef;
         this.title = title;
         this.id = id;
@@ -82,7 +83,8 @@
         children = new ArrayList();
     }
 
-    public void addChild(DocPage child) {
+    @SuppressWarnings("unchecked")
+       public void addChild(DocPage child) {
         child.depth = depth + 1;
         children.add(child);
     }

Modified: 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPageRenderer.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPageRenderer.java?view=diff&rev=447187&r1=447186&r2=447187
==============================================================================
--- 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPageRenderer.java
 (original)
+++ 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPageRenderer.java
 Sun Sep 17 19:11:46 2006
@@ -27,192 +27,221 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import junit.framework.TestCase;
-
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.gen.ClassGeneratorResourceLoader;
 import org.apache.velocity.Template;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 import org.apache.velocity.runtime.RuntimeConstants;
 import org.apache.velocity.runtime.log.NullLogSystem;
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.gen.ClassGeneratorResourceLoader;
 import 
org.objectstyle.confluence.rpc.soap_axis.confluenceservice_v1.ConfluenceSoapService;
 
 /**
- * Extracts embedded links from Confluence documentation and converts them to 
local fs references
+ * Extracts embedded links from Confluence documentation and converts them to
+ * local fs references
  * 
  * @author Cris Daniluk
  */
-public class DocPageRenderer extends TestCase {
-    
-    private static final String URL_PREFIX = "/confluence";
-    private static final String CONFLUENCE_URL = 
"http://www.objectstyle.org/confluence";;
-
-    /**
-     * Only attachments within the page are supported right now. This could 
easily be
-     * adjusted to find attachments in external documents if necessary.
-     */
-    private static final Pattern attachmentPattern = 
Pattern.compile("(href|src)=\"" + URL_PREFIX + 
"/download/attachments/(.*?)/(.*?)\"");
-    
-    /**
-     * When browsing the local filesystem, browsers like %20 (hex encoded) 
instead of + (legacy HTTP 0.9) for
-     * spaces. 
-     */
-    private static final Pattern spaceEncoderPattern = 
Pattern.compile("href=\"(?!http://).*?\\+.*?\"");
-    
-    
-    /**
-     * Not all images are supported - only the ones referenced by current docs.
-     */
-    private static final Pattern confluenceImagePattern = 
Pattern.compile("src=\"" + URL_PREFIX + "/images/icons/(.*?)\"");
-    
-    /**
-     * Take any confluence links to non-doc content and add the url
-     */
-    private Pattern confluenceLinkPattern = Pattern.compile("href=\"(" + 
URL_PREFIX + "/display/.*?)\"");
-    
-    private Pattern embeddedLinkPattern;
-    
-    private ConfluenceSoapService service;
-    private String token;
-    private String spaceKey;
-    
-    private VelocityContext velCtxt;
-    private Template pageTemplate;
-    
-    public DocPageRenderer(ConfluenceSoapService service, String token, String 
spaceKey, String template) throws Exception {
-        
-        // Note that these regexps have a fairly narrow capture - since the 
HTML is machine-generated,
-        // we're kind of assuming it is well-formed
-        embeddedLinkPattern = Pattern.compile("href=\"" + URL_PREFIX + 
"/display/" + spaceKey + "/(.*?)\"");
-        
-        this.service = service;
-        this.token = token;
-        this.spaceKey = spaceKey;
-        
-        velCtxt = new VelocityContext();
-        
-        initializeClassTemplate(template);
-    }
-    
-    
-    private void initializeClassTemplate(String template) throws Exception {
-        VelocityEngine velocityEngine = new VelocityEngine();
-        try {
-
-            // use ClasspathResourceLoader for velocity templates lookup
-            // if Cayenne URL is not null, load resource from this URL
-            Properties props = new Properties();
-
-            // null logger that will prevent velocity.log from being generated
-            props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, 
NullLogSystem.class
-                    .getName());
-
-            props.put("resource.loader", "cayenne");
-
-            props.put("cayenne.resource.loader.class", 
ClassGeneratorResourceLoader.class
-                    .getName());
-            
-            velocityEngine.init(props);
-        }
-        catch (Exception ex) {
-            throw new CayenneRuntimeException("Can't initialize Velocity", ex);
-        }
-        
-        pageTemplate = velocityEngine.getTemplate(template);
-    }
-    
-    public void render(DocPage page, Writer out) throws Exception {
-
-        // Add the TOC, unless this is the top-level page
-        StringBuffer toc = new StringBuffer();
-        if (page.getParentRef() != null) {
-            toc.append("<div id=\"cayenne_toc\">\n");
-
-            DocPage root = page.getRoot();
-
-            iterateChildren(toc, page, root);
-            toc.append("</div>\n");
-        }
-        
-        // Figure out the level of nesting for relative links
-        String basePath = "";
-        for (int i = 1; i <= page.getDepth(); i++) {
-            basePath += "../"; 
-        }
-        
-        String renderedContent = service.renderContent(token, spaceKey, 
page.getId(), page.getRawContent(), new HashMap(
-                Collections.singletonMap("style", "clean")));
-        
-        // Replace cross-doc links
-        Matcher linkMatcher = embeddedLinkPattern.matcher(renderedContent);
-        StringBuffer replacementBuffer = new StringBuffer();
-        while (linkMatcher.find()) {
-            DocPage destPage = 
DocPage.getPageByTitle(linkMatcher.group(1).replace('+', ' '));
-            
-            // If we don't understand the link, just leave it alone to be safe
-            if (destPage == null) {
-                continue;
-            }
-            linkMatcher.appendReplacement(replacementBuffer, "href=\"" + 
basePath + destPage.getLinkPath() + "/index.html\"");
-        }
-        linkMatcher.appendTail(replacementBuffer);
-        
-        renderedContent = replacementBuffer.toString();
-        
-        //renderedContent = 
embeddedLinkPattern.matcher(renderedContent).replaceAll("href=\"$1/index.html\"");
-        
-        // Replace attachment links
-        renderedContent = 
attachmentPattern.matcher(renderedContent).replaceAll("$1=\"$3\"");
-        
-        // Convert confluence images to relative links
-        renderedContent = 
confluenceImagePattern.matcher(renderedContent).replaceAll("src=\"" + basePath 
+ "images/$1\"");
-
-        // Replace wiki links
-        renderedContent = 
confluenceLinkPattern.matcher(renderedContent).replaceAll("href=\"" + 
CONFLUENCE_URL + "$1\"");
-        
-        // Convert local links with + to %20 to make browsers happy (wtf?)
-        Matcher matcher = spaceEncoderPattern.matcher(renderedContent);
-        
-        replacementBuffer = new StringBuffer();
-        while (matcher.find()) {
-            matcher.appendReplacement(replacementBuffer, 
matcher.group(0).replace("+", "%20"));
-        }
-        matcher.appendTail(replacementBuffer);
-        
-        renderedContent = replacementBuffer.toString();
-        
-        
-        velCtxt.put("page", page);
-        velCtxt.put("basePath", basePath);
-        velCtxt.put("pageContent", toc.toString() + renderedContent);
-
-        pageTemplate.merge(velCtxt, out);
-        
-        
-    }
-
-    private void iterateChildren(StringBuffer toc, DocPage currentPage, 
DocPage basePage) {
-        toc.append("<ul>\n");
-        for (Iterator baseIter = basePage.getChildren().iterator(); 
baseIter.hasNext(); ) {
-            
-            DocPage child = (DocPage) baseIter.next();
-            
-            toc.append("<li>").append("<a href=\"");
-            for (int i = 1; i <= currentPage.getDepth(); i++) {
-                toc.append("../"); 
-            }
-            toc.append(child.getLinkPath()).append("/index.html\">");
-            toc.append(child.getTitle()).append("</a>");
-            if (child.hasDescendent(currentPage)) {
-                // render children
-                iterateChildren(toc, currentPage, child);
-            }
-            
-            toc.append("</li>\n");
-        }
+public class DocPageRenderer {
+
+       private static final String URL_PREFIX = "/confluence";
+
+       /**
+        * Only attachments within the page are supported right now. This could
+        * easily be adjusted to find attachments in external documents if
+        * necessary.
+        */
+       private static final Pattern attachmentPattern = Pattern
+                       .compile("(href|src)=\"" + URL_PREFIX
+                                       + 
"/download/attachments/(.*?)/(.*?)\"");
+
+       /**
+        * When browsing the local filesystem, browsers like %20 (hex encoded)
+        * instead of + (legacy HTTP 0.9) for spaces.
+        */
+       private static final Pattern spaceEncoderPattern = Pattern
+                       .compile("href=\"(?!http://).*?\\+.*?\"");
+
+       /**
+        * Not all images are supported - only the ones referenced by current 
docs.
+        */
+       private static final Pattern confluenceImagePattern = Pattern
+                       .compile("src=\"" + URL_PREFIX + 
"/images/icons/(.*?)\"");
+
+       /**
+        * Take any confluence links to non-doc content and add the url
+        */
+       private Pattern confluenceLinkPattern = Pattern.compile("href=\"("
+                       + URL_PREFIX + "/display/.*?)\"");
+
+       private Pattern embeddedLinkPattern;
+
+       private ConfluenceSoapService service;
+
+       private String token;
+
+       private String spaceKey;
+
+       private String baseUrl;
+
+       private VelocityContext velCtxt;
+
+       private Template pageTemplate;
+
+       public DocPageRenderer(ConfluenceSoapService service, String baseUrl,
+                       String token, String spaceKey, String template) throws 
Exception {
+
+               // Note that these regexps have a fairly narrow capture - since 
the HTML
+               // is
+               // machine-generated,
+               // we're kind of assuming it is well-formed
+               embeddedLinkPattern = Pattern.compile("href=\"" + URL_PREFIX
+                               + "/display/" + spaceKey + "/(.*?)\"");
+
+               this.service = service;
+               this.baseUrl = baseUrl;
+               this.token = token;
+               this.spaceKey = spaceKey;
+
+               velCtxt = new VelocityContext();
+
+               initializeClassTemplate(template);
+       }
+
+       private void initializeClassTemplate(String template) throws Exception {
+               VelocityEngine velocityEngine = new VelocityEngine();
+               try {
+
+                       // use ClasspathResourceLoader for velocity templates 
lookup
+                       // if Cayenne URL is not null, load resource from this 
URL
+                       Properties props = new Properties();
+
+                       // null logger that will prevent velocity.log from 
being generated
+                       props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
+                                       NullLogSystem.class.getName());
+
+                       props.put("resource.loader", "cayenne");
+
+                       props.put("cayenne.resource.loader.class",
+                                       
ClassGeneratorResourceLoader.class.getName());
+
+                       velocityEngine.init(props);
+               } catch (Exception ex) {
+                       throw new CayenneRuntimeException("Can't initialize 
Velocity", ex);
+               }
+
+               pageTemplate = velocityEngine.getTemplate(template);
+       }
+
+       @SuppressWarnings("unchecked")
+       public void render(DocPage page, Writer out) throws Exception {
+
+               // Add the TOC, unless this is the top-level page
+               StringBuffer toc = new StringBuffer();
+               if (page.getParentRef() != null) {
+                       toc.append("<div id=\"cayenne_toc\">\n");
+
+                       DocPage root = page.getRoot();
+
+                       iterateChildren(toc, page, root);
+                       toc.append("</div>\n");
+               }
+
+               // Figure out the level of nesting for relative links
+               String basePath = "";
+               for (int i = 1; i <= page.getDepth(); i++) {
+                       basePath += "../";
+               }
+
+               String renderedContent = null;
+               try {
+                       renderedContent = service.renderContent(token, 
spaceKey, page
+                                       .getId(), page.getRawContent(), new 
HashMap(Collections
+                                       .singletonMap("style", "clean")));
+               } catch (Throwable t) {
+                       // could have hit a DOS prevention bit so
+                       // sleep for 250ms and try again
+            Thread.sleep(250);
+                       renderedContent = service.renderContent(token, 
spaceKey, page
+                                       .getId(), page.getRawContent(), new 
HashMap(Collections
+                                       .singletonMap("style", "clean")));
+               }
+               // Replace cross-doc links
+               Matcher linkMatcher = 
embeddedLinkPattern.matcher(renderedContent);
+               StringBuffer replacementBuffer = new StringBuffer();
+               while (linkMatcher.find()) {
+                       DocPage destPage = 
DocPage.getPageByTitle(linkMatcher.group(1)
+                                       .replace('+', ' '));
+
+                       // If we don't understand the link, just leave it alone 
to be safe
+                       if (destPage == null) {
+                               continue;
+                       }
+                       linkMatcher.appendReplacement(replacementBuffer, 
"href=\""
+                                       + basePath + destPage.getLinkPath() + 
"/index.html\"");
+               }
+               linkMatcher.appendTail(replacementBuffer);
+
+               renderedContent = replacementBuffer.toString();
+
+               // renderedContent =
+               // 
embeddedLinkPattern.matcher(renderedContent).replaceAll("href=\"$1/index.html\"");
+
+               // Replace attachment links
+               renderedContent = attachmentPattern.matcher(renderedContent)
+                               .replaceAll("$1=\"$3\"");
+
+               // Convert confluence images to relative links
+               renderedContent = 
confluenceImagePattern.matcher(renderedContent)
+                               .replaceAll("src=\"" + basePath + 
"images/$1\"");
+
+               // Replace wiki links
+               renderedContent = confluenceLinkPattern.matcher(renderedContent)
+                               .replaceAll("href=\"" + baseUrl + "$1\"");
+
+               // Convert local links with + to %20 to make browsers happy 
(wtf?)
+               Matcher matcher = spaceEncoderPattern.matcher(renderedContent);
+
+               replacementBuffer = new StringBuffer();
+               while (matcher.find()) {
+                       matcher.appendReplacement(replacementBuffer, 
matcher.group(0)
+                                       .replace("+", "%20"));
+               }
+               matcher.appendTail(replacementBuffer);
+
+               renderedContent = replacementBuffer.toString();
+
+               velCtxt.put("page", page);
+               velCtxt.put("basePath", basePath);
+               velCtxt.put("pageContent", toc.toString() + renderedContent);
+
+               pageTemplate.merge(velCtxt, out);
+
+       }
+
+       private void iterateChildren(StringBuffer toc, DocPage currentPage,
+                       DocPage basePage) {
+               toc.append("<ul>\n");
+               for (Iterator baseIter = basePage.getChildren().iterator(); 
baseIter
+                               .hasNext();) {
+
+                       DocPage child = (DocPage) baseIter.next();
+
+                       toc.append("<li>").append("<a href=\"");
+                       for (int i = 1; i <= currentPage.getDepth(); i++) {
+                               toc.append("../");
+                       }
+                       
toc.append(child.getLinkPath()).append("/index.html\">");
+                       toc.append(child.getTitle()).append("</a>");
+                       if (child.hasDescendent(currentPage)) {
+                               // render children
+                               iterateChildren(toc, currentPage, child);
+                       }
+
+                       toc.append("</li>\n");
+               }
 
-        toc.append("</ul>\n");
-    }
+               toc.append("</ul>\n");
+       }
 
 }


Reply via email to