package com.google.dart.engine.internal.index.file;
import com.google.common.collect.Maps;
import com.google.dart.engine.context.AnalysisContext;
import java.util.List;
import java.util.Map;
/**
* A {@link NodeManager} that keeps {@link IndexNode}s in memory.
*/
public class MemoryNodeManager implements NodeManager {
public final ContextCodec contextCodec = new ContextCodec();
public final StringCodec stringCodec = new StringCodec();
public final ElementCodec elementCodec = new ElementCodec(stringCodec);
public final RelationshipCodec relationshipCodec = new RelationshipCodec(stringCodec);
private final Map<String, IndexNode> nodes = Maps.newHashMap();
private final Map<String, Integer> nodeLocationCounts = Maps.newHashMap();
private int locationCount = 0;
@Override
public void clear() {
nodes.clear();
}
@Override
public ContextCodec getContextCodec() {
return contextCodec;
}
@Override
public ElementCodec getElementCodec() {
return elementCodec;
}
@Override
public int getLocationCount() {
return locationCount;
}
@Override
public IndexNode getNode(String name) {
return nodes.get(name);
}
@Override
public StringCodec getStringCodec() {
return stringCodec;
}
public boolean isEmpty() {
for (IndexNode node : nodes.values()) {
Map<RelationKeyData, List<LocationData>> relations = node.getRelations();
if (!relations.isEmpty()) {
return false;
}
}
return true;
}
@Override
public IndexNode newNode(AnalysisContext context) {
return new IndexNode(context, elementCodec, relationshipCodec);
}
@Override
public void putNode(String name, IndexNode node) {
// update location count
{
locationCount -= getLocationCount(name);
int nodeLocationCount = node.getLocationCount();
nodeLocationCounts.put(name, nodeLocationCount);
locationCount += nodeLocationCount;
}
// remember the node
nodes.put(name, node);
}
@Override
public void removeNode(String name) {
nodes.remove(name);
}
private int getLocationCount(String name) {
Integer locationCount = nodeLocationCounts.get(name);
return locationCount != null ? locationCount : 0;
}
}