view src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/BulletinBoardJungleManager.java @ 3:f3d30646c863

fix error
author tatsuki
date Mon, 27 Jun 2016 05:25:48 +0900
parents 3c188a5b69ef
children
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.bbs.network;


import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle;
import jp.ac.u_ryukyu.ie.cr.jungle.Jungle;
import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree;
import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath;
import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor;
import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
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;

public class BulletinBoardJungleManager {
	private static BulletinBoardJungleManager instance = new BulletinBoardJungleManager();
	private Jungle jungle;
	private static AtomicInteger requestCounter = new AtomicInteger(0);

	private BulletinBoardJungleManager() {
		jungle = new DefaultJungle(null,"default",new DefaultTreeEditor(new DefaultTraverser()));
	}
	
	public static int requestGetAndIncrement() {
		return requestCounter.getAndIncrement();
	}
	
	public static int requestIncrementAndGet() {
		return requestCounter.incrementAndGet();
	}
	
	public static BulletinBoardJungleManager getInstantce() {
		return instance;
	}
	
	public static void setJungle(Jungle _j) {
		instance.jungle = _j;
	}
	public static AtomicInteger getRequestCounter() {
		return requestCounter;
	}
	
	public static Jungle getJungle() {
		return instance.jungle;
	}
	
	public static JungleTree createNewTree(String name) {
		return instance.jungle.createNewTree(name);	
	}

	public static Either<Error, JungleTreeEditor> update(NetworkTreeOperationLog netLog) {
		String treeName = netLog.getTreeName();
		Jungle jungle = BulletinBoardJungleManager.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.getLocalTreeEditor();
			/* 
			 * 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();
		return either;
	}
	
	private static 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;
	}
}