diff src/main/java/christie/topology/manager/TopologyManager.java @ 41:cf5a75bc3e55

add
author akahori
date Tue, 31 Jul 2018 17:46:32 +0900
parents 02991eabdcbe
children 12c9bf81d429
line wrap: on
line diff
--- a/src/main/java/christie/topology/manager/TopologyManager.java	Tue Jul 31 16:12:27 2018 +0900
+++ b/src/main/java/christie/topology/manager/TopologyManager.java	Tue Jul 31 17:46:32 2018 +0900
@@ -1,14 +1,123 @@
 package christie.topology.manager;
 
+import christie.annotation.Peek;
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+
+import org.apache.log4j.Logger;
+
+import com.alexmerz.graphviz.ParseException;
+import com.alexmerz.graphviz.Parser;
+import com.alexmerz.graphviz.objects.*;
+
 public class TopologyManager extends CodeGear {
 
+    @Peek
+    TopologyManagerConfig config;
+
+    Logger logger = Logger.getLogger(TopologyManager.class);
+
+
     @Override
     protected void run(CodeGearManager cgm) {
+        cgm.setup(new CheckComingHost());
 
+        // if (!conf.dynamic) は, conf.dynamic = trueの動作がわからないので,  省いた.
+
+        LinkedList<String> nodeNames = new LinkedList<String>();
+        HashMap<String, LinkedList<NodeInfo>> topology = new HashMap<String, LinkedList<NodeInfo>>();
+        int nodeNum = 0;
+
+        try {
+            FileReader reader = new FileReader(new File(config.confFilePath));
+            Parser parser = new Parser();
+            parser.parse(reader);
+
+
+            ArrayList<Graph> digraphs = parser.getGraphs();
+
+
+            for (Graph digraph : digraphs) {
+                ArrayList<Node> nodes = digraph.getNodes(false);
+                nodeNum = nodes.size();
+
+                for (Node node : nodes) {
+                    String nodeName = node.getId().getId();
+                    nodeNames.add(nodeName);
+                    topology.put(nodeName, new LinkedList<NodeInfo>());
+                }
+
+                ArrayList<Edge> edges = digraph.getEdges();
+                HashMap<String, NodeInfo> hash = new HashMap<String, NodeInfo>();
+
+                String connection;
+                String source;
+                String target;
+
+                NodeInfo nodeInfo;
+
+                // まず1回グラフを読み込む
+                for (Edge edge : edges) {
+                    connection = edge.getAttribute("label");
+                    source = edge.getSource().getNode().getId().getId();
+                    target = edge.getTarget().getNode().getId().getId();
+                    nodeInfo = new NodeInfo(source, connection);
+
+                    //Question: この下の2行はどんな役目?
+                    //LinkedList<NodeInfo> sources = topology.get(target);
+                    //sources.add(nodeInfo); // addしてその後の使い道は...?
+
+                    hash.put(source + "," + target, nodeInfo);
+                }
+
+                // hash.get(target + "," + source); をして, グラフを逆にたどって, reverseNameにlabelを入れてる.
+                for (Edge edge : edges) {
+                    connection = edge.getAttribute("label");
+                    source = edge.getSource().getNode().getId().getId();
+                    target = edge.getTarget().getNode().getId().getId();
+                    nodeInfo = hash.get(target + "," + source);
+
+                    if (nodeInfo != null) {
+                        nodeInfo.reverseName = connection;
+                    }
+
+                }
+            }
+
+        } catch (FileNotFoundException e) {
+            logger.error("File not found: " + config.confFilePath);
+            e.printStackTrace();
+        } catch (ParseException e) {
+            logger.error("File format error: " + config.confFilePath);
+            e.printStackTrace();
+        }
+
+        // for recode topology information
+        // cookie List
+        getLocalDGM().put("running", false);
+        getLocalDGM().put("resultParse", topology);
+        getLocalDGM().put("nodeNames", nodeNames);
+
+        cgm.setup(new IncomingHosts());
+
+
+
+        // Question: この処理何をやっているのかわからない. 一応, その下にそれっぽいコードを書いた.
+        // ConfigWaiter cs3 = new ConfigWaiter(nodeNum);
+        // cs3.done.setKey("local", "done");
+
+        cgm.setup(new ConfigWaiter());
+        getLocalDGM().put("nodeNum", nodeNum);
+        getLocalDGM().put("done", false);
 
     }
 
+
 }