view src/main/java/alice/topology/manager/StartTopologyManager.java @ 422:2c6f86320691 dispose

add topology state recoder
author sugi
date Mon, 21 Jul 2014 17:23:38 +0900
parents aefbe41fcf12
children af343b2a7a8b
line wrap: on
line source

package alice.topology.manager;

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 alice.codesegment.CodeSegment;
import alice.topology.HostMessage;

import com.alexmerz.graphviz.ParseException;
import com.alexmerz.graphviz.Parser;
import com.alexmerz.graphviz.objects.Edge;
import com.alexmerz.graphviz.objects.Graph;
import com.alexmerz.graphviz.objects.Node;

public class StartTopologyManager extends CodeSegment {

    TopologyManagerConfig conf;
    Logger logger = Logger.getLogger(StartTopologyManager.class);

    public StartTopologyManager(TopologyManagerConfig conf) {
        this.conf = conf;
    }

    @Override
    public void run() {
        if (!conf.extendTopology) {
            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(conf.confFilePath));
                Parser parser = new Parser();
                parser.parse(reader);
                ArrayList<Graph> graphs = parser.getGraphs();
                for (Graph graph : graphs) {
                    ArrayList<Node> nodes = graph.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 = graph.getEdges();
                    HashMap<String, NodeInfo> hash = new HashMap<String, NodeInfo>();
                    for (Edge edge : edges) {
                        String connection = edge.getAttribute("label");
                        String source = edge.getSource().getNode().getId().getId();
                        String target = edge.getTarget().getNode().getId().getId();
                        LinkedList<NodeInfo> sources = topology.get(target);
                        NodeInfo nodeInfo = new NodeInfo(source, connection);
                        sources.add(nodeInfo);
                        hash.put(source + "," + target, nodeInfo);
                    }
                    for (Edge edge : edges) {
                        String connection = edge.getAttribute("label");
                        String source = edge.getSource().getNode().getId().getId();
                        String target = edge.getTarget().getNode().getId().getId();
                        NodeInfo nodeInfo = hash.get(target + "," + source);
                        if (nodeInfo != null) {
                            nodeInfo.reverseName = connection;
                        }
                    }
                }

            } catch (FileNotFoundException e) {
                logger.error("File not found: " + conf.confFilePath);
                e.printStackTrace();
            } catch (ParseException e) {
                logger.error("File format error: " + conf.confFilePath);
                e.printStackTrace();
            }
            
            // for recode topology information
            ods.put("topology", new HashMap<String, LinkedList<HostMessage>>());
            
            new IncomingHosts(topology, nodeNames);

            ConfigWaiter cs3 = new ConfigWaiter(nodeNum);
            cs3.done.setKey("local", "done");
        } else {
            System.out.println("mode -t");
            HashMap<String,HostMessage> parentInfo = new HashMap<String,HostMessage>();
            int cominghostCount = 0;
            ods.put("nodeConnectionInfo", parentInfo);
            ods.put("hostCount", cominghostCount);
            new ComingServiceHosts();
        }
    }

}