You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2007/12/16 20:54:32 UTC

svn commit: r604680 - in /directory/sandbox/akarasulu/bigbang/apacheds: btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/ core-cursor/src/main/java/org/apache/directory/server/core/cursor/ core-cursor/src/test/java/org/apa...

Author: akarasulu
Date: Sun Dec 16 11:54:30 2007
New Revision: 604680

URL: http://svn.apache.org/viewvc?rev=604680&view=rev
Log:
still not compiling and moving classes around with new modules, also removed absolute() method on Cursor since this is going to be problematic with most btree packages

Added:
    directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/CursorBehaviorTests.java
    directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/SingletonCursorTest.java
    directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/BTreeCursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/BTreeTupleCursor.java
Modified:
    directory/sandbox/akarasulu/bigbang/apacheds/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/NoDupsCursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/ValueArrayCursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/AbstractCursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/Cursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/EmptyCursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/IteratorCursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/ListCursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/SingletonCursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/ListCursorTest.java
    directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java

Modified: directory/sandbox/akarasulu/bigbang/apacheds/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/NoDupsCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/NoDupsCursor.java?rev=604680&r1=604679&r2=604680&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/NoDupsCursor.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/NoDupsCursor.java Sun Dec 16 11:54:30 2007
@@ -103,7 +103,7 @@
     }
 
 
-    public boolean before( Tuple element ) throws IOException
+    public void before( Tuple element ) throws IOException
     {
         throw new NotImplementedException();
     }

Modified: directory/sandbox/akarasulu/bigbang/apacheds/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/ValueArrayCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/ValueArrayCursor.java?rev=604680&r1=604679&r2=604680&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/ValueArrayCursor.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/ValueArrayCursor.java Sun Dec 16 11:54:30 2007
@@ -73,7 +73,7 @@
     }
 
 
-    public boolean before( Tuple element ) throws IOException
+    public void before( Tuple element ) throws IOException
     {
         throw new NotImplementedException();
     }

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/AbstractCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/AbstractCursor.java?rev=604680&r1=604679&r2=604680&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/AbstractCursor.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/AbstractCursor.java Sun Dec 16 11:54:30 2007
@@ -27,7 +27,6 @@
  */
 public abstract class AbstractCursor<E> implements Cursor<E>
 {
-    protected static final int BEFORE_FIRST = -1;
     private boolean closed;
 
 

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/Cursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/Cursor.java?rev=604680&r1=604679&r2=604680&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/Cursor.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/Cursor.java Sun Dec 16 11:54:30 2007
@@ -23,18 +23,19 @@
 
 
 /**
- * A simple cursor concept for bidirectionally enumerating over elements.
- * Cursors unlike iterators request to advance to an element by calling next()
- * or previous() which returns true or false if the request succeeds.  Other
- * operations for relative and absolute advances are provided.  If the cursor
- * does not advance, then the Cursor is either positioned before the first
- * element or after the last element in which case the user of the Cursor must
- * stop advancing in the respective direction.  If an advance succeeds a get()
+ * A Cursor for bidirectional traversal over elements in a dataset. Cursors
+ * unlike Iterators or Enumerations may advance to an element by calling
+ * next() or previous() which returns true or false if the request succeeds
+ * with a viable element at the new position.  Operations for relative
+ * positioning in larger increments are provided.  If the cursor can not
+ * advance, then the Cursor is either positioned before the first element or
+ * after the last element in which case the user of the Cursor must stop
+ * advancing in the respective direction.  If an advance succeeds a get()
  * operation retreives the current object at the Cursors position.
  *
- * Although this interface presumes Cursors can advance bidirectionally, one
- * or more either direction may not be supported.  In this case
- * implementations should throw UnsupportedOperationExceptions.
+ * Although this interface presumes Cursors can advance bidirectionally,
+ * implementations may restrict this by throwing
+ * UnsupportedOperationExceptions.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
@@ -42,31 +43,40 @@
 public interface Cursor<E>
 {
     /**
-     * Positions this Cursor just before the element.  If the element value
-     * does not exist in the dataset, the Cursor is advanced to a data element
-     * with the greatest value in the dataset less than the element argument.
+     * Prepares this Cursor, so a subsequent call to Cursor#next() with a
+     * true return value, will have positioned the Cursor on a dataset element
+     * equal to or greater than the element argument but not less.  A call to
+     * Cursor#previous() with a true return value will position the Cursor on
+     * a dataset element less than the argument.  If Cursor#next() returns
+     * false then the Cursor is past the last element and so all values in the
+     * dataset are less than the argument.  If Cursor#previous() returns false
+     * then the Cursor is positioned before the first element and all elements
+     * in the dataset are greater than the argument.
      *
      * @param element the element to be positioned before
-     * @return true if get() will yeild a valid value, false otherwise
-     * @throws IOException if there are problems positioning this cursor or if
-     * this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws IOException with problems accessing the underlying btree
+     * @throws UnsupportedOperationException if this method is not supported
      */
-    boolean before( E element ) throws IOException;
+    void before( E element ) throws IOException;
 
 
     /**
-     * Positions this Cursor just after the element.  If the element value
-     * does not exist in the dataset, the Cursor is advanced to a data element
-     * with the smallest value in the dataset greater than the element argument.
+     * Prepares this Cursor, so a subsequent call to Cursor#previous() with a
+     * true return value, will have positioned the Cursor on a dataset element
+     * equal to or less than the element argument but not greater. A call to
+     * Cursor#next() with a true return value will position the Cursor on a
+     * dataset element greater than the argument.  If Cursor#next() returns
+     * false then the Cursor is past the last element and so all values in the
+     * dataset are less than or equal to the argument.  If Cursor#previous()
+     * returns false then the Cursor is positioned before the first element
+     * and all elements in the dataset are greater than the argument.
      *
      * @param element the element to be positioned after
-     * @return true if get() will yeild a valid value, false otherwise
      * @throws IOException if there are problems positioning this cursor or if
      * this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
-    boolean after( E element ) throws IOException;
+    void after( E element ) throws IOException;
 
 
     /**
@@ -74,7 +84,7 @@
      *
      * @throws IOException if there are problems positioning this cursor or if
      * this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     void beforeFirst() throws IOException;
 
@@ -84,43 +94,34 @@
      *
      * @throws IOException if there are problems positioning this Cursor or if
      * this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     void afterLast() throws IOException;
 
 
     /**
-     * Positions this Curser at the nth element.  Zero based indexing is used.
-     *
-     * If the specified position is past the first or last element, the Cursor
-     * is positioned before the first or after the last element respectively.
-     *
-     * @param absolutePosition the absolute position to move this Cursor to
-     * @return true if the position has been successfully changed to the
-     * element at the specified position, false otherwise
-     * @throws IOException if there are problems positioning this Cursor or if
-     * this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
-     */
-    boolean absolute( int absolutePosition ) throws IOException;
-
-
-    /**
-     * Positions this Curser n places relative to the present position.  Zero
-     * based indexing is used and negative index values may be provided for
-     * representing the direction.
+     * Positions this Curser an offset number of elements before or after the
+     * current position.  Negative offsets are used to move the Cursor's
+     * position back, while positive offsets are used to advance the Cursor's
+     * position forward.
      *
      * If the specified position is past the first or last element, the Cursor
      * is positioned before the first or after the last element respectively.
      *
-     * @param relativePosition the relative position to move this Cursor to
-     * @return true if the position has been successfully changed to the
-     * element relative to the current position, false otherwise
+     * Note that this is not the most efficient means to advance a Cursor over
+     * a BTree.  The best mechanism is to advance by using a specific key via
+     * the Cursor#before() and Cursor#after() methods.  Most implementations
+     * of this method will have to walk through BTree records.
+     *
+     * @param offset the relative offset to move this Cursor to
+     * @return true if the position has been successfully changed to an
+     * existing element retreivable by Cursor#get() at the new relative
+     * position, of this Cursor, otherwise false
      * @throws IOException if there are problems positioning this Cursor or if
      * this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
-    boolean relative( int relativePosition ) throws IOException;
+    boolean relative( int offset ) throws IOException;
 
 
     /**
@@ -130,7 +131,7 @@
      * element, false otherwise
      * @throws IOException if there are problems positioning this Cursor or if
      * this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     boolean first() throws IOException;
 
@@ -142,7 +143,7 @@
      * element, false otherwise
      * @throws IOException if there are problems positioning this Cursor or if
      * this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     boolean last() throws IOException;
 
@@ -154,7 +155,7 @@
      * otherwise
      * @throws IOException if there are problems determining this Cursor's
      * position, or if this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     boolean isFirst() throws IOException;
 
@@ -166,7 +167,7 @@
      * otherwise
      * @throws IOException if there are problems determining this Cursor's
      * position, or if this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     boolean isLast() throws IOException;
 
@@ -178,7 +179,7 @@
      * otherwise
      * @throws IOException if there are problems determining this Cursor's
      * position, or if this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     boolean isAfterLast() throws IOException;
 
@@ -190,7 +191,7 @@
      * otherwise
      * @throws IOException if there are problems determining this Cursor's
      * position, or if this Cursor is closed
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     boolean isBeforeFirst() throws IOException;
 
@@ -201,7 +202,7 @@
      *
      * @return true if this Cursor is closed, false otherwise
      * @throws IOException if there are problems determining the cursor's closed state
-     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     boolean isClosed() throws IOException;
 
@@ -211,7 +212,7 @@
      *
      * @return true if the advance succeeded, false otherwise
      * @throws IOException if there are problems advancing to the next position
-     * @throws UnsupportedOperationException if advances in this direction are not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     boolean previous() throws IOException;
 
@@ -222,7 +223,7 @@
      * @return true if the advance succeeded, false otherwise
      * @throws IOException if there are problems advancing to this Cursor to
      * the next position, or if this Cursor is closed
-     * @throws UnsupportedOperationException if advances in this direction are not supported
+     * @throws UnsupportedOperationException if this method is not supported
      */
     boolean next() throws IOException;
 
@@ -259,7 +260,7 @@
      * Repeated calls to this method after this Cursor has already been
      * called should not fail with exceptions.
      *
-     * @throws IOException if this Cursor cannot be closed
+     * @throws IOException if for some reason this Cursor could not be closed
      */
     void close() throws IOException;
 }

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/EmptyCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/EmptyCursor.java?rev=604680&r1=604679&r2=604680&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/EmptyCursor.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/EmptyCursor.java Sun Dec 16 11:54:30 2007
@@ -30,17 +30,15 @@
  */
 public class EmptyCursor<E> extends AbstractCursor<E>
 {
-    public boolean before( E element ) throws IOException
+    public void before( E element ) throws IOException
     {
         checkClosed( "before()" );
-        return false;
     }
 
 
-    public boolean after( E element ) throws IOException
+    public void after( E element ) throws IOException
     {
         checkClosed( "after()" );
-        return false;
     }
 
 
@@ -53,14 +51,6 @@
     public void afterLast() throws CursorClosedException
     {
         checkClosed( "afterLast()" );
-    }
-
-
-    @SuppressWarnings ( { "UnusedDeclaration" } )
-    public boolean absolute( int absolutePosition ) throws CursorClosedException
-    {
-        checkClosed( "absolute()" );
-        return false;
     }
 
 

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/IteratorCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/IteratorCursor.java?rev=604680&r1=604679&r2=604680&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/IteratorCursor.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/IteratorCursor.java Sun Dec 16 11:54:30 2007
@@ -40,13 +40,13 @@
     }
 
 
-    public boolean before( E element ) throws IOException
+    public void before( E element ) throws IOException
     {
         throw new UnsupportedOperationException( "Cannot advance before an element on the underlying Iterator." );
     }
 
 
-    public boolean after( E element ) throws IOException
+    public void after( E element ) throws IOException
     {
         throw new UnsupportedOperationException( "Cannot advance after an element on the underlying Iterator." );
     }
@@ -61,12 +61,6 @@
     public void afterLast() throws IOException
     {
         throw new UnsupportedOperationException( "Cannot adanvce after last on the underlying Iterator." );
-    }
-
-
-    public boolean absolute( int absolutePosition ) throws IOException
-    {
-        throw new UnsupportedOperationException( "Cannot advance to an absolute postion on the underlying Iterator." );
     }
 
 

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/ListCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/ListCursor.java?rev=604680&r1=604679&r2=604680&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/ListCursor.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/ListCursor.java Sun Dec 16 11:54:30 2007
@@ -24,6 +24,7 @@
 import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
+import java.util.Comparator;
 
 
 /**
@@ -36,6 +37,7 @@
 public class ListCursor<E> extends AbstractCursor<E>
 {
     private final List<E> list;
+    private final Comparator<E> comparator;
     private final int start;
     private final int end;
     private int index = -1;
@@ -49,11 +51,12 @@
      * advance operations (next() or previous()) to properly return values
      * using the get() operation.
      *
+     * @param comparator an optional comparator to use for ordering
      * @param start the lower bound index
      * @param list the list this ListCursor operates on
      * @param end the upper bound index
      */
-    public ListCursor( int start, List<E> list, int end )
+    public ListCursor( Comparator<E> comparator, int start, List<E> list, int end )
     {
         if ( start < 0 || start > list.size() )
         {
@@ -73,6 +76,8 @@
                     + end + "' just does not make sense" );
         }
 
+        this.comparator = comparator;
+
         //noinspection ConstantConditions
         if ( list != null )
         {
@@ -90,6 +95,24 @@
 
 
     /**
+     * Creates a new ListCursor with lower (inclusive) and upper (exclusive)
+     * bounds.
+     *
+     * As with all Cursors, this ListCursor requires a successful return from
+     * advance operations (next() or previous()) to properly return values
+     * using the get() operation.
+     *
+     * @param start the lower bound index
+     * @param list the list this ListCursor operates on
+     * @param end the upper bound index
+     */
+    public ListCursor( int start, List<E> list, int end )
+    {
+        this( null, start, list, end );
+    }
+
+
+    /**
      * Creates a new ListCursor with a specific upper (exclusive) bound: the
      * lower (inclusive) bound defaults to 0.
      *
@@ -99,7 +122,13 @@
      */
     public ListCursor( List<E> list, int end )
     {
-        this( 0, list, end );
+        this( null, 0, list, end );
+    }
+
+
+    public ListCursor( Comparator<E> comparator, List<E> list, int end )
+    {
+        this( comparator, 0, list, end );
     }
 
 
@@ -113,7 +142,13 @@
      */
     public ListCursor( int start, List<E> list )
     {
-        this( start, list, list.size() );
+        this( null, start, list, list.size() );
+    }
+
+
+    public ListCursor( Comparator<E> comparator, int start, List<E> list )
+    {
+        this( comparator, start, list, list.size() );
     }
 
 
@@ -125,7 +160,13 @@
      */
     public ListCursor( List<E> list )
     {
-        this( 0, list, list.size() );
+        this( null, 0, list, list.size() );
+    }
+
+
+    public ListCursor( Comparator<E> comparator, List<E> list )
+    {
+        this( comparator, 0, list, list.size() );
     }
 
 
@@ -135,54 +176,100 @@
     public ListCursor()
     {
         //noinspection unchecked
-        this( 0, Collections.EMPTY_LIST, 0 );
+        this( null, 0, Collections.EMPTY_LIST, 0 );
     }
 
 
-    public boolean before( E element ) throws IOException
+    public ListCursor( Comparator<E> comparator )
     {
-        throw new NotImplementedException();
+        //noinspection unchecked
+        this( comparator, 0, Collections.EMPTY_LIST, 0 );
     }
 
 
-    public boolean after( E element ) throws IOException
+    /**
+     * @throws IllegalStateException if the underlying list is not sorted
+     * and/or a comparator is not provided.
+     */
+    public void before( E element ) throws IOException
     {
-        throw new NotImplementedException();
-    }
+        checkClosed( "before()" );
 
+        if ( comparator == null )
+        {
+            throw new IllegalStateException();
+        }
 
-    public void beforeFirst() throws IOException
-    {
-        checkClosed( "beforeFirst()" );
-        this.index = -1;
-    }
+        // handle some special cases
+        if ( list.size() == 0 )
+        {
+            return;
+        }
+        else if ( list.size() == 1 )
+        {
+            if ( comparator.compare( element, list.get( 0 ) ) <= 0 )
+            {
+                beforeFirst();
+            }
+            else
+            {
+                afterLast();
+            }
+        }
 
+        throw new NotImplementedException( "don't know if list is sorted and checking that is not worth it" );
 
-    public void afterLast() throws IOException
-    {
-        checkClosed( "afterLast()" );
-        this.index = end;
+        // check if increasing or decreasing order is in effect
+//        if ( comparator.compare( list.get( 0 ), list.get( list.size() - 1 ) ) > 0 )
+//        {
+//        }
+//        else
+//        {
+//        }
     }
 
 
-    public boolean absolute( int index ) throws IOException
+    public void after( E element ) throws IOException
     {
-        checkClosed( "absolute()" );
+        checkClosed( "after()" );
 
-        if ( index < start )
+        if ( comparator == null )
         {
-            this.index = -1;
-            return false;
+            throw new IllegalStateException();
         }
 
-        if ( index >= end )
+        // handle some special cases
+        if ( list.size() == 0 )
         {
-            this.index = end;
-            return false;
+            return;
         }
+        else if ( list.size() == 1 )
+        {
+            if ( comparator.compare( element, list.get( 0 ) ) >= 0 )
+            {
+                afterLast();
+            }
+            else
+            {
+                beforeFirst();
+            }
+        }
+
+        throw new NotImplementedException( "don't know if list is sorted and checking that is not worth it" );
+    }
+
+
+    public void beforeFirst() throws IOException
+    {
+        checkClosed( "beforeFirst()" );
+        this.index = -1;
+    }
+
 
-        this.index = index;
-        return true;
+    public void afterLast() throws IOException
+    {
+        checkClosed( "afterLast()" );
+        this.index = end;
     }
 
 

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/SingletonCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/SingletonCursor.java?rev=604680&r1=604679&r2=604680&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/SingletonCursor.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/main/java/org/apache/directory/server/core/cursor/SingletonCursor.java Sun Dec 16 11:54:30 2007
@@ -24,7 +24,7 @@
 
 
 /**
- * A Cursor on a single element.
+ * A Cursor over a single element.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
@@ -51,7 +51,7 @@
     }
 
 
-    public boolean before( E element ) throws IOException
+    public void before( E element ) throws IOException
     {
         checkClosed( "before()" );
 
@@ -65,18 +65,16 @@
 
         if ( comparison < 0 )
         {
-            absolute( 0 );
-            return true;
+            first();
         }
         else
         {
             beforeFirst();
-            return false;
         }
     }
 
 
-    public boolean after( E element ) throws IOException
+    public void after( E element ) throws IOException
     {
         checkClosed( "after()" );
 
@@ -90,13 +88,11 @@
 
         if ( comparison > 0 )
         {
-            absolute( 0 );
-            return true;
+            first();
         }
         else
         {
             afterLast();
-            return false;
         }
     }
 
@@ -116,33 +112,6 @@
         beforeFirst = false;
         afterLast = true;
         onSingleton = false;
-    }
-
-
-    public boolean absolute( int absolutePosition ) throws IOException
-    {
-        checkClosed( "()" );
-        if ( absolutePosition == 0 )
-        {
-            beforeFirst = false;
-            onSingleton = true;
-            afterLast = false;
-            return true;
-        }
-        else if ( absolutePosition > 0 )
-        {
-            beforeFirst = false;
-            onSingleton = false;
-            afterLast = true;
-            return false;
-        }
-        else
-        {
-            beforeFirst = true;
-            onSingleton = false;
-            afterLast = false;
-            return false;
-        }
     }
 
 

Added: directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/CursorBehaviorTests.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/CursorBehaviorTests.java?rev=604680&view=auto
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/CursorBehaviorTests.java (added)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/CursorBehaviorTests.java Sun Dec 16 11:54:30 2007
@@ -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.directory.server.core.cursor;
+
+
+/**
+ * Presuming a pristine Cursor's underlying data structure is initialized and
+ * populated with the expected data and given to the methods of this class,
+ * the class methods test various properties of the Cursor.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CursorBehaviorTests
+{
+}
+

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/ListCursorTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/ListCursorTest.java?rev=604680&r1=604679&r2=604680&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/ListCursorTest.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/ListCursorTest.java Sun Dec 16 11:54:30 2007
@@ -42,7 +42,6 @@
         ListCursor<String> cursor = new ListCursor<String>();
 
         assertFirstLastOnNewCursor( cursor, 0, 0, 0 );
-        assertAbsolute( cursor, 0, 0, 0 );
         assertRelative( cursor, 0, 0, 0 );
 
         // close test
@@ -55,7 +54,6 @@
     {
         ListCursor<String> cursor = new ListCursor<String>( Collections.singletonList( "singleton" ) );
         assertFirstLastOnNewCursor( cursor, 1, 0, 1 );
-        assertAbsolute( cursor, 1, 0, 1 );
         assertRelative( cursor, 1, 0, 1 );
         cursor.close();
 
@@ -149,21 +147,18 @@
         // test with bounds of the list itself
         ListCursor<String> cursor = new ListCursor<String>( list );
         assertFirstLastOnNewCursor( cursor, 5, 0, 5 );
-        assertAbsolute( cursor, 5, 0, 5 );
         assertRelative( cursor, 5, 0, 5 );
         cursor.close();
 
         // test with nonzero lower bound
         cursor = new ListCursor<String>( 1, list );
         assertFirstLastOnNewCursor( cursor, 5, 1, 5 );
-        assertAbsolute( cursor, 5, 1, 5 );
         assertRelative( cursor, 5, 1, 5 );
         cursor.close();
 
         // test with nonzero lower bound and upper bound
         cursor = new ListCursor<String>( 1, list, 4 );
         assertFirstLastOnNewCursor( cursor, 5, 1, 4 );
-        assertAbsolute( cursor, 5, 1, 4 );
         assertRelative( cursor, 5, 1, 4 );
 
         // close test
@@ -357,43 +352,6 @@
     }
 
 
-    protected void assertAbsolute( Cursor cursor, int listSize, int lowerBound, int upperBound )
-            throws IOException
-    {
-        String prefix = "[size, " + listSize + "] [lower, " + lowerBound + "] [upper, " + upperBound + "]: ";
-
-        // test absolute() advance with change of position below lower bound
-        cursor.afterLast();
-        assertFalse( prefix + "cursor.absolute(" + ( lowerBound - 1 ) +
-                ") should return false and change state to before first", cursor.absolute( lowerBound - 1 ) );
-        assertTrue( prefix + "cursor.relative(" + ( lowerBound - 1 ) +
-                ") should change pos to before first", cursor.isBeforeFirst() );
-        assertFalse( prefix + "cursor.relative(" + ( lowerBound - 1 ) +
-                ") should --NOT-- change pos to after last", cursor.isAfterLast() );
-
-        if ( listSize == 0 )
-        {
-            // Corner case!!!  Technically the 0th index is the 1st element
-            // which is greater than 0 elements which is the size of the list
-            // so technically the observed state change for index = 0 should be
-            // the same as when index > 0.
-            cursor.beforeFirst();
-            assertFalse( "empty cursor.absolute(0) should fail but change state to after last", cursor.absolute( 0 ) );
-            assertFalse( "empty cursor.absolute(0) should change pos to after last", cursor.isBeforeFirst() );
-            assertTrue( "empty cursor.absolute(0) should change pos to after last", cursor.isAfterLast() );
-        }
-
-        // test absolute() advance with change of position above upper bound
-        cursor.beforeFirst();
-        assertFalse( prefix + "cursor.absolute(" + ( upperBound + 1 )
-                + ") should return false but change state to after last", cursor.absolute( upperBound + 1 ) );
-        assertFalse( prefix + "cursor.absolute(" + ( upperBound + 1 ) + ") should change pos to after last",
-                cursor.isBeforeFirst() );
-        assertTrue( prefix + "cursor.absolute(" + ( upperBound + 1 ) + ") should change pos to after last",
-                cursor.isAfterLast() );
-    }
-
-
     protected void assertRelative( Cursor cursor, int listSize, int lowerBound, int upperBound )
             throws IOException
     {
@@ -455,16 +413,6 @@
             fail( "cursor.close() after closing the cursor should not fail with exceptions" );
         }
 
-
-        try
-        {
-            cursor.absolute( 1 );
-            fail( "cursor.absolute() after closing the cursor should fail with an IOException" );
-        }
-        catch ( IOException e )
-        {
-            assertNotNull( e );
-        }
 
         try
         {

Added: directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/SingletonCursorTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/SingletonCursorTest.java?rev=604680&view=auto
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/SingletonCursorTest.java (added)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core-cursor/src/test/java/org/apache/directory/server/core/cursor/SingletonCursorTest.java Sun Dec 16 11:54:30 2007
@@ -0,0 +1,30 @@
+/*
+ * 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.directory.server.core.cursor;
+
+
+/**
+ * Tests for the correct behavoir of a Cursor over a single element.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class SingletonCursorTest
+{
+}

Added: directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/BTreeCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/BTreeCursor.java?rev=604680&view=auto
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/BTreeCursor.java (added)
+++ directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/BTreeCursor.java Sun Dec 16 11:54:30 2007
@@ -0,0 +1,377 @@
+/*
+ * 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.directory.server.core.partition.impl.btree.jdbm;
+
+
+import jdbm.btree.BTree;
+import jdbm.helper.Tuple;
+import jdbm.helper.TupleBrowser;
+import org.apache.directory.server.core.cursor.AbstractCursor;
+import org.apache.directory.server.core.cursor.InconsistentCursorStateException;
+import org.apache.directory.server.core.cursor.InvalidCursorPositionException;
+import org.apache.directory.shared.ldap.NotImplementedException;
+
+import java.io.IOException;
+
+
+/**
+ * A Cursor across JDBM based BTree keys.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BTreeCursor extends AbstractCursor
+{
+    private final Tuple jdbmTuple = new Tuple();
+
+    private BTree btree;
+    private TupleBrowser browser;
+    private int pos = BEFORE_FIRST;
+    private int size;  // cache the size to prevent needless lookups
+    private boolean afterLast;
+    private boolean beforeFirst;
+    private boolean success;
+
+
+    BTreeCursor( BTree btree ) throws IOException
+    {
+        this.btree = btree;
+        beforeFirst();
+    }
+
+
+    public void before( Object element ) throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public boolean after( Object element ) throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public void beforeFirst() throws IOException
+    {
+        if ( ! beforeFirst )
+        {
+            beforeFirst = true;
+            afterLast = false;
+            success = false;
+            size = btree.size();
+            pos = BEFORE_FIRST;
+            browser = btree.browse();
+        }
+    }
+
+
+    public void afterLast() throws IOException
+    {
+        if ( ! afterLast )
+        {
+            beforeFirst = false;
+            afterLast = true;
+            success = false;
+            size = btree.size();
+            pos = size;
+            browser = btree.browse( null );
+        }
+    }
+
+
+    public boolean absolute( int absolutePosition ) throws IOException
+    {
+        // -------------------------------------------------------------------
+        // Special cases under or above the valid range puts the cursor
+        // respectively before the first or after the last position
+        // -------------------------------------------------------------------
+
+        if ( absolutePosition >= size )
+        {
+            afterLast();
+            return false;
+        }
+
+        if ( absolutePosition < 0 )
+        {
+            beforeFirst();
+            return false;
+        }
+
+        // -------------------------------------------------------------------
+        // Special case where position is valid and that's the new position
+        // -------------------------------------------------------------------
+
+        if ( absolutePosition == pos )
+        {
+            return success;
+        }
+
+        // -------------------------------------------------------------------
+        // Special easy to get to cases where we don't have to walk the tree
+        // -------------------------------------------------------------------
+
+        if ( absolutePosition == 0 && beforeFirst )
+        {
+            return next();
+        }
+
+        if ( ( absolutePosition == size - 1  ) && afterLast )
+        {
+            return previous();
+        }
+
+        // -------------------------------------------------------------------
+        // Cases we have to walk the tree forward or backwards to get to target
+        // -------------------------------------------------------------------
+
+        if ( absolutePosition > pos )
+        {
+            while ( success && pos < absolutePosition )
+            {
+                next();
+            }
+        }
+        else
+        {
+            while ( success && pos > absolutePosition )
+            {
+                previous();
+            }
+        }
+
+        return success;
+    }
+
+
+    public boolean relative( int relativePosition ) throws IOException
+    {
+        // -------------------------------------------------------------------
+        // Special cases under or above the valid range puts the cursor
+        // respectively before the first or after the last position
+        // -------------------------------------------------------------------
+
+        if ( ( relativePosition + pos ) >= size )
+        {
+            afterLast();
+            return false;
+        }
+
+        if ( ( relativePosition + pos ) < 0 )
+        {
+            beforeFirst();
+            return false;
+        }
+
+        // -------------------------------------------------------------------
+        // Special case where position is valid and that's the new position
+        // -------------------------------------------------------------------
+
+        if ( relativePosition == 0 )
+        {
+            return success;
+        }
+
+        // -------------------------------------------------------------------
+        // Cases we have to walk the tree forward or backwards
+        // -------------------------------------------------------------------
+
+        if ( relativePosition > 0 )
+        {
+            for ( ; success && relativePosition > 0; relativePosition-- )
+            {
+                next();
+            }
+        }
+        else
+        {
+            for ( ; success && relativePosition < 0; relativePosition++ )
+            {
+                previous();
+            }
+        }
+
+        return success;
+    }
+
+
+    public boolean first() throws IOException
+    {
+        if ( beforeFirst )
+        {
+            return next();
+        }
+
+        if ( pos == 0 )
+        {
+            return success;
+        }
+
+        beforeFirst();
+        return next();
+    }
+
+
+    public boolean last() throws IOException
+    {
+        if ( afterLast )
+        {
+            return previous();
+        }
+
+        if ( pos == ( size - 1 ) )
+        {
+            return success;
+        }
+
+        afterLast();
+        return previous();
+    }
+
+
+    public boolean isFirst() throws IOException
+    {
+        return pos == 0;
+    }
+
+
+    public boolean isLast() throws IOException
+    {
+        return pos == ( size - 1 );
+    }
+
+
+    public boolean isAfterLast() throws IOException
+    {
+        return afterLast;
+    }
+
+
+    public boolean isBeforeFirst() throws IOException
+    {
+        return beforeFirst;
+    }
+
+
+    public boolean previous() throws IOException
+    {
+        if ( beforeFirst )
+        {
+            return false;
+        }
+
+        if ( afterLast )
+        {
+            success = browser.getPrevious( jdbmTuple );
+            if ( success )
+            {
+                afterLast = false;
+                beforeFirst = false;
+                pos = size - 1;
+            }
+            return success;
+        }
+
+        if ( pos == 0 )
+        {
+            success = false;
+            afterLast = false;
+            beforeFirst = true;
+            pos = BEFORE_FIRST;
+            return false;
+        }
+
+        success = browser.getPrevious( jdbmTuple );
+        if ( success )
+        {
+            pos--;
+        }
+        return success;
+    }
+
+
+    public boolean next() throws IOException
+    {
+        if ( afterLast )
+        {
+            return false;
+        }
+
+        if ( beforeFirst )
+        {
+            success = browser.getNext( jdbmTuple );
+            if ( success )
+            {
+                afterLast = false;
+                beforeFirst = false;
+                pos = 0;
+            }
+            return success;
+        }
+
+        if ( pos == size - 1 )
+        {
+            success = false;
+            afterLast = true;
+            beforeFirst = false;
+            pos = size;
+            return false;
+        }
+
+        success = browser.getNext( jdbmTuple );
+        if ( success )
+        {
+            pos++;
+        }
+        return success;
+    }
+
+
+    private boolean inRangeOnValue()
+    {
+        return pos > BEFORE_FIRST && pos < size;
+    }
+
+
+
+    public Object get() throws IOException
+    {
+        if ( ! inRangeOnValue() )
+        {
+            throw new InvalidCursorPositionException();
+        }
+
+        if ( success )
+        {
+            return jdbmTuple.getKey();
+        }
+        else
+        {
+            throw new InconsistentCursorStateException( "Seems like the position is in range however the " +
+                    "last operation failed to produce a successful result" );
+        }
+    }
+
+
+    public boolean isElementReused()
+    {
+        return false;
+    }
+}
\ No newline at end of file

Added: directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/BTreeTupleCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/BTreeTupleCursor.java?rev=604680&view=auto
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/BTreeTupleCursor.java (added)
+++ directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/BTreeTupleCursor.java Sun Dec 16 11:54:30 2007
@@ -0,0 +1,154 @@
+/*
+ * 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.directory.server.core.partition.impl.btree.jdbm;
+
+
+import org.apache.directory.server.core.cursor.AbstractCursor;
+import org.apache.directory.server.core.partition.impl.btree.Tuple;
+import org.apache.directory.server.core.partition.impl.btree.TupleBrowserFactory;
+import org.apache.directory.server.core.partition.impl.btree.TupleBrowser;
+import org.apache.directory.shared.ldap.NotImplementedException;
+
+import java.io.IOException;
+import java.util.Comparator;
+
+
+/**
+ * Document me!
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BTreeTupleCursor extends AbstractCursor<Tuple>
+{
+    private final Object key;
+    private final Tuple tuple = new Tuple();
+    private final TupleBrowserFactory factory;
+    private final Comparator comparator;
+
+    private jdbm.helper.Tuple jdbmTuple = new jdbm.helper.Tuple();
+    private TupleBrowser browser;
+    private boolean success;
+
+
+
+    public BTreeTupleCursor( TupleBrowserFactory factory, Object key, Comparator comparator )
+            throws IOException
+    {
+        this.key = key;
+        this.factory = factory;
+        this.comparator = comparator;
+    }
+
+
+    public void before( Tuple element ) throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public void after( Tuple element ) throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public void beforeFirst() throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public void afterLast() throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public boolean absolute( int absolutePosition ) throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public boolean relative( int relativePosition ) throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public boolean first() throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public boolean last() throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public boolean isFirst() throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public boolean isLast() throws IOException
+    {
+        return false;
+    }
+
+
+    public boolean isAfterLast() throws IOException
+    {
+        return false;
+    }
+
+
+    public boolean isBeforeFirst() throws IOException
+    {
+        return false;
+    }
+
+
+    public boolean previous() throws IOException
+    {
+        return false;
+    }
+
+
+    public boolean next() throws IOException
+    {
+        return false;
+    }
+
+
+    public Tuple get() throws IOException
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public boolean isElementReused()
+    {
+        return true;
+    }
+}
\ No newline at end of file

Modified: directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java?rev=604680&r1=604679&r2=604680&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java Sun Dec 16 11:54:30 2007
@@ -29,6 +29,8 @@
 import org.apache.directory.server.core.cursor.IteratorCursor;
 import org.apache.directory.server.core.cursor.SingletonCursor;
 import org.apache.directory.server.core.partition.impl.btree.*;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.cursor.KeyCursor;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.cursor.TupleCursor;
 import org.apache.directory.server.schema.SerializableComparator;
 
 import javax.naming.NamingException;
@@ -982,7 +984,7 @@
         if ( values instanceof BTreeRedirect )
         {
             BTree tree = getBTree( ( BTreeRedirect ) values );
-            return new BTreeCursor( tree );
+            return new KeyCursor( tree );
         }
         
         throw new IllegalStateException( "When using duplicate keys either a TreeSet or BTree is used for values." );
@@ -1174,7 +1176,7 @@
 //            return new BTreeTupleEnumeration( getBTree( ( BTreeRedirect ) values ),
 //                comparator.getValueComparator(), key, val, isGreaterThan );
             JdbmTupleBrowserFactory factory = new JdbmTupleBrowserFactory( getBTree( ( BTreeRedirect ) values ) );
-            Cursor<Tuple> cursor = new BTreeTupleCursor( factory, key, comparator.getValueComparator() );
+            Cursor<Tuple> cursor = new TupleCursor( factory, key, comparator.getValueComparator() );
             if ( isGreaterThan )
             {
                 cursor.after( new Tuple( key, val ) );