/* 
 * This file is part of the HyperGraphDB source distribution. This is copyrighted 
 * software. For permitted uses, licensing options and redistribution, please see  
 * the LicensingInformation file at the root level of the distribution.  
 * 
 * Copyright (c) 2005-2010 Kobrix Software, Inc.  All rights reserved. 
 */
package org.hypergraphdb.storage;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.hypergraphdb.HGPersistentHandle;
import org.hypergraphdb.util.Pair;

public class RefDelegateStorageGraph implements StorageGraph
{
    private Map<HGPersistentHandle, HGPersistentHandle> delegates;
    private StorageGraph wrapped;
    
    public RefDelegateStorageGraph(StorageGraph wrapped, 
                                   Map<HGPersistentHandle, HGPersistentHandle> delegates)
    {
        this.wrapped = wrapped;
        this.delegates = delegates;
    }
    
    public byte[] getData(HGPersistentHandle handle)
    {
        HGPersistentHandle del = delegates.get(handle);
        return del != null ? wrapped.getData(del) : wrapped.getData(handle);
    }

    
    public HGPersistentHandle[] getLink(HGPersistentHandle handle)
    {
        HGPersistentHandle del = delegates.get(handle);
        return del != null ? wrapped.getLink(del) : wrapped.getLink(handle);
    }

    public HGPersistentHandle store(HGPersistentHandle handle,
                                    HGPersistentHandle[] link)
    {
        return wrapped.store(handle, link);
    }

    public HGPersistentHandle store(HGPersistentHandle handle, byte[] data)
    {
        return wrapped.store(handle, data);
    }

    public Set<HGPersistentHandle> getRoots()
    {
        return wrapped.getRoots();
    }

    public Iterator<Pair<HGPersistentHandle, Object>> iterator()
    {
        return wrapped.iterator();
    }
}
