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 }