You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2012/03/06 21:41:58 UTC

svn commit: r1297701 - in /cxf/web: bin/update-site pom.xml src/main/java/org/apache/cxf/cwiki/Page.java src/main/java/org/apache/cxf/cwiki/SiteExporter.java template/docs.cfg template/main.cfg

Author: dkulp
Date: Tue Mar  6 20:41:58 2012
New Revision: 1297701

URL: http://svn.apache.org/viewvc?rev=1297701&view=rev
Log:
Bunch of updates to make the site generation faster and better:
1) Multithread when doing multiple spaces (CXF + CXF20DOC)
2) Only get the banner/navigation/quicklinks once
3) Handle {children} tags so an added or delete page will automatically update pages that use the {children} tag for contents
4) Experimental support for {include:Page}.  Will flush out when I start working on Camel's site.


Added:
    cxf/web/template/docs.cfg
    cxf/web/template/main.cfg
Modified:
    cxf/web/bin/update-site
    cxf/web/pom.xml
    cxf/web/src/main/java/org/apache/cxf/cwiki/Page.java
    cxf/web/src/main/java/org/apache/cxf/cwiki/SiteExporter.java

Modified: cxf/web/bin/update-site
URL: http://svn.apache.org/viewvc/cxf/web/bin/update-site?rev=1297701&r1=1297700&r2=1297701&view=diff
==============================================================================
--- cxf/web/bin/update-site (original)
+++ cxf/web/bin/update-site Tue Mar  6 20:41:58 2012
@@ -1,6 +1,4 @@
 #!/bin/sh
-mvn -Pconfluence,main,nochecks package exec:java  $@
-[ $? -eq 0 ] || exit -1
-mvn -Pconfluence,docs,nochecks exec:java  $@
+mvn -Pconfluence,nochecks -e package exec:java  $@
 [ $? -eq 0 ] || exit -1
 

Modified: cxf/web/pom.xml
URL: http://svn.apache.org/viewvc/cxf/web/pom.xml?rev=1297701&r1=1297700&r2=1297701&view=diff
==============================================================================
--- cxf/web/pom.xml (original)
+++ cxf/web/pom.xml Tue Mar  6 20:41:58 2012
@@ -37,6 +37,7 @@
         <svn.arg1></svn.arg1>
         <svn.arg2></svn.arg2>
         <site.output>${basedir}/content</site.output>
+        <maven.test.skip>true</maven.test.skip>
     </properties>
 
     <dependencies>
@@ -57,7 +58,7 @@
         <dependency>
             <groupId>org.ccil.cowan.tagsoup</groupId>
             <artifactId>tagsoup</artifactId>
-            <version>1.2</version>
+            <version>1.2.1</version>
         </dependency>
     </dependencies>
 
@@ -79,14 +80,8 @@
                     <configuration>
                         <mainClass>org.apache.cxf.cwiki.SiteExporter</mainClass>
                         <arguments>
-                            <argument>-cache</argument>
-                            <argument>${cache.file}</argument>
                             <argument>-d</argument>
-                            <argument>${output.dir}</argument>
-                            <argument>-space</argument>
-                            <argument>${space.key}</argument>
-                            <argument>-template</argument>
-                            <argument>${basedir}/template/template.vm</argument>
+                            <argument>${site.output}</argument>
                             <argument>-password</argument>
                             <argument>${confluence.password}</argument>
                             <argument>-user</argument>
@@ -95,6 +90,8 @@
                             <argument>${svn.arg1}</argument>
                             <argument>${svn.arg2}</argument>
                             <!--argument>-force</argument-->
+                            <argument>${basedir}/template/main.cfg</argument>
+                            <argument>${basedir}/template/docs.cfg</argument>
                         </arguments>
                     </configuration>
                 </plugin>
@@ -111,21 +108,5 @@
                 <svn.arg2>-commit</svn.arg2>
             </properties>
         </profile>
-        <profile>
-            <id>docs</id>
-            <properties>
-                <cache.file>${site.output}/cache/docs.pageCache</cache.file>
-                <output.dir>${site.output}/docs</output.dir>
-                <space.key>CXF20DOC</space.key>
-            </properties>
-        </profile>
-        <profile>
-            <id>main</id>
-            <properties>
-                <cache.file>${site.output}/cache/main.pageCache</cache.file>
-                <output.dir>${site.output}/</output.dir>
-                <space.key>CXF</space.key>
-            </properties>
-        </profile>
     </profiles>
 </project>

Modified: cxf/web/src/main/java/org/apache/cxf/cwiki/Page.java
URL: http://svn.apache.org/viewvc/cxf/web/src/main/java/org/apache/cxf/cwiki/Page.java?rev=1297701&r1=1297700&r2=1297701&view=diff
==============================================================================
--- cxf/web/src/main/java/org/apache/cxf/cwiki/Page.java (original)
+++ cxf/web/src/main/java/org/apache/cxf/cwiki/Page.java Tue Mar  6 20:41:58 2012
@@ -23,6 +23,8 @@ package org.apache.cxf.cwiki;
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 import javax.xml.datatype.DatatypeFactory;
 import javax.xml.datatype.XMLGregorianCalendar;
@@ -43,9 +45,13 @@ public class Page implements Serializabl
     final String title;
     final String url;
     Map<String, String> attachments;
+    Set<String> includes;
+    Map<String, Integer> childrenOf;
     
-    transient String content;
-    
+    transient String renderedContent;
+    transient String renderedDivContent;
+    transient String divIdForContent;
+
     public Page(Document doc) throws Exception {
         //org.apache.cxf.helpers.XMLUtils.printDOM(doc.getDocumentElement());
         id = DOMUtils.getChildContent(doc.getDocumentElement().getFirstChild(), "id");
@@ -54,6 +60,68 @@ public class Page implements Serializabl
         url = DOMUtils.getChildContent(doc.getDocumentElement().getFirstChild(), "url");
         String mod = DOMUtils.getChildContent(doc.getDocumentElement().getFirstChild(), "modified");
         modified = DatatypeFactory.newInstance().newXMLGregorianCalendar(mod);
+        
+        String c = DOMUtils.getChildContent(doc.getDocumentElement().getFirstChild(), "content");
+        if (c != null) {
+            int idx = c.indexOf("{children");
+            while (idx != -1) {
+                if (childrenOf == null) {
+                    childrenOf = new HashMap<String, Integer>();
+                }
+                idx += 9;
+                if (c.charAt(idx) != '}') {
+                    // {children:page=Foo|...}
+                    idx++;
+                    int idx2 = c.indexOf('}', idx);
+                    String paramString = c.substring(idx, idx2);
+                    String params[] = paramString.split("\\||=");
+                    String page = null;
+                    int depth = 1;
+                    for (int x = 0; x < params.length; x++) {
+                        if ("page".equals(params[x])) {
+                            page = params[x + 1];
+                            x++;
+                        } else if ("depth".equals(params[x])) {
+                            depth = Integer.parseInt(params[x + 1]);
+                            x++;
+                        }
+                    }
+                    childrenOf.put(page, depth);
+                } else {
+                    childrenOf.put(title, 1);
+                }
+                idx = c.indexOf("{children", idx);
+            }
+            
+            idx = c.indexOf("{include:");
+            while (idx != -1) {
+                int idx2 = c.indexOf("}", idx);
+                String inc = c.substring(idx + 9, idx2);
+                if (includes == null) {
+                    includes = new CopyOnWriteArraySet<String>();
+                }
+                includes.add(inc);
+                idx = c.indexOf("{include:", idx2);
+            }
+        }
+    }
+    
+    public boolean hasChildrenOf(String t, int d) {
+        if (childrenOf == null) {
+            return false;
+        }
+        Integer i = childrenOf.get(t);
+        if (i == null) {
+            return false;
+        }
+        return d <= i;
+    }
+    
+    public boolean includesPage(String s) {
+        if (includes == null) {
+            return false;
+        }
+        return includes.contains(s);
     }
     
     public String getId() {
@@ -70,10 +138,10 @@ public class Page implements Serializabl
     }
 
     public void setContent(String c) {
-        content = c;
+        renderedContent = c;
     }
     public String getContent() {
-        return content;
+        return renderedContent;
     }
     public String getURL() {
         return url;
@@ -113,4 +181,19 @@ public class Page implements Serializabl
         }
         return attachments.get(aid);
     }
+
+    public void setContentForDivId(String divId, String content) {
+        renderedDivContent = content;
+        divIdForContent = divId;
+    }
+
+    public String getContentForDivId(String divId) {
+        if (divId == null) {
+            return renderedContent;
+        }
+        if (divId.equals(divIdForContent)) {
+            return renderedDivContent;
+        }
+        return null;
+    }
 }

Modified: cxf/web/src/main/java/org/apache/cxf/cwiki/SiteExporter.java
URL: http://svn.apache.org/viewvc/cxf/web/src/main/java/org/apache/cxf/cwiki/SiteExporter.java?rev=1297701&r1=1297700&r2=1297701&view=diff
==============================================================================
--- cxf/web/src/main/java/org/apache/cxf/cwiki/SiteExporter.java (original)
+++ cxf/web/src/main/java/org/apache/cxf/cwiki/SiteExporter.java Tue Mar  6 20:41:58 2012
@@ -76,75 +76,65 @@ import org.ccil.cowan.tagsoup.XMLWriter;
 /**
  * 
  */
-public class SiteExporter {
+public class SiteExporter implements Runnable {
 
     static final String HOST = "https://cwiki.apache.org";
     static final String ROOT = HOST + "/confluence";
     static final String RPC_ROOT = "/rpc/soap-axis/confluenceservice-v1";
-
-    
     static final String SOAPNS = "http://soap.rpc.confluence.atlassian.com";
 
-    static final Set<String> GLOBAL_PAGES = new HashSet<String>();
-    static {
-        GLOBAL_PAGES.add("Navigation");
-        GLOBAL_PAGES.add("Banner");
-        GLOBAL_PAGES.add("QuickLinks");        
-    }
     
     
+    static boolean debug;
+    static String userName = "cxf-export-user";
+    static String password;
+    
+    static boolean svn;
+    static boolean commit;
+    static StringBuilder svnCommitMessage = new StringBuilder();
+    
+    static File rootOutputDir = new File(".");
+    static String loginToken;
+    static Dispatch<Document> dispatch;
 
-    Dispatch<Document> dispatch;
     Map<String, Page> pages = new HashMap<String, Page>();
     List<Page> modifiedPages = new LinkedList<Page>();
-    
-    String userName = "cxf-export-user";
-    String password;
+    Set<String> globalPages = new HashSet<String>();
+
     String spaceKey = "CXF";
     String pageCacheFile = "pagesConfig.obj";
-    String templateName = "template.vm";
+    String templateName = "template/template.vm";
     boolean forceAll;
-    boolean svn;
-    boolean commit;
-    StringBuilder svnCommitMessage = new StringBuilder();
     
-    File outputDir = new File(".");
+    File outputDir = rootOutputDir;
 
-    String loginToken;
     Template template;
-    boolean debug;
     
-    public SiteExporter(List<String> args) throws Exception {
+    public SiteExporter(String fileName, boolean force) throws Exception {
+        forceAll = force;
         
-
+        Properties props = new Properties();
+        props.load(new FileInputStream(fileName));
         
-        ListIterator<String> it = args.listIterator();
-        while (it.hasNext()) {
-            String s = it.next();
-            if ("-debug".equals(s)) {
-                debug = true;
-            } else if ("-d".equals(s)) {
-                outputDir = new File(it.next());
-            } else if ("-user".equals(s)) {
-                userName = it.next(); 
-            } else if ("-password".equals(s)) {
-                password = it.next(); 
-            } else if ("-space".equals(s)) {
-                spaceKey = it.next(); 
-            } else if ("-cache".equals(s)) {
-                pageCacheFile = it.next();
-            } else if ("-force".equals(s)) {
-                forceAll = true;
-            } else if ("-template".equals(s)) {
-                templateName = it.next();
-            } else if ("-svn".equals(s)) {
-                svn = true;
-            } else if ("-commit".equals(s)) {
-                commit = true;
-            }
+        if (props.containsKey("spaceKey")) {
+            spaceKey = props.getProperty("spaceKey");
+        }
+        if (props.containsKey("pageCacheFile")) {
+            pageCacheFile = props.getProperty("pageCacheFile");
+        }
+        if (props.containsKey("templateName")) {
+            templateName = props.getProperty("templateName");
+        }
+        if (props.containsKey("outputDir")) {
+            outputDir = new File(rootOutputDir, props.getProperty("outputDir"));
+        }
+        if (props.containsKey("globalPages")) {
+            String globals = props.getProperty("globalPages");
+            String[] pgs = globals.split(",");
+            globalPages.addAll(Arrays.asList(pgs));
         }
         
-        Properties props = new Properties();
+        props = new Properties();
         String clzName = URLResourceLoader.class.getName();
         props.put("resource.loader", "url");
         props.put("url.resource.loader.class", clzName);
@@ -162,7 +152,7 @@ public class SiteExporter {
         outputDir.mkdirs();
     }
     
-    public Dispatch<Document> getDispatch() {
+    public static synchronized Dispatch<Document> getDispatch() {
         if (dispatch == null) {
             Service service = Service.create(new QName(SOAPNS, "Service"));
             service.addPort(new QName(SOAPNS, "Port"), 
@@ -181,14 +171,34 @@ public class SiteExporter {
         return dispatch;
     }
     
-    public void run() throws Exception {
-        loadPagesCache();
+    public void run() {
+        try {
+            doExport();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    public void forcePage(String s) throws Exception {
+        Page p = findPage(s);
+        if (p != null) {
+            pages.remove(p.getId());
+            modifiedPages.add(p);
+        }
+    }
+    
+    public void doExport() throws Exception {
+        if (!forceAll) {
+            loadPagesCache();
+        }
         
         // debug stuff, force regen of a page
-        //modifiedPages.add(findPage("Navigation"));
-        //modifiedPages.add(findPage("FAQ"));
+        //forcePage("Navigation");
+        //forcePage("Index");
+        //forcePage("Custom Transport");
         
         if (modifiedPages.isEmpty() && checkRSS()) {
+            System.out.println("(" + spaceKey + ") No changes detected from RSS");
             return;
         }
         
@@ -196,7 +206,7 @@ public class SiteExporter {
         loadPages();
         
         for (Page p : modifiedPages) {
-            if (GLOBAL_PAGES.contains(p.getTitle())) {
+            if (globalPages.contains(p.getTitle())) {
                 modifiedPages = new LinkedList<Page>(pages.values());
                 break;
             }
@@ -211,13 +221,7 @@ public class SiteExporter {
             savePages();
         }
         
-        if (commit) {
-            File file = FileUtils.createTempFile("svncommit", "txt");
-            FileWriter writer = new FileWriter(file);
-            writer.write(svnCommitMessage.toString());
-            writer.close();
-            callSvn("commit", "-F", file.getAbsolutePath(), outputDir.getAbsolutePath());
-        }
+
     }
 
 
@@ -248,11 +252,11 @@ public class SiteExporter {
             if (p != null) {
                 //found a modified page - need to rebuild
                 if (cal.compare(p.getModifiedTime()) > 0) {
-                    System.out.println("Changed page found: " + title);
+                    System.out.println("(" + spaceKey + ") Changed page found: " + title);
                     return false;
                 }
             } else {
-                System.out.println("Did not find page for: " + title);
+                System.out.println("(" + spaceKey + ") Did not find page for: " + title);
                 return false;
             }
         }
@@ -261,7 +265,7 @@ public class SiteExporter {
     }
 
     private void savePages() throws Exception {
-        File file = new File(pageCacheFile);
+        File file = new File(rootOutputDir, pageCacheFile);
         file.getParentFile().mkdirs();
         FileOutputStream fout = new FileOutputStream(file);
         ObjectOutputStream oout = new ObjectOutputStream(fout);
@@ -274,10 +278,11 @@ public class SiteExporter {
         int count = 0;
         for (Page p : modifiedPages) {
             count++;
-            System.out.println("Rendering " + p.getTitle() + "    (" + count + "/" + total + ")");
+            System.out.println("(" + spaceKey + ") Rendering " + p.getTitle() 
+                               + "    (" + count + "/" + total + ")");
             loadAttachments(p);
             
-            loadPageContent(p);
+            loadPageContent(p, null);
             VelocityContext ctx = new VelocityContext();
             ctx.put("exporter", this);
             ctx.put("page", p);
@@ -299,15 +304,17 @@ public class SiteExporter {
             }
         }
     }
-
-    private void callSvn(String ... commands) throws Exception {
+    void callSvn(String ... commands) throws Exception {
+        callSvn(outputDir, commands);
+    }
+    static void callSvn(File dir, String ... commands) throws Exception {
         if (svn) {
             List<String> cmds = new ArrayList<String>();
             cmds.add("svn");
             cmds.add("--non-interactive");
             cmds.addAll(Arrays.asList(commands));
             Process p = Runtime.getRuntime().exec(cmds.toArray(new String[cmds.size()]),
-                                                  new String[0], outputDir);
+                                                  new String[0], dir);
             if (p.waitFor() != 0) {
                 IOUtils.copy(p.getErrorStream(), System.err);
             }
@@ -438,22 +445,23 @@ public class SiteExporter {
         return buffer.toString();
     }
     
-    public String getPageContent(String title, String id) throws Exception {
+    public String getPageContent(String title, String divId) throws Exception {
         Page p = findPage(title);
-        return loadPageContent(p, id);
+        String s = p.getContentForDivId(divId);
+        if (s == null) {
+            s = loadPageContent(p, divId);
+        }
+        return s;
     }
     public String getPageContent(String title) throws Exception {
         Page p = findPage(title);
         String s = p.getContent();
         if (s == null) {
-            loadPageContent(p);
+            loadPageContent(p, null);
         }
         return p.getContent();
     }
-    private void loadPageContent(Page p) throws Exception {
-        loadPageContent(p, null);
-    }
-    private String loadPageContent(Page p, String id) throws Exception {
+    private String loadPageContent(Page p, String divId) throws Exception {
         Document doc = XMLUtils.newDocument();
         Element el = doc.createElementNS(SOAPNS, "ns1:renderContent");
         Element el2 = doc.createElement("in0");
@@ -488,43 +496,47 @@ public class SiteExporter {
         doc = getDispatch().invoke(doc);
         
         String content = doc.getDocumentElement().getFirstChild().getTextContent().trim();
-        content = updateContentLinks(p, content, id);
-        if (id == null) {
+        content = updateContentLinks(p, content, divId);
+        if (divId == null) {
             p.setContent(content);
+        } else {
+            p.setContentForDivId(divId, content);
         }
         return content;
     }
 
     
-    private void doLogin() throws Exception {
-        Document doc = XMLUtils.newDocument();
-        Element el = doc.createElementNS(SOAPNS, "ns1:login");
-        Element el2 = doc.createElement("in0");
-        
-        if (userName == null) {
-            System.out.println("Enter username: ");
-            el2.setTextContent(System.console().readLine());
-        } else {
-            el2.setTextContent(userName);
-        }
-        el.appendChild(el2);
-        el2 = doc.createElement("in1");
-        el.appendChild(el2);
-        if (password == null) {
-            System.out.println("Enter password: ");
-            el2.setTextContent(new String(System.console().readPassword()));
-        } else {
-            el2.setTextContent(password);
+    private static synchronized void doLogin() throws Exception {
+        if (loginToken == null) {
+            Document doc = XMLUtils.newDocument();
+            Element el = doc.createElementNS(SOAPNS, "ns1:login");
+            Element el2 = doc.createElement("in0");
+            
+            if (userName == null) {
+                System.out.println("Enter username: ");
+                el2.setTextContent(System.console().readLine());
+            } else {
+                el2.setTextContent(userName);
+            }
+            el.appendChild(el2);
+            el2 = doc.createElement("in1");
+            el.appendChild(el2);
+            if (password == null) {
+                System.out.println("Enter password: ");
+                el2.setTextContent(new String(System.console().readPassword()));
+            } else {
+                el2.setTextContent(password);
+            }
+            doc.appendChild(el);
+            doc = getDispatch().invoke(doc);
+            loginToken = doc.getDocumentElement().getFirstChild().getTextContent();
         }
-        doc.appendChild(el);
-        doc = getDispatch().invoke(doc);
-        loginToken = doc.getDocumentElement().getFirstChild().getTextContent();
     }
 
     public void loadPagesCache() throws Exception {
-        File file = new File(pageCacheFile);
+        File file = new File(rootOutputDir, pageCacheFile);
         if (file.exists()) {
-            FileInputStream fin = new FileInputStream(pageCacheFile);
+            FileInputStream fin = new FileInputStream(file);
             ObjectInputStream oin = new ObjectInputStream(fin);
             pages = CastUtils.cast((Map<?, ?>)oin.readObject());
             oin.close();
@@ -543,19 +555,24 @@ public class SiteExporter {
         doc = getDispatch().invoke(doc);
         
         Set<String> allPages = new HashSet<String>(pages.keySet());
+        Set<Page> newPages = new HashSet<Page>();
         
         //XMLUtils.printDOM(doc.getDocumentElement());
         Node nd = doc.getDocumentElement().getFirstChild().getFirstChild();
         while (nd != null) {
             if (nd instanceof Element) {
-                loadPage((Element)nd, allPages);
+                loadPage((Element)nd, allPages, newPages);
             }
             nd = nd.getNextSibling();
         }
-        
+        for (Page p : newPages) {
+            //pages have been added, need to check
+            checkForChildren(p);
+        }
         for (String id : allPages) {
             //these pages have been deleted
             Page p = pages.remove(id);
+            checkForChildren(p);
             
             File file = new File(outputDir, p.createFileName());
             if (file.exists()) {
@@ -566,8 +583,49 @@ public class SiteExporter {
                 file.delete();
             }            
         }
+        while (checkIncludes()) {
+            // nothing
+        }
+        
+    }
+
+    public boolean checkIncludes() {
+        for (Page p : modifiedPages) {
+            if (checkIncludes(p)) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    public boolean checkIncludes(Page p) {
+        for (Page p2 : pages.values()) {
+            if (p2.includesPage(p.getTitle())
+                && !modifiedPages.contains(p2)) {
+                modifiedPages.add(p2);
+                return true;
+            }
+        }
+        return false;
+    }
+    public void checkForChildren(Page p) {
+        Page parent = pages.get(p.getParentId());
+        int d = 1;
+        while (parent != null) {
+            for (Page p2 : pages.values()) {
+                if (p2.hasChildrenOf(parent.getTitle(), d)
+                    && !modifiedPages.contains(p2)) {
+                    modifiedPages.add(p2);
+                }
+            }
+            parent = pages.get(parent.getParentId());
+            d++;
+        }
     }
-    public void loadPage(Element pageSumEl, Set<String> allPages) throws Exception {
+    
+    public void loadPage(Element pageSumEl,
+                         Set<String> allPages,
+                         Set<Page> newPages) throws Exception {
         Document doc = XMLUtils.newDocument();
         Element el = doc.createElementNS(SOAPNS, "ns1:getPage");
         Element el2 = doc.createElement("in0");
@@ -580,10 +638,13 @@ public class SiteExporter {
         doc = getDispatch().invoke(doc);
         
         Page page = new Page(doc);
-        Page oldPage = pages.get(page.getId());
+        Page oldPage = pages.put(page.getId(), page);
         if (oldPage == null || page.getModifiedTime().compare(oldPage.getModifiedTime()) > 0) {
             modifiedPages.add(page);
-            pages.put(page.getId(), page);
+            if (oldPage == null) {
+                //need to check parents to see if it has a {children} tag so we can re-render
+                newPages.add(page);
+            }
         }
         if (allPages.contains(page.getId())) {
             allPages.remove(page.getId());
@@ -621,8 +682,47 @@ public class SiteExporter {
     }
 
     public static void main(String[] args) throws Exception {
-        new SiteExporter(Arrays.asList(args)).run();
+        ListIterator<String> it = Arrays.asList(args).listIterator();
+        List<String> files = new ArrayList<String>();
+        boolean forceAll = false;
+        while (it.hasNext()) {
+            String s = it.next();
+            if ("-debug".equals(s)) {
+                debug = true;
+            } else if ("-user".equals(s)) {
+                userName = it.next(); 
+            } else if ("-password".equals(s)) {
+                password = it.next(); 
+            } else if ("-d".equals(s)) {
+                rootOutputDir = new File(it.next());
+            } else if ("-force".equals(s)) {
+                forceAll = true;
+            } else if ("-svn".equals(s)) {
+                svn = true;
+            } else if ("-commit".equals(s)) {
+                commit = true;
+            } else if (s != null && s.length() > 0) {
+                files.add(s);
+            }
+        }
+        
+        List<Thread> threads = new ArrayList<Thread>(files.size());
+        for (String file : files) {
+            Thread t = new Thread(new SiteExporter(file, forceAll));
+            threads.add(t);
+            t.start();
+        }
+        for (Thread t : threads) {
+            t.join();
+        }
+        
+        if (commit) {
+            File file = FileUtils.createTempFile("svncommit", "txt");
+            FileWriter writer = new FileWriter(file);
+            writer.write(svnCommitMessage.toString());
+            writer.close();
+            callSvn(rootOutputDir, "commit", "-F", file.getAbsolutePath(), rootOutputDir.getAbsolutePath());
+            svnCommitMessage.setLength(0);
+        }
     }
-
-
 }

Added: cxf/web/template/docs.cfg
URL: http://svn.apache.org/viewvc/cxf/web/template/docs.cfg?rev=1297701&view=auto
==============================================================================
--- cxf/web/template/docs.cfg (added)
+++ cxf/web/template/docs.cfg Tue Mar  6 20:41:58 2012
@@ -0,0 +1,6 @@
+spaceKey: CXF20DOC
+pageCacheFile:/cache/docs.pageCache
+templateName:template/template.vm
+outputDir:/docs
+globalPages:Navigation,Banner,QuickLinks
+

Added: cxf/web/template/main.cfg
URL: http://svn.apache.org/viewvc/cxf/web/template/main.cfg?rev=1297701&view=auto
==============================================================================
--- cxf/web/template/main.cfg (added)
+++ cxf/web/template/main.cfg Tue Mar  6 20:41:58 2012
@@ -0,0 +1,6 @@
+spaceKey: CXF
+pageCacheFile:cache/main.pageCache
+templateName:template/template.vm
+outputDir:/
+globalPages:Navigation,Banner,QuickLinks
+