blob: ec954bf0a8d08dea0b3a674d7c2d76b17ac071b0 [file] [log] [blame]
/*
* 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.oak.upgrade;
import static com.google.common.collect.ImmutableSet.of;
import static com.google.common.collect.Sets.newHashSet;
import static org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreBuilder.newDocumentNodeStoreBuilder;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Set;
import javax.jcr.Credentials;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.core.RepositoryContext;
import org.apache.jackrabbit.core.RepositoryImpl;
import org.apache.jackrabbit.core.config.RepositoryConfig;
import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class SameNodeSiblingsTest {
public static final Credentials CREDENTIALS = new SimpleCredentials("admin", "admin".toCharArray());
private File crx2RepoDir;
@Before
public void createCrx2RepoDir() throws IOException {
crx2RepoDir = Files.createTempDirectory(Paths.get("target"), "repo-crx2").toFile();
}
@After
public void deleteCrx2RepoDir() {
FileUtils.deleteQuietly(crx2RepoDir);
}
@Test
public void snsShouldBeRenamed() throws RepositoryException, IOException {
DocumentNodeStore nodeStore = migrate(new SourceDataCreator() {
@Override
public void create(Session session) throws RepositoryException {
Node parent = session.getRootNode().addNode("parent");
parent.addNode("child", "nt:folder");
parent.addNode("child", "nt:folder");
parent.addNode("child", "nt:folder");
parent.addNode("something_else", "nt:folder");
session.save();
parent.setPrimaryType("nt:folder"); // change parent type to
// something that doesn't
// allow SNS
session.save();
}
});
try {
NodeState parent = nodeStore.getRoot().getChildNode("parent");
Set<String> children = newHashSet(parent.getChildNodeNames());
assertEquals(of("child", "child_2_", "child_3_", "something_else"), children);
} finally {
nodeStore.dispose();
}
}
@Test
public void snsShouldntBeRenamed() throws RepositoryException, IOException {
DocumentNodeStore nodeStore = migrate(new SourceDataCreator() {
@Override
public void create(Session session) throws RepositoryException {
Node parent = session.getRootNode().addNode("parent");
parent.addNode("child", "nt:folder");
parent.addNode("child", "nt:folder");
parent.addNode("child", "nt:folder");
parent.addNode("something_else", "nt:folder");
session.save();
}
});
try {
NodeState parent = nodeStore.getRoot().getChildNode("parent");
Set<String> children = newHashSet(parent.getChildNodeNames());
assertEquals(of("child", "child[2]", "child[3]", "something_else"), children);
} finally {
nodeStore.dispose();
}
}
@Test
public void snsNewNameAlreadyExists() throws RepositoryException, IOException {
DocumentNodeStore nodeStore = migrate(new SourceDataCreator() {
@Override
public void create(Session session) throws RepositoryException {
Node parent = session.getRootNode().addNode("parent");
parent.addNode("child", "nt:folder");
parent.addNode("child", "nt:folder");
parent.addNode("child", "nt:folder");
parent.addNode("child_2_", "nt:folder");
parent.addNode("child_3_", "nt:folder");
parent.addNode("child_3_2", "nt:folder");
session.save();
parent.setPrimaryType("nt:folder");
session.save();
}
});
try {
NodeState parent = nodeStore.getRoot().getChildNode("parent");
Set<String> children = newHashSet(parent.getChildNodeNames());
assertEquals(of("child", "child_2_", "child_3_", "child_2_2", "child_3_2", "child_3_3"), children);
} finally {
nodeStore.dispose();
}
}
private DocumentNodeStore migrate(SourceDataCreator sourceDataCreator) throws RepositoryException, IOException {
RepositoryConfig config = RepositoryConfig.install(crx2RepoDir);
RepositoryImpl repository = RepositoryImpl.create(config);
try {
Session session = repository.login(CREDENTIALS);
sourceDataCreator.create(session);
session.logout();
} finally {
repository.shutdown();
}
config = RepositoryConfig.install(crx2RepoDir); // re-create the config
RepositoryContext context = RepositoryContext.create(config);
DocumentNodeStore target = newDocumentNodeStoreBuilder().build();
try {
RepositoryUpgrade upgrade = new RepositoryUpgrade(context, target);
upgrade.copy(null);
} finally {
context.getRepository().shutdown();
}
return target;
}
private static interface SourceDataCreator {
void create(Session session) throws RepositoryException;
}
}