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 }