r1031 - in xwiki/trunk/src: main/java/com/xpn/xwiki/plugin/packaging test/java/com/xpn/xwiki/test

Jeremi Joslin jeremi at users.forge.objectweb.org
Fri Apr 7 07:51:58 CEST 2006


Author: jeremi
Date: 2006-04-07 07:51:57 +0200 (Fri, 07 Apr 2006)
New Revision: 1031

Added:
   xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/DocumentFilter.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/ExcludeDocumentException.java
Modified:
   xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/Package.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/PackageAPI.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/PackageException.java
   xwiki/trunk/src/test/java/com/xpn/xwiki/test/PackageTest.java
Log:
XWA-49 Implement Filter in Package System

Added: xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/DocumentFilter.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/DocumentFilter.java	2006-04-07 05:47:33 UTC (rev 1030)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/DocumentFilter.java	2006-04-07 05:51:57 UTC (rev 1031)
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2006, XpertNet SARL, and individual contributors as indicated
+ * by the contributors.txt.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *
+ * @author jeremi
+ */
+
+package com.xpn.xwiki.plugin.packaging;
+
+import com.xpn.xwiki.doc.XWikiDocument;
+import com.xpn.xwiki.XWikiContext;
+
+public interface DocumentFilter {
+
+    /**
+     * Do actions at the import or export on a document. For example, remove
+     * comments or attachments, do some security check.
+     *
+     * @param doc document you want to filter
+     * @param context xwiki context
+     */
+    public void filter(XWikiDocument doc, XWikiContext context) throws ExcludeDocumentException;
+}

Added: xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/ExcludeDocumentException.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/ExcludeDocumentException.java	2006-04-07 05:47:33 UTC (rev 1030)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/ExcludeDocumentException.java	2006-04-07 05:51:57 UTC (rev 1031)
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2006, XpertNet SARL, and individual contributors as indicated
+ * by the contributors.txt.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *
+ * @author jeremi
+ */
+package com.xpn.xwiki.plugin.packaging;
+
+public class ExcludeDocumentException extends Exception{
+
+}

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/Package.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/Package.java	2006-04-07 05:47:33 UTC (rev 1030)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/Package.java	2006-04-07 05:51:57 UTC (rev 1031)
@@ -69,6 +69,7 @@
     private List    customMappingFiles = null;
     private boolean backupPack = false;
     private boolean withVersions = true;
+    private List    documentFilters = new ArrayList();
 
     public static final int OK = 0;
     public static final int Right = 1;
@@ -139,6 +140,13 @@
         this.withVersions = withVersions;
     }
 
+    public void addDocumentFilter(Object filter) throws PackageException {
+        if (filter instanceof DocumentFilter)
+            this.documentFilters.add(filter);
+        else
+            throw new PackageException(PackageException.ERROR_PACKAGE_INVALID_FILTER, "Invalid Document Filter");
+    }
+
     public Package()
     {
         files = new ArrayList();
@@ -160,13 +168,23 @@
                 return true;
             }
         }
-        DocumentInfo docinfo = new DocumentInfo(doc);
-        docinfo.setAction(defaultAction);
-        files.add(docinfo);
-        BaseClass bclass =  doc.getxWikiClass();
-        if (bclass.getCustomMapping()!=null)
-         customMappingFiles.add(docinfo);
-        return true;
+
+        doc = (XWikiDocument) doc.clone();
+
+        try {
+            filter(doc, context);
+
+            DocumentInfo docinfo = new DocumentInfo(doc);
+            docinfo.setAction(defaultAction);
+            files.add(docinfo);
+            BaseClass bclass =  doc.getxWikiClass();
+            if (bclass.getCustomMapping()!=null)
+                customMappingFiles.add(docinfo);
+            return true;
+        } catch (ExcludeDocumentException e) {
+            log.info("Skip the document " + doc.getFullName());
+            return false;
+        }
     }
 
     public boolean add(XWikiDocument doc, XWikiContext context) throws XWikiException {
@@ -209,6 +227,11 @@
         return add(docFullName, language, DocumentInfo.ACTION_NOT_DEFINED, context);
     }
 
+    public void filter(XWikiDocument doc, XWikiContext context) throws ExcludeDocumentException {
+        for (int i = 0; i < documentFilters.size(); i++)
+            ((DocumentFilter)documentFilters.get(i)).filter(doc, context);
+    }
+
     public String export(OutputStream os, XWikiContext context) throws IOException, XWikiException {
         if (files.size() == 0)
         {
@@ -219,7 +242,8 @@
         for (int i = 0; i < files.size(); i++)
         {
             DocumentInfo docinfo = (DocumentInfo) files.get(i);
-            addToZip(docinfo.getDoc(), zos, withVersions, context);
+            XWikiDocument doc = docinfo.getDoc();
+            addToZip(doc, zos, withVersions, context);
         }
         addInfosToZip(zos);
         zos.finish();
@@ -239,7 +263,8 @@
         for (int i = 0; i < files.size(); i++)
         {
             DocumentInfo docinfo = (DocumentInfo) files.get(i);
-            addToDir(docinfo.getDoc(), dir, withVersions, context);
+            XWikiDocument doc = docinfo.getDoc();
+            addToDir(doc, dir, withVersions, context);
         }
         addInfosToDir(dir);
         return "";
@@ -264,10 +289,15 @@
                     continue;
                 else {
                     XWikiDocument doc = readFromXML(readFromInputStream(zis));
-                    if (documentExistInPackageFile(doc.getFullName(), doc.getLanguage(), description))
-                        this.add(doc, context);
-                    else
-                        throw new PackageException(PackageException.ERROR_XWIKI_UNKNOWN, "document does not exist in package definition");
+                    try {
+                        filter(doc, context);
+                        if (documentExistInPackageFile(doc.getFullName(), doc.getLanguage(), description))
+                            this.add(doc, context);
+                        else
+                            throw new PackageException(PackageException.ERROR_XWIKI_UNKNOWN, "document " + doc.getFullName() + " does not exist in package definition");
+                    } catch (ExcludeDocumentException e) {
+                        log.info("Skip the document '" + doc.getFullName() + "'");
+                    }
                 }
             }
             updateFileInfos(description);
@@ -632,10 +662,16 @@
         authorName = getElementText(infosEl, "author");
         version = getElementText(infosEl, "version");
         backupPack = new Boolean(getElementText(infosEl, "backupPack")).booleanValue();
+
+
         return domdoc;
     }
 
+    protected void readDependencies()
+    {
 
+    }
+
     public void addAllWikiDocuments(XWikiContext context) throws XWikiException {
         XWiki wiki = context.getWiki();
         List spaces = wiki.getSpaces(context);

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/PackageAPI.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/PackageAPI.java	2006-04-07 05:47:33 UTC (rev 1030)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/PackageAPI.java	2006-04-07 05:51:57 UTC (rev 1031)
@@ -111,6 +111,10 @@
          plugin.setWithVersions(withVersions);
      }
 
+    public void addDocumentFilter(Object filter) throws PackageException {
+        plugin.addDocumentFilter(filter);
+    }
+
     public List getFiles() {
         List files =  plugin.getFiles();
         ArrayList APIfiles = new ArrayList(files.size());

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/PackageException.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/PackageException.java	2006-04-07 05:47:33 UTC (rev 1030)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/packaging/PackageException.java	2006-04-07 05:51:57 UTC (rev 1031)
@@ -30,6 +30,7 @@
     static String plugName = "Package";
     public static final int ERROR_PACKAGE_UNKNOWN = 1;
     public static final int ERROR_PACKAGE_NODESCRIPTION = 2;
+    public static final int ERROR_PACKAGE_INVALID_FILTER = 3;
 
     public PackageException(int code, String message, Throwable e, Object[] args)
     {

Modified: xwiki/trunk/src/test/java/com/xpn/xwiki/test/PackageTest.java
===================================================================
--- xwiki/trunk/src/test/java/com/xpn/xwiki/test/PackageTest.java	2006-04-07 05:47:33 UTC (rev 1030)
+++ xwiki/trunk/src/test/java/com/xpn/xwiki/test/PackageTest.java	2006-04-07 05:51:57 UTC (rev 1031)
@@ -34,9 +34,10 @@
 import org.apache.velocity.VelocityContext;
 
 import com.xpn.xwiki.XWikiException;
+import com.xpn.xwiki.XWikiContext;
 import com.xpn.xwiki.doc.XWikiAttachment;
 import com.xpn.xwiki.doc.XWikiDocument;
-import com.xpn.xwiki.plugin.packaging.DocumentInfo;
+import com.xpn.xwiki.plugin.packaging.*;
 import com.xpn.xwiki.plugin.packaging.Package;
 
 
@@ -143,6 +144,29 @@
         testOverwrite(myOtherPackage);
     }
 
+    public void testFilter() throws XWikiException, IOException {
+        Package myPackage = new Package();
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+
+        try {
+            myPackage.addDocumentFilter(new testFilter());
+        } catch (PackageException e) {
+            fail("the filter should be added without exception");
+        }
+        myPackage.add("Test.first", getXWikiContext());
+        myPackage.add("Test.third", getXWikiContext());
+        myPackage.export(os, getXWikiContext());
+
+        //check if the filter does not impact the wiki
+        XWikiDocument doc = getXWikiContext().getWiki().getDocument("Test.first_filtered", getXWikiContext());
+        assertTrue(doc.isNew());
+
+        Package myOtherPackage = new Package();
+        myOtherPackage.Import(os.toByteArray(), getXWikiContext());
+        testDocName("Test.first_filtered", myOtherPackage.getFiles());
+        testDocName("Test.third_filtered", myOtherPackage.getFiles());
+    }
+
     public void testImportPackage(Package pack) throws XWikiException {
         // Setup database xwikitest2
         getXWikiContext().setDatabase("xwikitest2");
@@ -158,7 +182,6 @@
 
         doc = getXWikiContext().getWiki().getDocument("Test.third", getXWikiContext());
         assertFalse(doc.isNew());
-
     }
 
     public void testOverwrite(Package pack) throws XWikiException {
@@ -473,4 +496,16 @@
         assertEquals(myPackage.isBackupPack(), true);
     }
 
+
+
+
+
+    private class testFilter implements DocumentFilter {
+
+        public void filter(XWikiDocument doc, XWikiContext context) throws ExcludeDocumentException {
+            doc.setName(doc.getName() + "_filtered");
+        }
+    }
+
+
 }





More information about the Xwiki-notifications mailing list