Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/AbstractDecoratedNodeState.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/AbstractDecoratedNodeState.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/AbstractDecoratedNodeState.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/AbstractDecoratedNodeState.java Tue Nov 21 08:33:10 2017 @@ -24,7 +24,6 @@ import org.apache.jackrabbit.oak.api.Typ import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState; import org.apache.jackrabbit.oak.plugins.memory.MemoryChildNodeEntry; import org.apache.jackrabbit.oak.plugins.memory.PropertyStates; -import org.apache.jackrabbit.oak.plugins.tree.impl.TreeConstants; import org.apache.jackrabbit.oak.spi.state.AbstractNodeState; import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; @@ -37,6 +36,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import static com.google.common.base.Predicates.notNull; import static org.apache.jackrabbit.oak.plugins.tree.impl.TreeConstants.OAK_CHILD_ORDER; @@ -49,6 +49,10 @@ public abstract class AbstractDecoratedN this.delegate = delegate; } + public NodeState getDelegate() { + return delegate; + } + protected boolean hideChild(@Nonnull final String name, @Nonnull final NodeState delegateChild) { return false; } @@ -65,6 +69,11 @@ public abstract class AbstractDecoratedN return false; } + @Nonnull + protected Iterable<PropertyState> getNewPropertyStates() { + return Collections.emptyList(); + } + @CheckForNull protected abstract PropertyState decorateProperty(@Nonnull final PropertyState delegatePropertyState); @@ -150,7 +159,16 @@ public abstract class AbstractDecoratedN @Override @CheckForNull public PropertyState getProperty(@Nonnull String name) { - return decorate(delegate.getProperty(name)); + PropertyState ps = decorate(delegate.getProperty(name)); + if (ps == null) { + for (PropertyState p : getNewPropertyStates()) { + if (name.equals(p.getName())) { + ps = p; + break; + } + } + } + return ps; } @Override @@ -166,7 +184,7 @@ public abstract class AbstractDecoratedN } } ); - return Iterables.filter(propertyStates, notNull()); + return Iterables.filter(Iterables.concat(propertyStates, getNewPropertyStates()), notNull()); } /**
Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeState.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeState.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeState.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeState.java Tue Nov 21 08:33:10 2017 @@ -67,6 +67,10 @@ public class FilteringNodeState extends private final Set<String> excludedPaths; + private final Set<String> fragmentPaths; + + private final Set<String> excludedFragments; + /** * Factory method that conditionally decorates the given node-state * iff the node-state is (a) hidden itself or (b) has hidden descendants. @@ -75,6 +79,8 @@ public class FilteringNodeState extends * @param delegate The node-state to decorate. * @param includePaths A Set of paths that should be visible. Defaults to ["/"] if {@code null}. * @param excludePaths A Set of paths that should be hidden. Empty if {@code null}. + * @param fragmentPaths A Set of paths that should support the fragments (see below). Empty if {@code null}. + * @param excludedFragments A Set of name fragments that should be hidden. Empty if {@code null}. * @return The decorated node-state if required, the original node-state if decoration is unnecessary. */ @Nonnull @@ -82,12 +88,16 @@ public class FilteringNodeState extends @Nonnull final String path, @Nonnull final NodeState delegate, @Nullable final Set<String> includePaths, - @Nullable final Set<String> excludePaths + @Nullable final Set<String> excludePaths, + @Nullable final Set<String> fragmentPaths, + @Nullable final Set<String> excludedFragments ) { final Set<String> includes = defaultIfEmpty(includePaths, ALL); final Set<String> excludes = defaultIfEmpty(excludePaths, NONE); - if (hasHiddenDescendants(path, includes, excludes)) { - return new FilteringNodeState(path, delegate, includes, excludes); + final Set<String> safeFragmentPaths = defaultIfEmpty(fragmentPaths, NONE); + final Set<String> safeExcludedFragments = defaultIfEmpty(excludedFragments, NONE); + if (hasHiddenDescendants(path, includes, excludes, safeFragmentPaths, safeExcludedFragments)) { + return new FilteringNodeState(path, delegate, includes, excludes, fragmentPaths, safeExcludedFragments); } return delegate; } @@ -96,24 +106,28 @@ public class FilteringNodeState extends @Nonnull final String path, @Nonnull final NodeState delegate, @Nonnull final Set<String> includedPaths, - @Nonnull final Set<String> excludedPaths + @Nonnull final Set<String> excludedPaths, + @Nonnull final Set<String> fragmentPaths, + @Nonnull final Set<String> excludedFragments ) { super(delegate); this.path = path; this.includedPaths = includedPaths; this.excludedPaths = excludedPaths; + this.fragmentPaths = fragmentPaths; + this.excludedFragments = excludedFragments; } @Nonnull @Override protected NodeState decorateChild(@Nonnull final String name, @Nonnull final NodeState child) { final String childPath = PathUtils.concat(path, name); - return wrap(childPath, child, includedPaths, excludedPaths); + return wrap(childPath, child, includedPaths, excludedPaths, fragmentPaths, excludedFragments); } @Override protected boolean hideChild(@Nonnull final String name, @Nonnull final NodeState delegateChild) { - return isHidden(PathUtils.concat(path, name), includedPaths, excludedPaths); + return isHidden(PathUtils.concat(path, name), includedPaths, excludedPaths, excludedFragments); } @Override @@ -128,14 +142,16 @@ public class FilteringNodeState extends * @param path Path to be checked * @param includes Include paths * @param excludes Exclude paths + * @param excludedFragments Exclude fragments * @return Whether the {@code path} is hidden or not. */ private static boolean isHidden( @Nonnull final String path, @Nonnull final Set<String> includes, - @Nonnull final Set<String> excludes + @Nonnull final Set<String> excludes, + @Nonnull final Set<String> excludedFragments ) { - return isExcluded(path, excludes) || !isIncluded(path, includes); + return isExcluded(path, excludes, excludedFragments) || !isIncluded(path, includes); } /** @@ -145,14 +161,20 @@ public class FilteringNodeState extends * @param path Path to be checked * @param includePaths Include paths * @param excludePaths Exclude paths + * @param excludedFragments Exclude fragments * @return Whether the {@code path} or any of its descendants are hidden or not. */ private static boolean hasHiddenDescendants( @Nonnull final String path, @Nonnull final Set<String> includePaths, - @Nonnull final Set<String> excludePaths + @Nonnull final Set<String> excludePaths, + @Nonnull final Set<String> fragmentPaths, + @Nonnull final Set<String> excludedFragments ) { - return isHidden(path, includePaths, excludePaths) + return isHidden(path, includePaths, excludePaths, excludedFragments) + || isAncestorOfAnyPath(path, fragmentPaths) + || isDescendantOfAnyPath(path, fragmentPaths) + || fragmentPaths.contains(path) || isAncestorOfAnyPath(path, excludePaths) || isAncestorOfAnyPath(path, includePaths); } @@ -181,10 +203,11 @@ public class FilteringNodeState extends * * @param path Path to be checked * @param excludePaths Exclude paths + * @param excludedFragments Exclude fragments * @return Whether the path is covered by the excldue paths or not. */ - private static boolean isExcluded(@Nonnull final String path, @Nonnull final Set<String> excludePaths) { - return excludePaths.contains(path) || isDescendantOfAnyPath(path, excludePaths); + private static boolean isExcluded(@Nonnull final String path, @Nonnull final Set<String> excludePaths, @Nonnull final Set<String> excludedFragments) { + return excludePaths.contains(path) || isDescendantOfAnyPath(path, excludePaths) || containsAnyFragment(path, excludedFragments); } /** @@ -218,6 +241,22 @@ public class FilteringNodeState extends return true; } } + return false; + } + + /** + * Utility method to check whether the passed path contains any of the provided {@code fragments}. + * + * @param path Path + * @param fragments Fragments, which the path may contain + * @return true if {@code path} contains any of the {@code fragments}, false otherwise. + */ + private static boolean containsAnyFragment(@Nonnull final String path, @Nonnull final Set<String> fragments) { + for (final String f : fragments) { + if (path.contains(f)) { + return true; + } + } return false; } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java Tue Nov 21 08:33:10 2017 @@ -18,7 +18,6 @@ package org.apache.jackrabbit.oak.upgrad import com.google.common.base.Charsets; import org.apache.jackrabbit.oak.api.PropertyState; -import org.apache.jackrabbit.oak.plugins.document.util.Utils; import org.apache.jackrabbit.oak.spi.state.NodeState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,7 +69,7 @@ public class NameFilteringNodeState exte * * @param name * to check - * @return true if the name is longer than {@link Utils#NODE_NAME_LIMIT} + * @return true if the name is longer than {@code org.apache.jackrabbit.oak.plugins.document.util.Utils#NODE_NAME_LIMIT} */ public static boolean isNameTooLong(@Nonnull String name) { // OAK-1589: maximum supported length of name for DocumentNodeStore Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NodeStateCopier.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NodeStateCopier.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NodeStateCopier.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NodeStateCopier.java Tue Nov 21 08:33:10 2017 @@ -65,6 +65,9 @@ import static java.util.Collections.empt * <b>Exclude paths:</b> if exclude paths are set, any nodes matching * or below the excluded path are not copied. If an excluded node does * exist in the target, it is removed (see also merge paths). + * <b>Exclude fragments:</b> if exclude fragments are set, nodes with names + * matching any of the fragments (and their subtrees) are not copied. If an + * excluded node does exist in the target, it is removed. * <b>Merge paths:</b> if merge paths are set, any nodes matching or * below the merged path will not be deleted from target, even if they * are missing in (or excluded from) the source. @@ -77,11 +80,17 @@ public class NodeStateCopier { private final Set<String> excludePaths; + private final Set<String> fragmentPaths; + + private final Set<String> excludeFragments; + private final Set<String> mergePaths; - private NodeStateCopier(Set<String> includePaths, Set<String> excludePaths, Set<String> mergePaths) { + private NodeStateCopier(Set<String> includePaths, Set<String> excludePaths, Set<String> fragmentPaths, Set<String> excludeFragments, Set<String> mergePaths) { this.includePaths = includePaths; this.excludePaths = excludePaths; + this.fragmentPaths = fragmentPaths; + this.excludeFragments = excludeFragments; this.mergePaths = mergePaths; } @@ -89,7 +98,7 @@ public class NodeStateCopier { * Create a NodeStateCopier.Builder. * * @return a NodeStateCopier.Builder - * @see org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier.Builder + * @see NodeStateCopier.Builder */ public static Builder builder() { return new Builder(); @@ -103,7 +112,7 @@ public class NodeStateCopier { * @param target NodeStore to copy to. * @return true if the target has been modified * @throws CommitFailedException if the operation fails - * @see org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier.Builder#copy(NodeStore, NodeStore) + * @see NodeStateCopier.Builder#copy(NodeStore, NodeStore) */ public static boolean copyNodeStore(@Nonnull final NodeStore source, @Nonnull final NodeStore target) throws CommitFailedException { @@ -141,7 +150,7 @@ public class NodeStateCopier { } private boolean copyNodeState(@Nonnull final NodeState sourceRoot, @Nonnull final NodeBuilder targetRoot) { - final NodeState wrappedSource = FilteringNodeState.wrap("/", sourceRoot, this.includePaths, this.excludePaths); + final NodeState wrappedSource = FilteringNodeState.wrap("/", sourceRoot, this.includePaths, this.excludePaths, this.fragmentPaths, this.excludeFragments); boolean hasChanges = false; for (String includePath : this.includePaths) { hasChanges = copyMissingAncestors(sourceRoot, targetRoot, includePath) || hasChanges; @@ -294,6 +303,10 @@ public class NodeStateCopier { private Set<String> excludePaths = emptySet(); + private Set<String> fragmentPaths = emptySet(); + + private Set<String> excludeFragments = emptySet(); + private Set<String> mergePaths = emptySet(); private Builder() {} @@ -304,7 +317,7 @@ public class NodeStateCopier { * * @param paths include paths * @return this Builder instance - * @see NodeStateCopier#NodeStateCopier(Set, Set, Set) + * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set) */ @Nonnull public Builder include(@Nonnull Set<String> paths) { @@ -319,7 +332,7 @@ public class NodeStateCopier { * * @param paths include paths * @return this Builder instance - * @see NodeStateCopier#NodeStateCopier(Set, Set, Set) + * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set) */ @Nonnull public Builder include(@Nonnull String... paths) { @@ -331,7 +344,7 @@ public class NodeStateCopier { * * @param paths exclude paths * @return this Builder instance - * @see NodeStateCopier#NodeStateCopier(Set, Set, Set) + * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set) */ @Nonnull public Builder exclude(@Nonnull Set<String> paths) { @@ -346,7 +359,7 @@ public class NodeStateCopier { * * @param paths exclude paths * @return this Builder instance - * @see NodeStateCopier#NodeStateCopier(Set, Set, Set) + * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set) */ @Nonnull public Builder exclude(@Nonnull String... paths) { @@ -354,11 +367,65 @@ public class NodeStateCopier { } /** + * Set fragment paths. + * + * @param paths fragment paths + * @return this Builder instance + * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set) + */ + @Nonnull + public Builder supportFragment(@Nonnull Set<String> paths) { + if (!checkNotNull(paths).isEmpty()) { + this.fragmentPaths = copyOf(paths); + } + return this; + } + + /** + * Convenience wrapper for {@link #supportFragment(Set)}. + * + * @param paths fragment paths + * @return this Builder instance + * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set) + */ + @Nonnull + public Builder supportFragment(@Nonnull String... paths) { + return supportFragment(copyOf(checkNotNull(paths))); + } + + /** + * Set exclude fragments. + * + * @param fragments exclude fragments + * @return this Builder instance + * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set) + */ + @Nonnull + public Builder excludeFragments(@Nonnull Set<String> fragments) { + if (!checkNotNull(fragments).isEmpty()) { + this.excludeFragments = copyOf(fragments); + } + return this; + } + + /** + * Convenience wrapper for {@link #exclude(Set)}. + * + * @param fragments exclude fragments + * @return this Builder instance + * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set) + */ + @Nonnull + public Builder excludeFragments(@Nonnull String... fragments) { + return exclude(copyOf(checkNotNull(fragments))); + } + + /** * Set merge paths. * * @param paths merge paths * @return this Builder instance - * @see NodeStateCopier#NodeStateCopier(Set, Set, Set) + * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set) */ @Nonnull public Builder merge(@Nonnull Set<String> paths) { @@ -373,7 +440,7 @@ public class NodeStateCopier { * * @param paths merge paths * @return this Builder instance - * @see NodeStateCopier#NodeStateCopier(Set, Set, Set) + * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set) */ @Nonnull public Builder merge(@Nonnull String... paths) { @@ -394,7 +461,7 @@ public class NodeStateCopier { * the same content */ public boolean copy(@Nonnull final NodeState sourceRoot, @Nonnull final NodeBuilder targetRoot) { - final NodeStateCopier copier = new NodeStateCopier(includePaths, excludePaths, mergePaths); + final NodeStateCopier copier = new NodeStateCopier(includePaths, excludePaths, fragmentPaths, excludeFragments, mergePaths); return copier.copyNodeState(checkNotNull(sourceRoot), checkNotNull(targetRoot)); } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java Tue Nov 21 08:33:10 2017 @@ -18,6 +18,7 @@ */ package org.apache.jackrabbit.oak.upgrade.nodestate.report; +import com.google.common.collect.EvictingQueue; import org.apache.jackrabbit.oak.commons.PathUtils; import org.slf4j.Logger; @@ -34,6 +35,8 @@ public class LoggingReporter extends Per private final String verb; + private final EvictingQueue lastPaths = EvictingQueue.create(100); + /** * Constructor that allows setting the intervals to log node and property * accesses to a given logger. @@ -72,4 +75,14 @@ public class LoggingReporter extends Per protected void reportPeriodicProperty(final long count, @Nonnull final ReportingNodeState parent, @Nonnull final String propertyName) { logger.info("{} properties #{}: {}", verb, count, PathUtils.concat(parent.getPath(), propertyName)); } -} + + protected boolean skipNodeState(@Nonnull final ReportingNodeState nodeState) { + String path = nodeState.getPath(); + if (lastPaths.contains(path)) { + return true; + } else { + lastPaths.add(path); + return false; + } + } +} \ No newline at end of file Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java Tue Nov 21 08:33:10 2017 @@ -68,12 +68,21 @@ public abstract class PeriodicReporter i protected abstract void reportPeriodicProperty( final long count, @Nonnull final ReportingNodeState parent, @Nonnull final String propertyName); + + protected boolean skipNodeState(@Nonnull final ReportingNodeState nodeState) { + return false; + } + @Override public final void reportNode(@Nonnull final ReportingNodeState nodeState) { if (nodeLogInterval == -1) { return; } + if (skipNodeState(nodeState)) { + return; + } + final long count = nodes.incrementAndGet(); if (count % nodeLogInterval == 0) { reportPeriodicNode(count, nodeState); Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java Tue Nov 21 08:33:10 2017 @@ -16,24 +16,20 @@ */ package org.apache.jackrabbit.oak.upgrade.version; -import static org.apache.jackrabbit.JcrConstants.JCR_CREATED; import static org.apache.jackrabbit.JcrConstants.NT_VERSION; import java.util.Calendar; import java.util.Iterator; -import org.apache.jackrabbit.oak.api.Type; import org.apache.jackrabbit.oak.plugins.nodetype.TypePredicate; -import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeState; import org.apache.jackrabbit.oak.upgrade.DescendantsIterator; import org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier; -import org.apache.jackrabbit.util.ISO8601; import static org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_STORE_PATH; - import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getRelativeVersionHistoryPath; +import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryLastModified; import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryNodeState; /** @@ -94,21 +90,4 @@ public class VersionCopier { return false; } - private Calendar getVersionHistoryLastModified(final NodeState versionHistory) { - Calendar youngest = Calendar.getInstance(); - youngest.setTimeInMillis(0); - for (final ChildNodeEntry entry : versionHistory.getChildNodeEntries()) { - final NodeState version = entry.getNodeState(); - if (!isVersion.apply(version)) { - continue; - } - if (version.hasProperty(JCR_CREATED)) { - final Calendar created = ISO8601.parse(version.getProperty(JCR_CREATED).getValue(Type.DATE)); - if (created.after(youngest)) { - youngest = created; - } - } - } - return youngest; - } } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java Tue Nov 21 08:33:10 2017 @@ -16,24 +16,46 @@ */ package org.apache.jackrabbit.oak.upgrade.version; +import static com.google.common.collect.ImmutableSet.of; import static com.google.common.collect.Iterables.concat; +import static com.google.common.collect.Sets.newHashSet; import static java.util.Collections.singleton; +import static org.apache.jackrabbit.JcrConstants.JCR_BASEVERSION; +import static org.apache.jackrabbit.JcrConstants.JCR_CREATED; +import static org.apache.jackrabbit.JcrConstants.JCR_ISCHECKEDOUT; +import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES; +import static org.apache.jackrabbit.JcrConstants.JCR_PREDECESSORS; import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE; import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM; +import static org.apache.jackrabbit.JcrConstants.JCR_UUID; +import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONHISTORY; import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONSTORAGE; +import static org.apache.jackrabbit.JcrConstants.MIX_REFERENCEABLE; +import static org.apache.jackrabbit.JcrConstants.MIX_VERSIONABLE; +import static org.apache.jackrabbit.oak.plugins.memory.MultiGenericPropertyState.nameProperty; import static org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_VERSIONSTORAGE; import java.util.ArrayList; +import java.util.Calendar; import java.util.List; +import java.util.Set; import org.apache.jackrabbit.oak.api.Type; +import org.apache.jackrabbit.oak.commons.PathUtils; +import org.apache.jackrabbit.oak.plugins.nodetype.TypePredicate; +import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeState; import com.google.common.base.Joiner; +import org.apache.jackrabbit.util.ISO8601; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class VersionHistoryUtil { + private static final Logger LOG = LoggerFactory.getLogger(VersionHistoryUtil.class); + public static String getRelativeVersionHistoryPath(String versionableUuid) { return Joiner.on('/').join(concat( singleton(""), @@ -44,7 +66,7 @@ public class VersionHistoryUtil { /** * Constructs the version history path based on the versionable's UUID. * - * @param root The root NodeState below which to look for the version. + * @param versionStorage below which to look for the version. * @param versionableUuid The String representation of the versionable's UUID. * @return The NodeState corresponding to the version history, or {@code null} * if it does not exist. @@ -57,7 +79,7 @@ public class VersionHistoryUtil { return historyParent.getChildNode(versionableUuid); } - static NodeBuilder getVersionHistoryBuilder(NodeBuilder versionStorage, String versionableUuid) { + public static NodeBuilder getVersionHistoryBuilder(NodeBuilder versionStorage, String versionableUuid) { NodeBuilder history = versionStorage; for (String segment : getRelativeVersionHistoryPathSegments(versionableUuid)) { history = history.getChildNode(segment); @@ -89,4 +111,108 @@ public class VersionHistoryUtil { return vs; } + public static List<String> getVersionableNodes(NodeState root, TypePredicate isVersionable, Calendar olderThan) { + List<String> paths = new ArrayList<>(); + NodeState versionStorage = getVersionStorage(root); + getVersionableNodes(root, versionStorage, isVersionable, olderThan, PathUtils.ROOT_PATH, paths); + return paths; + } + + + private static void getVersionableNodes(NodeState node, NodeState versionStorage, TypePredicate isVersionable, Calendar olderThan, String path, List<String> paths) { + if (isVersionable.apply(node)) { + if (olderThan == null) { + paths.add(path); + } else { + NodeState versionHistory = getVersionHistoryNodeState(versionStorage, node.getString(JCR_UUID)); + Calendar lastModified = getVersionHistoryLastModified(versionHistory); + if (lastModified.before(olderThan)) { + paths.add(path); + } + } + } + for (ChildNodeEntry c : node.getChildNodeEntries()) { + getVersionableNodes(c.getNodeState(), versionStorage, isVersionable, olderThan, PathUtils.concat(path, c.getName()), paths); + } + } + + public static Calendar getVersionHistoryLastModified(NodeState versionHistory) { + Calendar youngest = Calendar.getInstance(); + youngest.setTimeInMillis(0); + for (final ChildNodeEntry entry : versionHistory.getChildNodeEntries()) { + final NodeState version = entry.getNodeState(); + if (version.hasProperty(JCR_CREATED)) { + final Calendar created = ISO8601.parse(version.getProperty(JCR_CREATED).getValue(Type.DATE)); + if (created.after(youngest)) { + youngest = created; + } + } + } + return youngest; + } + + public static void removeVersionProperties(NodeBuilder versionableBuilder, TypePredicate isReferenceable) { + assert versionableBuilder.exists(); + + removeMixin(versionableBuilder, MIX_VERSIONABLE); + + // we don't know if the UUID is otherwise referenced, + // so make sure the node remains referencable + if (!isReferenceable.apply(versionableBuilder.getNodeState())) { + addMixin(versionableBuilder, MIX_REFERENCEABLE); + } + + versionableBuilder.removeProperty(JCR_VERSIONHISTORY); + versionableBuilder.removeProperty(JCR_PREDECESSORS); + versionableBuilder.removeProperty(JCR_BASEVERSION); + versionableBuilder.removeProperty(JCR_ISCHECKEDOUT); + } + + static void addMixin(NodeBuilder builder, String name) { + if (builder.hasProperty(JCR_MIXINTYPES)) { + final Set<String> mixins = newHashSet(builder.getProperty(JCR_MIXINTYPES).getValue(Type.NAMES)); + if (mixins.add(name)) { + builder.setProperty(nameProperty(JCR_MIXINTYPES, mixins)); + } + } else { + builder.setProperty(nameProperty(JCR_MIXINTYPES, of(name))); + } + } + + private static void removeMixin(NodeBuilder builder, String name) { + if (builder.hasProperty(JCR_MIXINTYPES)) { + final Set<String> mixins = newHashSet(builder.getProperty(JCR_MIXINTYPES).getValue(Type.NAMES)); + if (mixins.remove(name)) { + if (mixins.isEmpty()) { + builder.removeProperty(JCR_MIXINTYPES); + } else { + builder.setProperty(nameProperty(JCR_MIXINTYPES, mixins)); + } + } + } + } + + public static NodeBuilder removeVersions(NodeState root, + List<String> toRemove) { + NodeBuilder rootBuilder = root.builder(); + TypePredicate isReferenceable = new TypePredicate(root, MIX_REFERENCEABLE); + NodeBuilder versionStorage = getVersionStorage(rootBuilder); + for (String p : toRemove) { + LOG.info("Removing version history for {}", p); + NodeBuilder b = getBuilder(rootBuilder, p); + String uuid = b.getString(JCR_UUID); + VersionHistoryUtil.removeVersionProperties(b, isReferenceable); + getVersionHistoryBuilder(versionStorage, uuid).remove(); + } + return rootBuilder; + } + + private static NodeBuilder getBuilder(NodeBuilder root, String path) { + NodeBuilder builder = root; + for (String e : PathUtils.elements(path)) { + builder = builder.child(e); + } + return builder; + } + } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java Tue Nov 21 08:33:10 2017 @@ -34,20 +34,14 @@ import java.util.Collections; import java.util.Set; import static com.google.common.collect.ImmutableSet.of; -import static com.google.common.collect.Sets.newHashSet; -import static org.apache.jackrabbit.JcrConstants.JCR_BASEVERSION; -import static org.apache.jackrabbit.JcrConstants.JCR_ISCHECKEDOUT; -import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES; -import static org.apache.jackrabbit.JcrConstants.JCR_PREDECESSORS; import static org.apache.jackrabbit.JcrConstants.JCR_UUID; -import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONHISTORY; import static org.apache.jackrabbit.JcrConstants.MIX_REFERENCEABLE; import static org.apache.jackrabbit.JcrConstants.MIX_VERSIONABLE; -import static org.apache.jackrabbit.oak.plugins.memory.MultiGenericPropertyState.nameProperty; import static org.apache.jackrabbit.oak.plugins.version.VersionConstants.MIX_REP_VERSIONABLE_PATHS; +import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.addMixin; import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryBuilder; -import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryNodeState; import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionStorage; +import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.removeVersionProperties; /** * The VersionableEditor provides two possible ways to handle @@ -57,7 +51,7 @@ import static org.apache.jackrabbit.oak. * <li> * it can skip copying version histories and remove the * {@code mix:versionable} mixin together with any related - * properties (see {@link #removeVersionProperties(NodeBuilder)}). + * properties (see {@link VersionHistoryUtil#removeVersionProperties(NodeBuilder, TypePredicate)}). * </li> * </ul> */ @@ -144,7 +138,7 @@ public class VersionableEditor extends D setVersionablePath(versionableUuid); } else { NodeBuilder versionableBuilder = getNodeBuilder(rootBuilder, this.path); - removeVersionProperties(versionableBuilder); + removeVersionProperties(versionableBuilder, isReferenceable); if (isVersionable.apply(versionableBuilder.getNodeState())) { logger.warn("Node {} is still versionable. Creating empty version history.", path); createEmptyHistory(versionableBuilder); @@ -174,23 +168,6 @@ public class VersionableEditor extends D return getVersionHistoryBuilder(versionStorage, versionableUuid).exists(); } - private void removeVersionProperties(final NodeBuilder versionableBuilder) { - assert versionableBuilder.exists(); - - removeMixin(versionableBuilder, MIX_VERSIONABLE); - - // we don't know if the UUID is otherwise referenced, - // so make sure the node remains referencable - if (!isReferenceable.apply(versionableBuilder.getNodeState())) { - addMixin(versionableBuilder, MIX_REFERENCEABLE); - } - - versionableBuilder.removeProperty(JCR_VERSIONHISTORY); - versionableBuilder.removeProperty(JCR_PREDECESSORS); - versionableBuilder.removeProperty(JCR_BASEVERSION); - versionableBuilder.removeProperty(JCR_ISCHECKEDOUT); - } - private void createEmptyHistory(NodeBuilder versionable) throws CommitFailedException { vMgr.getOrCreateVersionHistory(versionable, Collections.<String,Object>emptyMap()); } @@ -225,27 +202,5 @@ public class VersionableEditor extends D return builder; } - private static void addMixin(NodeBuilder builder, String name) { - if (builder.hasProperty(JCR_MIXINTYPES)) { - final Set<String> mixins = newHashSet(builder.getProperty(JCR_MIXINTYPES).getValue(Type.NAMES)); - if (mixins.add(name)) { - builder.setProperty(nameProperty(JCR_MIXINTYPES, mixins)); - } - } else { - builder.setProperty(nameProperty(JCR_MIXINTYPES, of(name))); - } - } - private static void removeMixin(NodeBuilder builder, String name) { - if (builder.hasProperty(JCR_MIXINTYPES)) { - final Set<String> mixins = newHashSet(builder.getProperty(JCR_MIXINTYPES).getValue(Type.NAMES)); - if (mixins.remove(name)) { - if (mixins.isEmpty()) { - builder.removeProperty(JCR_MIXINTYPES); - } else { - builder.setProperty(nameProperty(JCR_MIXINTYPES, mixins)); - } - } - } - } } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java Tue Nov 21 08:33:10 2017 @@ -69,8 +69,6 @@ public final class VersionableProperties private final TypePredicate isVersionable; - private final TypePredicate isSimpleVersionable; - private final TypePredicate isNtVersion; private final TypePredicate isFrozenNode; @@ -80,7 +78,6 @@ public final class VersionableProperties this.rootBuilder = rootBuilder; this.versionStorage = getVersionStorage(rootBuilder); this.isVersionable = new TypePredicate(rootBuilder.getNodeState(), MIX_VERSIONABLE); - this.isSimpleVersionable = new TypePredicate(rootBuilder.getNodeState(), MIX_SIMPLE_VERSIONABLE); this.isNtVersion = new TypePredicate(rootBuilder.getNodeState(), NT_VERSION); this.isFrozenNode = new TypePredicate(rootBuilder.getNodeState(), NT_FROZENNODE); } @@ -90,7 +87,6 @@ public final class VersionableProperties this.rootBuilder = parent.rootBuilder; this.versionStorage = parent.versionStorage; this.isVersionable = parent.isVersionable; - this.isSimpleVersionable = parent.isSimpleVersionable; this.isNtVersion = parent.isNtVersion; this.isFrozenNode = parent.isFrozenNode; } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java Tue Nov 21 08:33:10 2017 @@ -50,15 +50,10 @@ public class CopyVersionHistorySidegrade } @Override - protected Session performCopy(VersionCopySetup setup) throws RepositoryException, IOException { - final NodeStore targetNodeStore = new MemoryNodeStore(); - final RepositorySidegrade sidegrade = new RepositorySidegrade(sourceNodeStore, targetNodeStore); + protected void migrate(VersionCopySetup setup, NodeStore target, String includePath) throws RepositoryException, IOException { + final RepositorySidegrade sidegrade = new RepositorySidegrade(sourceNodeStore, target); + sidegrade.setIncludes(includePath); setup.setup(sidegrade.versionCopyConfiguration); - sidegrade.copy(null); - - repository = (RepositoryImpl) new Jcr(new Oak(targetNodeStore)).createRepository(); - Session s = repository.login(AbstractRepositoryUpgradeTest.CREDENTIALS); - sessions.add(s); - return s; + sidegrade.copy(); } -} +} \ No newline at end of file Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java Tue Nov 21 08:33:10 2017 @@ -50,6 +50,7 @@ import com.google.common.collect.Maps; import org.apache.jackrabbit.core.RepositoryContext; import org.apache.jackrabbit.core.config.RepositoryConfig; import org.apache.jackrabbit.oak.Oak; +import org.apache.jackrabbit.oak.commons.PathUtils; import org.apache.jackrabbit.oak.jcr.Jcr; import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl; import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders; @@ -256,23 +257,50 @@ public class CopyVersionHistoryTest exte .getPrimaryNodeType()); } + @Test + public void removeVersionHistory() throws RepositoryException, IOException { + final NodeStore targetNodeStore = SegmentNodeStoreBuilders.builder(new MemoryStore()).build(); + migrate(new VersionCopySetup() { + @Override + public void setup(VersionCopyConfiguration config) { + } + }, targetNodeStore, PathUtils.ROOT_PATH); + migrate(new VersionCopySetup() { + @Override + public void setup(VersionCopyConfiguration config) { + config.setCopyVersions(null); + config.setCopyOrphanedVersions(null); + } + }, targetNodeStore, "/versionables"); + repository = (RepositoryImpl) new Jcr(new Oak(targetNodeStore)).createRepository(); + Session s = repository.login(AbstractRepositoryUpgradeTest.CREDENTIALS); + sessions.add(s); + assertMissingHistories(s, VERSIONABLES_OLD, VERSIONABLES_YOUNG); + assertNonVersionablePaths(s, VERSIONABLES_OLD, VERSIONABLES_YOUNG); + + } + protected Session performCopy(VersionCopySetup setup) throws RepositoryException, IOException { + final NodeStore targetNodeStore = SegmentNodeStoreBuilders.builder(new MemoryStore()).build(); + migrate(setup, targetNodeStore, PathUtils.ROOT_PATH); + repository = (RepositoryImpl) new Jcr(new Oak(targetNodeStore)).createRepository(); + Session s = repository.login(AbstractRepositoryUpgradeTest.CREDENTIALS); + sessions.add(s); + return s; + } + + protected void migrate(VersionCopySetup setup, NodeStore target, String includePath) throws RepositoryException, IOException { final RepositoryConfig sourceConfig = RepositoryConfig.create(source); final RepositoryContext sourceContext = RepositoryContext.create(sourceConfig); - final NodeStore targetNodeStore = SegmentNodeStoreBuilders.builder(new MemoryStore()).build(); try { - final RepositoryUpgrade upgrade = new RepositoryUpgrade(sourceContext, targetNodeStore); + final RepositoryUpgrade upgrade = new RepositoryUpgrade(sourceContext, target); + upgrade.setIncludes(includePath); setup.setup(upgrade.versionCopyConfiguration); - upgrade.setEarlyShutdown(true); + upgrade.setEarlyShutdown(false); upgrade.copy(null); } finally { sourceContext.getRepository().shutdown(); } - - repository = (RepositoryImpl) new Jcr(new Oak(targetNodeStore)).createRepository(); - Session s = repository.login(AbstractRepositoryUpgradeTest.CREDENTIALS); - sessions.add(s); - return s; } @After @@ -358,6 +386,18 @@ public class CopyVersionHistoryTest exte } } } + + private static void assertNonVersionablePaths(final Session session, final String... names) + throws RepositoryException { + for (final String mixin : MIXINS) { + final String pathPrefix = VERSIONABLES_PATH_PREFIX + mixin + "/"; + for (final String name : names) { + final String path = pathPrefix + name; + final Node node = session.getNode(path); + assertFalse("Node " + path + " shouldn't have mix:versionable mixin", node.isNodeType(MIX_VERSIONABLE)); + } + } + } private static void assertVersionablePath(final VersionHistory history, final String versionablePath) throws RepositoryException { Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java Tue Nov 21 08:33:10 2017 @@ -73,7 +73,8 @@ public class IncludeExcludeSidegradeTest final RepositorySidegrade sidegrade = new RepositorySidegrade(segmentNodeStore, target); sidegrade.setIncludes( "/content/foo/en", - "/content/assets/foo" + "/content/assets/foo", + "/content/other" ); sidegrade.setExcludes( "/content/assets/foo/2013", @@ -81,6 +82,12 @@ public class IncludeExcludeSidegradeTest "/content/assets/foo/2011", "/content/assets/foo/2010" ); + sidegrade.setExcludeFragments( + "oak-mount-libs-xyz" + ); + sidegrade.setFragmentPaths( + "/content/other/path" + ); sidegrade.copy(); } finally { fileStore.close(); Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java Tue Nov 21 08:33:10 2017 @@ -46,7 +46,10 @@ public class IncludeExcludeUpgradeTest e JcrUtils.getOrCreateByPath("/content/assets/foo/2011", "nt:folder", session); JcrUtils.getOrCreateByPath("/content/assets/foo/2010", "nt:folder", session); JcrUtils.getOrCreateByPath("/content/assets/foo/2010/12", "nt:folder", session); - JcrUtils.getOrCreateByPath("/content/assets/foo/2010/11", "nt:folder", session); + JcrUtils.getOrCreateByPath("/content/other/path/foo/oak-mount-libs-xyz/node1", "nt:folder", session); + JcrUtils.getOrCreateByPath("/content/other/path/foo/oak-mount-libs-xyz/node2", "nt:folder", session); + JcrUtils.getOrCreateByPath("/content/other/path/foo/oak-mount-apps-abc/node3", "nt:folder", session); + JcrUtils.getOrCreateByPath("/content/other/path/foo/oak-mount-apps-abc/node4", "nt:folder", session); session.save(); } @@ -58,7 +61,8 @@ public class IncludeExcludeUpgradeTest e final RepositoryUpgrade upgrade = new RepositoryUpgrade(context, target); upgrade.setIncludes( "/content/foo/en", - "/content/assets/foo" + "/content/assets/foo", + "/content/other" ); upgrade.setExcludes( "/content/assets/foo/2013", @@ -66,6 +70,12 @@ public class IncludeExcludeUpgradeTest e "/content/assets/foo/2011", "/content/assets/foo/2010" ); + upgrade.setExcludeFragments( + "oak-mount-libs-xyz" + ); + upgrade.setFragmentPaths( + "/content/other/path" + ); upgrade.copy(null); } finally { context.getRepository().shutdown(); @@ -78,7 +88,9 @@ public class IncludeExcludeUpgradeTest e "/content/foo/en", "/content/assets/foo/2015/02", "/content/assets/foo/2015/01", - "/content/assets/foo/2014" + "/content/assets/foo/2014", + "/content/other/path/foo/oak-mount-apps-abc/node3", + "/content/other/path/foo/oak-mount-apps-abc/node4" ); } @@ -97,7 +109,9 @@ public class IncludeExcludeUpgradeTest e "/content/assets/foo/2013", "/content/assets/foo/2012", "/content/assets/foo/2011", - "/content/assets/foo/2010" + "/content/assets/foo/2010", + "/content/other/path/foo/oak-mount-libs-xyz/node1", + "/content/other/path/foo/oak-mount-libs-xyz/node2" ); } } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java Tue Nov 21 08:33:10 2017 @@ -23,18 +23,19 @@ import static org.apache.jackrabbit.oak. import java.io.File; import java.io.IOException; -import javax.annotation.Nonnull; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.apache.jackrabbit.oak.Oak; +import org.apache.jackrabbit.oak.api.CommitFailedException; import org.apache.jackrabbit.oak.jcr.Jcr; import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl; import org.apache.jackrabbit.oak.segment.SegmentNodeStore; import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders; import org.apache.jackrabbit.oak.segment.file.FileStore; import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; -import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer; +import org.apache.jackrabbit.oak.spi.commit.CommitInfo; +import org.apache.jackrabbit.oak.spi.commit.EmptyHook; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeStore; import org.junit.Before; @@ -63,7 +64,6 @@ public class RepeatedRepositorySidegrade final NodeStore target = getTargetNodeStore(); doUpgradeRepository(sourceDir, target, false); - fileStore.flush(); fileStore = fileStoreBuilder(sourceDir).build(); segmentNodeStore = SegmentNodeStoreBuilders.builder(fileStore).build(); @@ -79,7 +79,6 @@ public class RepeatedRepositorySidegrade } doUpgradeRepository(sourceDir, target, true); - fileStore.flush(); upgradeComplete = true; } @@ -96,12 +95,14 @@ public class RepeatedRepositorySidegrade SegmentNodeStore segmentNodeStore = SegmentNodeStoreBuilders.builder(fileStore).build(); try { final RepositorySidegrade repositoryUpgrade = new RepositorySidegrade(segmentNodeStore, target); - repositoryUpgrade.copy(new RepositoryInitializer() { - @Override - public void initialize(@Nonnull NodeBuilder builder) { - builder.child("foo").child("bar"); - } - }); + + NodeBuilder builder = target.getRoot().builder(); + builder.child("foo").child("bar"); + target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); + + repositoryUpgrade.copy(); + } catch (CommitFailedException e) { + throw new RepositoryException(e); } finally { fileStore.close(); } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java Tue Nov 21 08:33:10 2017 @@ -40,15 +40,14 @@ import javax.jcr.SimpleCredentials; import javax.jcr.Value; import com.google.common.base.Function; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import org.apache.commons.codec.digest.DigestUtils; import org.apache.jackrabbit.oak.api.Blob; import org.apache.jackrabbit.oak.api.CommitFailedException; -import org.apache.jackrabbit.oak.api.Type; import org.apache.jackrabbit.oak.commons.IOUtils; import org.apache.jackrabbit.oak.jcr.Jcr; import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl; +import org.apache.jackrabbit.oak.plugins.document.DocumentNodeState; import org.apache.jackrabbit.oak.plugins.index.reference.ReferenceIndexProvider; import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState; import org.apache.jackrabbit.oak.spi.commit.CommitInfo; @@ -59,7 +58,6 @@ import org.apache.jackrabbit.oak.spi.sta import org.apache.jackrabbit.oak.upgrade.RepositorySidegrade; import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer; import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer; -import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentTarNodeStoreContainer; import org.apache.jackrabbit.oak.upgrade.cli.parser.CliArgumentException; import org.junit.After; import org.junit.Before; @@ -82,8 +80,6 @@ public abstract class AbstractOak2OakTes private RepositoryImpl repository; - private String checkpointReference; - protected abstract NodeStoreContainer getSourceContainer(); protected abstract NodeStoreContainer getDestinationContainer(); @@ -149,7 +145,7 @@ public abstract class AbstractOak2OakTes builder.setProperty("binary-prop", getRandomBlob(target)); builder.setProperty("checkpoint-state", "before"); target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); - checkpointReference = target.checkpoint(60000, singletonMap("key", "123")); + target.checkpoint(60000, singletonMap("key", "123")); builder.setProperty("checkpoint-state", "after"); builder.setProperty("binary-prop", getRandomBlob(target)); @@ -219,6 +215,17 @@ public abstract class AbstractOak2OakTes protected void verifyCheckpoint() { assertEquals("after", destination.getRoot().getString("checkpoint-state")); + String checkpointReference = null; + + for (String c : destination.checkpoints()) { + if (destination.checkpointInfo(c).containsKey("key")) { + checkpointReference = c; + break; + } + } + + assertNotNull(checkpointReference); + Map<String, String> info = destination.checkpointInfo(checkpointReference); assertEquals("123", info.get("key")); @@ -244,6 +251,8 @@ public abstract class AbstractOak2OakTes return ((SegmentNodeState) node).getRecordId().toString(); } else if (node instanceof org.apache.jackrabbit.oak.segment.SegmentNodeState) { return ((org.apache.jackrabbit.oak.segment.SegmentNodeState) node).getRecordId().toString(); + } else if (node instanceof DocumentNodeState) { + return ((DocumentNodeState) node).getLastRevision().toString(); } else { return null; } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java Tue Nov 21 08:33:10 2017 @@ -48,4 +48,9 @@ public class JdbcToSegmentTest extends A return new String[] { "--src-user", "sa", "--src-password", "sa", source.getDescription(), destination.getDescription() }; } + + @Override + protected boolean supportsCheckpointMigration() { + return true; + } } Copied: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentWithMetadataTest.java (from r1815783, jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java) URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentWithMetadataTest.java?p2=jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentWithMetadataTest.java&p1=jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java&r1=1815783&r2=1815885&rev=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentWithMetadataTest.java Tue Nov 21 08:33:10 2017 @@ -16,19 +16,25 @@ */ package org.apache.jackrabbit.oak.upgrade.cli; -import java.io.IOException; - import org.apache.jackrabbit.oak.upgrade.cli.container.JdbcNodeStoreContainer; import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer; import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer; +import org.junit.BeforeClass; -public class JdbcToSegmentTest extends AbstractOak2OakTest { +import java.io.IOException; + +public class JdbcToSegmentWithMetadataTest extends AbstractOak2OakTest { private final NodeStoreContainer source; private final NodeStoreContainer destination; - public JdbcToSegmentTest() throws IOException { + @BeforeClass + public static void setMetadataProperty() throws IOException { + System.setProperty("oak.upgrade.addSecondaryMetadata", "true"); + } + + public JdbcToSegmentWithMetadataTest() throws IOException { source = new JdbcNodeStoreContainer(); destination = new SegmentNodeStoreContainer(); } @@ -48,4 +54,9 @@ public class JdbcToSegmentTest extends A return new String[] { "--src-user", "sa", "--src-password", "sa", source.getDescription(), destination.getDescription() }; } + + @Override + protected boolean supportsCheckpointMigration() { + return true; + } } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java Tue Nov 21 08:33:10 2017 @@ -59,4 +59,9 @@ public class MongoToMongoFbsTest extends return new String[] { "--copy-binaries", "--fileblobstore", destinationBlob.getDescription(), source.getDescription(), destination.getDescription() }; } + + @Override + protected boolean supportsCheckpointMigration() { + return true; + } } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java Tue Nov 21 08:33:10 2017 @@ -56,4 +56,9 @@ public class MongoToMongoFdsTest extends return new String[] { "--copy-binaries", "--datastore", destinationBlob.getDescription(), source.getDescription(), destination.getDescription() }; } + + @Override + protected boolean supportsCheckpointMigration() { + return true; + } } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java Tue Nov 21 08:33:10 2017 @@ -51,4 +51,9 @@ public class MongoToSegmentTest extends protected String[] getArgs() { return new String[] { source.getDescription(), destination.getDescription() }; } + + @Override + protected boolean supportsCheckpointMigration() { + return true; + } } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java Tue Nov 21 08:33:10 2017 @@ -49,4 +49,9 @@ public class SegmentToJdbcTest extends A return new String[] { "--disable-mmap", "--user", "sa", "--password", "sa", source.getDescription(), destination.getDescription() }; } + + @Override + protected boolean supportsCheckpointMigration() { + return true; + } } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java Tue Nov 21 08:33:10 2017 @@ -51,4 +51,9 @@ public class SegmentToMongoTest extends protected String[] getArgs() { return new String[] { source.getDescription(), destination.getDescription() }; } + + @Override + protected boolean supportsCheckpointMigration() { + return true; + } } Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java Tue Nov 21 08:33:10 2017 @@ -39,7 +39,7 @@ public class FbsToS3Test extends Abstrac private final NodeStoreContainer destination; public FbsToS3Test() throws IOException { - Assume.assumeTrue(S3_PROPERTIES != null); + Assume.assumeTrue(S3_PROPERTIES != null && !S3_PROPERTIES.isEmpty()); sourceBlob = new FileBlobStoreContainer(); destinationBlob = new S3DataStoreContainer(S3_PROPERTIES); source = new SegmentTarNodeStoreContainer(sourceBlob); Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java Tue Nov 21 08:33:10 2017 @@ -39,7 +39,7 @@ public class S3ToFbsTest extends Abstrac private final NodeStoreContainer destination; public S3ToFbsTest() throws IOException { - Assume.assumeTrue(S3_PROPERTIES != null); + Assume.assumeTrue(S3_PROPERTIES != null && !S3_PROPERTIES.isEmpty()); sourceBlob = new S3DataStoreContainer(S3_PROPERTIES); destinationBlob = new FileBlobStoreContainer(); source = new SegmentTarNodeStoreContainer(sourceBlob); Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java Tue Nov 21 08:33:10 2017 @@ -103,6 +103,9 @@ public class SegmentTarNodeStoreContaine } public static void deleteRecursive(File directory) { + if (!directory.exists()) { + return; + } try { Files.walkFileTree(directory.toPath(), new SimpleFileVisitor<Path>() { @Override Modified: jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeStateTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeStateTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff ============================================================================== --- jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeStateTest.java (original) +++ jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeStateTest.java Tue Nov 21 08:33:10 2017 @@ -16,6 +16,21 @@ */ package org.apache.jackrabbit.oak.upgrade.nodestate; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import org.apache.jackrabbit.oak.api.CommitFailedException; +import org.apache.jackrabbit.oak.api.PropertyState; +import org.apache.jackrabbit.oak.api.Type; +import org.apache.jackrabbit.oak.spi.state.NodeBuilder; +import org.apache.jackrabbit.oak.spi.state.NodeState; +import org.apache.jackrabbit.oak.spi.state.NodeStore; +import org.junit.Before; +import org.junit.Test; + +import javax.jcr.RepositoryException; +import java.io.IOException; +import java.util.Set; + import static com.google.common.collect.ImmutableSet.of; import static com.google.common.collect.Lists.newArrayList; import static java.util.Arrays.asList; @@ -36,22 +51,6 @@ import static org.junit.Assert.assertNul import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; -import java.io.IOException; -import java.util.Set; - -import javax.jcr.RepositoryException; - -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; -import org.apache.jackrabbit.oak.api.CommitFailedException; -import org.apache.jackrabbit.oak.api.PropertyState; -import org.apache.jackrabbit.oak.api.Type; -import org.apache.jackrabbit.oak.spi.state.NodeBuilder; -import org.apache.jackrabbit.oak.spi.state.NodeState; -import org.apache.jackrabbit.oak.spi.state.NodeStore; -import org.junit.Before; -import org.junit.Test; - public class FilteringNodeStateTest { private static final Set<String> DEFAULT_INCLUDES = FilteringNodeState.ALL; @@ -80,46 +79,46 @@ public class FilteringNodeStateTest { @Test public void shouldNotDecorateForNullArgs() { - final NodeState decorated = wrap("/", rootNodeState, null, null); + final NodeState decorated = wrap("/", rootNodeState, null, null, null, null); assertSame("root should be identical to decorated", rootNodeState, decorated); } @Test public void shouldNotDecorateForDefaultIncludes() { - final NodeState decorated = wrap("/", rootNodeState, DEFAULT_INCLUDES, null); + final NodeState decorated = wrap("/", rootNodeState, DEFAULT_INCLUDES, null, null, null); assertSame("root should be identical to decorated", rootNodeState, decorated); } @Test public void shouldNotDecorateForDefaultExcludes() { - final NodeState decorated = wrap("/", rootNodeState, null, DEFAULT_EXCLUDES); + final NodeState decorated = wrap("/", rootNodeState, null, DEFAULT_EXCLUDES, null, null); assertSame("root should be identical to decorated", rootNodeState, decorated); } @Test public void shouldNotDecorateForDefaultIncludesAndExcludes() { - final NodeState decorated = wrap("/", rootNodeState, DEFAULT_INCLUDES, DEFAULT_EXCLUDES); + final NodeState decorated = wrap("/", rootNodeState, DEFAULT_INCLUDES, DEFAULT_EXCLUDES, null, null); assertSame("root should be identical to decorated", rootNodeState, decorated); } @Test public void shouldNotDecorateIncludedPath() { final NodeState content = getNodeState(rootNodeState, "/content"); - final NodeState decorated = wrap("/content", content, of("/content"), null); + final NodeState decorated = wrap("/content", content, of("/content"), null, null, null); assertSame("content should be identical to decorated", content, decorated); } @Test public void shouldNotDecorateIncludedDescendants() { final NodeState foo = getNodeState(rootNodeState, "/content/foo"); - final NodeState decorated = wrap("/content/foo", foo, of("/content"), null); + final NodeState decorated = wrap("/content/foo", foo, of("/content"), null, null, null); assertSame("foo should be identical to decorated", foo, decorated); } @Test public void shouldDecorateAncestorOfExcludedDescendants() { final NodeState foo = getNodeState(rootNodeState, "/content/foo"); - final NodeState decorated = wrap("/content/foo", foo, of("/content"), of("/content/foo/de")); + final NodeState decorated = wrap("/content/foo", foo, of("/content"), of("/content/foo/de"), null, null); assertNotSame("foo should not be identical to decorated", foo, decorated); assertMissing(decorated, "de"); @@ -135,7 +134,7 @@ public class FilteringNodeStateTest { @Test public void shouldHaveCorrectChildOrderProperty() throws CommitFailedException { final NodeState content = rootNodeState.getChildNode("content"); - final NodeState decorated = wrap("/content", content, null, of("/content/foo")); + final NodeState decorated = wrap("/content", content, null, of("/content/foo"), null, null); assertTrue(decorated.hasProperty(OAK_CHILD_ORDER)); @@ -160,7 +159,7 @@ public class FilteringNodeStateTest { @Test public void shouldDecorateExcludedNode() { - final NodeState decoratedRoot = wrap("/", rootNodeState, of("/content"), of("/content/foo/de")); + final NodeState decoratedRoot = wrap("/", rootNodeState, of("/content"), of("/content/foo/de"), null, null); final NodeState de = getNodeState(rootNodeState, "/content/foo/de"); final NodeState decorated = getNodeState(decoratedRoot, "/content/foo/de"); assertFalse("de should not be equal to decorated", de.equals(decorated)); @@ -170,14 +169,14 @@ public class FilteringNodeStateTest { @Test public void shouldDecorateImplicitlyExcludedNode() { final NodeState content = getNodeState(rootNodeState, "/content"); - final NodeState decorated = wrap("/content", content, of("/apps"), null); + final NodeState decorated = wrap("/content", content, of("/apps"), null, null, null); assertNotSame("content should not be identical to decorated", content, decorated); } @Test public void shouldHideExcludedPathsViaExists() { - final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", "/libs")); + final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", "/libs"), null, null); assertMissing(decorated, "apps"); assertMissing(decorated, "libs/foo/install"); @@ -187,7 +186,7 @@ public class FilteringNodeStateTest { @Test public void shouldHideExcludedPathsViaHasChildNode() { - final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", "/libs")); + final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", "/libs"), null, null); assertExistingHasChildNode(decorated, "content"); assertMissingHasChildNode(decorated, "apps"); @@ -196,7 +195,7 @@ public class FilteringNodeStateTest { @Test public void shouldHideExcludedPathsViaGetChildNodeNames() { - final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", "/libs")); + final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", "/libs"), null, null); assertExistingChildNodeName(decorated, "content"); assertMissingChildNodeName(decorated, "apps"); @@ -205,7 +204,7 @@ public class FilteringNodeStateTest { @Test public void shouldHideMissingIncludedPathsViaExists() { - final NodeState decorated = wrap("/", rootNodeState, of("/content"), null); + final NodeState decorated = wrap("/", rootNodeState, of("/content"), null, null, null); assertMissing(decorated, "apps"); assertMissing(decorated, "libs/foo/install"); @@ -215,7 +214,7 @@ public class FilteringNodeStateTest { @Test public void shouldHideMissingIncludedPathsViaHasChildNode() { - final NodeState decorated = wrap("/", rootNodeState, of("/content"), null); + final NodeState decorated = wrap("/", rootNodeState, of("/content"), null, null, null); assertExistingHasChildNode(decorated, "content"); assertMissingHasChildNode(decorated, "apps"); @@ -224,7 +223,7 @@ public class FilteringNodeStateTest { @Test public void shouldHideMissingIncludedPathsViaGetChildNodeNames() { - final NodeState decorated = wrap("/", rootNodeState, of("/content"), null); + final NodeState decorated = wrap("/", rootNodeState, of("/content"), null, null, null); assertExistingChildNodeName(decorated, "content"); assertMissingChildNodeName(decorated, "apps"); @@ -233,15 +232,15 @@ public class FilteringNodeStateTest { @Test public void shouldGivePrecedenceForExcludesOverIncludes() { - final NodeState conflictingRules = wrap("/", rootNodeState, of("/content"), of("/content")); + final NodeState conflictingRules = wrap("/", rootNodeState, of("/content"), of("/content"), null, null); assertMissingChildNodeName(conflictingRules, "content"); - final NodeState overlappingRules = wrap("/", rootNodeState, of("/content"), of("/content/foo")); + final NodeState overlappingRules = wrap("/", rootNodeState, of("/content"), of("/content/foo"), null, null); assertExistingChildNodeName(overlappingRules, "content"); assertMissingChildNodeName(overlappingRules.getChildNode("content"), "foo"); - final NodeState overlappingRules2 = wrap("/", rootNodeState, of("/content/foo"), of("/content")); + final NodeState overlappingRules2 = wrap("/", rootNodeState, of("/content/foo"), of("/content"), null, null); assertMissingChildNodeName(overlappingRules2, "content"); assertMissingChildNodeName(overlappingRules2.getChildNode("content"), "foo"); @@ -249,7 +248,7 @@ public class FilteringNodeStateTest { @Test public void shouldRespectPathBoundariesForIncludes() { - final NodeState decorated = wrap("/", rootNodeState, of("/content/foo"), null); + final NodeState decorated = wrap("/", rootNodeState, of("/content/foo"), null, null, null); assertExistingChildNodeName(decorated, "content"); assertExistingChildNodeName(decorated.getChildNode("content"), "foo"); @@ -258,7 +257,7 @@ public class FilteringNodeStateTest { @Test public void shouldRespectPathBoundariesForExcludes() { - final NodeState decorated = wrap("/", rootNodeState, null, of("/content/foo")); + final NodeState decorated = wrap("/", rootNodeState, null, of("/content/foo"), null, null); assertExistingChildNodeName(decorated, "content"); assertMissingChildNodeName(decorated.getChildNode("content"), "foo"); @@ -267,7 +266,7 @@ public class FilteringNodeStateTest { @Test public void shouldDelegatePropertyCount() { - final NodeState decorated = wrap("/", rootNodeState, null, of("/content/foo/de")); + final NodeState decorated = wrap("/", rootNodeState, null, of("/content/foo/de"), null, null); assertEquals(1, getNodeState(decorated, "/content").getPropertyCount()); assertEquals(0, getNodeState(decorated, "/content/foo").getPropertyCount()); @@ -276,7 +275,7 @@ public class FilteringNodeStateTest { @Test public void shouldDelegateGetProperty() { - final NodeState decorated = wrap("/", rootNodeState, null, of("/content/foo")); + final NodeState decorated = wrap("/", rootNodeState, null, of("/content/foo"), null, null); final NodeState content = getNodeState(decorated, "/content"); assertNotNull(content.getProperty(OAK_CHILD_ORDER)); @@ -286,7 +285,7 @@ public class FilteringNodeStateTest { @Test public void shouldDelegateHasProperty() { - final NodeState decorated = wrap("/", rootNodeState, null, of("/content/foo/de")); + final NodeState decorated = wrap("/", rootNodeState, null, of("/content/foo/de"), null, null); assertTrue(getNodeState(decorated, "/content").hasProperty(OAK_CHILD_ORDER)); assertFalse(getNodeState(decorated, "/content").hasProperty("foo")); @@ -295,7 +294,7 @@ public class FilteringNodeStateTest { @Test public void exists() { - final NodeState decorated = wrap("/", rootNodeState, null, of("/content/foo")); + final NodeState decorated = wrap("/", rootNodeState, null, of("/content/foo"), null, null); assertTrue("/content should exist and be visible", getNodeState(decorated, "/content").exists()); assertFalse("/content/foo should be hidden", getNodeState(decorated, "/content/foo").exists()); assertFalse("/nonexisting should not exist", getNodeState(decorated, "/nonexisting").exists());
