You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by to...@apache.org on 2016/07/15 10:34:22 UTC
svn commit: r1752815 - in /jackrabbit/oak/trunk/oak-upgrade/src:
main/java/org/apache/jackrabbit/core/
main/java/org/apache/jackrabbit/oak/upgrade/
main/java/org/apache/jackrabbit/oak/upgrade/cli/
main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/...
Author: tomekr
Date: Fri Jul 15 10:34:21 2016
New Revision: 1752815
URL: http://svn.apache.org/viewvc?rev=1752815&view=rev
Log:
OAK-4564: Use Lucene index to look for long-named nodes in JCR2 upgrade
Added:
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/IndexAccessor.java
Modified:
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/MigrationFactory.java
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/MigrationOptions.java
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java
jackrabbit/oak/trunk/oak-upgrade/src/main/resources/upgrade_usage.txt
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/LongNameTest.java
Added: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/IndexAccessor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/IndexAccessor.java?rev=1752815&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/IndexAccessor.java (added)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/IndexAccessor.java Fri Jul 15 10:34:21 2016
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core;
+
+import org.apache.jackrabbit.core.query.QueryHandler;
+import org.apache.jackrabbit.core.query.lucene.SearchIndex;
+import org.apache.lucene.index.IndexReader;
+
+import javax.jcr.RepositoryException;
+import java.io.IOException;
+
+public final class IndexAccessor {
+
+ private IndexAccessor() {
+ }
+
+ public static IndexReader getReader(RepositoryContext ctx) throws RepositoryException, IOException {
+ RepositoryImpl repo = ctx.getRepository();
+ SearchManager searchMgr = repo.getSearchManager(ctx.getRepositoryConfig().getDefaultWorkspaceName());
+ QueryHandler handler = searchMgr.getQueryHandler();
+ SearchIndex index = (SearchIndex) handler;
+ return index.getIndexReader();
+ }
+
+}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java Fri Jul 15 10:34:21 2016
@@ -91,7 +91,7 @@ public class RepositorySidegrade {
*/
private Set<String> mergePaths = DEFAULT_MERGE_PATHS;
- private boolean skipLongNames = true;
+ private boolean filterLongNames = true;
private boolean skipInitialization = false;
@@ -198,12 +198,12 @@ public class RepositorySidegrade {
this.mergePaths = copyOf(checkNotNull(merges));
}
- public boolean isSkipLongNames() {
- return skipLongNames;
+ public boolean isFilterLongNames() {
+ return filterLongNames;
}
- public void setSkipLongNames(boolean skipLongNames) {
- this.skipLongNames = skipLongNames;
+ public void setFilterLongNames(boolean filterLongNames) {
+ this.filterLongNames = filterLongNames;
}
/**
@@ -252,7 +252,7 @@ public class RepositorySidegrade {
final NodeState reportingSourceRoot = ReportingNodeState.wrap(source.getRoot(), new LoggingReporter(LOG, "Copying", 10000, -1));
final NodeState sourceRoot;
- if (skipLongNames) {
+ if (filterLongNames) {
sourceRoot = NameFilteringNodeState.wrap(reportingSourceRoot);
} else {
sourceRoot = reportingSourceRoot;
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java Fri Jul 15 10:34:21 2016
@@ -30,6 +30,7 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.plugins.name.Namespaces.addCustomMapping;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH;
import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_ALL;
+import static org.apache.jackrabbit.oak.upgrade.cli.parser.OptionParserFactory.SKIP_NAME_CHECK;
import static org.apache.jackrabbit.oak.upgrade.nodestate.FilteringNodeState.ALL;
import static org.apache.jackrabbit.oak.upgrade.nodestate.FilteringNodeState.NONE;
import static org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier.copyProperties;
@@ -49,7 +50,9 @@ import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.jcr.NamespaceException;
+import javax.jcr.Node;
import javax.jcr.RepositoryException;
+import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
import javax.jcr.nodetype.NodeDefinitionTemplate;
@@ -66,6 +69,7 @@ import com.google.common.collect.Immutab
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import org.apache.jackrabbit.api.security.authorization.PrivilegeManager;
+import org.apache.jackrabbit.core.IndexAccessor;
import org.apache.jackrabbit.core.RepositoryContext;
import org.apache.jackrabbit.core.config.BeanConfig;
import org.apache.jackrabbit.core.config.LoginModuleConfig;
@@ -74,6 +78,7 @@ import org.apache.jackrabbit.core.config
import org.apache.jackrabbit.core.fs.FileSystem;
import org.apache.jackrabbit.core.fs.FileSystemException;
import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
+import org.apache.jackrabbit.core.query.lucene.FieldNames;
import org.apache.jackrabbit.core.security.authorization.PrivilegeRegistry;
import org.apache.jackrabbit.core.security.user.UserManagerImpl;
import org.apache.jackrabbit.oak.api.CommitFailedException;
@@ -87,7 +92,6 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.index.IndexUpdate;
import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
-import org.apache.jackrabbit.oak.plugins.index.counter.NodeCounterEditorProvider;
import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
import org.apache.jackrabbit.oak.plugins.index.reference.ReferenceEditorProvider;
import org.apache.jackrabbit.oak.plugins.name.NamespaceConstants;
@@ -133,6 +137,10 @@ import org.apache.jackrabbit.spi.QValueC
import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver;
import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
import org.apache.jackrabbit.spi.commons.value.ValueFormat;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermDocs;
+import org.apache.lucene.index.TermEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -186,7 +194,9 @@ public class RepositoryUpgrade {
private List<CommitHook> customCommitHooks = null;
- private boolean skipLongNames = true;
+ private boolean checkLongNames = false;
+
+ private boolean filterLongNames = true;
private boolean skipInitialization = false;
@@ -260,12 +270,20 @@ public class RepositoryUpgrade {
this.earlyShutdown = earlyShutdown;
}
- public boolean isSkipLongNames() {
- return skipLongNames;
+ public boolean isCheckLongNames() {
+ return checkLongNames;
+ }
+
+ public void setCheckLongNames(boolean checkLongNames) {
+ this.checkLongNames = checkLongNames;
+ }
+
+ public boolean isFilterLongNames() {
+ return filterLongNames;
}
- public void setSkipLongNames(boolean skipLongNames) {
- this.skipLongNames = skipLongNames;
+ public void setFilterLongNames(boolean filterLongNames) {
+ this.filterLongNames = filterLongNames;
}
public boolean isSkipInitialization() {
@@ -316,7 +334,6 @@ public class RepositoryUpgrade {
this.excludePaths = copyOf(checkNotNull(excludes));
}
-
/**
* Sets the paths that should be merged when the source repository
* is copied to the target repository.
@@ -376,6 +393,10 @@ public class RepositoryUpgrade {
* @throws RepositoryException if the copy operation fails
*/
public void copy(RepositoryInitializer initializer) throws RepositoryException {
+ if (checkLongNames) {
+ assertNoLongNames();
+ }
+
RepositoryConfig config = source.getRepositoryConfig();
logger.info("Copying repository content from {} to Oak", config.getHomeDir());
try {
@@ -454,7 +475,7 @@ public class RepositoryUpgrade {
new LoggingReporter(logger, "Migrating", 10000, -1)
);
final NodeState sourceRoot;
- if (skipLongNames) {
+ if (filterLongNames) {
sourceRoot = NameFilteringNodeState.wrap(reportingSourceRoot);
} else {
sourceRoot = reportingSourceRoot;
@@ -939,6 +960,40 @@ public class RepositoryUpgrade {
return includes;
}
+ void assertNoLongNames() throws RepositoryException {
+ Session session = source.getRepository().login(null, null);
+ boolean longNameFound = false;
+ try {
+ IndexReader reader = IndexAccessor.getReader(source);
+ TermEnum terms = reader.terms(new Term(FieldNames.LOCAL_NAME));
+ while (terms.next()) {
+ Term t = terms.term();
+ if (!FieldNames.LOCAL_NAME.equals(t.field())) {
+ continue;
+ }
+ String name = t.text();
+ if (NameFilteringNodeState.isNameTooLong(name)) {
+ TermDocs docs = reader.termDocs(t);
+ if (docs.next()) {
+ int docId = docs.doc();
+ String uuid = reader.document(docId).get(FieldNames.UUID);
+ Node n = session.getNodeByIdentifier(uuid);
+ logger.warn("Name too long: {}", n.getPath());
+ longNameFound = true;
+ }
+ }
+ }
+ } catch (IOException e) {
+ throw new RepositoryException(e);
+ } finally {
+ session.logout();
+ }
+ if (longNameFound) {
+ logger.error("Node with a long name has been found. Please fix the content or rerun the migration with {} option.", SKIP_NAME_CHECK);
+ throw new RepositoryException("Node with a long name has been found.");
+ }
+ }
+
static class LoggingCompositeHook implements CommitHook {
private final Collection<CommitHook> hooks;
private boolean started = false;
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/MigrationFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/MigrationFactory.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/MigrationFactory.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/MigrationFactory.java Fri Jul 15 10:34:21 2016
@@ -90,7 +90,8 @@ public class MigrationFactory {
if (options.getMergePaths() != null) {
upgrade.setMerges(options.getMergePaths());
}
- upgrade.setSkipLongNames(stores.isSkipLongNames());
+ upgrade.setFilterLongNames(!stores.getDstType().isSupportLongNames());
+ upgrade.setCheckLongNames(!options.isSkipNameCheck() && !stores.getDstType().isSupportLongNames());
upgrade.setSkipOnError(!options.isFailOnError());
upgrade.setEarlyShutdown(options.isEarlyShutdown());
upgrade.setSkipInitialization(options.isSkipInitialization());
@@ -114,7 +115,7 @@ public class MigrationFactory {
if (options.getMergePaths() != null) {
sidegrade.setMerges(options.getMergePaths());
}
- sidegrade.setSkipLongNames(stores.isSkipLongNames());
+ sidegrade.setFilterLongNames(stores.getSrcType().isSupportLongNames() && !stores.getDstType().isSupportLongNames());
sidegrade.setSkipInitialization(options.isSkipInitialization());
return sidegrade;
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/MigrationOptions.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/MigrationOptions.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/MigrationOptions.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/MigrationOptions.java Fri Jul 15 10:34:21 2016
@@ -52,6 +52,8 @@ public class MigrationOptions {
private final boolean skipInitialization;
+ private final boolean skipNameCheck;
+
public MigrationOptions(MigrationCliArguments args) {
this.copyBinariesByReference = !args.hasOption(OptionParserFactory.COPY_BINARIES);
this.mmap = args.hasOption(OptionParserFactory.MMAP);
@@ -79,6 +81,7 @@ public class MigrationOptions {
this.failOnError = args.hasOption(OptionParserFactory.FAIL_ON_ERROR);
this.earlyShutdown = args.hasOption(OptionParserFactory.EARLY_SHUTDOWN);
this.skipInitialization = args.hasOption(OptionParserFactory.SKIP_INIT);
+ this.skipNameCheck = args.hasOption(OptionParserFactory.SKIP_NAME_CHECK);
logOptions();
}
@@ -126,6 +129,10 @@ public class MigrationOptions {
return skipInitialization;
}
+ public boolean isSkipNameCheck() {
+ return skipNameCheck;
+ }
+
private void logOptions() {
if (copyBinariesByReference) {
log.info("DataStore needs to be shared with new repository");
@@ -169,6 +176,10 @@ public class MigrationOptions {
log.info("The repository initialization will be skipped");
}
+ if (skipNameCheck) {
+ log.info("Test for long-named nodes will be disabled");
+ }
+
log.info("Cache size: {} MB", cacheSizeInMB);
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java Fri Jul 15 10:34:21 2016
@@ -72,6 +72,8 @@ public class OptionParserFactory {
public static final String SKIP_INIT = "skip-init";
+ public static final String SKIP_NAME_CHECK = "skip-name-check";
+
public static OptionParser create() {
OptionParser op = new OptionParser();
addUsageOptions(op);
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java Fri Jul 15 10:34:21 2016
@@ -96,6 +96,14 @@ public class StoreArguments {
return dst.getFactory(MigrationDirection.DST, parser);
}
+ public StoreType getSrcType() {
+ return src.getType();
+ }
+
+ public StoreType getDstType() {
+ return dst.getType();
+ }
+
public BlobStoreFactory getSrcBlobStore() throws IOException {
BlobStoreFactory factory;
if (parser.hasOption(SRC_FBS)) {
@@ -137,10 +145,6 @@ public class StoreArguments {
return false;
}
- public boolean isSkipLongNames() {
- return dst.getType() != SEGMENT && dst.getType() != SEGMENT_TAR;
- }
-
public String[] getSrcPaths() {
return src.getPaths();
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java Fri Jul 15 10:34:21 2016
@@ -29,7 +29,7 @@ import org.apache.jackrabbit.oak.upgrade
import org.apache.jackrabbit.oak.upgrade.cli.node.StoreFactory;
import org.apache.jackrabbit.oak.upgrade.cli.parser.StoreArguments.MigrationDirection;
-enum StoreType {
+public enum StoreType {
JCR2_XML {
@Override
public boolean matches(String argument) {
@@ -40,6 +40,11 @@ enum StoreType {
public StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments) {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public boolean isSupportLongNames() {
+ return true;
+ }
},
JCR2_DIR {
@Override
@@ -51,6 +56,11 @@ enum StoreType {
public StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments) {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public boolean isSupportLongNames() {
+ return true;
+ }
},
JCR2_DIR_XML {
@Override
@@ -62,6 +72,11 @@ enum StoreType {
public StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments) {
return new StoreFactory(new Jackrabbit2Factory(paths[0], paths[1]));
}
+
+ @Override
+ public boolean isSupportLongNames() {
+ return true;
+ }
},
JDBC {
@Override
@@ -82,6 +97,11 @@ enum StoreType {
return new StoreFactory(
new JdbcFactory(paths[0], arguments.getOptions().getCacheSizeInMB(), username, password));
}
+
+ @Override
+ public boolean isSupportLongNames() {
+ return false;
+ }
},
MONGO {
@Override
@@ -93,6 +113,11 @@ enum StoreType {
public StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments) {
return new StoreFactory(new MongoFactory(paths[0], arguments.getOptions().getCacheSizeInMB()));
}
+
+ @Override
+ public boolean isSupportLongNames() {
+ return false;
+ }
},
SEGMENT {
@Override
@@ -105,6 +130,11 @@ enum StoreType {
String path = removeStart(paths[0], SEGMENT_OLD_PREFIX);
return new StoreFactory(new SegmentFactory(path, arguments.getOptions().isMmap()));
}
+
+ @Override
+ public boolean isSupportLongNames() {
+ return true;
+ }
},
SEGMENT_TAR {
@Override
@@ -116,6 +146,11 @@ enum StoreType {
public StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments) {
return new StoreFactory(new SegmentTarFactory(paths[0], arguments.getOptions().isMmap()));
}
+
+ @Override
+ public boolean isSupportLongNames() {
+ return true;
+ }
};
public static StoreType getMatchingType(String argument) {
@@ -131,6 +166,8 @@ enum StoreType {
public abstract StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments);
+ public abstract boolean isSupportLongNames();
+
public boolean isSegment() {
return this == SEGMENT || this == SEGMENT_TAR;
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java Fri Jul 15 10:34:21 2016
@@ -72,7 +72,7 @@ public class NameFilteringNodeState exte
* to check
* @return true if the name is longer than {@link Utils#NODE_NAME_LIMIT}
*/
- private static boolean isNameTooLong(@Nonnull String name) {
+ public static boolean isNameTooLong(@Nonnull String name) {
// OAK-1589: maximum supported length of name for DocumentNodeStore
// is 150 bytes. Skip the sub tree if the the name is too long
return name.length() > SAFE_NODE_NAME_LENGTH && name.getBytes(Charsets.UTF_8).length > NODE_NAME_LIMIT;
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/resources/upgrade_usage.txt
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/resources/upgrade_usage.txt?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/resources/upgrade_usage.txt (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/resources/upgrade_usage.txt Fri Jul 15 10:34:21 2016
@@ -91,4 +91,7 @@ An descriptor of the Oak node store. Pos
# other options
--?, -h, --help show help
\ No newline at end of file
+-?, -h, --help Show help
+--skip-init Don't initialize the destination repository
+--skip-name-check Don't look for long-named nodes at the beginning of
+ the migration
\ No newline at end of file
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/LongNameTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/LongNameTest.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/LongNameTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/LongNameTest.java Fri Jul 15 10:34:21 2016
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.oak.upgrad
import static com.google.common.collect.Iterables.cycle;
import static com.google.common.collect.Iterables.limit;
+import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
@@ -36,6 +37,7 @@ import org.apache.jackrabbit.core.Reposi
import org.apache.jackrabbit.core.config.RepositoryConfig;
import org.apache.jackrabbit.oak.plugins.document.DocumentMK;
import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
import org.apache.jackrabbit.oak.segment.SegmentNodeStore;
import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
import org.apache.jackrabbit.oak.segment.memory.MemoryStore;
@@ -44,7 +46,6 @@ import org.apache.jackrabbit.oak.spi.sta
import org.apache.jackrabbit.oak.stats.Clock;
import org.junit.Assert;
import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Test;
public class LongNameTest {
@@ -65,7 +66,8 @@ public class LongNameTest {
FileUtils.deleteQuietly(crx2RepoDir);
sourceRepositoryConfig = createCrx2Config(crx2RepoDir);
- RepositoryImpl sourceRepository = RepositoryImpl.create(sourceRepositoryConfig);
+ RepositoryContext ctx = RepositoryContext.create(sourceRepositoryConfig);
+ RepositoryImpl sourceRepository = ctx.getRepository();
Session session = sourceRepository.login(CREDENTIALS);
try {
Assert.assertTrue(TOO_LONG_NAME.getBytes().length > 150);
@@ -80,6 +82,7 @@ public class LongNameTest {
Assert.assertTrue(longNameParent.hasNode(TOO_LONG_NAME));
Assert.assertTrue(longNameParent.hasNode(NOT_TOO_LONG_NAME));
+
} finally {
session.logout();
}
@@ -96,7 +99,7 @@ public class LongNameTest {
public void longNameShouldBeSkipped() throws RepositoryException, IOException {
DocumentNodeStore nodeStore = new DocumentMK.Builder().getNodeStore();
try {
- upgrade(nodeStore, true);
+ upgrade(nodeStore, false, true);
NodeState parent = getParent(nodeStore.getRoot());
Assert.assertTrue(parent.hasChildNode(NOT_TOO_LONG_NAME));
@@ -109,34 +112,50 @@ public class LongNameTest {
}
}
+ @Test
+ public void assertNoLongNamesTest() throws IOException, RepositoryException {
+ RepositoryConfig config = createCrx2Config(crx2RepoDir);
+ RepositoryContext context = RepositoryContext.create(config);
+ try {
+ RepositoryUpgrade upgrade = new RepositoryUpgrade(context, new MemoryNodeStore());
+ try {
+ upgrade.assertNoLongNames();
+ fail("Exception should be thrown");
+ } catch (RepositoryException e) {
+ // that's fine
+ }
+ } finally {
+ context.getRepository().shutdown();
+ }
+ }
+
@Test(expected = RepositoryException.class)
- @Ignore
public void longNameOnDocumentStoreThrowsAnException() throws RepositoryException, IOException {
DocumentNodeStore nodeStore = new DocumentMK.Builder().getNodeStore();
try {
- upgrade(nodeStore, false);
+ upgrade(nodeStore, false, false);
} finally {
nodeStore.dispose();
}
}
@Test
- @Ignore
public void longNameOnSegmentStoreWorksFine() throws RepositoryException, IOException {
SegmentNodeStore nodeStore = SegmentNodeStoreBuilders.builder(new MemoryStore()).build();
- upgrade(nodeStore, false);
+ upgrade(nodeStore, false, false);
NodeState parent = getParent(nodeStore.getRoot());
Assert.assertTrue(parent.hasChildNode(NOT_TOO_LONG_NAME));
Assert.assertTrue(parent.hasChildNode(TOO_LONG_NAME));
}
- private static void upgrade(NodeStore target, boolean skipLongNames) throws RepositoryException, IOException {
+ private static void upgrade(NodeStore target, boolean skipNameCheck, boolean filterLongNames) throws RepositoryException, IOException {
RepositoryConfig config = createCrx2Config(crx2RepoDir);
RepositoryContext context = RepositoryContext.create(config);
try {
RepositoryUpgrade upgrade = new RepositoryUpgrade(context, target);
- upgrade.setSkipLongNames(skipLongNames);
+ upgrade.setCheckLongNames(skipNameCheck);
+ upgrade.setFilterLongNames(filterLongNames);
upgrade.copy(null);
} finally {
context.getRepository().shutdown();