You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2013/08/09 17:30:08 UTC
svn commit: r1512343 -
/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java
Author: elecharny
Date: Fri Aug 9 15:30:08 2013
New Revision: 1512343
URL: http://svn.apache.org/r1512343
Log:
Made the generic easier to use for the end user. Fix for MAVIBOT-2
Modified:
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java?rev=1512343&r1=1512342&r2=1512343&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java Fri Aug 9 15:30:08 2013
@@ -132,7 +132,7 @@ public class RecordManager
private int pageSize = DEFAULT_PAGE_SIZE;
/** The set of managed BTrees */
- private Map<String, BTree<?, ?>> managedBTrees;
+ private Map<String, BTree<Object, Object>> managedBTrees;
/** The offset on the last added BTree */
private long lastAddedBTreeOffset = NO_PAGE;
@@ -174,7 +174,7 @@ public class RecordManager
*/
public RecordManager( String fileName, int pageSize )
{
- managedBTrees = new LinkedHashMap<String, BTree<?, ?>>();
+ managedBTrees = new LinkedHashMap<String, BTree<Object, Object>>();
HEADER_BUFFER = ByteBuffer.allocate( pageSize );
HEADER_SIZE = pageSize;
@@ -348,7 +348,7 @@ public class RecordManager
PageIO[] pageIos = readPageIOs( HEADER_SIZE, Long.MAX_VALUE );
// Create the BTree
- copiedPageBTree = BTreeFactory.createBTree();
+ copiedPageBTree = BTreeFactory.<RevisionName, long[]> createBTree();
copiedPageBTree.setBtreeOffset( btreeOffset );
loadBTree( pageIos, copiedPageBTree );
@@ -357,7 +357,7 @@ public class RecordManager
// And the Revision BTree
pageIos = readPageIOs( nextBtreeOffset, Long.MAX_VALUE );
- revisionBTree = BTreeFactory.createBTree();
+ revisionBTree = BTreeFactory.<RevisionName, Long> createBTree();
revisionBTree.setBtreeOffset( nextBtreeOffset );
loadBTree( pageIos, revisionBTree );
@@ -367,7 +367,7 @@ public class RecordManager
for ( int i = 2; i < nbBtree; i++ )
{
// Create the BTree
- BTree<?, ?> btree = BTreeFactory.createBTree();
+ BTree<Object, Object> btree = BTreeFactory.createBTree();
btree.setBtreeOffset( nextBtreeOffset );
lastAddedBTreeOffset = nextBtreeOffset;
@@ -447,7 +447,7 @@ public class RecordManager
* @throws IllegalAccessException
* @throws ClassNotFoundException
*/
- private void loadBTree( PageIO[] pageIos, BTree<?, ?> btree ) throws EndOfFileExceededException,
+ private <K, V> void loadBTree( PageIO[] pageIos, BTree<K, V> btree ) throws EndOfFileExceededException,
IOException, ClassNotFoundException, IllegalAccessException, InstantiationException
{
long dataPos = 0L;
@@ -487,33 +487,25 @@ public class RecordManager
byte[] keySerializerBytes = readBytes( pageIos, dataPos );
dataPos += INT_SIZE + keySerializerBytes.length;
- String keySerializerFqcn = null;
+ String keySerializerFqcn = "";
if ( keySerializerBytes != null )
{
keySerializerFqcn = Strings.utf8ToString( keySerializerBytes );
}
- else
- {
- keySerializerFqcn = "";
- }
BTreeFactory.setKeySerializer( btree, keySerializerFqcn );
// The valueSerialier FQCN
byte[] valueSerializerBytes = readBytes( pageIos, dataPos );
- String valueSerializerFqcn = null;
+ String valueSerializerFqcn = "";
dataPos += INT_SIZE + valueSerializerBytes.length;
if ( valueSerializerBytes != null )
{
valueSerializerFqcn = Strings.utf8ToString( valueSerializerBytes );
}
- else
- {
- valueSerializerFqcn = "";
- }
BTreeFactory.setValueSerializer( btree, valueSerializerFqcn );
@@ -532,16 +524,16 @@ public class RecordManager
// Read the rootPage pages on disk
PageIO[] rootPageIos = readPageIOs( rootPageOffset, Long.MAX_VALUE );
- Page btreeRoot = readPage( btree, rootPageIos );
+ Page<K, V> btreeRoot = readPage( btree, rootPageIos );
BTreeFactory.setRecordManager( btree, this );
BTreeFactory.setRoot( btree, btreeRoot );
}
- private Page readNode( BTree btree, long offset, long revision, int nbElems ) throws IOException
+ private <K, V> Page<K, V> readNode( BTree<K, V> btree, long offset, long revision, int nbElems ) throws IOException
{
- Page node = BTreeFactory.createNode( btree, revision, nbElems );
+ Page<K, V> node = BTreeFactory.createNode( btree, revision, nbElems );
// Read the rootPage pages on disk
PageIO[] pageIos = readPageIOs( offset, Long.MAX_VALUE );
@@ -550,17 +542,18 @@ public class RecordManager
}
- public Page deserialize( BTree btree, long offset ) throws EndOfFileExceededException, IOException
+ public <K, V> Page<K, V> deserialize( BTree<K, V> btree, long offset ) throws EndOfFileExceededException,
+ IOException
{
PageIO[] rootPageIos = readPageIOs( offset, Long.MAX_VALUE );
- Page page = readPage( btree, rootPageIos );
+ Page<K, V> page = readPage( btree, rootPageIos );
return page;
}
- private Page readPage( BTree btree, PageIO[] pageIos ) throws IOException
+ private <K, V> Page<K, V> readPage( BTree<K, V> btree, PageIO[] pageIos ) throws IOException
{
// Deserialize the rootPage now
long position = 0L;
@@ -574,7 +567,7 @@ public class RecordManager
position += INT_SIZE;
// The size of the data containing the keys and values
- Page page = null;
+ Page<K, V> page = null;
ByteBuffer byteBuffer = null;
// Reads the bytes containing all the keys and values, if we have some
@@ -592,19 +585,19 @@ public class RecordManager
// Its a leaf
page = BTreeFactory.createLeaf( btree, revision, nbElems );
- ( ( AbstractPage ) page ).setOffset( pageIos[0].getOffset() );
- ( ( AbstractPage ) page ).setLastOffset( pageIos[pageIos.length - 1].getOffset() );
+ ( ( AbstractPage<K, V> ) page ).setOffset( pageIos[0].getOffset() );
+ ( ( AbstractPage<K, V> ) page ).setLastOffset( pageIos[pageIos.length - 1].getOffset() );
// Read each value and key
for ( int i = 0; i < nbElems; i++ )
{
- ElementHolder valueHolder;
+ ElementHolder<V, K, V> valueHolder;
if ( btree.isAllowDuplicates() )
{
long value = OFFSET_SERIALIZER.deserialize( byteBuffer );
-
- BTree dupValueContainer = loadDupsBTree(value);
+
+ BTree<K, V> dupValueContainer = loadDupsBTree( value );
valueHolder = new DuplicateKeyMemoryHolder( btree, dupValueContainer );
}
@@ -615,9 +608,9 @@ public class RecordManager
valueHolder = new MemoryHolder( btree, value );
}
- BTreeFactory.setValue( ( ( Leaf ) page ), i, valueHolder );
+ BTreeFactory.setValue( ( ( Leaf<K, V> ) page ), i, valueHolder );
- Object key = btree.getKeySerializer().deserialize( byteBuffer );
+ K key = btree.getKeySerializer().deserialize( byteBuffer );
BTreeFactory.setKey( page, i, key );
}
@@ -637,9 +630,9 @@ public class RecordManager
long lastOffset = OFFSET_SERIALIZER.deserialize( byteBuffer );
ElementHolder valueHolder = new ReferenceHolder( btree, null, offset, lastOffset );
- ( ( Node ) page ).setValue( i, valueHolder );
+ ( ( Node<K, V> ) page ).setValue( i, valueHolder );
- Object key = btree.getKeySerializer().deserialize( byteBuffer );
+ K key = btree.getKeySerializer().deserialize( byteBuffer );
BTreeFactory.setKey( page, i, key );
}
@@ -648,7 +641,7 @@ public class RecordManager
long lastOffset = OFFSET_SERIALIZER.deserialize( byteBuffer );
ElementHolder valueHolder = new ReferenceHolder( btree, null, offset, lastOffset );
- ( ( Node ) page ).setValue( nodeNbElems, valueHolder );
+ ( ( Node<K, V> ) page ).setValue( nodeNbElems, valueHolder );
}
return page;
@@ -908,9 +901,9 @@ public class RecordManager
*
* @param btree The new BTree to manage.
*/
- public synchronized void manage( BTree<?, ?> btree ) throws BTreeAlreadyManagedException, IOException
+ public synchronized <K, V> void manage( BTree<K, V> btree ) throws BTreeAlreadyManagedException, IOException
{
- manage( btree, false );
+ manage( ( BTree<Object, Object> ) btree, false );
}
@@ -924,7 +917,8 @@ public class RecordManager
* @throws BTreeAlreadyManagedException
* @throws IOException
*/
- public synchronized void manage( BTree<?, ?> btree, boolean internalTree ) throws BTreeAlreadyManagedException,
+ public synchronized <K, V> void manage( BTree<K, V> btree, boolean internalTree )
+ throws BTreeAlreadyManagedException,
IOException
{
LOG.debug( "Managing the btree {} which is an internam tree : {}", btree.getName(), internalTree );
@@ -939,7 +933,7 @@ public class RecordManager
throw new BTreeAlreadyManagedException( name );
}
- managedBTrees.put( name, btree );
+ managedBTrees.put( name, ( BTree<Object, Object> ) btree );
// We will add the newly managed BTree at the end of the header.
byte[] btreeNameBytes = Strings.getBytesUtf8( name );
@@ -987,7 +981,7 @@ public class RecordManager
position = store( position, btree.getNbElems(), pageIos );
// Serialize the BTree root page
- Page rootPage = BTreeFactory.getRoot( btree );
+ Page<K, V> rootPage = BTreeFactory.getRoot( btree );
PageIO[] rootPageIos = serializePage( btree, btree.getRevision(), rootPage );
@@ -997,7 +991,7 @@ public class RecordManager
// Now, we can inject the BTree rootPage offset into the BTree header
position = store( position, rootPageIo.getOffset(), pageIos );
btree.setRootPageOffset( rootPageIo.getOffset() );
- ( ( Leaf ) rootPage ).setOffset( rootPageIo.getOffset() );
+ ( ( Leaf<K, V> ) rootPage ).setOffset( rootPageIo.getOffset() );
// The next BTree Header offset (-1L, as it's a new BTree)
position = store( position, NO_PAGE, pageIos );
@@ -1071,7 +1065,7 @@ public class RecordManager
* @return An array of pages containing the serialized node
* @throws IOException
*/
- private PageIO[] serializePage( BTree btree, long revision, Page page ) throws IOException
+ private <K, V> PageIO[] serializePage( BTree<K, V> btree, long revision, Page<K, V> page ) throws IOException
{
int nbElems = page.getNbElems();
@@ -1139,7 +1133,7 @@ public class RecordManager
// Start with the value
if ( page instanceof Node )
{
- Page child = ( ( Node ) page ).getReference( pos );
+ Page<K, V> child = ( ( Node<K, V> ) page ).getReference( pos );
// The first offset
buffer = LongSerializer.serialize( child.getOffset() );
@@ -1155,13 +1149,14 @@ public class RecordManager
{
if ( btree.isAllowDuplicates() )
{
- DuplicateKeyMemoryHolder value = ( DuplicateKeyMemoryHolder ) ( ( Leaf ) page ).getValue( pos );
- long duplicateContainerOffset = ( ( BTree ) value.getValue( btree ) ).getBtreeOffset();
- buffer = OFFSET_SERIALIZER.serialize( duplicateContainerOffset );
+ DuplicateKeyMemoryHolder<K, V> value = ( DuplicateKeyMemoryHolder<K, V> ) ( ( Leaf<K, V> ) page )
+ .getValue( pos );
+ long duplicateContainerOffset = ( ( BTree<K, V> ) value.getValue( btree ) ).getBtreeOffset();
+ buffer = LongSerializer.serialize( duplicateContainerOffset );
}
else
{
- ElementHolder value = ( ( Leaf ) page ).getValue( pos );
+ ElementHolder<V, K, V> value = ( ( Leaf<K, V> ) page ).getValue( pos );
buffer = btree.getValueSerializer().serialize( value.getValue( btree ) );
}
@@ -1178,7 +1173,7 @@ public class RecordManager
// Nodes have one more value to serialize
if ( page instanceof Node )
{
- Page child = ( ( Node ) page ).getReference( nbElems );
+ Page<K, V> child = ( ( Node<K, V> ) page ).getReference( nbElems );
// The first offset
buffer = LongSerializer.serialize( child.getOffset() );
@@ -1255,7 +1250,8 @@ public class RecordManager
* @throws IOException
* @throws EndOfFileExceededException
*/
- /* No qualifier*/void updateBtreeHeader( BTree btree, long rootPageOffset ) throws EndOfFileExceededException,
+ /* No qualifier*/<K, V> void updateBtreeHeader( BTree<K, V> btree, long rootPageOffset )
+ throws EndOfFileExceededException,
IOException
{
// Read the pageIOs associated with this BTree
@@ -1678,7 +1674,8 @@ public class RecordManager
* @return The offset of the new page
* @throws IOException
*/
- /* No qualifier*/ElementHolder writePage( BTree btree, Page newPage, long newRevision )
+ /* No qualifier*/<K, V> ElementHolder<Page<K, V>, K, V> writePage( BTree<K, V> btree, Page<K, V> newPage,
+ long newRevision )
throws IOException
{
// We first need to save the new page on disk
@@ -1691,7 +1688,8 @@ public class RecordManager
// Build the resulting reference
long offset = pageIos[0].getOffset();
long lastOffset = pageIos[pageIos.length - 1].getOffset();
- ElementHolder valueHolder = new ReferenceHolder( btree, newPage, offset, lastOffset );
+ ElementHolder<Page<K, V>, K, V> valueHolder = new ReferenceHolder<Page<K, V>, K, V>( btree, newPage, offset,
+ lastOffset );
if ( LOG_CHECK.isDebugEnabled() )
{
@@ -1896,7 +1894,7 @@ public class RecordManager
{
// TODO : we must wait for the last write to finish
- for ( BTree tree : managedBTrees.values() )
+ for ( BTree<Object, Object> tree : managedBTrees.values() )
{
tree.close();
}
@@ -2001,7 +1999,7 @@ public class RecordManager
* @param rootPage The old rootPage
* @throws IOException If we have an issue while writing on disk
*/
- /* No qualifier */void storeRootPage( BTree btree, Page rootPage ) throws IOException
+ /* No qualifier */<K, V> void storeRootPage( BTree<K, V> btree, Page<K, V> rootPage ) throws IOException
{
if ( !isKeepRevisions() )
{
@@ -2033,7 +2031,8 @@ public class RecordManager
* @throws KeyNotFoundException If we can't find the rootPage for this revision and this BTree
* @throws IOException If we had an ise while accessing the data on disk
*/
- /* No qualifier */Page getRootPage( BTree btree, long revision ) throws KeyNotFoundException, IOException
+ /* No qualifier */<K, V> Page<K, V> getRootPage( BTree<K, V> btree, long revision ) throws KeyNotFoundException,
+ IOException
{
if ( btree.getRevision() == revision )
{
@@ -2047,7 +2046,7 @@ public class RecordManager
// Read the rootPage pages on disk
PageIO[] rootPageIos = readPageIOs( rootPageOffset, Long.MAX_VALUE );
- Page btreeRoot = readPage( btree, rootPageIos );
+ Page<K, V> btreeRoot = readPage( btree, rootPageIos );
return btreeRoot;
}
@@ -2058,9 +2057,9 @@ public class RecordManager
*
* @return The managed BTrees
*/
- public BTree getManagedTree( String name )
+ public <K, V> BTree<K, V> getManagedTree( String name )
{
- return managedBTrees.get( name );
+ return ( BTree<K, V> ) managedBTrees.get( name );
}
@@ -2075,7 +2074,8 @@ public class RecordManager
* @throws IOException
* @throws EndOfFileExceededException
*/
- /* Package protected */void addFreePages( BTree btree, List<Page> pages ) throws EndOfFileExceededException,
+ /* Package protected */<K, V> void addFreePages( BTree<K, V> btree, List<Page<K, V>> pages )
+ throws EndOfFileExceededException,
IOException
{
if ( ( btree == copiedPageBTree ) || ( btree == revisionBTree ) )
@@ -2095,7 +2095,7 @@ public class RecordManager
// NOTE : potential improvement : we can update the header only when
// we have processed all the logical pages.
- for ( Page page : pages )
+ for ( Page<K, V> page : pages )
{
// Retrieve all the PageIO associated with this logical page
long firstOffset = page.getOffset();
@@ -2151,7 +2151,7 @@ public class RecordManager
{
LOG.debug( "We should not get there" );
- for ( Page p : pages )
+ for ( Page<K, V> p : pages )
{
addFreePage( btree, p );
}
@@ -2166,7 +2166,7 @@ public class RecordManager
* @param btree
* @param freePage
*/
- private void addFreePage( BTree btree, Page freePage )
+ private <K, V> void addFreePage( BTree<K, V> btree, Page<K, V> freePage )
{
try
{
@@ -2226,7 +2226,8 @@ public class RecordManager
* @throws BTreeAlreadyManagedException
*/
@SuppressWarnings("all")
- public BTree addBTree( String name, ElementSerializer<?> keySerializer, ElementSerializer<?> valueSerializer,
+ public <K, V> BTree<K, V> addBTree( String name, ElementSerializer<K> keySerializer,
+ ElementSerializer<V> valueSerializer,
boolean allowDuplicates ) throws IOException, BTreeAlreadyManagedException
{
BTreeConfiguration config = new BTreeConfiguration();
@@ -2712,17 +2713,17 @@ public class RecordManager
* @param offset the offset of the BTree header
* @return the deserialized BTree
*/
- /* No qualifier */BTree loadDupsBTree( long offset )
+ /* No qualifier */<K, V> BTree<K, V> loadDupsBTree( long offset )
{
try
{
PageIO[] pageIos = readPageIOs( offset, Long.MAX_VALUE );
-
- BTree dupValueContainer = BTreeFactory.createBTree();
+
+ BTree<K, V> dupValueContainer = BTreeFactory.createBTree();
dupValueContainer.setBtreeOffset( offset );
loadBTree( pageIos, dupValueContainer );
-
+
return dupValueContainer;
}
catch ( Exception e )
@@ -2730,10 +2731,9 @@ public class RecordManager
// should not happen
throw new RuntimeException( e );
}
-
}
-
-
+
+
/**
* @see Object#toString()
*/