// This software is released into the Public Domain.  See copying.txt for details.
package org.openstreetmap.osmosis.core.store;

import org.openstreetmap.osmosis.core.lifecycle.Closeable;


/**
 * Provides read-only access to an indexed object store. Each thread accessing
 * the object store must create its own reader. The reader maintains all
 * references to heavyweight resources such as file handles used to access the
 * store eliminating the need for objects such as object iterators to be cleaned
 * up explicitly.
 * 
 * @param <T>
 *            The object type being stored.
 * @author Brett Henderson
 */
public class IndexedObjectStoreReader<T> implements Closeable {
	private RandomAccessObjectStoreReader<T> objectStoreReader;
	private IndexStoreReader<Long, LongLongIndexElement> indexStoreReader;
	
	
	/**
	 * Creates a new instance.
	 * 
	 * @param objectStoreReader
	 *            Provides access to the object data.
	 * @param indexStoreReader
	 *            Provides access to the index data.
	 */
	public IndexedObjectStoreReader(
			RandomAccessObjectStoreReader<T> objectStoreReader,
			IndexStoreReader<Long, LongLongIndexElement> indexStoreReader) {
		this.objectStoreReader = objectStoreReader;
		this.indexStoreReader = indexStoreReader;
	}
	
	
	/**
	 * Returns the object identified by id.
	 * 
	 * @param id
	 *            The identifier for the object to be retrieved.
	 * @return The requested object.
	 */
	public T get(long id) {
		long objectOffset;
		T data;
		
		// Get the object offset from the index store.
		objectOffset = indexStoreReader.get(id).getValue();
		
		// Read the object from the object store.
		data = objectStoreReader.get(objectOffset);
		
		return data;
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public void close() {
		objectStoreReader.close();
		indexStoreReader.close();
	}
}
