Author: tmortagne
Date: 2007-12-19 09:26:08 +0100 (Wed, 19 Dec 2007)
New Revision: 6418

Modified:
   
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/export/html/HtmlPackager.java
   
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/ExportAction.java
   
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/ExportURLFactory.java
Log:
XWIKI-564: Export pages in HTML, in a zip file
* Also add pattern support based on hsql "LIKE" for "pages" URL parameters 
(?pages=wiki:% export all "xwiki" sub wiki)
* fix "Page rendering needs can use more than context's document to correctly 
render it. Initialization before calling view.vm rendering for each page need 
to be completed."
* Now export translated pages

Modified: 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/export/html/HtmlPackager.java
===================================================================
--- 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/export/html/HtmlPackager.java
      2007-12-18 20:02:05 UTC (rev 6417)
+++ 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/export/html/HtmlPackager.java
      2007-12-19 08:26:08 UTC (rev 6418)
@@ -11,10 +11,13 @@
 import java.util.zip.ZipOutputStream;
 
 import org.apache.commons.lang.RandomStringUtils;
+import org.apache.velocity.VelocityContext;
 
 import com.xpn.xwiki.XWikiContext;
 import com.xpn.xwiki.XWikiException;
+import com.xpn.xwiki.api.Document;
 import com.xpn.xwiki.doc.XWikiDocument;
+import com.xpn.xwiki.render.XWikiVelocityRenderer;
 import com.xpn.xwiki.web.ExportURLFactory;
 
 /**
@@ -117,8 +120,6 @@
         tempdir.mkdirs();
         File attachmentDir = new File(tempdir, "attachment");
         attachmentDir.mkdirs();
-        urlf.init(this.pages, tempdir, context);
-        context.setURLFactory(urlf);
 
         // ////////////////////////////////////////////
         // Configure response
@@ -135,31 +136,63 @@
 
         ZipOutputStream zos = new 
ZipOutputStream(context.getResponse().getOutputStream());
 
-        XWikiContext renderContext = (XWikiContext) context.clone();
+        VelocityContext vcontext = (VelocityContext)context.get("vcontext");
+        
+        Document currentDocument = (Document)vcontext.get("cdoc");
+        Document currentCDocument = (Document)vcontext.get("cdoc");
+        Document currentTDocument = (Document)vcontext.get("tdoc");
+        
+        try {
+            XWikiContext renderContext = (XWikiContext) context.clone();
 
-        for (Iterator it = this.pages.iterator(); it.hasNext();) {
-            String pageName = (String) it.next();
+            vcontext = XWikiVelocityRenderer.prepareContext(renderContext);
 
-            XWikiDocument doc = context.getWiki().getDocument(pageName, 
context);
+            urlf.init(this.pages, tempdir, renderContext);
+            renderContext.setURLFactory(urlf);
 
-            String zipname =
-                doc.getDatabase() + "." + doc.getSpace() + "." + doc.getName() 
+ ".html";
-            String language = doc.getLanguage();
-            if ((language != null) && (!language.equals(""))) {
-                zipname += "." + language;
-            }
-            ZipEntry zipentry = new ZipEntry(zipname);
-            zos.putNextEntry(zipentry);
+            renderContext.put("action", "view");
 
-            renderContext.setDoc(doc);
-            String content = context.getWiki().parseTemplate("view.vm", 
renderContext);
+            for (Iterator it = this.pages.iterator(); it.hasNext();) {
+                String pageName = (String) it.next();
 
-            zos.write(content.getBytes(context.getWiki().getEncoding()));
-            zos.closeEntry();
+                XWikiDocument doc = 
renderContext.getWiki().getDocument(pageName, renderContext);
+
+                String zipname = doc.getDatabase() + "." + doc.getSpace() + 
"." + doc.getName();
+                String language = doc.getLanguage();
+                if ((language != null) && (!language.equals(""))) {
+                    zipname += "." + language;
+                }
+
+                zipname += ".html";
+
+                ZipEntry zipentry = new ZipEntry(zipname);
+                zos.putNextEntry(zipentry);
+
+                renderContext.setDatabase(doc.getDatabase());
+                renderContext.setDoc(doc);
+                vcontext.put("doc", doc.newDocument(renderContext));
+                vcontext.put("cdoc", vcontext.get("doc"));
+
+                XWikiDocument tdoc = doc.getTranslatedDocument(renderContext);
+                renderContext.put("tdoc", tdoc);
+                vcontext.put("tdoc", tdoc.newDocument(renderContext));
+
+                String content = 
renderContext.getWiki().parseTemplate("view.vm", renderContext);
+
+                
zos.write(content.getBytes(renderContext.getWiki().getEncoding()));
+                zos.closeEntry();
+            }
+        } finally {
+            // Clean velocity context
+            vcontext = XWikiVelocityRenderer.prepareContext(context);
+            
+            vcontext.put("doc", currentDocument);
+            vcontext.put("cdoc", currentCDocument);
+            vcontext.put("tdoc", currentTDocument);
         }
 
         // ////////////////////////////////////////////
-        // Add needed skins to zip file
+        // Add required skins to zip file
         // ////////////////////////////////////////////
         for (Iterator it = urlf.getNeededSkins().iterator(); it.hasNext();) {
             String skinName = (String) it.next();

Modified: 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/ExportAction.java
===================================================================
--- 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/ExportAction.java
      2007-12-18 20:02:05 UTC (rev 6417)
+++ 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/ExportAction.java
      2007-12-19 08:26:08 UTC (rev 6418)
@@ -28,8 +28,10 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Exports in XAR, PDF, RTF or HTML formats.
@@ -68,6 +70,14 @@
         return defaultPage;
     }
 
+    /**
+     * Create ZIP archive containing wiki pages rendered in HTML, attached 
files and used skins.
+     * 
+     * @param context the XWiki context.
+     * @return always return null.
+     * @throws XWikiException error when exporting HTML ZIP package.
+     * @throws IOException error when exporting HTML ZIP package.
+     */
     private String exportHTML(XWikiContext context) throws XWikiException, 
IOException
     {
         XWikiRequest request = context.getRequest();
@@ -76,17 +86,69 @@
         String name = request.get("name");
         String[] pages = request.getParameterValues("pages");
 
-        List pageList;
+        List pageList = new ArrayList();;
         if (pages == null || pages.length == 0) {
-            pageList = new ArrayList();
             pageList.add(context.getDoc().getFullName());
 
             if (name == null || name.trim().length() == 0) {
                 name = context.getDoc().getFullName();
             }
         } else {
-            pageList = Arrays.asList(pages);
+            Map wikiQueries = new HashMap();
+            for (int i = 0; i < pages.length; ++i) {
+                String pattern = pages[i];
+                
+                String wikiName;
+                if (pattern.contains(":")) {
+                    int index = pattern.indexOf(':');
+                    wikiName = pattern.substring(0, index);
+                    pattern = pattern.substring(index + 1);
+                } else {
+                    wikiName = context.getDatabase();
+                }
+                
+                StringBuffer where;
+                List params;
+                
+                if (!wikiQueries.containsKey(wikiName)) {
+                    Object[] query = new Object[2];
+                    query[0] = where = new StringBuffer("where ");
+                    query[1] = params = new ArrayList();
+                    wikiQueries.put(wikiName, query);
+                } else {
+                    Object[] query = (Object[])wikiQueries.get(wikiName);
+                    where = (StringBuffer)query[0];
+                    params = (List)query[1];
+                }
+                
+                if (i > 0) {
+                    where.append(" or ");
+                }
+                
+                where.append("doc.fullName like ?");
+                params.add(pattern);
+            }
+            
+            String database = context.getDatabase();
+            try {
+                for (Iterator it = wikiQueries.entrySet().iterator(); 
it.hasNext();) {
+                    Map.Entry entry = (Map.Entry)it.next();
+                    String wikiName = (String)entry.getKey();
+                    Object[] query = (Object[])entry.getValue();
+                    String where = ((StringBuffer)query[0]).toString();
+                    List params = (List)query[1];
+                    
+                    context.setDatabase(wikiName);
+                    
pageList.addAll(context.getWiki().getStore().searchDocumentsNames(where, 
params, context));
+                }
+            } finally {
+                context.setDatabase(database);
+            }
         }
+        
+        if (pageList.size() == 0) {
+            return null;
+        }
 
         HtmlPackager packager = new HtmlPackager();
 

Modified: 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/ExportURLFactory.java
===================================================================
--- 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/ExportURLFactory.java
  2007-12-18 20:02:05 UTC (rev 6417)
+++ 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/ExportURLFactory.java
  2007-12-19 08:26:08 UTC (rev 6418)
@@ -41,7 +41,7 @@
     private Set neededSkins = new HashSet();
 
     /**
-     * ExportURLFactory conxtructor.
+     * ExportURLFactory constructor.
      */
     public ExportURLFactory()
     {
@@ -200,7 +200,7 @@
             e.printStackTrace();
         }
 
-        return super.createURL(web, name, action, querystring, anchor, 
xwikidb, context);
+        return super.createExternalURL(web, name, action, querystring, anchor, 
xwikidb, context);
     }
 
     /**

_______________________________________________
notifications mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/notifications

Reply via email to