view src/test/java/jp/ac/u_ryukyu/ie/cr/junglenetwork/logupdate/Logupdator.java @ 348:944baaa4d345

Add debug Message
author suruga
date Sat, 16 Sep 2017 18:08:53 +0900
parents ec382195c477
children 1be36ba5ac00
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.junglenetwork.logupdate;

import jp.ac.u_ryukyu.ie.cr.jungle.Jungle;
import jp.ac.u_ryukyu.ie.cr.jungle.bbs.BBSTest;
import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.DefaultNodePath;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
import jp.ac.u_ryukyu.ie.cr.jungle.tree.JungleTree;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.jungle.util.jungleError.Error;
import jp.ac.u_ryukyu.ie.cr.jungleNetwork.codesegment.JungleDistributedUpdator;
import jp.ac.u_ryukyu.ie.cr.jungleNetwork.operations.NetworkTreeOperationLog;
import jp.ac.u_ryukyu.ie.cr.jungleNetwork.transaction.JungleUpdater;

import java.nio.ByteBuffer;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by kono on 2017/08/29.
 */
public class Logupdator implements JungleDistributedUpdator {

    private BBSTest bbsTest;
    private AtomicInteger requestCounter = new AtomicInteger(0);

    public Logupdator(String name, BBSTest bbsTest) {
        this.bbsTest = bbsTest;
    }

    public void init() {
    }

    public int requestIncrementAndGet() {
        return requestCounter.incrementAndGet();
    }
    @Override
    public Either<Error, JungleTreeEditor> update(NetworkTreeOperationLog netLog) {
        String treeName = netLog.getTreeName();
        Jungle jungle = getJungle();
        if (jungle.getTreeByName(treeName) == null) {
            if(null == jungle.createNewTree(treeName)){
                throw new IllegalStateException();
            }
        }
        Either<Error, JungleTreeEditor> either = null;
        JungleTree tree = jungle.getTreeByName(treeName);

        long timestamp = System.currentTimeMillis();
        ByteBuffer tBuffer = ByteBuffer.allocate(16);
        DefaultNodePath root = new DefaultNodePath();
        tBuffer.putLong(timestamp);
        do {
            JungleTreeEditor editor = tree.getJungleTreeEditor();
			/*
			 * Merge.
			 */
            int pos = calculatePosition(tree.getRootNode(), netLog.getTimeStamp());
            either = JungleUpdater.edit(editor, netLog, pos);
            if(either.isA()) {
                throw new IllegalStateException();
            }
            editor = either.b();
            either = editor.putAttribute(root, "renewtime", tBuffer);
            if(either.isA()) {
                throw new IllegalStateException();
            }
            editor = either.b();
            either = editor.success();
        } while(either.isA());
        requestIncrementAndGet();
        bbsTest.checkMessage();
        return either;
    }

    private int calculatePosition(TreeNode node, long newNodeTimeStamp) {
        int count = 0;
        long childTimeStamp = 0;
        for(TreeNode n : node.getChildren()) {
            ByteBuffer timestamp = n.getAttributes().get("timestamp");
            if(timestamp == null) {
                return count;
            }
            childTimeStamp = timestamp.getLong(0);
            if (newNodeTimeStamp < childTimeStamp) {
                break;
            }
            count++;
        }
        return count;
    }

    public Jungle getJungle() {
        return bbsTest.getJungle();
    }
}