view src/main/java/alice/topology/manager/SendNodeInfo.java @ 473:041ec04d4d45 dispose

refactor
author sugi
date Sun, 30 Nov 2014 00:00:48 +0900
parents 116e0fde9233
children fac27e395930
line wrap: on
line source

package alice.topology.manager;

import java.util.HashMap;
import java.util.LinkedList;

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 SendNodeInfo extends CodeSegment{

    private Receiver info = ids.create(CommandType.TAKE);
    private Receiver info1 = ids.create(CommandType.TAKE);
    private Receiver info2 = ids.create(CommandType.TAKE); // HashMap
    private Receiver info3 = ids.create(CommandType.TAKE); // MD5
    private Receiver info4 = ids.create(CommandType.TAKE);
    private Receiver info5 = ids.create(CommandType.TAKE);

    private static int BINATY_TREE = 2;

    public SendNodeInfo(){
        info.setKey("newHost");
        info1.setKey("hostCount");
        info2.setKey("nodeConnectionInfo");
        info3.setKey("MD5");
        info4.setKey("absCookieTable");
        info5.setKey("topology");
    }

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

        HashMap<String, HostMessage> parentInfo = info2.asClass(HashMap.class);
        HashMap<String, String> absCookieTable = info4.asClass(HashMap.class);
        HashMap<String, LinkedList<HostMessage>> topology = info5.asClass(HashMap.class);

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

        absCookieTable.put(cookie, nodeName);
        ods.put(info4.key, absCookieTable);
        ods.update(info1.key, comingHostCount+1);

        /*
         * add List own NodeInfo to own child
         * child number is own number(comingHostCount) * 2 add one or two
         */
        for (int i=1;i < BINATY_TREE+1; i++) {
            int num = BINATY_TREE * comingHostCount+i;
            HostMessage newHost = new HostMessage(host.name, host.port, "parent", "child"+(i-1));
            newHost.absName = nodeName;
            newHost.remoteAbsName = "node"+num;
            parentInfo.put(newHost.remoteAbsName, newHost);

            LinkedList<HostMessage> connections;
            if (!topology.containsKey(newHost.remoteAbsName)) {
                connections = new LinkedList<HostMessage>();
            } else {
                connections = topology.get(newHost.remoteAbsName);
            }
            connections.add(newHost);
            topology.put(newHost.remoteAbsName, connections);
        }

        if (comingHostCount!=0) {
            HostMessage parent = parentInfo.get(nodeName);
            HostMessage newHost = new HostMessage(host.name, host.port, parent.reverseName, parent.connectionName);
            newHost.absName = nodeName;
            newHost.remoteAbsName = parent.absName;
            ods.put(parent.absName, newHost);

            LinkedList<HostMessage> connections;
            if (!topology.containsKey(newHost.remoteAbsName)) {
                connections = new LinkedList<HostMessage>();
            } else {
                connections = topology.get(newHost.remoteAbsName);
            }
            connections.add(newHost);
            topology.put(newHost.remoteAbsName, connections);
        }

        LinkedList<HostMessage> connections;
        if (topology.containsKey(nodeName)) {
            connections = topology.get(nodeName);
            for (HostMessage node :connections) {
                ods.put(nodeName, node);
            }
        }

        ods.put(info5.key, topology);
        ods.put("nodeConnectionInfo", parentInfo);
        ods.put(nodeName, ValueFactory.createNilValue());
        if (comingHostCount==0)
            ods.put("start", ValueFactory.createNilValue());
    }

}