diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java index 3e46354..c8407f1 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java @@ -444,6 +444,9 @@ public class SessionImpl implements JackrabbitSession { return true; } }); + + // TODO keep namespace refresh either here or in ReadWriteNamespaceRegistry.refresh + sessionContext.getNamespaces().refresh(); } @Override diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionNamespaces.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionNamespaces.java index e091a7f..e5f8acd 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionNamespaces.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionNamespaces.java @@ -53,6 +53,9 @@ class SessionNamespaces extends LocalNameMapper { // The code below was initially copied from JCR Commons AbstractSession, // but has since been radically modified + // TODO is it safe to assume that the super class will never modify the local map? Otherwise we need some kind of event listeners + private String[] namespacePrefixesCache = null; + /** * @see Session#setNamespacePrefix(String, String) */ @@ -90,12 +93,22 @@ class SessionNamespaces extends LocalNameMapper { // add the new mapping local.put(prefix, uri); + + refresh(); } /** * @see Session#getNamespacePrefixes() */ synchronized String[] getNamespacePrefixes() { + if (namespacePrefixesCache == null) { + namespacePrefixesCache = internalGetNamespacePrefixes(); + } + // Clone to avoid that the consumer can manipulate the cache + return namespacePrefixesCache.clone(); + } + + private String[] internalGetNamespacePrefixes() { // get registered namespace prefixes Iterable global = emptyList(); PropertyState property = nsdata.getProperty(REP_PREFIXES); @@ -169,6 +182,7 @@ class SessionNamespaces extends LocalNameMapper { } if (base != prefix) { local.put(prefix, uri); + refresh(); } return prefix; @@ -179,6 +193,14 @@ class SessionNamespaces extends LocalNameMapper { */ synchronized void clear() { local.clear(); + refresh(); + } + + /** + * Clears the namespace prefixes cache. + */ + synchronized void refresh() { + namespacePrefixesCache = null; } } diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java index 4e0e6fc..94bc4f9 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java @@ -219,6 +219,8 @@ public class WorkspaceImpl implements JackrabbitWorkspace { @Override protected void refresh() throws RepositoryException { getSession().refresh(true); + // TODO keep namespace refresh either here or in SessionImpl.refresh + sessionContext.getNamespaces().refresh(); } }; }