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());
            }
        }
    }

}