# HG changeset patch # User one # Date 1373804809 -32400 # Node ID ccfe9b5e8f11f564a0b1849c02b85bef8c58c21c # Parent 25edf76b65dc7d7100e369eda79a17f5619ecd5b bug LogUpdateCodeSegment diff -r 25edf76b65dc -r ccfe9b5e8f11 src/alice/jungle/codesegment/HashLogUpdateCodeSegment.java --- 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); } diff -r 25edf76b65dc -r ccfe9b5e8f11 src/alice/jungle/codesegment/LogUpdateCodeSegment.java --- 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 checkTimeStamp(Node node, long newNodeTimeStamp) { + int count = 0; + long childTimeStamp = 0; + for(Iterator 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); } + + + } diff -r 25edf76b65dc -r ccfe9b5e8f11 src/alice/jungle/datasegment/store/operations/DefaultTreeOperationLogContainer.java --- 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; } diff -r 25edf76b65dc -r ccfe9b5e8f11 src/jungle/test/bbs/JungleManager.java --- 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 edit(JungleTreeEditor _editor ,TreeOperationLog _log, int pos) { + System.out.println("--path editor--"); + JungleTreeEditor editor = _editor; + Either either = null; + for (TreeOperation op : _log) { + either = _edit(editor, op, pos); + if(either.isA()) { + return either; + } + editor = either.b(); + } + return either; + } + + private static Either _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; + } + + } diff -r 25edf76b65dc -r ccfe9b5e8f11 src/jungle/test/bbs/NetworkJungleBulletinBoard.java --- 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 > Either 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 > Either 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(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 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 _log, String nextRevision) throws IOException { + private void putDataSegment(String _uuid, String _treeName, String _updaterName, Iterable _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); diff -r 25edf76b65dc -r ccfe9b5e8f11 src/jungle/test/bbs/codesegment/ChildLogCheckCodeSegment.java --- 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 either = JungleManager.edit(editor, log); + Either e = checkTimeStamp(tree.getRootNode(), container.getTimeStamp()); + Either either; + if(e.isB()) { + either = JungleManager.edit(editor, log, e.b()); + } else { + either = JungleManager.edit(editor, log); + } +// Either either = JungleManager.edit(editor, log); if(either.isA()) { throw new IllegalStateException(); } @@ -64,5 +77,26 @@ } } + private DefaultEither checkTimeStamp(Node node, long newNodeTimeStamp) { + int count = 0; + long childTimeStamp = 0; + for(Iterator 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); + } + + + } diff -r 25edf76b65dc -r ccfe9b5e8f11 src/jungle/test/codesegment/persistence/AliceJournal.java --- 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; } } diff -r 25edf76b65dc -r ccfe9b5e8f11 src/jungle/test/functionalJava/ListTest.java --- 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 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 insertInteger(List list, final int insertNum) {