diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/impl/LocalNameMapper.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/impl/LocalNameMapper.java index fe688f92519..a1d5d40471a 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/impl/LocalNameMapper.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/impl/LocalNameMapper.java @@ -58,16 +58,13 @@ public synchronized String getJcrName(@NotNull String oakName) { checkArgument(!oakName.startsWith(":"), oakName); // hidden name checkArgument(!isExpandedName(oakName), oakName); // expanded name - if (!local.isEmpty()) { - int colon = oakName.indexOf(':'); - if (colon > 0) { - String oakPrefix = oakName.substring(0, colon); - String uri = getNamespacesProperty(oakPrefix); - if (uri == null) { - throw new IllegalStateException( - "No namespace mapping found for " + oakName); - } + int colon = oakName.indexOf(':'); + if (colon > 0) { + String oakPrefix = oakName.substring(0, colon); + String uri = getNamespacesProperty(oakPrefix); + if (local.containsValue(uri)) { + //local prefix replaces global prefix for (Map.Entry entry : local.entrySet()) { if (uri.equals(entry.getValue())) { String jcrPrefix = entry.getKey(); @@ -78,22 +75,15 @@ public synchronized String getJcrName(@NotNull String oakName) { } } } - - // local mapping not found for this URI, make sure there - // is no conflicting local mapping for the prefix - if (local.containsKey(oakPrefix)) { - for (int i = 2; true; i++) { - String jcrPrefix = oakPrefix + i; - if (!local.containsKey(jcrPrefix)) { - log.warn("no prefix found for namespace name '" + uri + "', using unmapped temporary prefix '" - + jcrPrefix + "' for now (see OAK-10544)"); - return jcrPrefix + oakName.substring(colon); - } - } - } + } else if (uri == null && !local.containsKey(oakPrefix)) { + //completely unknown prefix + throw new IllegalStateException("No namespace mapping found for " + oakName); } } + //locally registered, but not yet globally known + //or globally known, but not locally overridden + //or empty namespace return oakName; } diff --git a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/JackrabbitNodeTest.java b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/JackrabbitNodeTest.java index 223102839ae..0c4212e9c11 100644 --- a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/JackrabbitNodeTest.java +++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/JackrabbitNodeTest.java @@ -24,14 +24,19 @@ import java.util.List; import java.util.concurrent.CountDownLatch; +import javax.jcr.ItemExistsException; import javax.jcr.Node; import javax.jcr.NodeIterator; +import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.lock.LockException; +import javax.jcr.nodetype.ConstraintViolationException; import javax.jcr.observation.Event; import javax.jcr.observation.EventIterator; import javax.jcr.observation.EventListener; import javax.jcr.observation.ObservationManager; +import javax.jcr.version.VersionException; import org.apache.jackrabbit.JcrConstants; import org.apache.jackrabbit.api.JackrabbitNode; @@ -336,4 +341,11 @@ public void testGetPropertyOrNull() throws Exception { assertNotNull(jn.getPropertyOrNull(JcrConstants.JCR_PRIMARYTYPE)); assertNotNull(jn.getPropertyOrNull("a/aa/p")); } + + public void testSessionMappedPrefixWithUnregisteredNamespace() throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, RepositoryException { + Node n = testRootNode.addNode("foo:bar"); + assertEquals("foo:bar", n.getName()); + n.getSession().setNamespacePrefix("foo", "http://foo.com"); + assertEquals("foo:bar", n.getName()); // this must not fail, but throws a ISE + } }