changeset 56:ccfe9b5e8f11

bug LogUpdateCodeSegment
author one
date Sun, 14 Jul 2013 21:26:49 +0900
parents 25edf76b65dc
children 1bfd13f831ea
files src/alice/jungle/codesegment/HashLogUpdateCodeSegment.java src/alice/jungle/codesegment/LogUpdateCodeSegment.java src/alice/jungle/datasegment/store/operations/DefaultTreeOperationLogContainer.java src/jungle/test/bbs/JungleManager.java src/jungle/test/bbs/NetworkJungleBulletinBoard.java src/jungle/test/bbs/codesegment/ChildLogCheckCodeSegment.java src/jungle/test/codesegment/persistence/AliceJournal.java src/jungle/test/functionalJava/ListTest.java
diffstat 8 files changed, 141 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/src/alice/jungle/codesegment/HashLogUpdateCodeSegment.java	Sun Jul 14 17:23:48 2013 +0900
+++ b/src/alice/jungle/codesegment/HashLogUpdateCodeSegment.java	Sun Jul 14 21:26:49 2013 +0900
@@ -8,18 +8,17 @@
 public class HashLogUpdateCodeSegment extends CodeSegment {
 	
 	Receiver hashLog = ids.create(CommandType.PEEK);
-	
-	String str;
+	Receiver logString = ids.create(CommandType.TAKE);
 	
-	public HashLogUpdateCodeSegment(String _str) {
+	public HashLogUpdateCodeSegment() {
 		hashLog.setKey("hashLog");
-		str = _str;
+		logString.setKey("logString");
 	}
 	
 	public void run() {
-		System.out.println("HashLogUpdateCodeSegment");
-		System.out.println("str : "+str);
 		HashSetDataSegment ds = hashLog.asClass(HashSetDataSegment.class);
+		String str = logString.asString();
+		System.out.println("HashLogUpdateCodeSegment : "+ str);
 		ds.hash.add(str);
 		ods.put("hashLog", ds);
 	}
--- a/src/alice/jungle/codesegment/LogUpdateCodeSegment.java	Sun Jul 14 17:23:48 2013 +0900
+++ b/src/alice/jungle/codesegment/LogUpdateCodeSegment.java	Sun Jul 14 21:26:49 2013 +0900
@@ -1,10 +1,14 @@
 package alice.jungle.codesegment;
 
 import java.io.IOException;
+import java.util.Iterator;
 
 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.logger.DefaultTreeOperationLog;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import jungle.test.bbs.JungleManager;
@@ -39,7 +43,6 @@
 		String h = host.asString();
 		DefaultTreeOperationLogContainer container = parentLog.asClass(DefaultTreeOperationLogContainer.class);
 		HashSetDataSegment ds = hashLog.asClass(HashSetDataSegment.class);
-		System.out.println(container.getHashLogString());
 		if(ds.hash.contains(container.getHashLogString())) {
 			ods.update("hashLog", ds);		
 			new LogUpdateCodeSegment(index);
@@ -74,8 +77,27 @@
 		ods.put("log", container);
 		new LogUpdateCodeSegment(index);
 	}
+
 	
-	private boolean updaterIsMe(String host, DefaultTreeOperationLogContainer container) {
-		return host.equals(container.getServerName());
+	private DefaultEither<DefaultError, Integer> checkTimeStamp(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 DefaultEither.newA(new DefaultError());
+			}
+			if(n.getAttributes().get("timestamp") != null) {
+				childTimeStamp = n.getAttributes().get("timestamp").getLong();
+				if (newNodeTimeStamp < childTimeStamp) {
+					break;
+				}
+			}
+			count++;
+		}
+		return DefaultEither.newB(count);
 	}
+	
+	
+
 }
--- a/src/alice/jungle/datasegment/store/operations/DefaultTreeOperationLogContainer.java	Sun Jul 14 17:23:48 2013 +0900
+++ b/src/alice/jungle/datasegment/store/operations/DefaultTreeOperationLogContainer.java	Sun Jul 14 21:26:49 2013 +0900
@@ -38,7 +38,7 @@
 		uuid = "";
 		updaterName = "";
 		revision = "";
-		timestamp = new Date().getTime();
+		timestamp = Long.MAX_VALUE;
 	}
 	
 	public void setTreeName(String _treeName) {
@@ -111,7 +111,7 @@
 	}
 	
 	public String getHashLogString() {
-		return updaterName + revision;
+		return treeName + revision + updaterName;
 	}
 
 	
--- a/src/jungle/test/bbs/JungleManager.java	Sun Jul 14 17:23:48 2013 +0900
+++ b/src/jungle/test/bbs/JungleManager.java	Sun Jul 14 21:26:49 2013 +0900
@@ -9,6 +9,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
 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;
@@ -71,5 +72,45 @@
 			return editor.deleteChildAt(path, 0);
 		}
 		return null;
-	}	
+	}
+	
+	
+	public static Either<Error, JungleTreeEditor> edit(JungleTreeEditor _editor ,TreeOperationLog _log, int pos) {
+		System.out.println("--path editor--");
+		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) {
+		DefaultNodePath path = new DefaultNodePath();
+		NodeOperation nodeOp = op.getNodeOperation();
+		Command c = nodeOp.getCommand();
+		String key = "";
+		switch (c) {
+		case PUT_ATTRIBUTE:
+			path = path.add(pos);
+			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;
+	}
+
+	
 }
--- a/src/jungle/test/bbs/NetworkJungleBulletinBoard.java	Sun Jul 14 17:23:48 2013 +0900
+++ b/src/jungle/test/bbs/NetworkJungleBulletinBoard.java	Sun Jul 14 21:26:49 2013 +0900
@@ -2,6 +2,7 @@
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.Date;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import alice.jungle.codesegment.HashLogUpdateCodeSegment;
@@ -77,9 +78,10 @@
 		if(result.isA()){
 			throw new IllegalStateException();
 		}
+		final long timestamp = new Date().getTime();
 		/* Put DataSegment */
 		try {
-			putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor);
+			putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor, timestamp);
 		} catch (IOException e1) {
 			e1.printStackTrace();
 		}
@@ -97,6 +99,8 @@
 				_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
 				_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_initMessage.getBytes())).b();
 				_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
+				ByteBuffer tBuffer = ByteBuffer.allocate(16);
+				_e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b();
 				return DefaultEither.newB(_e);
 			}
 		};
@@ -109,7 +113,7 @@
 		editor.success();
 		/* Put DataSegment */
 		try {
-			putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor);
+			putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor, timestamp);
 		} catch (IOException e1) {
 			e1.printStackTrace();
 		}
@@ -136,11 +140,14 @@
 				throw new IllegalStateException();
 			}
 			editor = either.b();
+			final long timestamp = new Date().getTime();
 			NodeEditor e = new NodeEditor(){
 				public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
 					_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
 					_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b();
 					_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
+					ByteBuffer tBuffer = ByteBuffer.allocate(16);
+					_e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b();
 					return DefaultEither.newB(_e);
 				}
 			};
@@ -152,7 +159,7 @@
 			editor = either.b();
 			either = editor.success();
 			try {
-				putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor);
+				putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor, timestamp);
 			} catch (IOException e1) {
 				e1.printStackTrace();
 			}
@@ -170,11 +177,14 @@
 		
 			JungleTree tree = jungle.getTreeByName(_board);
 			editor = tree.getTreeEditor();
+			final long timestamp = new Date().getTime(); 
 			NodeEditor e = new NodeEditor(){
 				public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
 					_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
 					_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b();
 					_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
+					ByteBuffer tBuffer = ByteBuffer.allocate(16);
+					_e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b();
 				return DefaultEither.newB(_e);
 				}
 			};
@@ -186,7 +196,7 @@
 			editor = either.b();
 			either = editor.success();
 			try {
-				putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor);
+				putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor, timestamp);
 			} catch (IOException e1) {
 				e1.printStackTrace();
 			}
@@ -213,27 +223,28 @@
 		return new IterableConverter<BoardMessage,Node>(chs,converter);
 	}
 	
-	private void putTreeOperationLog(NetworkDefaultJungleTreeEditor editor) throws IOException {
+	private void putTreeOperationLog(NetworkDefaultJungleTreeEditor editor, long timestamp) throws IOException {
 		String uuid = editor.getID();
 		String treeName = editor.getTreeName();
 		String updaterName = editor.getUpdaterName();
 		String revision = editor.getRevision();
 		Iterable<TreeOperation> log = editor.getTreeOperationLog();
-		putDataSegment(uuid, treeName, updaterName, log, revision);
+		putDataSegment(uuid, treeName, updaterName, log, revision, timestamp);
 	}
 	
-	private void putDataSegment(String _uuid, String _treeName, String _updaterName, Iterable<TreeOperation> _log, String nextRevision) throws IOException {
+	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);
-		NullCodeSegmentForUpdate cs = new NullCodeSegmentForUpdate();
+		container.setTimeStamp(timestamp);
+		HashLogUpdateCodeSegment cs = new HashLogUpdateCodeSegment();
+		container.getHashLogString();
 		cs.ods.put("log", container);
-		new HashLogUpdateCodeSegment(container.getHashLogString());
-		System.out.println("putDataSegment");
-		System.out.println(container.getHashLogString());
+		cs.ods.put("logString", container.getHashLogString());
+		System.out.println("putDataSegment : "+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/test/bbs/codesegment/ChildLogCheckCodeSegment.java	Sun Jul 14 17:23:48 2013 +0900
+++ b/src/jungle/test/bbs/codesegment/ChildLogCheckCodeSegment.java	Sun Jul 14 21:26:49 2013 +0900
@@ -1,10 +1,16 @@
 package jungle.test.bbs.codesegment;
 
 import java.io.IOException;
+import java.util.Iterator;
 
 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.NodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import jungle.test.bbs.JungleManager;
@@ -45,7 +51,14 @@
 		}
 		JungleTree tree = JungleManager.getJungle().getTreeByName(treeName);
 		JungleTreeEditor editor = tree.getTreeEditor();
-		Either<Error, JungleTreeEditor> either = JungleManager.edit(editor, log);
+		Either<DefaultError, Integer> e = checkTimeStamp(tree.getRootNode(), container.getTimeStamp());
+		Either<Error, JungleTreeEditor> either; 
+		if(e.isB()) {	
+			either = JungleManager.edit(editor, log, e.b());
+		} else {
+			either = JungleManager.edit(editor, log);
+		}
+//		Either<Error, JungleTreeEditor> either = JungleManager.edit(editor, log);
 		if(either.isA()) {
 			throw new IllegalStateException();
 		}
@@ -64,5 +77,26 @@
 		}
 	}
 	
+	private DefaultEither<DefaultError, Integer> checkTimeStamp(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 DefaultEither.newA(new DefaultError());
+			}
+			if(n.getAttributes().get("timestamp") != null) {
+				childTimeStamp = n.getAttributes().get("timestamp").getLong();
+				if (newNodeTimeStamp < childTimeStamp) {
+					break;
+				}
+			}
+			count++;
+		}
+		return DefaultEither.newB(count);
+	}
+	
+	
+	
 
 }
--- a/src/jungle/test/codesegment/persistence/AliceJournal.java	Sun Jul 14 17:23:48 2013 +0900
+++ b/src/jungle/test/codesegment/persistence/AliceJournal.java	Sun Jul 14 21:26:49 2013 +0900
@@ -33,7 +33,6 @@
 		@Override
 		public Result write(ChangeList _operations)
 		{
-			/*
 			for(TreeOperation op : _operations){
 				NodePath p = op.getNodePath();
 				NodeOperation nodeOp = op.getNodeOperation();
@@ -61,7 +60,6 @@
 				}
 				System.out.println(String.format("[%s:%s:%s]",c,p,args));
 			}
-			*/
 			return Result.SUCCESS;
 		}
 	}
--- a/src/jungle/test/functionalJava/ListTest.java	Sun Jul 14 17:23:48 2013 +0900
+++ b/src/jungle/test/functionalJava/ListTest.java	Sun Jul 14 21:26:49 2013 +0900
@@ -1,18 +1,21 @@
 package jungle.test.functionalJava;
 
 import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import fj.P2;
 import fj.data.List;
 
-public class ListTest{
+public class ListTest {
 	
 	public static void main(String[] args) {
 		List<Integer> list = List.nil();
-		list = list.cons(1);
 		list = list.cons(2);
-		list = list.cons(4);
+		list = list.cons(3);
+		list = list.cons(5);
+		list = list.snoc(1);
 		System.out.println("list :"+list);		
+		System.out.println("list.reverse() :"+list.reverse());		
 		System.out.println("list.index(0) :"+list.index(0));		
 		System.out.println("list.head() :"+ list.head());		
 		System.out.println("list.tail() :"+list.tail());		
@@ -23,9 +26,12 @@
 		System.out.println(list1);
 		System.out.println(list2);
 		
-		final int INSERT_NUM = 3;
+		final int INSERT_NUM = 4;
 		list = insertInteger(list, INSERT_NUM);
 		System.out.println("newList :"+ list);
+		
+		
+		
 	}
 	
 	public static List<Integer> insertInteger(List<Integer> list, final int insertNum) {