view src/main/java/alice/topology/manager/CreateTreeTopology.java @ 602:8a9fd716c335 dispose

change topology class extends CodeSegment from MetaCodeSegment, Chat minor fix
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Tue, 03 May 2016 20:09:45 +0900
parents 3284428f525e
children
line wrap: on
line source

package alice.topology.manager;

import java.util.HashMap;

import alice.codesegment.MetaCodeSegment;
import org.msgpack.type.ValueFactory;

import alice.codesegment.CodeSegment;
import alice.datasegment.CommandType;
import alice.datasegment.DataSegment;
import alice.datasegment.Receiver;
import alice.topology.HostMessage;

public class CreateTreeTopology extends CodeSegment {

    private Receiver info = ids.create(CommandType.TAKE);
    private Receiver info1 = ids.create(CommandType.TAKE);
    private Receiver info2 = ids.create(CommandType.TAKE);
    private Receiver info3 = ids.create(CommandType.TAKE);
    private Receiver info4 = ids.create(CommandType.TAKE);
    private Receiver info6 = ids.create(CommandType.TAKE);

    public CreateTreeTopology(){
        info.setKey("newHost");         //HostMessage
        info1.setKey("hostCount");      //incoming host count number for put node name like node0, node1, node2
        info2.setKey("nameTable");      //HashMap.<String:nodeName, HostMessage>
        info3.setKey("MD5");            //String:node's cookie that created by CreateHash
        info4.setKey("absCookieTable"); //HashMap<String:cookie, String:nodeName>
        info6.setKey("parentManager");  //ParentManager
    }

    @SuppressWarnings("unchecked")
    @Override
    public void run() {
        String cookie = info3.asString();
        System.out.println("cookie:" + cookie);
        HostMessage host = info.asClass(HostMessage.class);
        int comingHostCount = info1.asInteger();
        ParentManager manager = info6.asClass(ParentManager.class);

        HashMap<String, HostMessage> nameTable = info2.asClass(HashMap.class);
        HashMap<String, String> absCookieTable = info4.asClass(HashMap.class);

        String nodeName = "node"+comingHostCount;
        // Manager connect to Node
        DataSegment.connect(nodeName, nodeName, host.name, host.port);
        ods.put(nodeName, "host"+host.topMNum, nodeName);
        ods.put(nodeName, "cookie"+host.topMNum, cookie);

        absCookieTable.put(cookie, nodeName);
        ods.put(info4.key, absCookieTable);
        ods.put(info1.key, comingHostCount+1);
        host.alive = true;
        nameTable.put(nodeName, host);
        manager.register(nodeName);

        if (comingHostCount!=0) {///ルートでなければ親情報を持つ
            // put parent information own
            String parentAbsName = manager.getMyParent();
            HostMessage parent = nameTable.get(parentAbsName);
            int num = manager.getMyNumber();

            HostMessage newHost = new HostMessage(parent.name, parent.port, "parent", "child"+num);
            newHost.absName = parentAbsName;
            newHost.remoteAbsName = nodeName; // address
            ods.put(newHost.remoteAbsName, newHost);

            ods.put("nodeInfo", newHost);
            new RecodeTopology();

            // put own information parent
            newHost = new HostMessage(host.name, host.port, "child"+num, "parent");
            newHost.absName = nodeName;
            newHost.remoteAbsName = parentAbsName;

            ods.put(newHost.remoteAbsName, newHost);
            ods.put("nodeInfo", newHost);
            new RecodeTopology();

        }

        ods.put(info2.key, nameTable);
        ods.put(info6.key, manager);
        ods.put(nodeName, ValueFactory.createNilValue());
        if (comingHostCount==0)
            ods.put("start", ValueFactory.createNilValue());
    }
}