Index: contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceStorage.java =================================================================== --- contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceStorage.java (revision 474820) +++ contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceStorage.java (working copy) @@ -16,6 +16,8 @@ */ package org.apache.jackrabbit.jcr2spi.name; +import java.util.Map; + import javax.jcr.NamespaceException; import javax.jcr.UnsupportedRepositoryOperationException; import javax.jcr.AccessDeniedException; @@ -26,6 +28,8 @@ */ public interface NamespaceStorage { + public Map getRegisteredNamespaces() throws RepositoryException; + public void registerNamespace(String prefix, String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException; public void unregisterNamespace(String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException; Index: contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceRegistryImpl.java =================================================================== --- contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceRegistryImpl.java (revision 474820) +++ contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceRegistryImpl.java (working copy) @@ -146,22 +146,26 @@ // inform storage before mappings are added to maps and propagated to listeners storage.registerNamespace(prefix, uri); + updatePrefixMapping(oldPrefix, prefix, uri); + } + + private void updatePrefixMapping(String oldPrefix, String newPrefix, String uri) { // remove old prefix mapping if (oldPrefix != null) { prefixToURI.remove(oldPrefix); uriToPrefix.remove(uri); } // add new prefix mapping - prefixToURI.put(prefix, uri); - uriToPrefix.put(uri, prefix); - + prefixToURI.put(newPrefix, uri); + uriToPrefix.put(uri, newPrefix); + // notify listeners if (oldPrefix != null) { // remapped existing namespace uri to new prefix - notifyNamespaceRemapped(oldPrefix, prefix, uri); + notifyNamespaceRemapped(oldPrefix, newPrefix, uri); } else { // added new namespace uri mapped to prefix - notifyNamespaceAdded(prefix, uri); + notifyNamespaceAdded(newPrefix, uri); } } @@ -214,8 +218,23 @@ public String getURI(String prefix) throws NamespaceException { String uri = (String) prefixToURI.get(prefix); if (uri == null) { + try { + // try to refresh... + Map currentmap = storage.getRegisteredNamespaces(); + uri = (String)currentmap.get(prefix); + if (uri != null) { + updatePrefixMapping(null, prefix, uri); + } + } + catch (RepositoryException ex) { + // TODO: log this? + } + } + + if (uri == null) { throw new NamespaceException(prefix + ": is not a registered namespace prefix."); } + return uri; } @@ -224,10 +243,32 @@ * @see org.apache.jackrabbit.name.NamespaceResolver#getPrefix(String) */ public String getPrefix(String uri) throws NamespaceException { - String prefix = (String) uriToPrefix.get(uri); + String prefix = (String)uriToPrefix.get(uri); if (prefix == null) { + try { + // try to refresh... + Map currentmap = storage.getRegisteredNamespaces(); + if (currentmap.containsValue(uri)) { + for (Iterator it = currentmap.entrySet().iterator(); it.hasNext() && prefix == null; ) { + Map.Entry entry = (Map.Entry)it.next(); + if (uri.equals((String)entry.getValue())) { + prefix = (String)entry.getKey(); + } + } + if (prefix != null) { + updatePrefixMapping(null, prefix, uri); + } + } + } + catch (RepositoryException ex) { + // TODO: log this? + } + } + + if (prefix == null) { throw new NamespaceException(uri + ": is not a registered namespace uri."); } + return prefix; } Index: contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java =================================================================== --- contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (revision 474820) +++ contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (working copy) @@ -586,6 +586,13 @@ service.unregisterNamespace(sessionInfo, uri); } + /** + * @inheritDoc + */ + public Map getRegisteredNamespaces() throws RepositoryException { + return service.getRegisteredNamespaces(sessionInfo); + } + //----------------------------------------------------< NodetypeStorage >--- /** * @inheritDoc