/* Copyright 2012, UCAR/Unidata.
See the LICENSE file for more information.
*/
package dap4.cdmshared;
import dap4.core.dmr.DapNode;
import ucar.nc2.CDMNode;
import java.util.HashMap;
import java.util.Map;
/**
Provide a bi-directional 1-1 map between DapNode
instances and CDMNode instances.
There is a complication. Currently, the hashCode() in
ucar.nc2.Variable (and other classes) is unstable when
objects are being incrementally constructed. So until and
unless that is changed, it is necessary to provide a way to
map CDMNode <-> DapNode that is independent of e.g
Variable.hashCode(); We do this by overriding hashCode() to
use Object.hashCode() explicitly.
*/
public class NodeMap
{
//////////////////////////////////////////////////
// Instance Variables
/**
* Map from DapNode -> CDMNode
*/
Map<DapNode, CDMNode> cdmmap = new HashMap<DapNode, CDMNode>();
/**
* Map from CDMNode -> DapNode via a specific hashCode integer
*/
Map<Integer, DapNode> dapmap = new HashMap<Integer, DapNode>();
//////////////////////////////////////////////////
// Constructor(s)
public NodeMap() {};
//////////////////////////////////////////////////
// Accessors
public DapNode get(CDMNode cdmnode)
{
cdmnode = CDMNode.unwrap(cdmnode);
int lh = cdmnode.localhash();
return dapmap.get(lh);
}
public CDMNode get(DapNode node) {return cdmmap.get(node);}
public boolean containsKey(CDMNode node) {return dapmap.containsKey(node.localhash());}
public boolean containsKey(DapNode node) {return cdmmap.containsKey(node);}
/**
* Given a dapnode <-> cdmnode pair, insert
* into the maps
* @param dapnode
* @param cdmnode
*/
public void put(DapNode dapnode, CDMNode cdmnode)
{
assert(dapnode != null && cdmnode != null);
cdmnode = CDMNode.unwrap(cdmnode);
int lh = cdmnode.localhash();
dapmap.put(lh,dapnode);
cdmmap.put(dapnode,cdmnode);
}
/**
* Given a dapnode <-> cdmnode pair, remove
* from the maps
* @param dapnode
* @param cdmnode
*/
public void remove(DapNode dapnode, CDMNode cdmnode)
{
assert(dapnode != null && cdmnode != null);
cdmnode = CDMNode.unwrap(cdmnode);
dapmap.remove(cdmnode.localhash());
cdmmap.remove(dapnode);
}
// Access one of the underlying maps
public Map<DapNode,CDMNode> getCDMMap() {return cdmmap;}
// public Map<CDMNode,DapNode> getDapMap() {return dapmap;}
}