diff --git vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/WorkspaceFilter.java vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/WorkspaceFilter.java
index a1c27cd..a338970 100644
--- vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/WorkspaceFilter.java
+++ vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/WorkspaceFilter.java
@@ -25,25 +25,33 @@ import javax.jcr.RepositoryException;
import javax.jcr.Session;
/**
- * WorkspaceFilter...
+ * WorkspaceFilter defined a filter for items (node or property).
*/
public interface WorkspaceFilter extends Dumpable {
/**
- * Returns a list of path filter sets.
+ * Returns a list of path filter sets for node items.
* @return the list of path filter sets.
*/
List getFilterSets();
/**
- * Returns the filter set that covers the respective path
+ * Returns a list of path filter sets for node or property items.
+ * @param applyToNodes true in order to get the list of path filters for nodes,
+ * false in order to get the list of path filters for properties.
+ * @return the list of path filter sets.
+ */
+ List getFilterSets(boolean applyToNodes);
+
+ /**
+ * Returns the filter set that covers the respective node path
* @param path the path
* @return the filter set or null
*/
PathFilterSet getCoveringFilterSet(String path);
/**
- * Returns the import mode for the given path.
+ * Returns the import mode for the given node path.
* @param path path to check
* @return the import mode or {@link ImportMode#REPLACE} if the given path
* is not covered by this filter.
@@ -51,7 +59,7 @@ public interface WorkspaceFilter extends Dumpable {
ImportMode getImportMode(String path);
/**
- * Checks if the given path is contained in this workspace filter.
+ * Checks if the given node path is contained in this workspace filter.
* It returns true if any of the filter sets contain the path
* and it's not globally ignored.
*
@@ -61,7 +69,7 @@ public interface WorkspaceFilter extends Dumpable {
boolean contains(String path);
/**
- * Checks if the given path is covered in this workspace filter.
+ * Checks if the given node path is covered in this workspace filter.
* It only returns true if at least one of the sets covers
* the path and is not globally ignored.
*
@@ -71,7 +79,7 @@ public interface WorkspaceFilter extends Dumpable {
boolean covers(String path);
/**
- * Checks if the given path is an ancestor of any of the filter sets.
+ * Checks if the given node path is an ancestor of any of the filter sets.
*
* @param path the item to check
* @return true if the given item is an ancestor
@@ -79,7 +87,7 @@ public interface WorkspaceFilter extends Dumpable {
boolean isAncestor(String path);
/**
- * Checks if the given path is globally ignored.
+ * Checks if the given node path is globally ignored.
*
* @param path the path to check.
* @return true if the item is globally ignored.
diff --git vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java
index 46f036f..2bc4b61 100644
--- vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java
+++ vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java
@@ -73,7 +73,9 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
*/
private static final Logger log = LoggerFactory.getLogger(DefaultWorkspaceFilter.class);
- private final List filterSets = new LinkedList();
+ private final List nodesFilterSets = new LinkedList();
+
+ private final List propsFilterSets = new LinkedList();
public static final String ATTR_VERSION = "version";
@@ -93,15 +95,40 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
*/
private ImportMode importMode;
+ /**
+ * Add a #PathFilterSet for nodes.
+ * @param set the set of filters to add.
+ */
public void add(PathFilterSet set) {
- filterSets.add(set);
+ add(set, true);
+ }
+
+ /**
+ * Add a #PathFilterSet for properties.
+ * @param set the set of filters to add.
+ * @param applyToNodes true if the filters apply to nodes,
+ * false if the filters apply to items.
+ */
+ public void add(PathFilterSet set, boolean applyToNodes) {
+ if (applyToNodes) {
+ nodesFilterSets.add(set);
+ } else {
+ propsFilterSets.add(set);
+ }
}
/**
* {@inheritDoc}
*/
public List getFilterSets() {
- return filterSets;
+ return nodesFilterSets;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public List getFilterSets(boolean applyToNodes) {
+ return (applyToNodes) ? nodesFilterSets : propsFilterSets;
}
/**
@@ -111,7 +138,7 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
if (isGloballyIgnored(path)) {
return null;
}
- for (PathFilterSet set: filterSets) {
+ for (PathFilterSet set: nodesFilterSets) {
if (set.covers(path)) {
return set;
}
@@ -141,7 +168,7 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
if (isGloballyIgnored(path)) {
return false;
}
- for (PathFilterSet set: filterSets) {
+ for (PathFilterSet set: nodesFilterSets) {
if (set.contains(path)) {
return true;
}
@@ -156,7 +183,7 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
if (isGloballyIgnored(path)) {
return false;
}
- for (PathFilterSet set: filterSets) {
+ for (PathFilterSet set: nodesFilterSets) {
if (set.covers(path)) {
return true;
}
@@ -168,7 +195,7 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
* {@inheritDoc}
*/
public boolean isAncestor(String path) {
- for (PathFilterSet set: filterSets) {
+ for (PathFilterSet set: nodesFilterSets) {
if (set.isAncestor(path)) {
return true;
}
@@ -194,9 +221,12 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
if (globalIgnored != null) {
mapped.setGlobalIgnored(globalIgnored.translate(mapping));
}
- for (PathFilterSet set: filterSets) {
+ for (PathFilterSet set: nodesFilterSets) {
mapped.add(set.translate(mapping));
}
+ for (PathFilterSet set: propsFilterSets) {
+ mapped.add(set.translate(mapping), false);
+ }
return mapped;
}
@@ -284,35 +314,41 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
if (!"filter".equals(child.getNodeName())) {
throw new ConfigurationException(" expected.");
}
- PathFilterSet def = readDef((Element) child);
- filterSets.add(def);
+ readDef((Element) child);
}
}
}
- private PathFilterSet readDef(Element elem) throws ConfigurationException {
+ private void readDef(Element elem) throws ConfigurationException {
String root = elem.getAttribute("root");
- PathFilterSet def = new PathFilterSet(root == null || root.length() == 0 ? "/" : root);
+ PathFilterSet nodeFilters = new PathFilterSet(root == null || root.length() == 0 ? "/" : root);
+ PathFilterSet propFilters = new PathFilterSet();
// check for import mode
String mode = elem.getAttribute("mode");
if (mode != null && mode.length() > 0) {
- def.setImportMode(ImportMode.valueOf(mode.toUpperCase()));
+ ImportMode importMode = ImportMode.valueOf(mode.toUpperCase());
+ nodeFilters.setImportMode(importMode);
+ propFilters.setImportMode(importMode);
}
// check for filters
NodeList n1 = elem.getChildNodes();
for (int i=0; i or expected.");
}
}
}
- return def;
+ add(nodeFilters, true);
+ add(propFilters, false);
}
protected PathFilter readFilter(Element elem) throws ConfigurationException {
@@ -327,7 +363,7 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
* {@inheritDoc}
*/
public void dump(DumpContext ctx, boolean isLast) {
- Iterator iter = filterSets.iterator();
+ Iterator iter = nodesFilterSets.iterator();
while (iter.hasNext()) {
PathFilterSet set = iter.next();
ctx.println(!iter.hasNext(), "ItemFilterSet");
@@ -354,7 +390,7 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
AttributesImpl attrs = new AttributesImpl();
attrs.addAttribute(null, null, ATTR_VERSION, "CDATA", String.valueOf(version));
ser.startElement(null, null, "workspaceFilter", attrs);
- for (PathFilterSet set: filterSets) {
+ for (PathFilterSet set: nodesFilterSets) {
attrs = new AttributesImpl();
attrs.addAttribute(null, null, "root", "CDATA", set.getRoot());
if (set.getImportMode() != ImportMode.REPLACE) {
@@ -411,7 +447,7 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
ProgressTracker tracker = new ProgressTracker(listener);
// get common ancestor
Tree tree = new Tree();
- for (PathFilterSet set: filterSets) {
+ for (PathFilterSet set: nodesFilterSets) {
tree.put(set.getRoot(), set);
}
String rootPath = tree.getRootPath();
diff --git vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/AggregateImpl.java vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/AggregateImpl.java
index d70da46..fea7464 100644
--- vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/AggregateImpl.java
+++ vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/AggregateImpl.java
@@ -572,6 +572,15 @@ public class AggregateImpl implements Aggregate {
}
}
+ private boolean includeProperty(String propertyPath) {
+ for (PathFilterSet filterSet : mgr.getWorkspaceFilter().getFilterSets(false)) {
+ if (filterSet.contains(propertyPath)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private void addNamespace(Set prefixes, String name) throws RepositoryException {
int idx = name.indexOf(':');
if (idx > 0) {
@@ -676,7 +685,7 @@ public class AggregateImpl implements Aggregate {
while (pIter.hasNext()) {
Property p = pIter.nextProperty();
String path = p.getPath();
- if (aggregator.includes(getNode(), node, p, path)) {
+ if (aggregator.includes(getNode(), node, p, path) && includeProperty(path)) {
include(node, p, path);
}
}