changeset 93:75cf01a430a6

Added LocalTreeEditor
author one
date Fri, 15 Nov 2013 12:23:59 +0900
parents e95faa202b4f
children 47e337fc4086
files src/alice/jungle/operations/NetworkTreeOperationLog.java src/alice/jungle/transaction/LocalTreeEditor.java src/alice/jungle/transaction/NetworkDefaultJungleTree.java src/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java src/jungle/app/bbs/JungleManager.java src/jungle/app/bbs/NetworkJungleBulletinBoard.java
diffstat 6 files changed, 125 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/src/alice/jungle/operations/NetworkTreeOperationLog.java	Mon Nov 11 19:35:22 2013 +0900
+++ b/src/alice/jungle/operations/NetworkTreeOperationLog.java	Fri Nov 15 12:23:59 2013 +0900
@@ -1,5 +1,6 @@
 package alice.jungle.operations;
 
+import java.util.Date;
 import java.util.Iterator;
 import java.util.LinkedList;
 
@@ -17,18 +18,26 @@
 	public int size;
 	String uuid;
 	String treeName;
+	long timestamp;
 	
 	public NetworkTreeOperationLog() {
 		list = new LinkedList<NetworkTreeOperation>();
 		size = 0;
 		treeName = "";
+		timestamp = new Date().getTime();
 	}
 
 	public NetworkTreeOperationLog(String _uuid, String _treeName, Iterable<TreeOperation> _list)
 	{
+		this(_uuid, _treeName, _list, new Date().getTime());
+	}
+	
+	public NetworkTreeOperationLog(String _uuid, String _treeName, Iterable<TreeOperation> _list, long _timestamp)
+	{
 		uuid = _uuid;
 		treeName = _treeName;
 		list = new LinkedList<NetworkTreeOperation>();
+		timestamp = _timestamp;
 		for(TreeOperation op: _list) {
 			NetworkTreeOperation nOp = new NetworkTreeOperation(op);
 			list.add(nOp);
@@ -38,13 +47,7 @@
 
 	public NetworkTreeOperationLog(Iterable<TreeOperation> _list)
 	{
-		list = new LinkedList<NetworkTreeOperation>();
-		for(TreeOperation op: _list) {
-			NetworkTreeOperation nOp = new NetworkTreeOperation(op);
-			list.add(nOp);
-		}
-		size = list.size();
-		treeName = "";
+		this("", "", _list);
 	}
 
 	
@@ -88,5 +91,13 @@
 	public String getTreeName() {
 		return treeName;
 	}
+	
+	public long getTimeStamp() {
+		return timestamp;
+	}
+	
+	public void setTimeStamp(long _timestamp) {
+		timestamp = _timestamp;
+	}
 
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/alice/jungle/transaction/LocalTreeEditor.java	Fri Nov 15 12:23:59 2013 +0900
@@ -0,0 +1,48 @@
+package alice.jungle.transaction;
+
+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.persistent.ChangeListWriter;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext;
+
+/** Edit tree without exporting logs. **/
+public class LocalTreeEditor<T extends TreeNode<T>> implements JungleTree {
+	private final AtomicReservableReference<TreeContext<T>> repository;
+	private final String uuid;
+	private final String treeName;
+	private final ChangeListWriter writer;
+	private final TreeEditor editor;
+	
+	public LocalTreeEditor(String _treeName, TreeContext<T> _tc,String _uuid,ChangeListWriter _writer,TreeEditor _editor)
+	{
+		treeName = _treeName;
+		repository = new AtomicReservableReference<TreeContext<T>>(_tc);
+		uuid = _uuid;
+		writer = _writer;
+		editor = _editor;
+	}
+
+	@Override
+	public JungleTreeEditor getTreeEditor()
+	{
+		TreeContext<T> tc = repository.get();
+		NetworkTransactionManager<T> txManager = new NetworkTransactionManager<T>(treeName, writer,tc,repository,uuid);
+		T root = tc.getTreeNode();
+		return NetworkDefaultJungleTreeEditor.NewLocalJungleTreeEditor(treeName,root,txManager, editor);
+	}
+	
+	@Override
+	public Node getRootNode()
+	{
+		TreeContext<T> tc = repository.get();
+		ChangeSet cs = tc.getChangeSet();
+		return cs.getRoot();
+	}
+
+
+}
--- a/src/alice/jungle/transaction/NetworkDefaultJungleTree.java	Mon Nov 11 19:35:22 2013 +0900
+++ b/src/alice/jungle/transaction/NetworkDefaultJungleTree.java	Fri Nov 15 12:23:59 2013 +0900
@@ -34,7 +34,7 @@
 		T root = tc.getTreeNode();
 		return new NetworkDefaultJungleTreeEditor<T>(treeName, root,txManager,editor);
 	}
-
+	
 	@Override
 	public Node getRootNode()
 	{
--- a/src/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java	Mon Nov 11 19:35:22 2013 +0900
+++ b/src/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java	Fri Nov 15 12:23:59 2013 +0900
@@ -1,8 +1,10 @@
 package alice.jungle.transaction;
 
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
+import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer;
 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.NodePath;
@@ -22,9 +24,11 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
+
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
+import jungle.app.bbs.codesegment.HashLogUpdateCodeSegment;
 
 public class NetworkDefaultJungleTreeEditor<T extends TreeNode<T>> implements JungleTreeEditor {
 
@@ -33,6 +37,7 @@
 	private final TreeEditor editor;
 	private final String treeName;
 	private final TreeOperationLog log;
+	private boolean exportLog;
 
 	public NetworkDefaultJungleTreeEditor(String _treeName, T _root,TransactionManager<T> _txManager,TreeEditor _editor)
 	{
@@ -46,6 +51,13 @@
 		txManager = _txManager;
 		editor = _editor;
 		log = _log;
+		exportLog = true;
+	}
+	
+	public static <T1 extends TreeNode<T1>> NetworkDefaultJungleTreeEditor<T1> NewLocalJungleTreeEditor(String _treeName, T1 _root,TransactionManager<T1> _txManager,TreeEditor _editor) {
+		NetworkDefaultJungleTreeEditor<T1> treeEditor = new NetworkDefaultJungleTreeEditor<T1>(_treeName, _root,_txManager,_editor,new DefaultTreeOperationLog());
+		treeEditor.exportLog = false;
+		return treeEditor;
 	}
 	
 	private Either<Error,JungleTreeEditor> _edit(final NodePath _path,NodeEditor _e)
@@ -71,6 +83,15 @@
 		TreeOperationLog newTreeOpLog = log.append(treeOperationLog);
 		
 		JungleTreeEditor newEditor = new NetworkDefaultJungleTreeEditor<T>(treeName, newNode,txManager,editor,newTreeOpLog);
+		if(exportLog) {
+			try {
+				putTreeOperationLog(newTreeOpLog);
+			} catch (IOException e) {
+				return DefaultEither.newA(either.a());
+			}	
+		}
+		
+		
 		return DefaultEither.newB(newEditor);
 	}
 	
@@ -147,4 +168,31 @@
 	public TreeOperationLog getTreeOperationLog() {
 		return log;
 	}
+
+	public void putTreeOperationLog(Iterable<TreeOperation> newLog) throws IOException {
+		String uuid = getID();
+		String treeName = getTreeName();
+		String updaterName = getID();
+		String revision = getRevision();
+		putDataSegment(uuid, treeName, updaterName, newLog, revision);
+	}
+	
+	public void putDataSegment(String _uuid, String _treeName, String _updaterName, Iterable<TreeOperation> newLog, String nextRevision) throws IOException {
+		DefaultTreeOperationLogContainer container = new DefaultTreeOperationLogContainer();
+		container.setTreeName(_treeName);
+		container.setUUID(_uuid);
+		container.setUpdaterName(_updaterName);
+		container.setRevision(nextRevision);
+		container.unconvert(newLog);
+		HashLogUpdateCodeSegment cs = new HashLogUpdateCodeSegment();
+		cs.ods.put("log", container);
+		cs.ods.put("logString", container.getHashLogString());
+		/* If this node is not Root node, push log to parent node's DS */
+		if(!_updaterName.equals("node0")) {
+			cs.ods.put("parent", "childLog", container);
+		}
+	}
+
+	
+	
 }
--- a/src/jungle/app/bbs/JungleManager.java	Mon Nov 11 19:35:22 2013 +0900
+++ b/src/jungle/app/bbs/JungleManager.java	Fri Nov 15 12:23:59 2013 +0900
@@ -5,6 +5,7 @@
 import java.util.Iterator;
 
 import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer;
+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;
@@ -12,10 +13,12 @@
 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.DefaultTreeOperationLog;
 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;
 
@@ -25,7 +28,7 @@
 	private static int NOT_CHANGE_POSITION = 0;
 
 	private JungleManager() {
-
+		jungle = new DefaultJungle(null,"hogehoge",new DefaultTreeEditor(new DefaultTraverser()));
 	}
 	
 	public static void setJungle(Jungle _j) {
@@ -88,12 +91,13 @@
 			e.printStackTrace();
 		}
 		String treeName = container.getTreeName();
-		if (JungleManager.getJungle().getTreeByName(treeName) == null) {
-			if(null == JungleManager.getJungle().createNewTree(treeName)){
+		Jungle jungle = JungleManager.getJungle(); 
+		if (jungle.getTreeByName(treeName) == null) {
+			if(null == jungle.createNewTree(treeName)){
 				throw new IllegalStateException();
 			}
 		}
-		JungleTree tree = JungleManager.getJungle().getTreeByName(treeName);
+		JungleTree tree = jungle.getTreeByName(treeName);
 		JungleTreeEditor editor = tree.getTreeEditor();
 		int pos = calculatePosition(tree.getRootNode(), container.getTimeStamp());
 		Either<Error, JungleTreeEditor> either = JungleManager.edit(editor, log, pos);
--- a/src/jungle/app/bbs/NetworkJungleBulletinBoard.java	Mon Nov 11 19:35:22 2013 +0900
+++ b/src/jungle/app/bbs/NetworkJungleBulletinBoard.java	Fri Nov 15 12:23:59 2013 +0900
@@ -1,14 +1,11 @@
 package jungle.app.bbs;
 
-import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Date;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import alice.jungle.core.NetworkDefaultJungle;
-import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer;
 import alice.jungle.persistence.AliceJournal;
-import alice.jungle.transaction.NetworkDefaultJungleTreeEditor;
 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;
@@ -16,16 +13,13 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
 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.operations.TreeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
-import jungle.app.bbs.codesegment.HashLogUpdateCodeSegment;
 
 public class NetworkJungleBulletinBoard implements BulletinBoard
 {
@@ -79,12 +73,7 @@
 			throw new IllegalStateException();
 		}
 		final long timestamp = new Date().getTime();
-		/* Put DataSegment */
-		try {
-			putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor,timestamp);
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
+
 		
 		tree = jungle.getTreeByName(_name);
 		editor = tree.getTreeEditor();
@@ -111,12 +100,6 @@
 		}
 		editor = either.b();
 		editor.success();
-		/* Put DataSegment */
-		try {
-			putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor, timestamp);
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
 		
 	}
 
@@ -157,12 +140,7 @@
 			}
 			editor = either.b();
 			either = editor.success();
-			try {
-				NetworkDefaultJungleTreeEditor<DefaultTreeNode> netEditor = (NetworkDefaultJungleTreeEditor<DefaultTreeNode>) editor;
-				putTreeOperationLog(netEditor, timestamp);
-			} catch (IOException e1) {
-				e1.printStackTrace();
-			}
+
 		}while(either.isA());
 		/* Put DataSegment */
 	}
@@ -193,11 +171,6 @@
 			}
 			editor = either.b();
 			either = editor.success();
-			try {
-				putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor,  timestamp);
-			} catch (IOException e1) {
-				e1.printStackTrace();
-			}
 			if(!either.isA()) {
 				return;
 			}
@@ -225,31 +198,6 @@
 		return new IterableConverter<BoardMessage,Node>(chs,converter);
 	}
 	
-	private void putTreeOperationLog(NetworkDefaultJungleTreeEditor<DefaultTreeNode> editor, long timestamp) throws IOException {
-		String uuid = editor.getID();
-		String treeName = editor.getTreeName();
-		String updaterName = editor.getID();
-		String revision = editor.getRevision();
-		Iterable<TreeOperation> log = editor.getTreeOperationLog();
-		putDataSegment(uuid, treeName, updaterName, log, revision, timestamp);
-	}
-	
-	private void putDataSegment(String _uuid, String _treeName, String _updaterName, Iterable<TreeOperation> _log, String nextRevision,long timestamp) throws IOException {
-		DefaultTreeOperationLogContainer container = new DefaultTreeOperationLogContainer();
-		container.setTreeName(_treeName);
-		container.setUUID(_uuid);
-		container.setUpdaterName(_updaterName);
-		container.setRevision(nextRevision);
-		container.unconvert(_log);
-		container.setTimeStamp(timestamp);
-		HashLogUpdateCodeSegment cs = new HashLogUpdateCodeSegment();
-		cs.ods.put("log", container);
-		cs.ods.put("logString", container.getHashLogString());
-		/* If this node is not Root node, push log to parent node's DS */
-		if(!_updaterName.equals("node0")) {
-			cs.ods.put("parent", "childLog", container);
-		}
-	}
 
 	
 	private static class BoardMessageImpl implements BoardMessage