package edu.byu.cs.roots.opg.nfs;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
public class RelationMap implements Serializable {
private static final long serialVersionUID = 1000L;
private HashMap <String, Integer> locationInTree;
private HashMap <String, Boolean> parsedYet;
private HashMap <String, Void> rootDescendant;
private int oldestGen;
private int youngestGen;
public RelationMap() {
locationInTree = new HashMap<String, Integer>();
parsedYet = new HashMap<String, Boolean>();
rootDescendant = new HashMap<String, Void>();
oldestGen = 0;
youngestGen = 0;
}
public synchronized void add(String Id, int gen, boolean done) {
if (!contains(Id)){
if (gen < youngestGen)
youngestGen = gen;
if (gen > oldestGen)
oldestGen = gen;
locationInTree.put(Id, gen);
parsedYet.put(Id, done);
}
}
public boolean isCompleted(String Id) {
return parsedYet.get(Id);
}
public synchronized int getGeneration(String Id) {
return locationInTree.get(Id);
}
public synchronized boolean contains(String Id) {
//if it is in ParsedYet, then it must be in locationInTree as well
return parsedYet.containsKey(Id);
}
public synchronized void nowCompleted(String Id) {
parsedYet.remove(Id);
parsedYet.put(Id, true);
}
public int getAmtNotDone() {
int count = 0;
Collection<String> allIDs = parsedYet.keySet();
for (String id: allIDs) {
if (!parsedYet.get(id))
count++;
}
return count;
}
public String getLowestGen() {
String lowestID = "abcdefg";
int lowest = 10000;
Collection<String> allIDs= locationInTree.keySet();
for (String id: allIDs) {
int gen = locationInTree.get(id);
if (gen < lowest && !parsedYet.get(id)) {
lowest = gen;
lowestID = id;
}
}
return lowestID;
}
public ArrayList<String> getSmToLgNotDone() {
ArrayList<String> smToLg = new ArrayList<String>();
ArrayList<String> notDone = getAllNotDone();
int counter = youngestGen;
while (counter <= oldestGen) {
for (String ID: notDone) {
if (locationInTree.get(ID) == counter)
smToLg.add(ID);
}
counter++;
}
return smToLg;
}
public ArrayList<String> getGenerationList(int i) {
ArrayList<String> genI = new ArrayList<String>();
Collection<String> allIDs = locationInTree.keySet();
for (String id: allIDs) {
if (locationInTree.get(id).equals(i))
genI.add(id);
}
return genI;
}
public int getOldestGeneration() {
return oldestGen;
}
public int getYoungestGeneration() {
return youngestGen;
}
public int getTotalPeople(){
return parsedYet.size();
}
public ArrayList<String> getAllNotDone() {
ArrayList<String> notDoneIDs = new ArrayList<String>();
Collection<String> allIDs = parsedYet.keySet();
for (String id: allIDs) {
if (!parsedYet.get(id))
notDoneIDs.add(id);
}
return notDoneIDs;
}
public ArrayList<String> getAllDone() {
ArrayList<String> doneIDs = new ArrayList<String>();
Collection<String> allIDs = parsedYet.keySet();
for (String id: allIDs) {
if (parsedYet.get(id))
doneIDs.add(id);
}
return doneIDs;
}
public boolean isEmpty() {
return locationInTree.isEmpty();
}
public synchronized void addRootDescendant(String add){
rootDescendant.put(add, null);
}
public boolean isRootDescendant(String add){
return rootDescendant.containsKey(add);
}
}