diff --git a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryTest.java similarity index 96% rename from oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java rename to oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryTest.java index e9203a1a0a8..a67bac7ca50 100644 --- a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java +++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryTest.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.jackrabbit.oak.jcr; +package org.apache.jackrabbit.oak.jcr.repository; import static java.util.Arrays.asList; import static javax.jcr.ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW; @@ -30,6 +30,9 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.Assume.assumeTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -86,14 +89,27 @@ import org.apache.jackrabbit.api.JackrabbitNode; import org.apache.jackrabbit.api.JackrabbitRepository; import org.apache.jackrabbit.api.ReferenceBinary; +import org.apache.jackrabbit.api.stats.RepositoryStatistics; import org.apache.jackrabbit.commons.cnd.CndImporter; import org.apache.jackrabbit.commons.cnd.ParseException; import org.apache.jackrabbit.commons.jackrabbit.SimpleReferenceBinary; import org.apache.jackrabbit.core.data.RandomInputStream; import org.apache.jackrabbit.core.security.principal.AdminPrincipal; +import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.fixture.NodeStoreFixture; -import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl; +import org.apache.jackrabbit.oak.jcr.AbstractRepositoryTest; +import org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate; +import org.apache.jackrabbit.oak.jcr.session.SessionContext; +import org.apache.jackrabbit.oak.jcr.session.SessionNamespaces; +import org.apache.jackrabbit.oak.jcr.session.SessionStats; +import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState; +import org.apache.jackrabbit.oak.plugins.observation.CommitRateLimiter; +import org.apache.jackrabbit.oak.plugins.tree.factories.RootFactory; +import org.apache.jackrabbit.oak.plugins.tree.impl.RootProviderService; import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants; +import org.apache.jackrabbit.oak.spi.security.SecurityProvider; +import org.apache.jackrabbit.oak.stats.NoopStats; +import org.apache.jackrabbit.oak.stats.StatisticManager; import org.apache.jackrabbit.spi.QValue; import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver; import org.apache.jackrabbit.spi.commons.value.QValueFactoryImpl; @@ -2331,6 +2347,35 @@ protected void append(ILoggingEvent e) { logMessages.toString(), containsString(p2.getPath())); } + @Test + public void testConsistencyOfNameConversion() throws RepositoryException { + NamespaceRegistry namespaceRegistry = getAdminSession().getWorkspace().getNamespaceRegistry(); + Root root = new RootProviderService().createReadOnlyRoot(EmptyNodeState.EMPTY_NODE); + + SessionDelegate sessionDelegateMock = mock(SessionDelegate.class); + when(sessionDelegateMock.getSessionStats()).thenReturn(mock(SessionStats.class)); + when(sessionDelegateMock.getRoot()).thenReturn(root); + SessionNamespaces sessionNamespaces = new SessionNamespaces(root); + when(sessionDelegateMock.getNamespaces()).thenReturn(sessionNamespaces); + StatisticManager statisticManagerMock = mock(StatisticManager.class); + when(statisticManagerMock.getStatsCounter(any(RepositoryStatistics.Type.class))).thenReturn(NoopStats.INSTANCE); + when(statisticManagerMock.getMeter(any(RepositoryStatistics.Type.class))).thenReturn(NoopStats.INSTANCE); + SessionContext sessionContext = ((RepositoryImpl) getRepository()).createSessionContext(statisticManagerMock, mock(SecurityProvider.class), Collections.emptyMap(), sessionDelegateMock, 100, mock(CommitRateLimiter.class)); + + //register global namespaces + namespaceRegistry.registerNamespace("sample", "http://www.example.com"); + namespaceRegistry.registerNamespace("globalPrefix", "http://www.secondexample.com"); + + //should fail (but doesn't, see OAK-xyz), because the prefix foo is not registered + assertEquals("foo:bar", sessionContext.getJcrName("foo:bar")); + + //create a local mapping for a completely unrelated namespace + sessionContext.getSession().setNamespacePrefix("localPrefix", "http://www.secondexample.com"); + + //Now (in the presence of a local re-mapping) it will fail + assertEquals("foo:bar", sessionContext.getJcrName("foo:bar")); + } + private static ch.qos.logback.classic.Logger rootLogger() { return ((LoggerContext) LoggerFactory.getILoggerFactory()).getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); }