You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2006/12/12 11:09:17 UTC

svn commit: r486082 - /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java

Author: tripod
Date: Tue Dec 12 02:09:16 2006
New Revision: 486082

URL: http://svn.apache.org/viewvc?view=rev&rev=486082
Log:
JCR-669: Move NamespaceMappings/Index from lucene to namespace registry.

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java?view=diff&rev=486082&r1=486081&r2=486082
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java Tue Dec 12 02:09:16 2006
@@ -16,22 +16,17 @@
  */
 package org.apache.jackrabbit.core;
 
-import org.apache.jackrabbit.core.fs.FileSystem;
-import org.apache.jackrabbit.core.fs.FileSystemResource;
 import org.apache.jackrabbit.core.cluster.NamespaceEventChannel;
 import org.apache.jackrabbit.core.cluster.NamespaceEventListener;
+import org.apache.jackrabbit.core.fs.FileSystem;
+import org.apache.jackrabbit.core.fs.FileSystemResource;
 import org.apache.jackrabbit.name.AbstractNamespaceResolver;
-import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.name.NameCache;
+import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.util.XMLChar;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.jcr.AccessDeniedException;
-import javax.jcr.NamespaceException;
-import javax.jcr.NamespaceRegistry;
-import javax.jcr.RepositoryException;
-import javax.jcr.UnsupportedRepositoryOperationException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.HashMap;
@@ -39,6 +34,12 @@
 import java.util.Iterator;
 import java.util.Properties;
 
+import javax.jcr.AccessDeniedException;
+import javax.jcr.NamespaceException;
+import javax.jcr.NamespaceRegistry;
+import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
+
 /**
  * A <code>NamespaceRegistryImpl</code> ...
  */
@@ -48,6 +49,7 @@
     private static Logger log = LoggerFactory.getLogger(NamespaceRegistryImpl.class);
 
     private static final String NS_REG_RESOURCE = "ns_reg.properties";
+    private static final String NS_IDX_RESOURCE = "ns_idx.properties";
 
     private static final HashSet reservedPrefixes = new HashSet();
     private static final HashSet reservedURIs = new HashSet();
@@ -76,6 +78,11 @@
     private HashMap prefixToURI = new HashMap();
     private HashMap uriToPrefix = new HashMap();
 
+    private HashMap indexToURI = new HashMap();
+    private HashMap uriToIndex = new HashMap();
+
+    private int lastIndex = 0;
+
     private final CachingNamespaceResolver resolver;
 
     private final FileSystem nsRegStore;
@@ -99,64 +106,118 @@
         load();
     }
 
+    /**
+     * Clears all mappings.
+     */
+    private void clear() {
+        prefixToURI.clear();
+        uriToPrefix.clear();
+        indexToURI.clear();
+        uriToIndex.clear();
+    }
+
+    /**
+     * Adds a new mapping and automatically assigns a new index.
+     *
+     * @param prefix the namespace prefix
+     * @param uri the namespace uri
+     */
+    private void map(String prefix, String uri) {
+        map(prefix, uri, null);
+    }
+
+    /**
+     * Adds a new mapping and uses the given index if specified.
+     *
+     * @param prefix the namespace prefix
+     * @param uri the namespace uri
+     * @param idx the index or <code>null</code>.
+     */
+    private void map(String prefix, String uri, Integer idx) {
+        prefixToURI.put(prefix, uri);
+        uriToPrefix.put(uri, prefix);
+        if (!uriToIndex.containsKey(uri)) {
+            if (idx == null) {
+                idx = new Integer(++lastIndex);
+            } else {
+                if (idx.intValue() > lastIndex) {
+                    lastIndex = idx.intValue();
+                }
+            }
+            indexToURI.put(idx, uri);
+            uriToIndex.put(uri, idx);
+        }
+    }
+
     private void load() throws RepositoryException {
         FileSystemResource propFile =
                 new FileSystemResource(nsRegStore, NS_REG_RESOURCE);
+        FileSystemResource idxFile =
+                new FileSystemResource(nsRegStore, NS_IDX_RESOURCE);
         try {
             if (!propFile.exists()) {
                 // clear existing mappings
-                prefixToURI.clear();
-                uriToPrefix.clear();
+                clear();
 
                 // default namespace (if no prefix is specified)
-                prefixToURI.put(QName.NS_EMPTY_PREFIX, QName.NS_DEFAULT_URI);
-                uriToPrefix.put(QName.NS_DEFAULT_URI, QName.NS_EMPTY_PREFIX);
+                map(QName.NS_EMPTY_PREFIX, QName.NS_DEFAULT_URI);
+
                 // declare the predefined mappings
                 // rep:
-                prefixToURI.put(QName.NS_REP_PREFIX, QName.NS_REP_URI);
-                uriToPrefix.put(QName.NS_REP_URI, QName.NS_REP_PREFIX);
+                map(QName.NS_REP_PREFIX, QName.NS_REP_URI);
                 // jcr:
-                prefixToURI.put(QName.NS_JCR_PREFIX, QName.NS_JCR_URI);
-                uriToPrefix.put(QName.NS_JCR_URI, QName.NS_JCR_PREFIX);
+                map(QName.NS_JCR_PREFIX, QName.NS_JCR_URI);
                 // nt:
-                prefixToURI.put(QName.NS_NT_PREFIX, QName.NS_NT_URI);
-                uriToPrefix.put(QName.NS_NT_URI, QName.NS_NT_PREFIX);
+                map(QName.NS_NT_PREFIX, QName.NS_NT_URI);
                 // mix:
-                prefixToURI.put(QName.NS_MIX_PREFIX, QName.NS_MIX_URI);
-                uriToPrefix.put(QName.NS_MIX_URI, QName.NS_MIX_PREFIX);
+                map(QName.NS_MIX_PREFIX, QName.NS_MIX_URI);
                 // sv:
-                prefixToURI.put(QName.NS_SV_PREFIX, QName.NS_SV_URI);
-                uriToPrefix.put(QName.NS_SV_URI, QName.NS_SV_PREFIX);
+                map(QName.NS_SV_PREFIX, QName.NS_SV_URI);
                 // xml:
-                prefixToURI.put(QName.NS_XML_PREFIX, QName.NS_XML_URI);
-                uriToPrefix.put(QName.NS_XML_URI, QName.NS_XML_PREFIX);
+                map(QName.NS_XML_PREFIX, QName.NS_XML_URI);
 
                 // persist mappings
                 store();
                 return;
             }
 
+            // check if index file exists
+            Properties indexes = new Properties();
+            if (idxFile.exists()) {
+                InputStream in = idxFile.getInputStream();
+                try {
+                    indexes.load(in);
+                } finally {
+                    in.close();
+                }
+            }
+
             InputStream in = propFile.getInputStream();
             try {
                 Properties props = new Properties();
                 props.load(in);
 
                 // clear existing mappings
-                prefixToURI.clear();
-                uriToPrefix.clear();
+                clear();
 
                 // read mappings from properties
                 Iterator iter = props.keySet().iterator();
                 while (iter.hasNext()) {
                     String prefix = (String) iter.next();
                     String uri = props.getProperty(prefix);
-
-                    prefixToURI.put(prefix, uri);
-                    uriToPrefix.put(uri, prefix);
+                    String idx = indexes.getProperty(uri);
+                    if (idx != null) {
+                        map(prefix, uri, Integer.decode(idx));
+                    } else {
+                        map(prefix, uri);
+                    }
                 }
             } finally {
                 in.close();
             }
+            if (!idxFile.exists()) {
+                store();
+            }
         } catch (Exception e) {
             String msg = "failed to load namespace registry";
             log.debug(msg);
@@ -191,6 +252,33 @@
             log.debug(msg);
             throw new RepositoryException(msg, e);
         }
+
+        FileSystemResource indexFile =
+                new FileSystemResource(nsRegStore, NS_IDX_RESOURCE);
+        try {
+            indexFile.makeParentDirs();
+            OutputStream os = indexFile.getOutputStream();
+            Properties props = new Properties();
+
+            // store mappings in properties
+            Iterator iter = uriToIndex.keySet().iterator();
+            while (iter.hasNext()) {
+                String uri = (String) iter.next();
+                String index = uriToIndex.get(uri).toString();
+                props.setProperty(uri, index);
+            }
+
+            try {
+                props.store(os, null);
+            } finally {
+                // make sure stream is closed
+                os.close();
+            }
+        } catch (Exception e) {
+            String msg = "failed to persist namespace registry index.";
+            log.debug(msg);
+            throw new RepositoryException(msg, e);
+        }
     }
 
     /**
@@ -266,6 +354,36 @@
         eventChannel.setListener(this);
     }
 
+    /**
+     * Returns the index (i.e. stable prefix) for the given uri.
+     *
+     * @param uri the uri to retrieve the index for
+     * @return the index
+     * @throws NamespaceException if the URI is not registered.
+     */
+    public int getURIIndex(String uri) throws NamespaceException {
+        Integer idx = (Integer) uriToIndex.get(uri);
+        if (idx == null) {
+            throw new NamespaceException("URI " + uri + " is not registered.");
+        }
+        return idx.intValue();
+    }
+
+    /**
+     * Returns the URI for a given index (i.e. stable prefix).
+     *
+     * @param idx the index to retrieve the uri for.
+     * @return the uri
+     * @throws NamespaceException if the URI is not registered.
+     */
+    public String getURI(int idx) throws NamespaceException {
+        String uri = (String) indexToURI.get(new Integer(idx));
+        if (uri == null) {
+            throw new NamespaceException("URI for index " + idx +  " not registered.");
+        }
+        return uri;
+    }
+    
     //----------------------------------------------------< NamespaceRegistry >
     /**
      * {@inheritDoc}
@@ -323,8 +441,7 @@
         }
 
         // add new prefix mapping
-        prefixToURI.put(prefix, uri);
-        uriToPrefix.put(uri, prefix);
+        map(prefix, uri);
 
         if (eventChannel != null) {
             eventChannel.remapped(oldPrefix, prefix, uri);
@@ -450,8 +567,7 @@
         }
 
         // add new prefix mapping
-        prefixToURI.put(newPrefix, uri);
-        uriToPrefix.put(uri, newPrefix);
+        map(newPrefix, uri);
 
         // persist mappings
         store();