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