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