/*
* 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.jcr2spi.name;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.jcr.NamespaceException;
import javax.jcr.NamespaceRegistry;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.jackrabbit.test.AbstractJCRTest;
import org.apache.jackrabbit.test.NotExecutableException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <code>NamespaceRegistryTest</code>...
*/
public class NamespaceRegistryTest extends AbstractJCRTest {
private static Logger log = LoggerFactory.getLogger(NamespaceRegistryTest.class);
/** Default value of test prefix */
private static final String TEST_PREFIX = "test";
/** Default value of test namespace uri */
private static final String TEST_URI = "http://www.apache.org/jackrabbit/test/namespaceRegistryTest";
private NamespaceRegistry nsRegistry;
private String testPrefix;
private String testURI;
@Override
protected void setUp() throws Exception {
super.setUp();
nsRegistry = superuser.getWorkspace().getNamespaceRegistry();
testPrefix = getUnusedPrefix();
testURI = getUnusedURI();
boolean level2 = Boolean.valueOf(superuser.getRepository().getDescriptor(Repository.LEVEL_2_SUPPORTED)).booleanValue();
if (!level2) {
throw new NotExecutableException("Cannot test namespace registration/unregistration. Repository is a Level 1 only.");
}
}
@Override
protected void tearDown() throws Exception {
nsRegistry = null;
super.tearDown();
}
/**
* Test if a new registered namespace is immediately visible through another
* session object.
*
* @throws RepositoryException
*/
public void testRegisteredNamespaceVisibility() throws RepositoryException {
Session otherSession = getHelper().getReadOnlySession();
try {
NamespaceRegistry other = otherSession.getWorkspace().getNamespaceRegistry();
nsRegistry.registerNamespace(testPrefix, testURI);
String otherUri = other.getURI(testPrefix);
String otherPrefix = other.getPrefix(testURI);
assertTrue("Namespace registered must be immediately visible to any other session.", testURI.equals(otherUri) && testPrefix.equals(otherPrefix));
} finally {
otherSession.logout();
}
}
/**
* Test if a replace namespace prefix cannot be used as key any more to
* retrieve the uri.
*
* @throws RepositoryException
*/
public void testReRegisteredNamespace() throws RepositoryException {
nsRegistry.registerNamespace(testPrefix, testURI);
String replacePrefix = getUnusedPrefix();
nsRegistry.registerNamespace(replacePrefix, testURI);
try {
nsRegistry.getURI(testPrefix);
fail("Namespace with prefix " + testPrefix + " has been reregistered with new prefix " + replacePrefix);
} catch (NamespaceException e) {
// OK
}
}
/**
* Test if a replace namespace prefix cannot be used as key any more to
* retrieve the uri in the <code>NamespaceRegistry</code> retrieved by
* another Session object.
*
* @throws RepositoryException
*/
public void testReRegisteredNamespace2() throws RepositoryException {
Session otherSession = getHelper().getReadOnlySession();
try {
NamespaceRegistry other = otherSession.getWorkspace().getNamespaceRegistry();
nsRegistry.registerNamespace(testPrefix, testURI);
other.getPrefix(testURI);
String replacePrefix = getUnusedPrefix();
nsRegistry.registerNamespace(replacePrefix, testURI);
String otherPrefix = other.getPrefix(testURI);
assertEquals("Namespace with prefix " + testPrefix + " has been reregistered with new prefix " + replacePrefix, replacePrefix, otherPrefix);
} finally {
otherSession.logout();
}
}
/**
* Test if a replaced namespace prefix is immediately visible in the
* NamespaceRegistry obtained from another session object.
*
* @throws RepositoryException
*/
public void testReRegisteredNamespaceVisibility() throws RepositoryException {
Session otherSession = getHelper().getReadOnlySession();
try {
NamespaceRegistry other = otherSession.getWorkspace().getNamespaceRegistry();
nsRegistry.registerNamespace(testPrefix, testURI);
other.getPrefix(testURI);
String replacePrefix = getUnusedPrefix();
nsRegistry.registerNamespace(replacePrefix, testURI);
String otherUri = other.getURI(replacePrefix);
String otherPrefix = other.getPrefix(testURI);
assertTrue("Namespace registered must be immediately visible to any other session.", testURI.equals(otherUri) && replacePrefix.equals(otherPrefix));
try {
other.getURI(testPrefix);
fail("Namespace with prefix " + testPrefix + " has been reregistered with new prefix " + replacePrefix);
} catch (NamespaceException e) {
// OK
}
} finally {
otherSession.logout();
}
}
/**
* Test if unregistering a namespace is propagated to all other sessions.
*
* @throws RepositoryException
*/
public void testUnregisteredNamespaceVisibility() throws RepositoryException, NotExecutableException {
String prefix = getUnusedPrefix();
String uri = getUnusedURI();
Session otherSession = getHelper().getReadOnlySession();
try {
NamespaceRegistry other = otherSession.getWorkspace().getNamespaceRegistry();
nsRegistry.registerNamespace(prefix, uri);
try {
nsRegistry.unregisterNamespace(prefix);
} catch (NamespaceException e) {
throw new NotExecutableException("Repository does not support unregistration of namespaces.");
}
String otherUri = other.getURI(prefix);
String otherPrefix = other.getPrefix(uri);
assertTrue("Namespace registered must be immediately visible to any other session.", uri.equals(otherUri) && prefix.equals(otherPrefix));
} finally {
otherSession.logout();
}
}
/**
* Returns a namespace prefix that currently not used in the namespace
* registry.
* @return an unused namespace prefix.
*/
private String getUnusedPrefix() throws RepositoryException {
Set<String> prefixes = new HashSet<String>(Arrays.asList(nsRegistry.getPrefixes()));
String prefix = TEST_PREFIX;
int i = 0;
while (prefixes.contains(prefix)) {
prefix = TEST_PREFIX + i++;
}
return prefix;
}
/**
* Returns a namespace URI that currently not used in the namespace
* registry.
* @return an unused namespace URI.
*/
private String getUnusedURI() throws RepositoryException {
Set<String> uris = new HashSet<String>(Arrays.asList(nsRegistry.getURIs()));
String uri = TEST_URI;
int i = 0;
while (uris.contains(uri)) {
uri = TEST_URI + i++;
}
return uri;
}
}