You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/09/29 19:38:51 UTC

svn commit: r1002775 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/persistence/bundle/ main/java/org/apache/jackrabbit/core/persistence/pool/ main/java/org/apache/jackrabbit/core/persistence/util/ test/java/org/apache...

Author: jukka
Date: Wed Sep 29 17:38:50 2010
New Revision: 1002775

URL: http://svn.apache.org/viewvc?rev=1002775&view=rev
Log:
JCR-2762: Optimize bundle serialization

Split HashMapIndex to an in-memory base class and a file-based subclass for easier testing.

Add basic test cases for HashMapIndex and BundleBinding. The goal is to ensure backwards compatibility of potential bundle serialization improvements.

Added:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/FileBasedIndex.java   (with props)
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java   (with props)
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/HashMapIndexTest.java   (with props)
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/TestAll.java   (with props)
Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/AbstractBundlePersistenceManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleBinding.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/HashMapIndex.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/NodePropBundle.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java?rev=1002775&r1=1002774&r2=1002775&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java Wed Sep 29 17:38:50 2010
@@ -39,7 +39,7 @@ import org.apache.jackrabbit.core.util.S
 import org.apache.jackrabbit.core.persistence.util.BLOBStore;
 import org.apache.jackrabbit.core.persistence.util.BundleBinding;
 import org.apache.jackrabbit.core.persistence.util.BundleCache;
-import org.apache.jackrabbit.core.persistence.util.HashMapIndex;
+import org.apache.jackrabbit.core.persistence.util.FileBasedIndex;
 import org.apache.jackrabbit.core.persistence.util.LRUNodeIdCache;
 import org.apache.jackrabbit.core.persistence.util.NodePropBundle;
 import org.apache.jackrabbit.spi.Name;
@@ -249,7 +249,7 @@ public abstract class AbstractBundlePers
                 // load name and ns index
                 FileSystemResource nsFile = new FileSystemResource(context.getFileSystem(), RES_NS_INDEX);
                 if (nsFile.exists()) {
-                    nsIndex = new HashMapIndex(nsFile);
+                    nsIndex = new FileBasedIndex(nsFile);
                 } else {
                     nsIndex = (StringIndex) context.getNamespaceRegistry();
                 }
@@ -270,7 +270,8 @@ public abstract class AbstractBundlePers
     public StringIndex getNameIndex() {
         try {
             if (nameIndex == null) {
-                nameIndex = new HashMapIndex(new FileSystemResource(context.getFileSystem(), RES_NAME_INDEX));
+                nameIndex = new FileBasedIndex(new FileSystemResource(
+                        context.getFileSystem(), RES_NAME_INDEX));
             }
             return nameIndex;
         } catch (Exception e) {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/AbstractBundlePersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/AbstractBundlePersistenceManager.java?rev=1002775&r1=1002774&r2=1002775&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/AbstractBundlePersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/AbstractBundlePersistenceManager.java Wed Sep 29 17:38:50 2010
@@ -35,7 +35,7 @@ import org.apache.jackrabbit.core.persis
 import org.apache.jackrabbit.core.persistence.PersistenceManager;
 import org.apache.jackrabbit.core.persistence.util.BLOBStore;
 import org.apache.jackrabbit.core.persistence.util.BundleCache;
-import org.apache.jackrabbit.core.persistence.util.HashMapIndex;
+import org.apache.jackrabbit.core.persistence.util.FileBasedIndex;
 import org.apache.jackrabbit.core.persistence.util.LRUNodeIdCache;
 import org.apache.jackrabbit.core.persistence.util.NodePropBundle;
 import org.apache.jackrabbit.core.state.ItemState;
@@ -248,7 +248,7 @@ public abstract class AbstractBundlePers
                 // load name and ns index
                 FileSystemResource nsFile = new FileSystemResource(context.getFileSystem(), RES_NS_INDEX);
                 if (nsFile.exists()) {
-                    nsIndex = new HashMapIndex(nsFile);
+                    nsIndex = new FileBasedIndex(nsFile);
                 } else {
                     nsIndex = (StringIndex) context.getNamespaceRegistry();
                 }
@@ -269,7 +269,8 @@ public abstract class AbstractBundlePers
     public StringIndex getNameIndex() {
         try {
             if (nameIndex == null) {
-                nameIndex = new HashMapIndex(new FileSystemResource(context.getFileSystem(), RES_NAME_INDEX));
+                nameIndex = new FileBasedIndex(new FileSystemResource(
+                        context.getFileSystem(), RES_NAME_INDEX));
             }
             return nameIndex;
         } catch (Exception e) {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleBinding.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleBinding.java?rev=1002775&r1=1002774&r2=1002775&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleBinding.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleBinding.java Wed Sep 29 17:38:50 2010
@@ -16,8 +16,6 @@
  */
 package org.apache.jackrabbit.core.persistence.util;
 
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;

Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/FileBasedIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/FileBasedIndex.java?rev=1002775&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/FileBasedIndex.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/FileBasedIndex.java Wed Sep 29 17:38:50 2010
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.persistence.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.jackrabbit.core.fs.FileSystemException;
+import org.apache.jackrabbit.core.fs.FileSystemResource;
+import org.apache.jackrabbit.core.util.StringIndex;
+
+/**
+ * Implements a {@link StringIndex} that is based on a hashmap and persists
+ * the names as property file.
+ */
+public class FileBasedIndex extends HashMapIndex {
+
+    /**
+     * the filesystem resource that stores the lookup tables.
+     */
+    private FileSystemResource file;
+
+    /**
+     * the time when the resource was last modified.
+     */
+    private long lastModified = -1;
+
+    /**
+     * Creates a new hashmap index and loads the lookup tables from the
+     * filesystem resource. If it does not exist yet, it will create a new one.
+     *
+     * @param file the filesystem resource that stores the lookup tables.
+     *
+     * @throws IOException if an I/O error occurs.
+     * @throws FileSystemException if an I/O error occurs.
+     */
+    public FileBasedIndex(FileSystemResource file)
+            throws FileSystemException, IOException {
+        this.file = file;
+        if (!file.exists()) {
+            file.makeParentDirs();
+            file.getOutputStream().close();
+        }
+        load();
+    }
+
+    /**
+     * Loads the lookup table from the filesystem resource.
+     */
+    protected void load() {
+        try {
+            long modTime = file.lastModified();
+            if (modTime != lastModified) {
+                lastModified = modTime;
+
+                InputStream in = file.getInputStream();
+                try {
+                    Properties properties = new Properties();
+                    properties.load(in);
+                    for (Object name
+                            : Collections.list(properties.propertyNames())) {
+                        String string = name.toString();
+                        Integer index =
+                            Integer.valueOf(properties.getProperty(string));
+                        stringToIndex.put(string, index);
+                        indexToString.put(index, string);
+                    }
+                } finally {
+                    in.close();
+                }
+            }
+        } catch (Exception e) {
+            throw new IllegalStateException("Unable to load lookup table", e);
+        }
+    }
+
+    /**
+     * Saves the lookup table to the filesystem resource.
+     */
+    protected void save() {
+        try {
+            OutputStream out = file.getOutputStream();
+            try {
+                Properties properties = new Properties();
+                for (Map.Entry<String, Integer> entry
+                        : stringToIndex.entrySet()) {
+                    properties.setProperty(
+                            entry.getKey(), entry.getValue().toString());
+                }
+                properties.store(out, "string index");
+            } finally {
+                out.close();
+            }
+            lastModified = file.lastModified();
+        } catch (Exception e) {
+            throw new IllegalStateException("Unable to store lookup table", e);
+        }
+    }
+
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/FileBasedIndex.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/HashMapIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/HashMapIndex.java?rev=1002775&r1=1002774&r2=1002775&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/HashMapIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/HashMapIndex.java Wed Sep 29 17:38:50 2010
@@ -18,106 +18,39 @@ package org.apache.jackrabbit.core.persi
 
 import java.util.HashMap;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Iterator;
-import java.util.Properties;
-
-import org.apache.jackrabbit.core.fs.FileSystemException;
-import org.apache.jackrabbit.core.fs.FileSystemResource;
 import org.apache.jackrabbit.core.util.StringIndex;
 
 /**
- * Implements a {@link StringIndex} that is based on a hashmap and persists
- * the names as property file.
- * <p/>
- * Please note that this class is not synchronized and the calls need to ensure
- * thread safeness.
+ * Implements a {@link StringIndex} that is based on a hashmap. Subclasses
+ * can override the protected {@link #load()} and {@link #save()} methods
+ * to implement persistent storage of the string index.
+ * <p>
+ * This class is thread-safe.
  */
 public class HashMapIndex implements StringIndex {
 
     /**
      * holds the string-to-index lookups.
      */
-    private final HashMap<String, Integer> stringToIndex = new HashMap<String, Integer>();
+    protected final HashMap<String, Integer> stringToIndex =
+        new HashMap<String, Integer>();
 
     /**
      * holds the index-to-string lookups.
      */
-    private final HashMap<Integer, String> indexToString = new HashMap<Integer, String>();
-
-    /**
-     * a copy of the {@link #stringToIndex} as properties class for faster
-     * storing.
-     */
-    private final Properties stringToIndexProps = new Properties();
+    protected final HashMap<Integer, String> indexToString =
+        new HashMap<Integer, String>();
 
     /**
-     * the filesystem resource that stores the lookup tables.
+     * Loads the lookup table.
      */
-    private FileSystemResource file;
-
-    /**
-     * the time when the resource was last modified.
-     */
-    private long lastModified = -1;
-
-    /**
-     * Creates a new hashmap index and loads the lookup tables from the
-     * filesystem resource. If it does not exist yet, it will create a new one.
-     *
-     * @param file the filesystem resource that stores the lookup tables.
-     *
-     * @throws IOException if an I/O error occurs.
-     * @throws FileSystemException if an I/O error occurs.
-     */
-    public HashMapIndex(FileSystemResource file)
-            throws FileSystemException, IOException {
-        this.file = file;
-        if (!file.exists()) {
-            file.makeParentDirs();
-            file.getOutputStream().close();
-        }
-        load();
-    }
-
-    /**
-     * Loads the lookup table from the filesystem resource.
-     *
-     * @throws IOException if an I/O error occurs.
-     * @throws FileSystemException if an I/O error occurs.
-     */
-    private void load() throws IOException, FileSystemException {
-        long modTime = file.lastModified();
-        if (modTime > lastModified) {
-            InputStream in = file.getInputStream();
-            stringToIndexProps.clear();
-            stringToIndexProps.load(in);
-            Iterator<Object> iter = stringToIndexProps.keySet().iterator();
-            while (iter.hasNext()) {
-                String uri = (String) iter.next();
-                String prop = stringToIndexProps.getProperty(uri);
-                Integer idx = Integer.valueOf(prop);
-                stringToIndex.put(uri, idx);
-                indexToString.put(idx, uri);
-            }
-            in.close();
-        }
-        lastModified = modTime;
+    protected void load() {
     }
 
     /**
-     * Saves the lookup table to the filesystem resource.
-     *
-     * @throws IOException if an I/O error occurs.
-     * @throws FileSystemException if an I/O error occurs.
+     * Saves the lookup table.
      */
-    private void save() throws IOException, FileSystemException {
-        OutputStream out = file.getOutputStream();
-        stringToIndexProps.store(out, "string index");
-        out.close();
-        lastModified = file.lastModified();
+    protected void save() {
     }
 
     /**
@@ -126,30 +59,17 @@ public class HashMapIndex implements Str
      * This implementation reloads the table from the resource if a lookup fails
      * and if the resource was modified since.
      */
-    public int stringToIndex(String nsUri) {
+    public synchronized int stringToIndex(String nsUri) {
         Integer idx = stringToIndex.get(nsUri);
         if (idx == null) {
-            try {
-                load();
-            } catch (Exception e) {
-                IllegalStateException ise = new IllegalStateException("Unable to load lookup table for uri: " + nsUri);
-                ise.initCause(e);
-                throw ise;
-            }
+            load();
             idx = stringToIndex.get(nsUri);
         }
         if (idx == null) {
             idx = Integer.valueOf(indexToString.size());
             stringToIndex.put(nsUri, idx);
             indexToString.put(idx, nsUri);
-            stringToIndexProps.put(nsUri, idx.toString());
-            try {
-                save();
-            } catch (Exception e) {
-                IllegalStateException ise = new IllegalStateException("Unable to store lookup table for uri: "  + nsUri);
-                ise.initCause(e);
-                throw ise;
-            }
+            save();
         }
         return idx.intValue();
     }
@@ -160,19 +80,14 @@ public class HashMapIndex implements Str
      * This implementation reloads the table from the resource if a lookup fails
      * and if the resource was modified since.
      */
-    public String indexToString(int i) {
+    public synchronized String indexToString(int i) {
         Integer idx = Integer.valueOf(i);
         String s = indexToString.get(idx);
         if (s == null) {
-            try {
-                load();
-            } catch (Exception e) {
-                IllegalStateException ise = new IllegalStateException("Unable to load lookup table for index: " + i);
-                ise.initCause(e);
-                throw ise;
-            }
+            load();
             s = indexToString.get(idx);
         }
         return s;
     }
+
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/NodePropBundle.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/NodePropBundle.java?rev=1002775&r1=1002774&r2=1002775&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/NodePropBundle.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/NodePropBundle.java Wed Sep 29 17:38:50 2010
@@ -451,6 +451,24 @@ public class NodePropBundle {
         this.size = size;
     }
 
+    //--------------------------------------------------------------< Object >
+
+    public boolean equals(Object object) {
+        if (object instanceof NodePropBundle) {
+            NodePropBundle that = (NodePropBundle) object;
+            return id.equals(that.id)
+                && parentId.equals(that.parentId)
+                && nodeTypeName.equals(that.nodeTypeName)
+                && mixinTypeNames.equals(that.mixinTypeNames)
+                && isReferenceable == that.isReferenceable
+                && sharedSet.equals(that.sharedSet)
+                && properties.equals(that.properties)
+                && childNodeEntries.equals(that.childNodeEntries);
+        } else {
+            return false;
+        }
+    }
+
     //-----------------------------------------------------< ChildNodeEntry >---
 
     /**

Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java?rev=1002775&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java Wed Sep 29 17:38:50 2010
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.persistence.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Collections;
+
+import org.apache.jackrabbit.core.id.NodeId;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.commons.name.NameConstants;
+
+import junit.framework.TestCase;
+
+public class BundleBindingTest extends TestCase {
+
+    private BundleBinding binding;
+
+    protected void setUp() throws Exception {
+        binding = new BundleBinding(
+                null, null, new HashMapIndex(), new HashMapIndex(), null);
+    }
+
+    public void testEmptyBundle() throws Exception {
+        NodePropBundle bundle = new NodePropBundle(new NodeId());
+        bundle.setParentId(new NodeId());
+        bundle.setNodeTypeName(NameConstants.NT_UNSTRUCTURED);
+        bundle.setMixinTypeNames(Collections.<Name>emptySet());
+        bundle.setSharedSet(Collections.<NodeId>emptySet());
+        assertBundleRoundtrip(bundle);
+    }
+
+    private void assertBundleRoundtrip(NodePropBundle bundle)
+            throws Exception {
+        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+        binding.writeBundle(buffer, bundle);
+        byte[] bytes = buffer.toByteArray();
+
+        assertTrue(binding.checkBundle(new ByteArrayInputStream(bytes)));
+
+        assertEquals(bundle, binding.readBundle(
+                new ByteArrayInputStream(bytes), bundle.getId()));
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/HashMapIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/HashMapIndexTest.java?rev=1002775&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/HashMapIndexTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/HashMapIndexTest.java Wed Sep 29 17:38:50 2010
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.persistence.util;
+
+import junit.framework.TestCase;
+
+import org.apache.jackrabbit.core.util.StringIndex;
+
+public class HashMapIndexTest extends TestCase {
+
+    private StringIndex index;
+
+    private int load;
+    private int save;
+
+    protected void setUp() throws Exception {
+        index = new HashMapIndex() {
+            @Override
+            protected void load() {
+                load++;
+            }
+            @Override
+            protected void save() {
+                save++;
+            }
+        };
+        load = 0;
+        save = 0;
+    }
+
+    public void testIndex() {
+        assertEquals(0, load);
+        assertEquals(0, save);
+
+        int test = index.stringToIndex("test");
+        assertEquals(1, load);
+        assertEquals(1, save);
+
+        assertEquals(test, index.stringToIndex("test"));
+        assertEquals(1, load);
+        assertEquals(1, save);
+
+        assertEquals("test", index.indexToString(test));
+        assertEquals(1, load);
+        assertEquals(1, save);
+
+        assertNull(index.indexToString(test + 1));
+        assertEquals(2, load);
+        assertEquals(1, save);
+
+        int foo = index.stringToIndex("foo");
+        assertTrue(test != foo);
+        assertEquals(3, load);
+        assertEquals(2, save);
+
+        assertEquals(foo, index.stringToIndex("foo"));
+        assertEquals(3, load);
+        assertEquals(2, save);
+
+        assertEquals("foo", index.indexToString(foo));
+        assertEquals(3, load);
+        assertEquals(2, save);
+    }
+
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/HashMapIndexTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/TestAll.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/TestAll.java?rev=1002775&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/TestAll.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/TestAll.java Wed Sep 29 17:38:50 2010
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.persistence.util;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class TestAll extends TestCase {
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Persistence utility tests");
+
+        suite.addTestSuite(HashMapIndexTest.class);
+
+        return suite;
+    }
+
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/TestAll.java
------------------------------------------------------------------------------
    svn:eol-style = native