/*
* 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 java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Random;
import javax.jcr.Binary;
import javax.jcr.Credentials;
import javax.jcr.NamespaceRegistry;
import javax.jcr.Node;
import javax.jcr.PropertyType;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.Value;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.nodetype.NodeTypeTemplate;
import junit.framework.TestCase;
import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.core.config.RepositoryConfig;
public class RepositoryCopierTest extends TestCase {
private static final Credentials CREDENTIALS =
new SimpleCredentials("admin", "admin".toCharArray());
private static final File BASE = new File("target", "RepositoryCopierTest");
private static final File SOURCE = new File(BASE, "source");
private static final File TARGET = new File(BASE, "target");
private static final Calendar DATE = Calendar.getInstance();
private static final byte[] BINARY = new byte[64 * 1024];
static {
new Random().nextBytes(BINARY);
}
private String identifier;
protected void setUp() {
BASE.mkdirs();
}
protected void tearDown() throws Exception {
FileUtils.deleteDirectory(BASE);
}
public void testRepositoryCopy() throws Exception {
createSourceRepository();
RepositoryCopier.copy(SOURCE, TARGET);
verifyTargetRepository();
}
private void createSourceRepository() throws Exception {
RepositoryImpl repository = RepositoryImpl.create(
RepositoryConfig.install(SOURCE));
try {
Session session = repository.login(CREDENTIALS);
try {
NamespaceRegistry registry =
session.getWorkspace().getNamespaceRegistry();
registry.registerNamespace("test", "http://www.example.org/");
NodeTypeManager manager =
session.getWorkspace().getNodeTypeManager();
NodeTypeTemplate template = manager.createNodeTypeTemplate();
template.setName("test:unstructured");
template.setDeclaredSuperTypeNames(
new String[] { "nt:unstructured" });
manager.registerNodeType(template, false);
Node root = session.getRootNode();
Node referenceable =
root.addNode("referenceable", "test:unstructured");
referenceable.addMixin(NodeType.MIX_REFERENCEABLE);
session.save();
identifier = referenceable.getIdentifier();
Node properties = root.addNode("properties", "test:unstructured");
properties.setProperty("boolean", true);
Binary binary = session.getValueFactory().createBinary(
new ByteArrayInputStream(BINARY));
try {
properties.setProperty("binary", binary);
} finally {
binary.dispose();
}
properties.setProperty("date", DATE);
properties.setProperty("decimal", new BigDecimal(123));
properties.setProperty("double", Math.PI);
properties.setProperty("long", 9876543210L);
properties.setProperty("reference", referenceable);
properties.setProperty("string", "test");
properties.setProperty("multiple", "a,b,c".split(","));
session.save();
binary = properties.getProperty("binary").getBinary();
try {
InputStream stream = binary.getStream();
try {
for (int i = 0; i < BINARY.length; i++) {
assertEquals(BINARY[i], (byte) stream.read());
}
assertEquals(-1, stream.read());
} finally {
stream.close();
}
} finally {
binary.dispose();
}
} finally {
session.logout();
}
} finally {
repository.shutdown();
}
}
private void verifyTargetRepository() throws Exception {
RepositoryImpl repository = RepositoryImpl.create(
RepositoryConfig.create(TARGET));
try {
Session session = repository.login(CREDENTIALS);
try {
assertEquals(
"http://www.example.org/",
session.getNamespaceURI("test"));
NodeTypeManager manager =
session.getWorkspace().getNodeTypeManager();
assertTrue(manager.hasNodeType("test:unstructured"));
NodeType type = manager.getNodeType("test:unstructured");
assertFalse(type.isMixin());
assertTrue(type.isNodeType("nt:unstructured"));
assertTrue(session.nodeExists("/properties"));
Node properties = session.getNode("/properties");
assertEquals(
PropertyType.BOOLEAN,
properties.getProperty("boolean").getType());
assertEquals(
true, properties.getProperty("boolean").getBoolean());
assertEquals(
PropertyType.BINARY,
properties.getProperty("binary").getType());
Binary binary = properties.getProperty("binary").getBinary();
try {
InputStream stream = binary.getStream();
try {
for (int i = 0; i < BINARY.length; i++) {
assertEquals(BINARY[i], (byte) stream.read());
}
assertEquals(-1, stream.read());
} finally {
stream.close();
}
} finally {
binary.dispose();
}
assertEquals(
PropertyType.DATE,
properties.getProperty("date").getType());
assertEquals(
DATE.getTimeInMillis(),
properties.getProperty("date").getDate().getTimeInMillis());
assertEquals(
PropertyType.DECIMAL,
properties.getProperty("decimal").getType());
assertEquals(
new BigDecimal(123),
properties.getProperty("decimal").getDecimal());
assertEquals(
PropertyType.DOUBLE,
properties.getProperty("double").getType());
assertEquals(
Math.PI, properties.getProperty("double").getDouble());
assertEquals(
PropertyType.LONG,
properties.getProperty("long").getType());
assertEquals(
9876543210L, properties.getProperty("long").getLong());
assertEquals(
PropertyType.REFERENCE,
properties.getProperty("reference").getType());
assertEquals(
identifier,
properties.getProperty("reference").getString());
assertEquals(
"/referenceable",
properties.getProperty("reference").getNode().getPath());
assertEquals(
PropertyType.STRING,
properties.getProperty("string").getType());
assertEquals(
"test", properties.getProperty("string").getString());
assertEquals(
PropertyType.STRING,
properties.getProperty("multiple").getType());
Value[] values = properties.getProperty("multiple").getValues();
assertEquals(3, values.length);
assertEquals("a", values[0].getString());
assertEquals("b", values[1].getString());
assertEquals("c", values[2].getString());
} finally {
session.logout();
}
} finally {
repository.shutdown();
}
}
}