diff src/main/java/app/bbs/BullentInBoardJungleManager.java @ 123:495ac60d7f5f

Modified JungleUpdater
author one
date Fri, 27 Dec 2013 20:13:37 +0900
parents src/main/java/app/bbs/JungleManager.java@895ab2907db3
children 292538b1de32
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/app/bbs/BullentInBoardJungleManager.java	Fri Dec 27 20:13:37 2013 +0900
@@ -0,0 +1,81 @@
+package app.bbs;
+
+import java.nio.ByteBuffer;
+
+import alice.jungle.operations.NetworkTreeOperationLog;
+import alice.jungle.transaction.JungleUpdater;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+
+public class BullentInBoardJungleManager {
+	private static BullentInBoardJungleManager instance = new BullentInBoardJungleManager();
+	private Jungle jungle;
+
+	private BullentInBoardJungleManager() {
+		jungle = new DefaultJungle(null,"default",new DefaultTreeEditor(new DefaultTraverser()));
+	}
+	
+	public static BullentInBoardJungleManager getInstantce() {
+		return instance;
+	}
+	
+	public static void setJungle(Jungle _j) {
+		instance.jungle = _j;
+	}
+	
+	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 = BullentInBoardJungleManager.getJungle(); 
+		if (jungle.getTreeByName(treeName) == null) {
+			if(null == jungle.createNewTree(treeName)){
+				throw new IllegalStateException();
+			}
+		}
+		JungleTree tree = jungle.getTreeByName(treeName);
+		JungleTreeEditor editor = tree.getLocalTreeEditor();
+
+		int pos = calculatePosition(tree.getRootNode(), netLog.getTimeStamp());
+		Either<Error, JungleTreeEditor> either = JungleUpdater.edit(editor, netLog, pos);
+		if(either.isA()) {
+			throw new IllegalStateException();
+		}
+		editor = either.b();
+		either = editor.success();
+		if(either.isA()) {
+			throw new IllegalStateException();
+		}
+		return either;
+	}
+	
+	private static int calculatePosition(Node node, long newNodeTimeStamp) {
+		int count = 0;
+		long childTimeStamp = 0;
+		for(Node n : node.getChildren()) {
+			ByteBuffer timestamp = n.getAttributes().get("timestamp");
+			if(timestamp == null) {
+				return count;
+			}
+			childTimeStamp = timestamp.getLong();
+			if (newNodeTimeStamp < childTimeStamp) {
+				break;
+			}
+			count++;
+		}
+		return count;
+	}
+}