001    package nl.cwi.sen1.modulemanager.model;
002    
003    import java.util.Iterator;
004    import java.util.Map;
005    import java.util.Set;
006    
007    import nl.cwi.sen1.graph.Factory;
008    import nl.cwi.sen1.graph.types.Attribute;
009    import nl.cwi.sen1.graph.types.AttributeList;
010    import nl.cwi.sen1.graph.types.Edge;
011    import nl.cwi.sen1.graph.types.EdgeList;
012    import nl.cwi.sen1.graph.types.Graph;
013    import nl.cwi.sen1.graph.types.Node;
014    import nl.cwi.sen1.graph.types.NodeId;
015    import nl.cwi.sen1.graph.types.NodeList;
016    import nl.cwi.sen1.graph.types.Shape;
017    import nl.cwi.sen1.moduleapi.types.ModuleId;
018    import aterm.ATerm;
019    import aterm.pure.PureFactory;
020    
021    public class ModuleGraph extends ModuleDatabase {
022        private NodeList nodeList;
023    
024        private EdgeList edgeList;
025    
026        private Factory factory;
027    
028        public ModuleGraph(PureFactory pureFactory, AttributeSetListener l) {
029            super(l, pureFactory);
030            factory = Factory.getInstance(pureFactory);
031        }
032    
033        private void setNodes(ATerm namespace) {
034            for (Iterator<ModuleId> iter = modules.keySet().iterator(); iter
035                    .hasNext();) {
036                boolean shapeSet = false;
037                ModuleId moduleId = iter.next();
038                NodeId nodeId = factory.makeNodeId_Default(moduleId.toTerm());
039    
040                Module module = modules.get(moduleId);
041                AttributeList attrList = factory.makeAttributeList();
042    
043                AttributeTable table = module.getAttributes(namespace);
044                AttributeTable predicates = module.getPredicates(namespace);
045                if (predicates != null) {
046                    table.addEntries(module.getPredicates(namespace));
047                }
048                if (table != null) {
049                    Map<ATerm, ATerm> entries = table.getEntries();
050                    
051                    for (Iterator<ATerm> iterEntries = entries.keySet().iterator(); iterEntries
052                            .hasNext();) {
053                        ATerm value = entries.get(iterEntries.next());
054    
055                        try {
056                            Attribute attr = factory.AttributeFromTerm(value);
057                            attrList = attrList.insert(attr);
058    
059                            if (attr.isShape()) {
060                                shapeSet = true;
061                            }
062                        } catch (IllegalArgumentException exc) {
063                            System.err.println("Illegal graph attribute: " + value);
064                        }
065                    }
066    
067                }
068    
069                if (!shapeSet) {
070                    Shape shape = factory.makeShape_Box();
071                    attrList = attrList.insert(factory.makeAttribute_Shape(shape));
072                }
073    
074                Node node = factory.makeNode_Node(nodeId, attrList);
075                nodeList = nodeList.insert(node);
076            }
077        }
078    
079        private void setEdges() {
080            for (Iterator<ModuleId> iter = descendants.keySet().iterator(); iter
081                    .hasNext();) {
082                ModuleId moduleId = iter.next();
083                NodeId nodeFromId = factory.makeNodeId_Default(moduleId.toTerm());
084    
085                Set<ModuleId> dependingModules = descendants.get(moduleId);
086    
087                for (Iterator<ModuleId> depsIter = dependingModules.iterator(); depsIter
088                        .hasNext();) {
089                    NodeId nodeToId = factory.makeNodeId_Default(depsIter.next()
090                            .toTerm());
091    
092                    Edge edge = factory.makeEdge_Default(nodeFromId, nodeToId,
093                            factory.makeAttributeList());
094    
095                    edgeList = edgeList.insert(edge);
096                }
097            }
098        }
099    
100        public Graph getModuleGraph(ATerm namespace) {
101            nodeList = factory.makeNodeList();
102            edgeList = factory.makeEdgeList();
103    
104            setNodes(namespace);
105            setEdges();
106            AttributeList attrList = factory.makeAttributeList();
107    
108            return factory.makeGraph_Default(nodeList, edgeList, attrList);
109        }
110    }