You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2014/08/31 08:41:44 UTC

svn commit: r1621563 - in /directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree: RevisionAndHeaderOffset.java RevisionAndHeaderOffsetComparator.java RevisionAndHeaderOffsetSerializer.java

Author: kayyagari
Date: Sun Aug 31 06:41:44 2014
New Revision: 1621563

URL: http://svn.apache.org/r1621563
Log:
o new data structure to hold revision and associated BTreeHeader's offset
o the comparator and serializers

Added:
    directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffset.java
    directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffsetComparator.java
    directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffsetSerializer.java

Added: directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffset.java
URL: http://svn.apache.org/viewvc/directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffset.java?rev=1621563&view=auto
==============================================================================
--- directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffset.java (added)
+++ directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffset.java Sun Aug 31 06:41:44 2014
@@ -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.directory.mavibot.btree;
+
+
+import java.util.Arrays;
+
+
+/**
+ * A class to hold revision and btree offset of a B-Tree.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class RevisionAndHeaderOffset
+{
+    /** the revision number */
+    private long revision;
+
+    /** the btree offset of the given revision */
+    private long offset;
+
+
+    /**
+     * Creates a new instance of RevisionAndHeaderOffset.
+     *
+     * @param revision the revision number
+     * @param offset btree header offset
+     */
+    public RevisionAndHeaderOffset( long revision, long offset )
+    {
+        this.revision = revision;
+        this.offset = offset;
+    }
+
+
+    public long getRevision()
+    {
+        return revision;
+    }
+
+
+    /* no qualifier */void setRevision( long revision )
+    {
+        this.revision = revision;
+    }
+
+
+    public long getOffset()
+    {
+        return offset;
+    }
+
+
+    /* no qualifier */void setOffset( long offset )
+    {
+        this.offset = offset;
+    }
+
+
+    @Override
+    public int hashCode()
+    {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ( int ) ( offset ^ ( offset >>> 32 ) );
+        result = prime * result + ( int ) ( revision ^ ( revision >>> 32 ) );
+        return result;
+    }
+
+
+    @Override
+    public boolean equals( Object obj )
+    {
+        if ( this == obj )
+        {
+            return true;
+        }
+
+        RevisionAndHeaderOffset other = ( RevisionAndHeaderOffset ) obj;
+
+        if ( offset != other.offset )
+        {
+            return false;
+        }
+
+        if ( revision != other.revision )
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+
+    @Override
+    public String toString()
+    {
+        return "RevisionAndHeaderOffset [revision=" + revision + ", offset=" + offset + "]";
+    }
+
+}

Added: directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffsetComparator.java
URL: http://svn.apache.org/viewvc/directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffsetComparator.java?rev=1621563&view=auto
==============================================================================
--- directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffsetComparator.java (added)
+++ directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffsetComparator.java Sun Aug 31 06:41:44 2014
@@ -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.directory.mavibot.btree;
+
+
+import java.util.Comparator;
+
+
+/**
+ * A comparator for the RevisionAndHeaderOffset class
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+/* no qualifier*/class RevisionAndHeaderOffsetComparator implements Comparator<RevisionAndHeaderOffset>
+{
+    /** A static instance of a RevisionOffsetComparator */
+    public static final RevisionAndHeaderOffsetComparator INSTANCE = new RevisionAndHeaderOffsetComparator();
+
+    public static final RevisionAndHeaderOffsetComparator INSTANCE_DESC_ORDER = new RevisionAndHeaderOffsetComparator( true );
+    
+    private boolean desc;
+    
+    /**
+     * A private constructor of the RevisionOffsetComparator class
+     */
+    private RevisionAndHeaderOffsetComparator()
+    {
+    }
+
+    
+    private RevisionAndHeaderOffsetComparator( boolean desc )
+    {
+        this.desc = desc;
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public int compare( RevisionAndHeaderOffset rn1, RevisionAndHeaderOffset 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 offset
+        return 0;
+    }
+}

Added: directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffsetSerializer.java
URL: http://svn.apache.org/viewvc/directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffsetSerializer.java?rev=1621563&view=auto
==============================================================================
--- directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffsetSerializer.java (added)
+++ directory/mavibot/branches/free-page-mgmt/mavibot/src/main/java/org/apache/directory/mavibot/btree/RevisionAndHeaderOffsetSerializer.java Sun Aug 31 06:41:44 2014
@@ -0,0 +1,185 @@
+/*
+ *  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 RevisionAndHeaderOffset object. The RevisionAndHeaderOffset 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 RevisionAndHeaderOffsetSerializer extends AbstractElementSerializer<RevisionAndHeaderOffset>
+{
+    /** A static instance of a RevisionAndHeaderOffsetSerializer */
+    /*No qualifier*/ final static RevisionAndHeaderOffsetSerializer INSTANCE = new RevisionAndHeaderOffsetSerializer();
+
+    /**
+     * Create a new instance of a RevisionAndHeaderOffsetSerializer
+     */
+    private RevisionAndHeaderOffsetSerializer()
+    {
+        super( RevisionAndHeaderOffsetComparator.INSTANCE );
+    }
+
+
+    /**
+     * A static method used to deserialize a RevisionAndHeaderOffset from a byte array.
+     *
+     * @param in The byte array containing the RevisionAndHeaderOffset
+     * @return A RevisionAndHeaderOffset instance
+     */
+    /* no qualifier*/static RevisionAndHeaderOffset deserialize( byte[] in )
+    {
+        return deserialize( in, 0 );
+    }
+
+
+    /**
+     * A static method used to deserialize a RevisionAndHeaderOffset from a byte array.
+     *
+     * @param in The byte array containing the RevisionAndHeaderOffset
+     * @param start the position in the byte[] we will deserialize the RevisionAndHeaderOffset from
+     * @return A RevisionAndHeaderOffset instance
+     */
+    /* no qualifier*/static RevisionAndHeaderOffset deserialize( byte[] in, int start )
+    {
+        // The buffer must be 8 bytes
+        if ( ( in == null ) || ( in.length < 8 + start ) )
+        {
+            throw new SerializerCreationException( "Cannot extract a RevisionAndHeaderOffset from a buffer with not enough bytes" );
+        }
+
+        long revision = LongSerializer.deserialize( in, start );
+        
+        long offset = LongSerializer.deserialize( in, start + 8 );
+        
+        RevisionAndHeaderOffset RevisionOffset = new RevisionAndHeaderOffset( revision, offset );
+        
+        return RevisionOffset;
+    }
+
+
+    /**
+     * A static method used to deserialize a RevisionAndHeaderOffset from a byte array.
+     *
+     * @param in The byte array containing the RevisionAndHeaderOffset
+     * @return A RevisionAndHeaderOffset instance
+     */
+    public RevisionAndHeaderOffset fromBytes( byte[] in )
+    {
+        return deserialize( in, 0 );
+    }
+
+
+    /**
+     * A static method used to deserialize a RevisionAndHeaderOffset from a byte array.
+     *
+     * @param in The byte array containing the RevisionAndHeaderOffset
+     * @param start the position in the byte[] we will deserialize the RevisionAndHeaderOffset from
+     * @return A RevisionAndHeaderOffset instance
+     */
+    public RevisionAndHeaderOffset 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 RevisionAndHeaderOffset from a buffer with not enough bytes" );
+        }
+
+        return deserialize( in, start );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public byte[] serialize( RevisionAndHeaderOffset RevisionOffset )
+    {
+        if ( RevisionOffset == null )
+        {
+            throw new SerializerCreationException( "The RevisionAndHeaderOffset instance should not be null " );
+        }
+
+        byte[] result = new byte[16];
+        LongSerializer.serialize( result, 0, RevisionOffset.getRevision() );
+
+        LongSerializer.serialize( result, 8, RevisionOffset.getOffset() );
+        
+        return result;
+    }
+
+
+    /**
+     * Serialize a RevisionAndHeaderOffset
+     *
+     * @param buffer the Buffer that will contain the serialized value
+     * @param start the position in the buffer we will store the serialized RevisionAndHeaderOffset
+     * @param value the value to serialize
+     * @return The byte[] containing the serialized RevisionAndHeaderOffset
+     */
+    /* no qualifier*/static byte[] serialize( byte[] buffer, int start, RevisionAndHeaderOffset RevisionOffset )
+    {
+        LongSerializer.serialize( buffer, start, RevisionOffset.getRevision() );
+        LongSerializer.serialize( buffer, start + 8, RevisionOffset.getOffset() );
+        return buffer;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public RevisionAndHeaderOffset deserialize( BufferHandler bufferHandler ) throws IOException
+    {
+        byte[] revisionBytes = bufferHandler.read( 16 );
+        long revision = LongSerializer.deserialize( revisionBytes );
+
+        long offset = LongSerializer.deserialize( revisionBytes, 8 );
+
+        return new RevisionAndHeaderOffset( revision, offset );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public RevisionAndHeaderOffset deserialize( ByteBuffer buffer ) throws IOException
+    {
+        // The revision
+        long revision = buffer.getLong();
+
+        long offset = buffer.getLong();
+
+        return new RevisionAndHeaderOffset( revision, offset );
+    }
+}