view src/main/java/christie/topology/manager/CreateTreeTopology.java @ 121:8949d0ecf1f6

refactor Topology
author akahori
date Tue, 11 Dec 2018 15:46:09 +0900
parents ce96f375f369
children 2e2d761ea806
line wrap: on
line source

package christie.topology.manager;


import christie.annotation.Peek;
import christie.annotation.Take;
import christie.codegear.CodeGear;
import christie.codegear.CodeGearManager;
import christie.topology.HostMessage;

import java.util.HashMap;

public class CreateTreeTopology extends CodeGear{

    @Take
    HostMessage newHost;

    @Take
    int hostCount;

    @Peek
    HashMap<String, HostMessage> nameTable;

    @Take
    String MD5;

    @Peek
    HashMap<String, String> absCookieTable;

    @Peek
    ParentManager parentManager;

    public CreateTreeTopology(){
    }

    @Override
    protected void run(CodeGearManager cgm) {


        String nodeName = "node" + hostCount;
        String newHostName = newHost.getHostName();
        int newHostPort = newHost.getPort();


        cgm.createRemoteDGM(nodeName, newHostName, newHostPort);
        getDGM(nodeName).put("nodeName", nodeName);
        getDGM(nodeName).put("cookie", MD5);

        absCookieTable.put(MD5, nodeName);
        getLocalDGM().put("hostCount", hostCount + 1);

        newHost.setAlive(true);
        nameTable.put(nodeName, newHost);
        parentManager.register(nodeName);

        if (hostCount == 0) {
            // どこにも繋がれるところがないので, ルートのとき.
            // ルートなので, connectNodeNumもreverseCountも0でいい.
            getDGM(nodeName).put("connectNodeNum", 0);
            getDGM(nodeName).put("reverseCount", 0);

        } else {
            // 親のみにつながればいいので1
            getDGM(nodeName).put("connectNodeNum", 1);
            // put parent information own
            String parentNodeName = parentManager.getMyParent();
            HostMessage parentHost = nameTable.get(parentNodeName);

            // 相手からhostNameとportはもらっているので, nodeの情報だけ与えれば良い.
            parentHost.setNodeInfo(nodeName, "parent", parentNodeName);
            getLocalDGM().put("nodeInfo", parentHost);
            cgm.setup(new RecordTopology());

            // newChildHost, newHostも同じ
            newHost.setNodeInfo(parentNodeName, "child" + parentManager.getMyNumber(), nodeName);
            getLocalDGM().put("nodeInfo", newHost);
            cgm.setup(new RecordTopology());
        }

        getDGM(nodeName).put("start", "start");
        getLocalDGM().put("startTime", System.currentTimeMillis());

        cgm.setup(new CreateTreeTopology());
    }
}