001    package org.mesopotamia;
002    
003    import gnu.trove.TIntObjectHashMap;
004    
005    import java.util.ArrayList;
006    import java.util.HashMap;
007    import java.util.List;
008    import java.util.Map;
009    
010    import biz.hammurapi.util.Attributable;
011    import biz.hammurapi.util.CollectionVisitable;
012    import biz.hammurapi.util.VisitableBase;
013    import biz.hammurapi.util.Visitor;
014    
015    /**
016     * Raw source unit
017     * @author Pavel Vlasov
018     *
019     */
020    public class SyntaxTree extends VisitableBase implements Attributable {
021            private List<MesopotamiaNode> roots = new ArrayList<MesopotamiaNode>();
022            private TIntObjectHashMap nodeMap = new TIntObjectHashMap();
023            
024            public List<MesopotamiaNode> getRoots() {
025                    return roots;
026            }
027            
028            public MesopotamiaNode findNode(int id) {
029                    return (MesopotamiaNode) nodeMap.get(id);
030            }
031            
032            public void mapNode(MesopotamiaNode node) {
033                    nodeMap.put(node.getId(), node);
034            }
035            
036            protected void acceptChildren(Visitor visitor) {
037                    new CollectionVisitable(roots, false).accept(visitor);
038            }
039            
040            private Map<Object, Object> attributes = new HashMap<Object, Object>();
041    
042            public Object getAttribute(Object key) {
043                    return attributes.get(key);
044            }
045    
046            public Object removeAttribute(Object key) {
047                    return attributes.remove(key);
048            }
049    
050            public void setAttribute(Object key, Object value) {
051                    attributes.put(key, value);             
052            }       
053    }