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();