/*
* 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.harness.compatibility;
import static org.testng.AssertJUnit.fail;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Random;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.version.Version;
import javax.jcr.version.VersionHistory;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.api.JackrabbitNodeTypeManager;
import org.apache.jackrabbit.core.RepositoryImpl;
import org.apache.jackrabbit.core.config.RepositoryConfig;
public class AbstractRepositoryTest {
protected void doCreateRepositories(String name) throws Exception {
// Create a repository using the Jackrabbit default configuration
doCreateRepository(
name,
RepositoryImpl.class.getResourceAsStream("repository.xml"));
// Create repositories for any special configurations included
File directory = new File(new File("src", "test"), "resources");
File[] files = directory.listFiles();
if (files != null) {
Arrays.sort(files);
for (File file : files) {
String xml = file.getName();
if (file.isFile() && xml.endsWith(".xml")) {
doCreateRepository(
name + "-" + xml.substring(0, xml.length() - 4),
FileUtils.openInputStream(file));
}
}
}
}
/**
* Creates a named test repository with the given configuration file.
*
* @param name name of the repository
* @param xml input stream for reading the repository configuration
* @throws Exception if the repository could not be created
*/
protected void doCreateRepository(String name, InputStream xml)
throws Exception {
File directory = new File(new File("target", "repository"), name);
File configuration = new File(directory, "repository.xml");
// Copy the configuration file into the repository directory
try {
OutputStream output = FileUtils.openOutputStream(configuration);
try {
IOUtils.copy(xml, output);
} finally {
output.close();
}
} finally {
xml.close();
}
// Create the repository
try {
RepositoryConfig config = RepositoryConfig.create(
configuration.getPath(), directory.getPath());
RepositoryImpl repository = RepositoryImpl.create(config);
try {
Session session = repository.login(
new SimpleCredentials("admin", "admin".toCharArray()));
try {
createTestData(session);
} finally {
session.logout();
}
} finally {
repository.shutdown();
}
} catch (RepositoryException e) {
e.printStackTrace();
fail("Create repository " + name);
}
}
protected void createTestData(Session session) throws Exception {
JackrabbitNodeTypeManager manager = (JackrabbitNodeTypeManager)
session.getWorkspace().getNodeTypeManager();
String cnd =
"<nt='http://www.jcp.org/jcr/nt/1.0'>\n"
+ "<mix='http://www.jcp.org/jcr/mix/1.0'>\n"
+ "[nt:myversionable] > nt:unstructured, mix:versionable\n";
manager.registerNodeTypes(
new ByteArrayInputStream(cnd.getBytes("UTF-8")),
JackrabbitNodeTypeManager.TEXT_X_JCR_CND);
Node root = session.getRootNode();
Node test = root.addNode("test", "nt:unstructured");
root.save();
Node versionable = createVersionable(test);
createProperties(test, versionable);
createLock(test);
createUsers(session);
}
protected Node createVersionable(Node parent) throws RepositoryException {
Node versionable = parent.addNode("versionable", "nt:myversionable");
versionable.setProperty("foo", "A");
parent.save();
VersionHistory history = versionable.getVersionHistory();
Version versionA = versionable.checkin();
history.addVersionLabel(versionA.getName(), "labelA", false);
versionable.checkout();
versionable.setProperty("foo", "B");
parent.save();
Version versionB = versionable.checkin();
history.addVersionLabel(versionB.getName(), "labelB", false);
return versionable;
}
protected void createProperties(Node parent, Node reference)
throws RepositoryException {
Node properties = parent.addNode("properties", "nt:unstructured");
properties.setProperty("boolean", true);
properties.setProperty("double", 0.123456789);
properties.setProperty("long", 1234567890);
properties.setProperty("reference", reference);
properties.setProperty("string", "test");
properties.setProperty("multiple", new String[] { "a", "b", "c" });
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(1234567890);
properties.setProperty("date", calendar);
byte[] binary = new byte[100 * 1000];
new Random(1234567890).nextBytes(binary);
properties.setProperty("binary", new ByteArrayInputStream(binary));
parent.save();
}
protected void createLock(Node parent) throws RepositoryException {
Node lock = parent.addNode("lock", "nt:unstructured");
lock.addMixin("mix:lockable");
parent.save();
lock.lock(true, false);
}
protected void createUsers(Session session) throws RepositoryException {
}
}