You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2018/06/21 02:35:22 UTC

svn commit: r1833972 - in /jackrabbit/commons/filevault/trunk/vault-core/src: main/java/org/apache/jackrabbit/vault/fs/config/ test/java/org/apache/jackrabbit/vault/fs/filter/ test/java/org/apache/jackrabbit/vault/packaging/integration/

Author: tripod
Date: Thu Jun 21 02:35:22 2018
New Revision: 1833972

URL: http://svn.apache.org/viewvc?rev=1833972&view=rev
Log:
JCRVLT-305 DefaultWorkspaceFilter.add(nodeFilters) does not include properties

Modified:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/filter/WorkspaceFilterTest.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFilteredPropertyExport.java

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java?rev=1833972&r1=1833971&r2=1833972&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java Thu Jun 21 02:35:22 2018
@@ -73,9 +73,12 @@ public class DefaultWorkspaceFilter impl
      */
     private static final Logger log = LoggerFactory.getLogger(DefaultWorkspaceFilter.class);
 
-    private final List<PathFilterSet> nodesFilterSets = new LinkedList<PathFilterSet>();
+    private final List<PathFilterSet> nodesFilterSets = new LinkedList<>();
 
-    private final List<PathFilterSet> propsFilterSets = new LinkedList<PathFilterSet>();
+    private final List<PathFilterSet> propsFilterSets = new LinkedList<>();
+
+    // this list is only kept as reference for source generation.
+    private List<PathFilterSet> referenceFilterSets = null;
 
     public static final String ATTR_VERSION = "version";
 
@@ -101,7 +104,18 @@ public class DefaultWorkspaceFilter impl
      */
     public void add(PathFilterSet set) {
         nodesFilterSets.add(set);
-        propsFilterSets.add(set);
+        if (referenceFilterSets == null) {
+            referenceFilterSets = new LinkedList<>();
+        }
+        referenceFilterSets.add(set);
+
+        // create corresponding filter set for the properties so that it covers the roots of the node filters
+        for (PathFilterSet s: propsFilterSets) {
+            if (s.getRoot().equals(set.getRoot())) {
+                return;
+            }
+        }
+        propsFilterSets.add(new PathFilterSet(set.getRoot()));
     }
 
     /**
@@ -110,8 +124,33 @@ public class DefaultWorkspaceFilter impl
      * @param propFilter the set of filters to add.
      */
     public void add(PathFilterSet nodeFilter, PathFilterSet propFilter) {
+        if (!nodeFilter.getRoot().equals(propFilter.getRoot())) {
+            throw new IllegalArgumentException("Adding node and property filter sets must have the same root");
+        }
+
         nodesFilterSets.add(nodeFilter);
         propsFilterSets.add(propFilter);
+        if (referenceFilterSets == null) {
+            referenceFilterSets = new LinkedList<>();
+        }
+        PathFilterSet bothFilter = new PathFilterSet(nodeFilter.getRoot());
+        bothFilter.setType(nodeFilter.getType());
+        bothFilter.setImportMode(nodeFilter.getImportMode());
+        bothFilter.addAll(nodeFilter);
+        for (PathFilterSet.Entry<PathFilter> entry: propFilter.getEntries()) {
+            // only handle path filters
+            PathFilter filter = entry.getFilter();
+            if (filter instanceof DefaultPathFilter) {
+                if (entry.isInclude()) {
+                    bothFilter.addInclude(new DefaultPropertyPathFilter(((DefaultPathFilter) filter).getPattern()));
+                } else {
+                    bothFilter.addExclude(new DefaultPropertyPathFilter(((DefaultPathFilter) filter).getPattern()));
+                }
+            } else {
+                throw new IllegalArgumentException("Can only export default path filters, yet.");
+            }
+        }
+        referenceFilterSets.add(bothFilter);
     }
 
     /**
@@ -311,6 +350,9 @@ public class DefaultWorkspaceFilter impl
             if (version > SUPPORTED_VERSION) {
                 throw new ConfigurationException("version " + version + " not supported.");
             }
+            nodesFilterSets.clear();
+            propsFilterSets.clear();
+            referenceFilterSets = new LinkedList<>();
             read(doc);
         } catch (ParserConfigurationException e) {
             throw new ConfigurationException(
@@ -344,17 +386,20 @@ public class DefaultWorkspaceFilter impl
         }
         PathFilterSet nodeFilters = new PathFilterSet(root);
         PathFilterSet propFilters = new PathFilterSet(root);
+        PathFilterSet bothFilters = new PathFilterSet(root);
         // check for import mode
         String mode = elem.getAttribute("mode");
         if (mode != null && mode.length() > 0) {
             ImportMode importMode = ImportMode.valueOf(mode.toUpperCase());
             nodeFilters.setImportMode(importMode);
             propFilters.setImportMode(importMode);
+            bothFilters.setImportMode(importMode);
         }
         String type = elem.getAttribute("type");
         if (type != null && type.length() > 0) {
             nodeFilters.setType(type);
             propFilters.setType(type);
+            bothFilters.setType(type);
         }
 
         // check for filters
@@ -364,23 +409,27 @@ public class DefaultWorkspaceFilter impl
             if (child.getNodeType() == Node.ELEMENT_NODE) {
                 final PathFilter filter = readFilter((Element) child);
                 if ("include".equals(child.getNodeName())) {
-                    propFilters.addInclude(filter);
-                    if (!(filter instanceof DefaultPropertyPathFilter)) {
-                        // also add non property filters to the node filters
+                    if (filter instanceof DefaultPropertyPathFilter) {
+                        propFilters.addInclude(filter);
+                    } else {
                         nodeFilters.addInclude(filter);
                     }
+                    bothFilters.addInclude(filter);
                 } else if ("exclude".equals(child.getNodeName())) {
-                    propFilters.addExclude(filter);
-                    if (!(filter instanceof DefaultPropertyPathFilter)) {
-                        // also add non property filters to the node filters
+                    if (filter instanceof DefaultPropertyPathFilter) {
+                        propFilters.addExclude(filter);
+                    } else {
                         nodeFilters.addExclude(filter);
                     }
+                    bothFilters.addExclude(filter);
                 } else {
                     throw new ConfigurationException("either <include> or <exclude> expected.");
                 }
             }
         }
-        add(nodeFilters, propFilters);
+        nodesFilterSets.add(nodeFilters);
+        propsFilterSets.add(propFilters);
+        referenceFilterSets.add(bothFilters);
     }
 
     protected PathFilter readFilter(Element elem) throws ConfigurationException {
@@ -426,7 +475,11 @@ public class DefaultWorkspaceFilter impl
             AttributesImpl attrs = new AttributesImpl();
             attrs.addAttribute(null, null, ATTR_VERSION, "CDATA", String.valueOf(version));
             ser.startElement(null, null, "workspaceFilter", attrs);
-            for (PathFilterSet set: propsFilterSets) {
+
+            if (referenceFilterSets == null) {
+                referenceFilterSets = new LinkedList<>(nodesFilterSets);
+            }
+            for (PathFilterSet set: referenceFilterSets) {
                 attrs = new AttributesImpl();
                 attrs.addAttribute(null, null, "root", "CDATA", set.getRoot());
                 if (set.getImportMode() != ImportMode.REPLACE) {
@@ -527,7 +580,7 @@ public class DefaultWorkspaceFilter impl
 
     /**
      * internal class to mark the property filter entries. eventually promote to outer class and adjust the 'contains'
-     * code accordingly. But since the filter set are publicly accessible, this would introduce backward compatbility
+     * code accordingly. But since the filter set are publicly accessible, this would introduce backward compatibility
      * issues for code that is reading those directly.
      */
     private static class DefaultPropertyPathFilter extends DefaultPathFilter {

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/filter/WorkspaceFilterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/filter/WorkspaceFilterTest.java?rev=1833972&r1=1833971&r2=1833972&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/filter/WorkspaceFilterTest.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/filter/WorkspaceFilterTest.java Thu Jun 21 02:35:22 2018
@@ -133,7 +133,7 @@ public class WorkspaceFilterTest {
         PathFilterSet propertyFilterSet = propertyFilterSets.get(0);
         assertEquals("/var/foo/bar", propertyFilterSet.getRoot());
         List<FilterSet.Entry<PathFilter>> propertyFilters = propertyFilterSet.getEntries();
-        assertEquals(2, propertyFilters.size());
+        assertEquals(1, propertyFilters.size());
         FilterSet.Entry<PathFilter> propertyFilter = propertyFilters.get(0);
         assertFalse(propertyFilter.isInclude());
     }
@@ -149,4 +149,47 @@ public class WorkspaceFilterTest {
 
         assertEquals("Filter source", expected, filter.getSourceAsString());
     }
+
+    @Test
+    public void testGeneratedSourceFromCode()  {
+        String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                "<workspaceFilter version=\"1.0\">\n" +
+                "    <filter root=\"/tmp\">\n" +
+                "        <include pattern=\"/tmp\"/>\n" +
+                "    </filter>\n" +
+                "</workspaceFilter>\n";
+
+        PathFilterSet props = new PathFilterSet("/tmp");
+        PathFilterSet nodes = new PathFilterSet("/tmp");
+
+        DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
+        nodes.addInclude(new DefaultPathFilter("/tmp"));
+
+        filter.add(nodes, props);
+
+        assertEquals(expected, filter.getSourceAsString());
+
+    }
+
+    @Test
+    public void testGeneratedSourceFromCodeWithProps()  {
+        String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                "<workspaceFilter version=\"1.0\">\n" +
+                "    <filter root=\"/foo\"/>\n" +
+                "    <filter root=\"/tmp\">\n" +
+                "        <exclude pattern=\"/tmp/foo/p.*\" matchProperties=\"true\"/>\n" +
+                "    </filter>\n" +
+                "</workspaceFilter>\n";
+
+        PathFilterSet properties = new PathFilterSet("/tmp");
+        properties.addExclude(new DefaultPathFilter("/tmp/foo/p.*"));
+
+        DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
+        filter.add(new PathFilterSet("/foo"));
+        filter.add(new PathFilterSet("/tmp"), properties);
+
+        assertEquals(expected, filter.getSourceAsString());
+
+    }
+
 }
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFilteredPropertyExport.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFilteredPropertyExport.java?rev=1833972&r1=1833971&r2=1833972&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFilteredPropertyExport.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFilteredPropertyExport.java Thu Jun 21 02:35:22 2018
@@ -156,7 +156,7 @@ public class TestFilteredPropertyExport
     }
 
     @Test
-    public void filterPropertyWithTwoRoots_deprecated() throws IOException, RepositoryException, PackageException {
+    public void filterPropertyWithTwoRoots() throws IOException, RepositoryException, PackageException {
         PathFilterSet properties = new PathFilterSet("/tmp");
         properties.addExclude(new DefaultPathFilter("/tmp/foo/p.*"));
 
@@ -175,7 +175,7 @@ public class TestFilteredPropertyExport
     }
 
     @Test
-    public void filterPropertyWithTwoRoots() throws IOException, RepositoryException, PackageException {
+    public void filterPropertyWithTwoRoots_deprecated() throws IOException, RepositoryException, PackageException {
 
         DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
         filter.add(new PathFilterSet("/foo"));
@@ -316,6 +316,47 @@ public class TestFilteredPropertyExport
         assertNodeMissing("/tmp/foo/bar");
     }
 
+    @Test
+    public void filterRelativePropertiesSingleSet_NotDeep_no_propertyFilter_addNodes() throws IOException, RepositoryException, PackageException {
+        PathFilterSet nodes = new PathFilterSet("/tmp");
+
+        DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
+        nodes.addInclude(new DefaultPathFilter("/tmp"));
+
+        filter.add(nodes);
+
+        // export and extract
+        File pkgFile = assemblePackage(filter);
+        clean("/tmp");
+        packMgr.open(pkgFile).extract(admin, getDefaultOptions());
+        // validate the extracted content
+        assertPropertiesExist("/tmp", "p1", "p2", "p3");
+        assertNodeMissing("/tmp/foo");
+        assertNodeMissing("/tmp/foo/bar");
+    }
+
+    @Test
+    public void filterRelativePropertiesSingleSet_NotDeep_with_xml() throws IOException, RepositoryException, PackageException, ConfigurationException {
+        String src = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                "<workspaceFilter version=\"1.0\">\n" +
+                "    <filter root=\"/tmp\">\n" +
+                "        <include pattern=\"/tmp\"/>\n" +
+                "    </filter>\n" +
+                "</workspaceFilter>\n";
+
+        DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
+        filter.load(new ByteArrayInputStream(src.getBytes("utf-8")));
+
+        // export and extract
+        File pkgFile = assemblePackage(filter);
+        clean("/tmp");
+        packMgr.open(pkgFile).extract(admin, getDefaultOptions());
+        // validate the extracted content
+        assertPropertiesExist("/tmp", "p1", "p2", "p3");
+        assertNodeMissing("/tmp/foo");
+        assertNodeMissing("/tmp/foo/bar");
+    }
+
     /**
      * Setup the path /tmp/foo/bar with properties set at each level
      */
@@ -338,7 +379,7 @@ public class TestFilteredPropertyExport
     private File assemblePackage(WorkspaceFilter filter)
             throws IOException, RepositoryException {
 
-        File tmpFile = File.createTempFile("vaulttest", "zip");
+        File tmpFile = File.createTempFile("vaulttest", ".zip");
 
         ExportOptions options = new ExportOptions();
         DefaultMetaInf meta = new DefaultMetaInf();