diff src/main/java/app/bbs/JungleManager.java @ 112:8f9811a1e00c

Moved app files
author one
date Fri, 29 Nov 2013 04:31:22 +0900
parents src/main/java/jungle/app/bbs/JungleManager.java@f9e29a52efd3
children 7d9b7fcb4d9a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/app/bbs/JungleManager.java	Fri Nov 29 04:31:22 2013 +0900
@@ -0,0 +1,127 @@
+package app.bbs;
+
+import java.nio.ByteBuffer;
+import java.util.Iterator;
+
+import alice.jungle.operations.NetworkTreeOperationLog;
+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.Command;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
+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 JungleManager {
+	private static JungleManager jm = new JungleManager();
+	private Jungle jungle;
+	private static int NOT_CHANGE_POSITION = 0;
+
+	private JungleManager() {
+		jungle = new DefaultJungle(null,"hogehoge",new DefaultTreeEditor(new DefaultTraverser()));
+	}
+	
+	public static void setJungle(Jungle _j) {
+		jm.jungle = _j;
+	}
+	
+	public static Jungle getJungle() {
+		return jm.jungle;
+	}
+	
+	public static JungleTree createNewTree(String name) {
+		return jm.jungle.createNewTree(name);		
+	}
+
+	public static Either<Error, JungleTreeEditor> edit(JungleTreeEditor _editor ,TreeOperationLog _log, int pos) {
+		JungleTreeEditor editor = _editor;
+		Either<Error, JungleTreeEditor> either = null;
+		for (TreeOperation op : _log) {
+			either = _edit(editor, op, pos);
+			if(either.isA()) {
+				return either;
+			}
+			editor = either.b();
+		}
+		return either;
+	}
+	
+	private static Either<Error, JungleTreeEditor> _edit(JungleTreeEditor editor,
+			TreeOperation op, int _pos) {
+		NodePath path = new DefaultNodePath();
+		NodeOperation nodeOp = op.getNodeOperation();
+		int pos = _pos;
+		if (_pos == NOT_CHANGE_POSITION ) {
+			pos = nodeOp.getPosition();
+		}
+		Command c = nodeOp.getCommand();
+		String key = "";
+		switch (c) {
+		case PUT_ATTRIBUTE:
+			path = op.getNodePath();
+			key = nodeOp.getKey();
+			ByteBuffer value = nodeOp.getValue();
+			return editor.putAttribute(path, key, value);
+		case DELETE_ATTRIBUTE:
+			key = nodeOp.getKey();
+			return editor.deleteAttribute(path, key);
+		case APPEND_CHILD:
+			return editor.addNewChildAt(path, pos);
+		case DELETE_CHILD:
+			return editor.deleteChildAt(path, 0);
+		}
+		return null;
+	}
+	
+	public static Either<Error, JungleTreeEditor> update(NetworkTreeOperationLog netLog) {
+		String treeName = netLog.getTreeName();
+		Jungle jungle = JungleManager.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());
+		int pos = 0;
+		Either<Error, JungleTreeEditor> either = JungleManager.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(Iterator<Node> iter = node.getChildren().iterator();iter.hasNext();) {
+			Node n = iter.next();
+			if(n.getAttributes().get("timestamp") == null) {
+				return NOT_CHANGE_POSITION;
+			}
+			if(n.getAttributes().get("timestamp") != null) {
+				childTimeStamp = n.getAttributes().get("timestamp").getLong();
+				if (newNodeTimeStamp < childTimeStamp) {
+					break;
+				}
+			}
+			count++;
+		}
+		return count;
+	}
+}