diff src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle-network/transaction/NetworkDefaultJungleTreeEditor.cs @ 10:abe0c247f5a5

Add Network module. but, unComplete NetworkDefaultJungleTreeEditor.cs
author Kazuma Takeda <kazuma-arashi@hotmail.co.jp>
date Sun, 23 Oct 2016 07:40:50 +0900
parents
children 220433691c2e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle-network/transaction/NetworkDefaultJungleTreeEditor.cs	Sun Oct 23 07:40:50 2016 +0900
@@ -0,0 +1,170 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+public class NetworkDefaultJungleTreeEditor : JungleTreeEditor {
+	private readonly TransactionManager TxManager;
+	private readonly TreeNode Root;
+	private readonly TreeEditor Editor;
+	private readonly string TreeName;
+	private readonly TreeOperationLog Log;
+	private bool ExportLog;
+
+	public NetworkDefaultJungleTreeEditor(string tname, TreeNode root, TransactionManager txMan, TreeEditor edit) 
+	{
+		this.TreeName = tname;
+		this.Root = root;
+		this.TxManager = txMan;
+		this.Editor = edit;
+		this.Log = new DefaultTreeOperationLog();
+		this.ExportLog = true;
+	}
+
+	public NetworkDefaultJungleTreeEditor(string tname, TreeNode root, TransactionManager txMan, TreeEditor edit, TreeOperationLog log) {
+		this.TreeName = tname;
+		this.Root = root;
+		this.TxManager = txMan;
+		this.Editor = edit;
+		this.Log = log;
+		this.ExportLog = true;
+	}
+
+	public static NetworkDefaultJungleTreeEditor NewLocalTreeEditor(string tname, TreeNode root, TransactionManager txMan, TreeEditor edit) {
+		NetworkDefaultJungleTreeEditor treeEditor = new NetworkDefaultJungleTreeEditor(tname, root, txMan, edit, new DefaultTreeOperationLog());
+		treeEditor.ExportLog = false;
+		return treeEditor;
+	}
+
+	public static NetworkDefaultJungleTreeEditor NewLocalTreeEditor(string tname, TreeNode root, TransactionManager txMan, TreeEditor edit, TreeOperationLog log) {
+		NetworkDefaultJungleTreeEditor treeEditor = new NetworkDefaultJungleTreeEditor(tname, root, txMan, edit, log);
+		treeEditor.ExportLog = false;
+		return treeEditor;
+	}
+
+
+	private Either<Error,JungleTreeEditor> TreeEditor(NodePath path, NodeEditor editor)
+	{
+		//LoggingNodeHook hook = new LoggingNodeHook(_e);
+		Either<Error,LoggingNode> either = this.Editor.edit(this.Root, path, editor);
+		if(either.isA()){
+			return DefaultEither<Error, JungleTreeEditor>.newA(either.a());
+		}
+
+		TreeNode newNode = either.b().getWrap();
+		OperationLog newLog = either.b().getOperationLog();
+
+//		IterableConverter.Converter<TreeOperation,NodeOperation> converter = new IterableConverter.Converter<TreeOperation,NodeOperation>(){
+//		public TreeOperation conv(NodeOperation _b){
+//				return new DefaultTreeOperation(_path,_b);
+//			}
+//		};
+
+		// I must fix this code.
+		IterableConverter.Converter<TreeOperation,NodeOperation> converter;
+
+		IEnumerable<TreeOperation> iterable = new IterableConverter<TreeOperation,NodeOperation>(newLog, converter);
+		DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length());
+		TreeOperationLog newTreeOpLog = Log.append(treeOperationLog);
+
+		JungleTreeEditor newEditor;
+		if(this.ExportLog) {
+			newEditor = new NetworkDefaultJungleTreeEditor(this.TreeName, newNode, this.TxManager, this.Editor, newTreeOpLog);
+		} else {
+			newEditor = NetworkDefaultJungleTreeEditor.NewLocalTreeEditor(this.TreeName, newNode, TxManager, this.Editor, newTreeOpLog);
+		}
+		return DefaultEither<Error, JungleTreeEditor>.newB(newEditor);
+	}
+
+
+	public Either<Error,JungleTreeEditor> addNewChildAt(NodePath _path, int _pos)
+	{
+		AppendChildAt appendChildAt = new AppendChildAt(_pos);
+		return this.TreeEditor(_path,appendChildAt);
+	}
+
+	public Either<Error,JungleTreeEditor> deleteChildAt(NodePath _path, int _pos)
+	{
+		DeleteChildAt deleteChildAt = new DeleteChildAt(_pos);
+		return this.TreeEditor(_path,deleteChildAt);
+	}
+
+	public Either<Error,JungleTreeEditor> putAttribute(NodePath _path, string _key, byte[] _value)
+	{
+		PutAttribute putAttribute = new PutAttribute(_key,_value);
+		return this.TreeEditor(_path,putAttribute);
+	}
+
+	public Either<Error,JungleTreeEditor> deleteAttribute(NodePath _path, string _key)
+	{
+		DeleteAttribute deleteAttribute = new DeleteAttribute(_key);
+		return this.TreeEditor(_path,deleteAttribute);
+	}
+
+	public Either<Error,JungleTreeEditor> edit(NodePath _path, NodeEditor _editor)
+	{
+		return this.TreeEditor(_path,_editor);
+	}
+
+	public Either<Error,JungleTreeEditor> success()
+	{
+		Either<Error,TransactionManager> either = TxManager.commit(this.Root, this.Log);
+		if(either.isA()){
+			return DefaultEither<Error, JungleTreeEditor>.newA(either.a());
+		}
+//		if(this.ExportLog) {
+//			try {
+//				putTreeOperationLog(this.Log);
+//			} catch (IOException e) {
+//				return DefaultEither.newA(either.a());
+//			}	
+//		}
+
+		TransactionManager newTxManager = either.b();
+		JungleTreeEditor newTreeEditor = new NetworkDefaultJungleTreeEditor(this.TreeName, this.Root, newTxManager, this.Editor);
+
+		return DefaultEither<Error, JungleTreeEditor>.newB(newTreeEditor);
+	}
+
+	private string getID()
+	{
+		return this.TxManager.getUUID();
+	}
+
+	private string getRevision()
+	{
+		return this.TxManager.getRevision().ToString();
+	}
+
+	public string getTreeName() {
+		return this.TreeName;
+	}
+
+	public TreeOperationLog getTreeOperationLog() {
+		return this.Log;
+	}
+
+	public void putTreeOperationLog(IEnumerable<TreeOperation> newLog) {
+		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, IEnumerable<TreeOperation> newLog, string nextRevision) {
+		// NetworkTreeOperationLog netLog = new NetworkTreeOperationLog(_uuid, _treeName,newLog);
+//		CodeSegment cs = new LogPutCodeSegment(netLog);
+//		cs.execute();
+	}
+
+	public Either<Error, JungleTreeEditor> replaceNewRootNode() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public Either<Error, JungleTreeEditor> flushSuccess() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}