a new data structure to hold revision number and offsets of the copied pages of that...
authorKiran Ayyagari <kayyagari@apache.org>
Sun, 27 Jul 2014 13:37:15 +0000 (13:37 +0000)
committerKiran Ayyagari <kayyagari@apache.org>
Sun, 27 Jul 2014 13:37:15 +0000 (13:37 +0000)
mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionOffset.java [new file with mode: 0644]
mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionOffsetComparator.java [new file with mode: 0644]
mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionOffsetSerializer.java [new file with mode: 0644]

diff --git a/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionOffset.java b/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionOffset.java
new file mode 100644 (file)
index 0000000..695e9fd
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ *   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.mavibot.btree;
+
+
+import java.util.Arrays;
+
+
+/**
+ * A class to hold name, revision, and copied page offsets of a B-Tree.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class RevisionOffset
+{
+    /** the revision number */
+    private long revision;
+
+    /** offsets of copied pages */
+    private long[] offsets;
+
+
+    /**
+     * Creates a new instance of RevisionOffset.
+     *
+     * @param revision the revision number
+     * @param offsets array of copied page offsets
+     */
+    public RevisionOffset( long revision, long[] offsets )
+    {
+        this.revision = revision;
+        this.offsets = offsets;
+    }
+
+
+    public long getRevision()
+    {
+        return revision;
+    }
+
+
+    /* no qualifier */void setRevision( long revision )
+    {
+        this.revision = revision;
+    }
+
+
+    public long[] getOffsets()
+    {
+        return offsets;
+    }
+
+
+    /* no qualifier */void setOffsets( long[] offsets )
+    {
+        this.offsets = offsets;
+    }
+
+
+    @Override
+    public int hashCode()
+    {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ( int ) ( revision ^ ( revision >>> 32 ) );
+        return result;
+    }
+
+
+    @Override
+    public boolean equals( Object obj )
+    {
+        if ( this == obj )
+        {
+            return true;
+        }
+        
+        if ( obj == null )
+        {
+            return false;
+        }
+
+        RevisionOffset other = ( RevisionOffset ) obj;
+
+        if ( revision != other.revision )
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+
+    @Override
+    public String toString()
+    {
+        return "RevisionOffset [revision=" + revision + ", offsets=" + Arrays.toString( offsets ) + "]";
+    }
+
+}
diff --git a/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionOffsetComparator.java b/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionOffsetComparator.java
new file mode 100644 (file)
index 0000000..cb2940d
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ *  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.mavibot.btree;
+
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+
+/**
+ * A comparator for the RevisionOffset class
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+/* no qualifier*/class RevisionOffsetComparator implements Comparator<RevisionOffset>
+{
+    /** A static instance of a RevisionOffsetComparator */
+    public static final RevisionOffsetComparator INSTANCE = new RevisionOffsetComparator();
+
+    public static final RevisionOffsetComparator INSTANCE_DESC_ORDER = new RevisionOffsetComparator( true );
+    
+    private boolean desc;
+    
+    /**
+     * A private constructor of the RevisionOffsetComparator class
+     */
+    private RevisionOffsetComparator()
+    {
+    }
+
+    
+    private RevisionOffsetComparator( boolean desc )
+    {
+        this.desc = desc;
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public int compare( RevisionOffset rn1, RevisionOffset rn2 )
+    {
+        if ( rn1 == rn2 )
+        {
+            return 0;
+        }
+
+        // the RevisionOffset will never be used as a key
+        
+        // First compare the revisions
+        if ( rn1.getRevision() < rn2.getRevision() )
+        {
+            return desc ? 1 : -1;
+        }
+        else if ( rn1.getRevision() > rn2.getRevision() )
+        {
+            return desc ? -1 : 1;
+        }
+        
+        // ignore the offsets 
+        return 0;
+    }
+}
diff --git a/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionOffsetSerializer.java b/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionOffsetSerializer.java
new file mode 100644 (file)
index 0000000..57a8bbb
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+ *  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.mavibot.btree;
+
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import org.apache.directory.mavibot.btree.exception.SerializerCreationException;
+import org.apache.directory.mavibot.btree.serializer.AbstractElementSerializer;
+import org.apache.directory.mavibot.btree.serializer.BufferHandler;
+import org.apache.directory.mavibot.btree.serializer.LongArraySerializer;
+import org.apache.directory.mavibot.btree.serializer.LongSerializer;
+
+
+/**
+ * A serializer for the RevisionOffset object. The RevisionOffset will be serialized
+ * as a long (the revision), followed by the long[].
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+/* no qualifier*/class RevisionOffsetSerializer extends AbstractElementSerializer<RevisionOffset>
+{
+    /** A static instance of a RevisionOffsetSerializer */
+    /*No qualifier*/ final static RevisionOffsetSerializer INSTANCE = new RevisionOffsetSerializer();
+
+    /**
+     * Create a new instance of a RevisionOffsetSerializer
+     */
+    private RevisionOffsetSerializer()
+    {
+        super( RevisionOffsetComparator.INSTANCE );
+    }
+
+
+    /**
+     * A static method used to deserialize a RevisionOffset from a byte array.
+     *
+     * @param in The byte array containing the RevisionOffset
+     * @return A RevisionOffset instance
+     */
+    /* no qualifier*/static RevisionOffset deserialize( byte[] in )
+    {
+        return deserialize( in, 0 );
+    }
+
+
+    /**
+     * A static method used to deserialize a RevisionOffset from a byte array.
+     *
+     * @param in The byte array containing the RevisionOffset
+     * @param start the position in the byte[] we will deserialize the RevisionOffset from
+     * @return A RevisionOffset instance
+     */
+    /* no qualifier*/static RevisionOffset deserialize( byte[] in, int start )
+    {
+        // The buffer must be 8 bytes
+        if ( ( in == null ) || ( in.length < 8 + start ) )
+        {
+            throw new SerializerCreationException( "Cannot extract a RevisionOffset from a buffer with not enough bytes" );
+        }
+
+        long revision = LongSerializer.deserialize( in, start );
+        
+        try
+        {
+            long[] offsets = LongArraySerializer.INSTANCE.fromBytes( in, 8 + start );
+
+            RevisionOffset RevisionOffset = new RevisionOffset( revision, offsets );
+            
+            return RevisionOffset;
+        }
+        catch( IOException e )
+        {
+            throw new RuntimeException( e );
+        }
+    }
+
+
+    /**
+     * A static method used to deserialize a RevisionOffset from a byte array.
+     *
+     * @param in The byte array containing the RevisionOffset
+     * @return A RevisionOffset instance
+     */
+    public RevisionOffset fromBytes( byte[] in )
+    {
+        return deserialize( in, 0 );
+    }
+
+
+    /**
+     * A static method used to deserialize a RevisionOffset from a byte array.
+     *
+     * @param in The byte array containing the RevisionOffset
+     * @param start the position in the byte[] we will deserialize the RevisionOffset from
+     * @return A RevisionOffset instance
+     */
+    public RevisionOffset fromBytes( byte[] in, int start )
+    {
+        // The buffer must be 8 bytes long (the revision is a long, and the name is a String
+        if ( ( in == null ) || ( in.length < 8 + start ) )
+        {
+            throw new SerializerCreationException( "Cannot extract a RevisionOffset from a buffer with not enough bytes" );
+        }
+
+        return deserialize( in, start );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public byte[] serialize( RevisionOffset RevisionOffset )
+    {
+        if ( RevisionOffset == null )
+        {
+            throw new SerializerCreationException( "The RevisionOffset instance should not be null " );
+        }
+
+        byte[] result = null;
+
+        byte[] offsets = LongArraySerializer.INSTANCE.serialize( RevisionOffset.getOffsets() );
+        result = new byte[8 + offsets.length];
+        LongSerializer.serialize( result, 0, RevisionOffset.getRevision() );
+
+        System.arraycopy( offsets, 0, result, 8, offsets.length );
+        
+        return result;
+    }
+
+
+    /**
+     * Serialize a RevisionOffset
+     *
+     * @param buffer the Buffer that will contain the serialized value
+     * @param start the position in the buffer we will store the serialized RevisionOffset
+     * @param value the value to serialize
+     * @return The byte[] containing the serialized RevisionOffset
+     */
+    /* no qualifier*/static byte[] serialize( byte[] buffer, int start, RevisionOffset RevisionOffset )
+    {
+        LongSerializer.serialize( buffer, start, RevisionOffset.getRevision() );
+        
+        byte[] offsets = LongArraySerializer.INSTANCE.serialize( RevisionOffset.getOffsets() );
+
+        System.arraycopy( offsets, 0, buffer, 8 + start, offsets.length );
+        
+        return buffer;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public RevisionOffset deserialize( BufferHandler bufferHandler ) throws IOException
+    {
+        byte[] revisionBytes = bufferHandler.read( 8 );
+        long revision = LongSerializer.deserialize( revisionBytes );
+
+        long[] offsets = LongArraySerializer.INSTANCE.deserialize( bufferHandler );
+
+        return new RevisionOffset( revision, offsets );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public RevisionOffset deserialize( ByteBuffer buffer ) throws IOException
+    {
+        // The revision
+        long revision = buffer.getLong();
+
+        long[] offsets = LongArraySerializer.INSTANCE.deserialize( buffer );
+
+        return new RevisionOffset( revision, offsets );
+    }
+}