RefMappers.java
package edu.udel.cis.vsl.tass.ast.parser;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
class RefMappers {
private static class RefSetter {
private final int attrNum;
private final NodeEltWrapperIF srcElt;
private final int reference;
public RefSetter(NodeEltWrapperIF srcElt,
int attrNum,
int reference) {
this.srcElt = srcElt;
this.attrNum = attrNum;
this.reference = reference;
}
public int getReference() {
return reference;
}
public void link(NodeEltWrapperIF destElt) {
srcElt.setAttr(attrNum,destElt);
}
}
private final IdGenerator idGenerator = new IdGenerator();
private final List<RefSetter> references = new ArrayList<RefSetter>();
private final Map<Integer,NodeEltWrapperIF> idMap =
new HashMap<Integer,NodeEltWrapperIF>();
public long getId() {
return idGenerator.getId();
}
public void addId(NodeEltWrapperIF elt, Integer id) {
idMap.put(id,elt);
}
public void addRef(NodeEltWrapperIF elt, Integer ref, int attrNum) {
references.add(new RefSetter(elt,attrNum,ref));
}
public void linkRefs() {
for (RefSetter entry : references) {
NodeEltWrapperIF elt = idMap.get(entry.getReference());
if (elt != null) {
entry.link(elt);
} else {
throw new ParserException("Missing id: "+entry.getReference());
}
}
}
}